单片机时钟秒表代码文档格式.docx
《单片机时钟秒表代码文档格式.docx》由会员分享,可在线阅读,更多相关《单片机时钟秒表代码文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
![单片机时钟秒表代码文档格式.docx](https://file1.bdocx.com/fileroot1/2022-10/10/92ad1b71-8b91-4f96-b072-9d5734173335/92ad1b71-8b91-4f96-b072-9d57341733351.gif)
sbitkey4=P1A3;
uintmin,sec,tcnt,ge,shi,bai,qian;
uchara=0;
ucharflag=O;
ucharcodetable[]={
0xC0,0xF9,0xA4,0xB0,
0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
voiddelay()
{;
;
}
voiddelayms(uintz)
{
uintx,y;
for(x=z;
x>
0;
x__)
for(y=110;
y>
y--);
}
voidstart()//开始信号:
scl为高电平期间,sda发生负跳变
sda=1;
delay();
scl=1;
sda=0;
voidstop()//停止信号:
scl为高电平,sda发生正跳变
voidrespons()
//应答信号:
scl为高电平期间,sda被接受设备拉为低电平,最后//scl置0
uchari;
while((sda==1)&
&
(i<
255))
i++;
scl=0;
/*写字节数据:
将8位数据通过左移到CY(进位),然后赋值给数据线SDA每发送一位,scl出现正跳变,发送完数据后,需要将scl置0,sda置1*/
voidwrite_byte(uchardate)
uchari,temp;
temp=date;
for(i=0;
i<
8;
i++)
temp=temp<
<
1;
sda=CY;
/*读字节数据:
将数据一位一位从sda中获取,每读取一位scl出现负跳变通过变量k将8位数据整合为1个字节数据,读数据前,先将scl置0,sda置
1*/ucharread_byte()
uchari,k;
k=(k<
1)|sda;
returnk;
//数码管显示程序
voiddisplay(ucharqian,ucharbai,ucharshi,ucharge)
P0=table[ge];
dula=1;
dula=0;
P0=0x08;
wela=1;
wela=0;
delayms(l);
P0=table[shi];
dula=1;
P0=0x04;
delayms
(1);
P0=table[bai];
P0=0x02;
wela=1;
wela=0;
P0=table[qian];
P0=0x01;
delayms
(1);
//判断按键
voidkeyscan()
MOTOR_CS=0;
LED_CS=O;
if(key1==0)
消抖
delayms(IO);
//if(key1==O)
sec=0;
min=0;
while(!
key1);
if(key2==0)
delayms(10);
TR0=1;
key2);
if(key3==0)
TR0=0;
key3);
if(key4==0)
sec=sec+1;
key4);
voidled()
LED_CS=1;
P0=0x00;
delayms(250);
P0=0xff;
LED_CS=0;
voidbeep()
MOTOR_CS=1;
P0=0x3f;
P0=0x7f;
voidmain()
LED_CS=0;
sec=read_add
(2);
//读出保存的数据赋于sec
TMOD=0x01;
//定时器工作在方式1
ET0=1;
//打开定时器、计数器0中断允许位
EA=1;
//打开全局中断
//TR0=0;
TH0=(65536-50000)/256;
//对TH0TL0赋值
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);
voidt0()interrupt1//
判断计时器是否计时一秒
置零
//在24c02的地址2中写入数据sec
//对THOTLO赋值
//重装计数初值
tcnt++;
//每过50mstent加一if(tcnt==20)//计满20次(1秒)时
tcnt=0;
//重新再计
sec++;
write=1;
//1秒写一次24C02
if(sec==60)//定时60秒,再从零开始计时
led();
beep();
min++;
if(min==60)〃是否满1h{