51单片机,I2C 24c02 1-99秒循环定时器
仿真电路。
程序源码
HEX文件
单片机源程序如下:
- #include "reg52.h"
- #include "i2c.h"
- #ifndef uchar
- #define uchar unsigned char
- #endif
- #ifndef uint
- #define uint unsigned int
- #endif
- #ifndef ulong
- #define ulong unsigned long
- #endif
- uchar stoptime=0,runtime=0,stopcoun=00,runcoun=00;
- uchar disp[8];
- uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- uchar keynum=0;
- bit noankey=1;
- sbit stopled=P2^5;
- sbit runled=P2^4;
- void datapros();
- void keyaffair();
- /*******************************************************************************
- * 函 数 名 : Timer1Init
- * 函数功能 : 定时器1初始化
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void TimerInit()
- {
- TMOD|=0X11;//选择为定时器0和1模式,工作方式1,仅用TR1打开启动。
- TH0=0XF0;
- TL0=0X60;
- TH1=0XFC; //给定时器赋初值,定时1ms
- TL1=0X18;
- ET0=1;
- ET1=1;//打开定时器1中断允许
- EA=1;//打开总中断
- TR0=1;
- TR1=1;//打开定时器
- }
- /*******************************************************************************
- * 函数名 :datapros()
- * 函数功能 :数据处理函数
- * 输入 : 无
- * 输出 : 无
- *******************************************************************************/
- void datapros()
- {
- disp[0]=smgduan[stoptime/10]; //停止定时十位
- disp[1]=smgduan[stoptime%10]; //停止定时个位
- disp[2]=smgduan[runtime/10]; //运行定时十位
- disp[3]=smgduan[runtime%10]; //运行定时个位
- disp[4]=smgduan[stopcoun/10]; //停止计时十位
- disp[5]=smgduan[stopcoun%10]; //停止计时个位
- disp[6]=0; //运行计时十位
- disp[7]=0; //运行计时个位
- }
- /*******************************************************************************
- * 函数名 :void keyaffair()
- * 函数功能 :按键事件函数
- * 输入 : 无
- * 输出 : 无
- *******************************************************************************/
- void keyaffair(uchar num)
- {
-
- switch(num)
- {
- case 1: stoptime=(stoptime>=90)?stoptime-90 : stoptime+10; disp[0]=smgduan[stoptime/10]; At24c02Write(1,stoptime); break;
- case 2: stoptime=(stoptime%10==9)? stoptime-9:stoptime+1; disp[1]=smgduan[stoptime%10]; At24c02Write(1,stoptime); break;
- case 3: runtime=(runtime>=90)?runtime-90 : runtime+10; disp[2]=smgduan[runtime/10]; At24c02Write(2,runtime); break;
- case 4: runtime=(runtime%10==9)?runtime-9 : runtime+1; disp[3]=smgduan[runtime%10]; At24c02Write(2,runtime); break;
- case 5: stoptime=(stoptime>=10)?stoptime-10 : stoptime+90; disp[0]=smgduan[stoptime/10]; At24c02Write(1,stoptime); break;
- case 6: stoptime=(stoptime%10>=1)? stoptime-1:stoptime+9; disp[1]=smgduan[stoptime%10]; At24c02Write(1,stoptime); break;
- case 7: runtime=(runtime>=10)?runtime-10 : runtime+90; disp[2]=smgduan[runtime/10]; At24c02Write(2,runtime); break;
- case 8: runtime=(runtime%10>=1)?runtime-1 : runtime+9; disp[3]=smgduan[runtime%10]; At24c02Write(2,runtime); break;
- }
- }
- /*******************************************************************************
- * 函 数 名 : void amin()
- * 函数功能 : 主函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void main()
- {
- stopled = 0;
- runled = 1;
- stoptime = At24c02Read(1);
- stoptime%=100;
- runtime = At24c02Read(2);
- runtime%=100;
- datapros();
- TimerInit();
- while(1)
- {
- if(keynum!=0 && noankey==1)
- {
- EA=0;
- keyaffair(keynum);
- keynum=0;
- EA=1;
- }
- }
- }
- /*******************************************************************************
- * 函 数 名 : void Timer0() interrupt 1
- * 函数功能 : 定时器0中断函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void Timer0() interrupt 1
- {
- static ulong timeset=0xffffffff;
- TH0 = 0xF0;
- TL0 = 0x60;
- //add your code here!
- //if(timeset==0xffffffff)
- noankey=1;
- timeset<<=8;
- timeset|=P3;
- switch(timeset)
- {
- case 0xfefefefe: keynum=1; noankey=0; break;
- case 0xfdfdfdfd: keynum=2; noankey=0; break;
- case 0xfbfbfbfb: keynum=3; noankey=0; break;
- case 0xf7f7f7f7: keynum=4; noankey=0; break;
- case 0xefefefef: keynum=5; noankey=0; break;
- case 0xdfdfdfdf: keynum=6; noankey=0; break;
- case 0xbfbfbfbf: keynum=7; noankey=0; break;
- case 0x7f7f7f7f: keynum=8; noankey=0; break;
- case 0xffffffff: if(keynum!=0)noankey=1;break;
- }
- }
- /*******************************************************************************
- * 函 数 名 : void Timer1() interrupt 3
- * 函数功能 : 定时器1中断函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void Timer1() interrupt 3
- {
- static uchar n=0;
- static uint count=0;
- static bit run_stop=0;
- TH1=0XFC; //给定时器赋初值,定时1ms
- TL1=0X18;
- count++;
- if(count>=1000)
- {
- count=0;
- if(run_stop==0)
- {
- stopcoun++;
- disp[4]=smgduan[stopcoun/10]; //停止计时十位
- disp[5]=smgduan[stopcoun%10]; //停止计时个位
- if(stopcoun>=stoptime)
- {
- run_stop=1;
- runcoun=0;
- disp[4]=0;
- disp[5]=0;
- disp[6]=smgduan[runcoun/10]; //停止计时十位
- disp[7]=smgduan[runcoun%10]; //停止计时个位
- stopled=1;
- runled=0;
- }
- }
- else
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
1-99秒循环定时器.rar
(62.42 KB, 下载次数: 87)
|