51定時器時鐘及protues仿真
51hei.gif (69.5 KB, 下載次數: 44)
下載附件
2023-4-9 22:21 上傳
單片機源程序如下:
- /**************************************************************************************
- 實驗現象:下載程序后,數碼管右3位顯示0,按K1鍵將數據寫入到EEPROM內保存,
- 按K2鍵讀取EEPROM內保存的數據,按K3鍵顯示數據加1,按K4鍵顯示數據清零,
- 最大能寫入的數據是255。
- 注意事項:
- ***************************************************************************************/
- #include "public.h"
- #include "24c02.h"
- #include "lcd1602.h"
- #include "stdio.h"
- #define EEPROM_ADDRESS 0 //定義數據存入EEPROM的起始地址
- sbit s1=P3^0;
- sbit s2=P3^1;
- sbit s3=P3^2;
- sbit beep=P2^3;
- u8 count,s1num;
- char miao,shi,fen;
- char code table[]=" 2008-9-30 MON";
- void di()
- {
- beep=0;
- delay_ms(100);
- beep=1;
- }
- void write_sfm(u8 add,u8 date)
- {
- u8 shi,ge;
- shi=date/10;
- ge=date%10;
- lcd1602_write_cmd(0x80+0x40+add);
- lcd1602_write_data(0x30+shi);
- lcd1602_write_data(0x30+ge);
- }
- void keyscan()
- {
- if(s1==0)
- {
- delay_ms(5);
- if(s1==0)
- {
- s1num++;
- while(!s1);
- di();
- if(s1num==1)
- {
- TR0=0;
- lcd1602_write_cmd(0x80+0x40+10);
- lcd1602_write_cmd(0x0f);
- }
- if(s1num==2)
- {
- lcd1602_write_cmd(0x80+0x40+7);
- }
- if(s1num==3)
- {
- lcd1602_write_cmd(0x80+0x40+4);
- }
- if(s1num==4)
- {
- s1num=0;
- lcd1602_write_cmd(0x0c);
- TR0=1;
- }
- }
- }
- if(s1num!=0)
- {
- if(s2==0)
- {
- delay_ms(5);
- if(s2==0)
- {
- while(!s2);
- di();
- if(s1num==1)
- {
- miao++;
- if(miao==60)
- miao=0;
- write_sfm(10,miao);
- lcd1602_write_cmd(0x80+0x40+10);
- at24c02_write_one_byte(1,miao);
- }
- if(s1num==2)
- {
- fen++;
- if(fen==60)
- fen=0;
- write_sfm(7,fen);
- lcd1602_write_cmd(0x80+0x40+7);
- at24c02_write_one_byte(2,fen);
- }
- if(s1num==3)
- {
- shi++;
- if(shi==24)
- shi=0;
- write_sfm(4,shi);
- lcd1602_write_cmd(0x80+0x40+4);
- at24c02_write_one_byte(3,shi);
- }
- }
- }
- if(s3==0)
- {
- delay_ms(5);
- if(s3==0)
- {
- while(!s3);
- di();
- if(s1num==1)
- {
- miao--;
- if(miao==-1)
- miao=59;
- write_sfm(10,miao);
- lcd1602_write_cmd(0x80+0x40+10);
- at24c02_write_one_byte(1,shi);
- }
- if(s1num==2)
- {
- fen--;
- if(fen==-1)
- fen=59;
- write_sfm(7,fen);
- lcd1602_write_cmd(0x80+0x40+7);
- at24c02_write_one_byte(2,fen);
- }
- if(s1num==3)
- {
- shi--;
- if(shi==-1)
- fen=23;
- write_sfm(7,shi);
- lcd1602_write_cmd(0x80+0x40+4);
- at24c02_write_one_byte(3,shi);
- }
- }
-
- }
- }
- }
- /*******************************************************************************
- * 函 數 名 : main
- * 函數功能 : 主函數
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void main()
- {
- u8 num;
- lcd1602_init();//LCD1602初始化
-
- fen=0;
- miao=0;
- shi=0;
- count=0;
- s1num=0;
- for(num=0;num<15;num++)
- {
- lcd1602_write_data(table[num]);
- delay_ms(5);
- }
- lcd1602_write_cmd(0x80+0x40+6);
- lcd1602_write_data(':');
- delay_ms(5);
- lcd1602_write_cmd(0x80+0x40+9);
- lcd1602_write_data(':');
- delay_ms(5);
- miao=at24c02_read_one_byte(1);
- fen=at24c02_read_one_byte(2);
- shi=at24c02_read_one_byte(3);
- write_sfm(10,miao);
- write_sfm(7,fen);
- write_sfm(4,shi);
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- //lcd1602_show_string(0,0,"24c02save");//第二行顯示
- while(1)
- {
- keyscan();
- //sprintf(buffer,"%d%d%d",save_buf[0],save_buf[1],save_buf[2]);
- //lcd1602_show_string(0,1,buffer);//第二行顯示
- }
-
- }
- void timer0() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- count++;
- if(count==20)
- {
- count=0;
- miao++;
- if(miao==60)
- {
- miao=0;
- fen++;
- if(fen==60)
- {
- fen=0;
- shi++;
- if(shi==24)
- {
- shi=0;
- }
- write_sfm(4,shi);
- at24c02_write_one_byte(3,shi);
- }
- write_sfm(7,fen);
- at24c02_write_one_byte(2,fen);
- }
- write_sfm(10,miao);
- at24c02_write_one_byte(1,miao);
- }
- }
復制代碼
Keil代碼與Proteus8.13仿真下載:
定時器時鐘LCD顯示protues仿真.7z
(75.91 KB, 下載次數: 36)
2023-4-9 22:22 上傳
點擊文件名下載附件
51單片機時鐘 下載積分: 黑幣 -5
|