數碼管鬧鐘.png (304.66 KB, 下載次數: 70)
下載附件
2017-3-2 09:59 上傳
單片機源程序:
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code DSY_CODE[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共陰極總段//
- uchar DSY_BUFFER[]={0,0,0xBF,0,0,0xff,0,0};//時間顯示時-分 模式
- uchar DSY_BUFFER1[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //模式顯示段//
- uchar Scan_BIT;//位選擇//
- uchar DSY_IDX;//段選擇//
- uchar Key_State; //按鍵控制//
- uchar s,s100,h1 ;
- char h,m;
- sbit dd=P1^7; //喇叭和led輸出端口//
- sbit cc=P1^6;
- sbit ss=P1^5; //時間和秒轉換顯示鍵//
- void DelayMS(uchar x)
- {
- uchar i;
- while(x--) for(i = 0;i<120;i++);
- }
- void Increase_Hour()
- {
- if (++h>23) h=0;
- DSY_BUFFER[0] =DSY_CODE[h/10];
- DSY_BUFFER[1] =DSY_CODE[h%10];
- }
- void Decrease_Hour()
- { h--;
- if (h<0) h=23;
- DSY_BUFFER[0] =DSY_CODE[h/10];
- DSY_BUFFER[1] =DSY_CODE[h%10];
- }
- void Increase_Minute()
- {
- if(++m>59)
- {
- m=0;Increase_Hour();
- }
- DSY_BUFFER[3] =DSY_CODE[m/10];
- DSY_BUFFER[4] =DSY_CODE[m%10];
- }
- void Decrease_Minute()
- { m--;
- if(m<0) m=59;
- DSY_BUFFER[3] =DSY_CODE[m/10];
- DSY_BUFFER[4] =DSY_CODE[m%10];
- }
- void Increase_Hour1()
- {
- if (++h1>7) h1=1;
- DSY_BUFFER[6] =DSY_CODE[h1/10];
- DSY_BUFFER[7] =DSY_CODE[h1%10];
- }
- void Increase_Second()
- {
- if(++s>59)
- {
- s=0;Increase_Minute();
- }
- DSY_BUFFER1[0] =DSY_CODE[s/10];
- DSY_BUFFER1[1] =DSY_CODE[s%10];
- }
- void T0_INT() interrupt 1 //顯示屏顯示//
- {
- TH0=(65536-1000)/256;
- TL0=(65536-1000)%256;
- if(ss==1) //P1.5鍵沒按下,顯示時間//
- {
- P3=Scan_BIT;
- P2=~DSY_BUFFER[DSY_IDX];
- }
- else { //P1.5鍵按下,閃//
- P3=Scan_BIT;
- P2=~DSY_BUFFER[DSY_IDX];
- }
- Scan_BIT=_crol_(Scan_BIT,1);//位顯示移動//
- DSY_IDX=(DSY_IDX+1)%8; //段選擇每次變化//
-
- if(h1==3)
- { if(h==6&m==0)cc=dd=0;else cc=dd=1;//時間到鬧鐘響,led亮,一分鐘//
- if(h==6&m==15)cc=dd=0; else cc=dd=1;
- if(h==7&m==0)cc=dd=0; else cc=dd=1;
- if(h==12&m==30)cc=dd=0; else cc=dd=1;
- if(h==14&m==0)cc=dd=0; else cc=dd=1;
- if(h==16&m==30)cc=dd=0; else cc=dd=1;
- if(h==18&m==0)cc=dd=0; else cc=dd=1;
- if(h==18&m==45)cc=dd=0; else cc=dd=1;
- if(h==19&m==30)cc=dd=0; else cc=dd=1;
- if(h==21&m==30)cc=dd=0; else cc=dd=1;
- if(h==22&m==0)cc=dd=0;else cc=dd=1; }
- else cc=dd=1;
- if(h1==1|h1==4|h1==2|h1==5)
- { if(h==6&m==0)cc=dd=0;else cc=dd=1;//時間到鬧鐘響,led亮,一分鐘//
- if(h==7&m==0)cc=dd=0; else cc=dd=1;
- if(h==12&m==30)cc=dd=0; else cc=dd=1;
- if(h==14&m==0)cc=dd=0; else cc=dd=1;
- if(h==16&m==30)cc=dd=0; else cc=dd=1;
- if(h==18&m==0)cc=dd=0; else cc=dd=1;
- if(h==18&m==45)cc=dd=0; else cc=dd=1;
- if(h==19&m==30)cc=dd=0; else cc=dd=1;
- if(h==21&m==30)cc=dd=0; else cc=dd=1;
- if(h==22&m==0)cc=dd=0;else cc=dd=1; }
- else cc=dd=1;
- if(h1==6)
- { if(h==6&m==0)cc=dd=0;else cc=dd=1;//時間到鬧鐘響,led亮,一分鐘//
- if(h==7&m==0)cc=dd=0; else cc=dd=1;
- if(h==12&m==30)cc=dd=0; else cc=dd=1;
- if(h==14&m==30)cc=dd=0; else cc=dd=1;
- if(h==18&m==0)cc=dd=0; else cc=dd=1;
- if(h==21&m==0)cc=dd=0; else cc=dd=1;
- if(h==21&m==30)cc=dd=0; else cc=dd=1;
- if(h==22&m==30)cc=dd=0;else cc=dd=1; }
- else cc=dd=1;
- if(h1==7)
- { if(h==6&m==30)cc=dd=0;else cc=dd=1;//時間到鬧鐘響,led亮,一分鐘//
- if(h==7&m==0)cc=dd=0; else cc=dd=1;
- if(h==11&m==30)cc=dd=0; else cc=dd=1;
- if(h==12&m==30)cc=dd=0; else cc=dd=1;
- if(h==15&m==30)cc=dd=0; else cc=dd=1;
- if(h==16&m==30)cc=dd=0; else cc=dd=1;
- if(h==18&m==0)cc=dd=0; else cc=dd=1;
- if(h==18&m==40)cc=dd=0; else cc=dd=1;
- if(h==20&m==0)cc=dd=0; else cc=dd=1;
- if(h==20&m==30)cc=dd=0; else cc=dd=1;
- if(h==21&m==30)cc=dd=0; else cc=dd=1;
- if(h==22&m==0)cc=dd=0;else cc=dd=1; }
- else cc=dd=1;
-
- }
- void T1_INT() interrupt 3//時間秒自動加一,走時//
- {
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;//延時50毫秒//
- if (s100==20)
- {
- s100=0;
- Increase_Second();
- }
- else s100++;
- }
- void main ()
- {
- P2=P3=0xFF;
- TMOD=0x11;
- TH0=(65536-1000)/256;
- TL0=(65536-1000)%256;
- TH1=0XDC;
- TL1=0;
- TCON=0x01;
- EA=1;
- ET0=1;
- ET1=1;
- h=05,m=55,s=s100,h1=1; //時間和鬧鐘初值//
- DSY_BUFFER[0]=DSY_CODE[h/10]; //時間初值賦給時間段碼顯示組//
- DSY_BUFFER[1]=DSY_CODE[h%10];
- DSY_BUFFER[3]=DSY_CODE[m/10];
- DSY_BUFFER[4]=DSY_CODE[m%10];
- DSY_BUFFER[6]=DSY_CODE[h1/10];
- DSY_BUFFER[7]=DSY_CODE[h1%10];
- DSY_BUFFER1[0]=DSY_CODE[h1/10]; //鬧鐘初值賦給鬧鐘段碼顯示組//
- DSY_BUFFER1[1]=DSY_CODE[h1%10];
- Scan_BIT=0xFE; //給位選擇賦初值為二進制數 11111110,即只有最后一位為低電平,之后每次左移一位,依次為11111101,11111011......01111111,11111110循環移動//
- DSY_IDX=0; //段碼顯示組的選擇變量//
- TR0=TR1=1;
- Key_State=0xFF;
- while(1)
- {
- if (P1^Key_State) //判斷按鍵是否有按下//
- {
- DelayMS(10);
- if (P1^Key_State)
- {
- Key_State=P1; EA=0;
- if((Key_State&0x01)==0) Increase_Hour(); //小時加一//
- else if ((Key_State&0x02)==0) Decrease_Hour(); //小時減一//
- else if ((Key_State&0x04)==0) Increase_Minute(); //分鐘加一//
- else if ((Key_State&0x08)==0) Decrease_Minute(); //分鐘減一//
- else if ((Key_State&0x10)==0) //復位按鍵//
- {h=05,m=55,s=0,h1=1;
- DSY_BUFFER[0]=DSY_CODE[h/10];
- DSY_BUFFER[1]=DSY_CODE[h%10];
- DSY_BUFFER[3]=DSY_CODE[m/10];
- DSY_BUFFER[4]=DSY_CODE[m%10];
- DSY_BUFFER[6]=DSY_CODE[h1/10];
- DSY_BUFFER[7]=DSY_CODE[h1%10];
- }
- else if ((Key_State&0x20)==0)Increase_Hour1(); //模式加一//
- EA=1;
- }
- }
- }
- }
復制代碼
0.png (60.95 KB, 下載次數: 64)
下載附件
2017-3-2 18:32 上傳
下載:
數字鬧鐘(自動值班打鈴系統).zip
(48.9 KB, 下載次數: 105)
2017-3-2 10:01 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|