單片機倒計時牌仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.jpg (43.33 KB, 下載次數(shù): 49)
下載附件
2017-12-27 16:58 上傳
實物圖:
0.jpg (10.4 KB, 下載次數(shù): 39)
下載附件
2017-12-27 16:59 上傳
倒計時牌單片機源程序如下:
- #include<reg52.h>
- #include<lcd1602.h> //LCD1602頭文件
- #include<ds1302.h> //DS1302時鐘頭文件
- #define uchar unsigned char
- #define uint unsigned int
- sbit key1=P1^0; //調(diào)整模式選擇按鍵
- sbit key2=P1^1; //加按鍵
- sbit key3=P1^2; //減按鍵
- sbit key4=P1^3; //跳出調(diào)整模式
- sbit key5=P1^4;
- sbit SPK=P1^7; //接鬧鐘
- int aa=80;
- uchar code table2[]="Alarm: : : ";
- uchar code table3[]=" CD: - - ";
- uchar num,keynum,dj=255,flag1=0;
- char sec,min,hour,date,month,year,day,flag;
- char year1=9,month1=12,date1=10,hour1=12,min1=0,sec1=0;
- void init() //定時器T0初始化函數(shù)
- {
- TMOD=0x01; //設置定時器T0為工作方式1
- TH0=(65536-50000)/256; //裝入1ms的初值
- TL0=(65536-50000)%256; //作為蜂鳴器的周期
- EA=1;
- ET0=1;
- }
- void T0_timer()interrupt 1 //定時器T0中斷服務程序
- {
- TH0=(65536-1000)/256; //重裝初值
- TL0=(65536-1000)%256;
- SPK=!SPK;
-
- }
- void keyscan() //鍵盤掃描函數(shù)
- {
- if(key4==0) //如果key4按下跳出調(diào)整模式
- {
- delay(5);
- if(key4==0)
- goto Tuichu;
- while(!key4)
- ;
- }
-
- if(key1==0) //判斷key1是否按下
- {
- delay(5);
- if(key1==0)
- {
- while(!key1);
- keynum++;
- switch(keynum)
- {
- case 1:
- write_com(0x0f); //開光標閃爍:0x0f
- gotoxy(2,6); //按一次鍵,時間停止,秒光標閃爍
- flag=1;
- break;
- case 2:
- gotoxy(2,3); //分調(diào)整模式
- break;
- case 3:
- gotoxy(2,0); //小時調(diào)整模式
- break;
- case 4:
- gotoxy(1,15); //星期調(diào)整模式
- break;
- case 5:
- gotoxy(1,8); //日調(diào)整模式
- break;
- case 6:
- gotoxy(1,5); //月調(diào)整模式
- break;
- case 7:
- gotoxy(1,2); //年調(diào)整模式
- break;
- case 8:
- gotoxy(2,10);
- write_str("CD:");
- gotoxy(2,13);
- write_date(0x30+dj/100);
- gotoxy(2,14);
- write_num(dj%100);
- gotoxy(2,15);
- break;
- case 9: //鬧鐘,倒計時調(diào)整模式界面顯示
- write_com(0x01);
- gotoxy(1,0);
- write_str(&table2);
- gotoxy(2,0);
- write_str(&table3);
- gotoxy(1,6);
- write_num(hour1);
- gotoxy(1,9);
- write_num(min1);
- gotoxy(1,12);
- write_num(sec1);
- gotoxy(2,5);
- write_num(year1);
- gotoxy(2,8);
- write_num(month1);
- gotoxy(2,11);
- write_num(date1);
- gotoxy(1,12); //鬧鐘秒調(diào)整模式
- break;
- case 10: //鬧鐘分調(diào)整模式
- gotoxy(1,9);
- break;
- case 11: //鬧鐘小時調(diào)整模式
- gotoxy(1,6);
- break;
- case 12: //倒計時年調(diào)整模式
- gotoxy(2,11);
- break;
- case 13: //倒計時月調(diào)整模式
- gotoxy(2,8);
- break;
- case 14: //倒計時日調(diào)整模式
- gotoxy(2,5);
- break;
-
- Tuichu: case 15: //跳出調(diào)整模式
- keynum=0;
- write_com(0x01);
- write_com(0x0c);
- tubiao();
- settime_ds1302(0x80,sec);
- settime_ds1302(0x82,min);
- settime_ds1302(0x84,hour);
- settime_ds1302(0x86,date);
- settime_ds1302(0x88,month);
- settime_ds1302(0x8a,day);
- settime_ds1302(0x8c,year);
- flag=0;
- break;
- }
- }
- }
- /*****加按鍵****/
- if(keynum!=0)
- {
- if(key2==0)
- {
- delay(5);
- if(key2==0)
- {
- while(!key2);
- switch(keynum)
- {
- case 1: //秒加1
- sec++;
- if(sec==60)
- sec=0;
- gotoxy(2,6);
- write_num(sec);
- gotoxy(2,7);
- break;
- case 2: //分加1
- min++;
- if(min==60)
- min=0;
- gotoxy(2,3);
- write_num(min);
- gotoxy(2,4);
- break;
- case 3: //小時加1
- hour++;
- if(hour==24)
- hour=0;
- gotoxy(2,0);
- write_num(hour);
- gotoxy(2,1);
- break;
- case 4: //星期加1
- day++;
- if(day==8)
- day=0;
- gotoxy(1,15);
- write_date(0x30+day);
- gotoxy(1,15);
- break;
- case 5: //日加1
- date++;
- if(date==32)
- date=0;
- gotoxy(1,8);
- write_num(date);
- gotoxy(1,9);
- break;
- case 6: //月加1
- month++;
- if(month==13)
- month=1;
- gotoxy(1,5);
- write_num(month);
- gotoxy(1,6);
- break;
- case 7: //年加1
- year++;
- gotoxy(1,2);
- write_num(year);
- gotoxy(1,3);
- break;
- case 8: //倒計時間加1
- dj++;
- if(dj==201)
- dj=0;
- gotoxy(2,13);
- write_date(0x30+dj/100);
- gotoxy(2,14);
- write_num(dj%100);
- gotoxy(2,15);
- break;
-
- case 9: //鬧鐘秒加1
- sec1++;
- gotoxy(1,12);
- if(sec1==60)
- sec1=0;
- write_num(sec1);
- gotoxy(1,13);
- break;
- case 10: //鬧鐘分加1
- min1++;
- if(min1==60)
- min1=0;
- gotoxy(1,9);
- write_num(min1);
- gotoxy(1,10);
- break;
- case 11: //鬧鐘小時加1
- hour1++;
- if(hour1==24)
- hour1=0;
- gotoxy(1,6);
- write_num(hour1);
- gotoxy(1,7);
- break;
-
- case 12: //倒計時日加
- date1++;
- if(date1==32)
- date1=0;
- gotoxy(2,11);
- write_num(date1);
- gotoxy(2,12);
- break;
- case 13: //倒計時月加
- month1++;
- if(month1==13)
- month1=0;
- gotoxy(2,8);
- write_num(month1);
- gotoxy(2,9);
- break;
- case 14: //倒計時年加
- year1++;
- gotoxy(2,5);
- write_num(year1);
- gotoxy(2,6);
- break;
- }
- }
- }
- }
- //減操作
- if(key3==0)
- {
- delay(5);
- if(key3==0)
- {
- while(!key3);
- switch(keynum)
- {
- case 1: //秒減1
- sec--;
- if(sec==-1)
- sec=59;
- gotoxy(2,6);
- write_num(sec);
- gotoxy(2,7);
- break;
- case 2: //分加1
- min--;
- if(min==-1)
- min=59;
- gotoxy(2,3);
- write_num(min);
- gotoxy(2,4);
- break;
- case 3: //小時加1
- hour--;
- if(hour==-1)
- hour=23;
- gotoxy(2,0);
- write_num(hour);
- gotoxy(2,1);
- break;
- case 4: //星期加1
- day--;
- if(day==0)
- day=7;
- gotoxy(1,15);
- write_date(0x30+day);
- gotoxy(1,15);
- break;
- case 5: //日加1
- date--;
- if(date==0)
- date=31;
- gotoxy(1,8);
- write_num(date);
- gotoxy(1,9);
- break;
- case 6: //月加1
- month--;
- if(month==0)
- month=12;
- gotoxy(1,5);
- write_num(month);
- gotoxy(1,6);
- break;
- case 7: //年加1
- year--;
- gotoxy(1,2);
- write_num(year);
- gotoxy(1,3);
- break;
- case 8: //倒計時間減1
- dj--;
- if(dj==0)
- dj=200;
- gotoxy(2,13);
- write_date(0x30+dj/100);
- gotoxy(2,14);
- write_num(dj%100);
- gotoxy(2,15);
- break;
- case 9: //鬧鐘秒加1
- sec1--;
- if(sec1==-1)
- sec1=59;
- gotoxy(1,12);
- write_num(sec1);
- gotoxy(1,13);
- break;
- case 10: //鬧鐘分加1
- min1--;
- if(min1==-1)
- min1=59;
- gotoxy(1,9);
- write_num(min1);
- gotoxy(1,10);
- break;
- case 11: //鬧鐘小時加1
- hour1--;
- if(hour1==-1)
- hour1=23;
- gotoxy(1,6);
- write_num(hour1);
- gotoxy(1,7);
- break;
- case 12: //倒計時日加1
- date1--;
- if(date1==0)
- date1=31;
- gotoxy(2,11);
- write_num(date1);
- gotoxy(2,12);
- break;
- case 13: //倒計時月加1
- month1--;
- if(month1==0)
- month1=12;
- gotoxy(2,8);
- write_num(month1);
- gotoxy(2,9);
- break;
- case 14: //倒計時年加1
- year1--;
- gotoxy(2,5);
- write_num(year1);
- gotoxy(2,6);
- break;
- }
- }
- }
- }
- /***************主函數(shù)*****************/
- void main()
- {
- init_lcd(); //液晶初始化
- init(); //定時器T0初始化
- kxcs();
- write_com(0x01); //清屏
- tubiao(); //顯示字符
- while(1)
- {
- if(hour1==hour&&min1==min&&sec1==sec&&keynum==0&&!key5) //鬧鐘判斷
- TR0=1;
- if(year1==year&&month1==month&&date1==date&&keynum==0&&!key5)//倒計時日期判斷
- {
- flag1=1; //倒計時顯示標志位
- TR0=1; //啟動定時器1鬧鐘提示
- year1++;
- }
-
- if(key1==0||key2==0||key3==0||key4==0||key5) //按任意鍵跳出鬧鐘
- TR0=0;
- keyscan(); //鍵盤掃描
- if(flag==0) //flag是判斷是否有鍵按下,有鍵按下時flag為1
- {
- if(hour==23&&min==59&&sec==59&&flag1)//當flag1為1時且時間為23:59:59:時
- { //倒計時間減1
- dj--;
- delay(1000); //1s延時很必要
- }
- if(flag1==1&&aa>0) //倒計時顯示:flag1==1時顯示
- {
- if(aa==80) //顯示倒計時畫面時循環(huán)顯示80次
- {
- write_com(0x01);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
捕獲.PNG (7.19 KB, 下載次數(shù): 41)
下載附件
2017-12-27 15:49 上傳
所有資料51hei提供下載:
基于單片機的倒計時牌控制系統(tǒng)設計.rar
(160.93 KB, 下載次數(shù): 36)
2017-12-27 15:49 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|