1、#include#define uchar unsigned char#define uint unsigned intbit write=0; /写 24C02 的标志;sbit sda=P23; sbit scl=P22;sbit dula=P36;sbit wela=P37;sbit LED_CS=P25;sbit MOTOR_CS=P27;sbit key1=P10;sbit key2=P11;sbit key3=P12;sbit key4=P13;uint min,sec,tcnt,ge,shi,bai,qian;uchar a=0; uchar flag=0;uchar code
2、table=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E;void delay() ; void delayms(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void start() /开始信号:scl 为高电平期间, sda 发生负跳变sda=1;delay();scl=1;delay();sda=0;delay();void stop() /停止信号:scl 为高电平, sda 发生正跳变sda=0;delay();scl=1;
3、delay();sda=1;delay();void respons() /应答信号:scl 为高电平期间, sda 被接受设备拉为低电平, 最后/scl 置 0uchar i;scl=1;delay();while(sda=1)scl=0;delay();void init() /总线初始化:将总线拉高以释放总线sda=1;delay();scl=1;delay();/*写字节数据: 将 8 位数据通过左移到 CY(进位),然后赋值给数据线 SDA每发送一位,scl 出现正跳变 ,发送完数据后,需要将 scl 置 0, sda 置 1 */void write_byte(uchar date
4、)uchar i,temp;temp=date;for(i=0;i8;i+)temp=temp1;scl=0;delay();sda=CY;delay();scl=1;delay();scl=0;delay();sda=1;delay();/*读字节数据: 将数据一位一位从 sda 中获取, 每读取一位 scl 出现负跳变通过变量 k 将 8 位数据整合为 1 个字节数据,读数据前, 先将 scl 置 0, sda 置 1*/uchar read_byte()uchar i,k;scl=0;delay();sda=1;delay();for(i=0;i8;i+)scl=1;delay();k=
5、(k1)|sda;scl=0;delay();return k;/数码管显示程序void display(uchar qian,uchar bai,uchar shi,uchar ge) P0 = tablege;dula = 1;dula = 0;P0=0x08; wela = 1;wela = 0;delayms(1); P0 = tableshi;dula = 1;dula = 0;P0=0x04;wela = 1;wela = 0;delayms(1);P0 = tablebai;dula = 1;dula = 0;P0 = 0x02;wela= 1;wela= 0;delayms(1
6、);P0 = tableqian;dula = 1;dula = 0;P0 = 0x01;wela= 1;wela= 0;delayms(1);/判断按键void keyscan()MOTOR_CS=0;LED_CS=0;if(key1=0)delayms(10); /消抖if(key1=0)sec=0;min=0;while(!key1); if(key2=0) delayms(10);if(key2=0)TR0=1;while(!key2);if(key3=0) delayms(10);if(key3=0)TR0=0;while(!key3); if(key4=0) delayms(10)
7、;if(key4=0)TR0=0;sec=sec+1;while(!key4); void led()LED_CS=1;P0=0x00;delayms(250);P0=0xff;LED_CS=0;void beep()MOTOR_CS=1;P0 = 0x3f; delayms(250);P0 = 0x7f;MOTOR_CS=0;void main()LED_CS = 0;MOTOR_CS=0;sec=read_add(2); /读出保存的数据赋于 secTMOD=0x01; /定时器工作在方式 1ET0=1; /打开定时器、计数器 0 中断允许位EA=1; /打开全局中断/ TR0=0;TH0
8、=(65536-50000)/256; /对 TH0 TL0 赋值TL0=(65536-50000)%256; /使定时器 0.05 秒中断一次while(1)shi=sec/10;ge=sec%10;bai = min%10;qian = min/10;display(qian,bai,shi,ge);keyscan();if(write=1) /判断计时器是否计时一秒 write=0; /置零write_add(2,sec); /在 24c02 的地址 2 中写入数据 sec void t0() interrupt 1 /定时中断服务函数TH0=(65536-50000)/256; /对 TH0 TL0 赋值TL0=(65536-50000)%256; /重装计数初值tcnt+; /每过 50ms tcnt 加一if(tcnt=20) /计满 20 次(1 秒)时tcnt=0; /重新再计sec+;write=1; /1 秒写一次 24C02if(sec=60) /定时 60 秒,再从零开始计时 sec=0; led();beep();min+;if(min=60)/是否满 1h min=0;