數字鐘設計(基于單片機的設計——實驗箱或Proteus仿真) 設計要求: l 顯示格式:hh-mm-ss l 可更改的12小時制或24小時制 l 整點報時功能 l 鬧鐘功能 l 對時調整功能 l 秒表功能
單片機源程序如下:
- #include<reg51.h>
- /*------------------檢查忙位-----------------------------*/
- void chk_busy();
- /*------------------延時子程序-----------------------------*/
- void delay(unsigned int num);
- /*------------------寫命令到LCD------------------------------*/
- void write_com(unsigned char cmdcode);
- /*-------------------寫數據到LCD----------------------------*/
- void write_data(unsigned char Dispdata);
- /*------------------初始化LCD屏--------------------------*/
- void lcdreset();
- /*------------------顯示字符串--------------------------*/
- void hzkdis(unsigned char *s,unsigned char len);
- /*------------------清屏命令--------------------------*/
- void clrscreen();
- void change();
- sbit RS = P2^0;
- sbit RW = P2^1;
- sbit E = P2^2;
- void zhengdianbaoshi();
- void naozhong();
- void Pwm_Set(unsigned int Hz,unsigned char Pwm);
- void key_scan();
- sbit key1=P3^0;
- sbit key2=P3^1;
- sbit key3=P3^2;
- sbit key4=P3^3;
- sbit key5=P3^4;
- sbit key6=P3^5;
- sbit key7=P3^6;
- sbit key8=P1^1;
- sbit key9=P1^2;
- sbit BEEP=P1^0;
- #define Lcd_Bus P0
- unsigned char ADDR=0x90;
- volatile unsigned char sec=0,min=59,hour=23;
- unsigned char disp_hour[2]={'0','0'};
- unsigned char disp_min[2]={'0','0'};
- unsigned char disp_sec[2]={'0','0'};
- void main()
- {
-
-
- EA=1;
- ET0=1;
- TH0=0x3c;
- TL0=0xb0;
- TMOD=0x01;
- TR0=1;
- lcdreset();
- clrscreen();
- write_com(0x80);
- hzkdis("張玉科",6);
- hzkdis("、陳偉藝:",9);
- write_com(0x90);//0x90 start
- hzkdis("鬧鐘:",6);
- hzkdis("00",2);
- hzkdis(":",1);
- hzkdis("01",2);
- write_com(0x88);//0x88
- hzkdis("報時:",6);
- hzkdis("整點",6);
- while(1)
- {
-
- if(sec>=60)
- {
- min++;
- sec=0;
- }
- if(min>=60)
- {
- hour++;
- min=0;
- }
- if(hour>=24)
- {
- hour=0;
- }
-
- change();
- write_com(0x80);
- hzkdis("張玉科",6);
- hzkdis("、陳偉藝:",9);
- write_com(0x90);//0x90 start
- hzkdis("鬧鐘:",6);
- hzkdis("00",2);
- hzkdis(":",1);
- hzkdis("01",2);
- write_com(0x88);//0x88
- hzkdis("報時:",6);
- hzkdis("整點",6);
- write_com(0x98);//0x98
- hzkdis(disp_hour,2);
- hzkdis(":",1);
- hzkdis(disp_min,2);
- hzkdis(":",1);
- hzkdis(disp_sec,2);
- key_scan();
- zhengdianbaoshi();
- naozhong();
-
- }
- }
- /*------------------檢查忙位-----------------------------*/
- void chk_busy()
- {
- RS=0;
- RW=1;
- E=1;
- Lcd_Bus=0xff;
- while((Lcd_Bus&0x80)==0x80);
- E=0;
- }
- /*------------------延時子程序-----------------------------*/
- void delay(unsigned int num)
- {
- unsigned int i,j;
- for(i=0;i<num;i++)
- {
- for(j=0;j<5;j++)
- {
- }
- }
- }
- /*------------------寫命令到LCD------------------------------*/
- void write_com(unsigned char cmdcode)
- {
- chk_busy();
- RS=0;
- RW=0;
- E=1;
- Lcd_Bus=cmdcode;
- delay(5);////////////////////在數據寫入的時候加入適當的延時
- E=0;
- delay(5);
- }
- /*-------------------寫數據到LCD----------------------------*/
- void write_data(unsigned char Dispdata)
- {
- chk_busy();
- RS=1;
- RW=0;
- E=1;
- Lcd_Bus=Dispdata;
- delay(5);///////////////////在數據寫入的時候加入適當的延時
- E=0;
- delay(5);
- }
- /*------------------初始化LCD屏--------------------------*/
- void lcdreset()
- {
- delay(2000);
- write_com(0x30);
- delay(10); //選擇基本指令集
- write_com(0x30); //選擇8bit數據流
- delay(5);
- write_com(0x0c); //開顯示(無游標、不反白)
- delay(10);
- write_com(0x01); //清除顯示,并且設定地址指針為00H
- delay(500);
- write_com(0x06); //指定在資料的讀取及寫入時,設定游標的移動方向及指定顯示的移位
- delay(0);
- }
- /*------------------顯示字符串--------------------------*/
- void hzkdis(unsigned char *s,unsigned char len)
- {
- while(len!=0)
- {
- write_data(*s);
- s++;
- len--;
- delay(50);
- }
- }
- /*------------------清屏命令--------------------------*/
- void clrscreen()
- {
- write_com(0x01);
- delay(10);
- }/*------------------------------*/
- void timer0() interrupt 1
- {
- static unsigned char i=0;
- EA=0;
- TF0=0;
- TR0=0;
- TH0=0x3c;
- TL0=0xb0;
- i++;
- if(i>=20)
- {
- i=0;
- sec++;
- }
-
- TR0=1;
- EA=1;
- }
- void change()
- {
- unsigned char k1,k2,k3;
- k1=hour/10;
- k2=min/10;
- k3=sec/10;
- disp_hour[0]=k1+0x30;
- disp_hour[1]=(hour-k1*10)+0x30;
- disp_min[0]=k2+0x30;
- disp_min[1]=(min-k2*10)+0x30;
- disp_sec[0]=k3+0x30;
- disp_sec[1]=(sec-k3*10)+0x30;
- }
- void key_scan()
- {
- unsigned char hou=0,mi=0;
-
- if(key1==0)
- {
- delay(10);
- if(key1==0)
- {
- if(hour<23)
- {
- hour++;
- }
- else
- {
- hour=0;
- }
- while(!key1);
- }
- }
- if(key3==0)
- {
- delay(10);
- if(key3==0)
- {
- if(min<59)
- {
- min++;
- }
- else
- {
- min=0;
- }
- }
- while(!key3);
- }
- if(key5==0)
- {
- delay(10);
- if(key5==0)
- {
- if(sec<59)
- {
- sec++;
- }
- else
- {
- sec=0;
- }
- }
- while(!key5);
-
- }
- if(key2==0)
- {
- delay(10);
- if(key2==0)
- {
- if(hour>0)
- {
- hour--;
- }
- else
- {
- hour=23;
- }
- }
- while(!key2);
- }
- if(key4==0)
- {
- delay(10);
- if(key4==0)
- {
- if(min>0)
- {
- min--;
- }
- else
- {
- min=59;
- }
- }
- while(!key4);
- }
- if(key6==0)
- {
- delay(10);
- if(key6==0)
- {
- if(sec>0)
- {
- sec--;
- }
- else
- {
- sec=59;
- }
- }
- while(!key6);
-
- }
- if(key7==0)
- {
- delay(10);
- if(key7==0)
-
- {
- hour=0;
- min=0;
- sec=0;
- }
-
- while(!key7);
-
- }
-
- }
- void zhengdianbaoshi()//整點報時(從50秒開始)
- {
- if(hour==hour&&min==59&&sec>50)
- {
- BEEP=!BEEP;
- }
-
- }
- void naozhong()//鬧鐘00:01:00,就響30秒
- {
-
- if(hour==0&&min==1&&sec<30)
- {
- BEEP=!BEEP;
-
- }
- }
復制代碼
所有資料51hei提供下載:
Desktop.zip
(2.01 KB, 下載次數: 24)
2018-11-13 15:17 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|