51定时器时钟及protues仿真
单片机源程序如下:
- /**************************************************************************************
- 实验现象:下载程序后,数码管右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)
|