单片机时钟秒表代码.docx
- 文档编号:25615026
- 上传时间:2023-06-10
- 格式:DOCX
- 页数:10
- 大小:15.72KB
单片机时钟秒表代码.docx
《单片机时钟秒表代码.docx》由会员分享,可在线阅读,更多相关《单片机时钟秒表代码.docx(10页珍藏版)》请在冰豆网上搜索。
单片机时钟秒表代码
*include
*defineucharunsignedchar
*defineuintunsignedint
bitwrite=0;//写24C02的标志;
sbitsda=P2^3;
sbitscl=P2^2;
sbitdula=P3^6;
sbitwela=P3^7;
sbitLED_CS=P2^5;
sbitMOTOR_CS=P2^7;
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitkey4=P1^3;
uintmin,sec,tt,ge,shi,bai,qian;
uchara=0;
ucharflag=0;
ucharcodetable[]={
0*C0,0*F9,0*A4,0*B0,
0*99,0*92,0*82,0*F8,
0*80,0*90,0*88,0*83,
0*C6,0*A1,0*86,0*8E};
voiddelay()
{;;}
voiddelayms(uintz)
{
uint*,y;
for(*=z;*>0;*--)
for(y=110;y>0;y--);
}
voidstart()//开场信号:
scl为高电平期间,sda发生负跳变
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
voidstop()//停顿信号:
scl为高电平,sda发生正跳变
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
voidrespons()
//应答信号:
scl为高电平期间,sda被承受设备拉为低电平,最后//scl置0
{
uchari;
scl=1;
delay();
while((sda==1)&&(i<255))
i++;
scl=0;
delay();
}
voidinit()//总线初始化:
将总线拉高以释放总线
{
sda=1;
delay();
scl=1;
delay();
}
/*写字节数据:
将8位数据通过左移到CY(进位),然后赋值给数据线SDA
每发送一位,scl出现正跳变,发送完数据后,需要将scl置0,sda置1*/
voidwrite_byte(uchardate)
{
uchari,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=1;
delay();
}
/*读字节数据:
将数据一位一位从sda中获取,每读取一位scl出现负跳变
通过变量k将8位数据整合为1个字节数据,读数据前,先将scl置0,sda置1*/
ucharread_byte()
{
uchari,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();
}
returnk;
}
//数码管显示程序
voiddisplay(ucharqian,ucharbai,ucharshi,ucharge)
{
P0=table[ge];
dula=1;
dula=0;
P0=0*08;
wela=1;
wela=0;
delayms
(1);
P0=table[shi];
dula=1;
dula=0;
P0=0*04;
wela=1;
wela=0;
delayms
(1);
P0=table[bai];
dula=1;
dula=0;
P0=0*02;
wela=1;
wela=0;
delayms
(1);
P0=table[qian];
dula=1;
dula=0;
P0=0*01;
wela=1;
wela=0;
delayms
(1);
}
//判断按键
voidkeyscan()
{
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);
if(key4==0)
{
TR0=0;
sec=sec+1;
while(!
key4);
}
}
}
voidled()
{
LED_CS=1;
P0=0*00;
delayms(250);
P0=0*ff;
LED_CS=0;
}
voidbeep()
{
MOTOR_CS=1;
P0=0*3f;
delayms(250);
P0=0*7f;
MOTOR_CS=0;
}
voidmain()
{
LED_CS=0;
MOTOR_CS=0;
sec=read_add
(2);//读出保存的数据赋于sec
TMOD=0*01;//定时器工作在方式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);//在24c02的地址2中写入数据sec
}
}
}
voidt0()interrupt1//定时中断效劳函数
{
TH0=(65536-50000)/256;//对TH0TL0赋值
TL0=(65536-50000)%256;//重装计数初值
tt++;//每过50mstt加一
if(tt==20)//计满20次〔1秒〕时
{
tt=0;//重新再计
sec++;
write=1;//1秒写一次24C02
if(sec==60)//定时60秒,再从零开场计时
{
sec=0;
led();
beep();
min++;
if(min==60)//是否满1h
{
min=0;
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 时钟 秒表 代码