单片机秒表设计c语言.docx
《单片机秒表设计c语言.docx》由会员分享,可在线阅读,更多相关《单片机秒表设计c语言.docx(12页珍藏版)》请在冰豆网上搜索。
![单片机秒表设计c语言.docx](https://file1.bdocx.com/fileroot1/2022-12/13/a2a18fd3-f29a-4cc3-9a08-bf4215671dbf/a2a18fd3-f29a-4cc3-9a08-bf4215671dbf1.gif)
单片机秒表设计c语言
单片机秒表设计
专业
班级
姓名
学号
完成日期:
20年月日
实验内容及要求
要求:
1.设计一个精度为0.1s的秒表系统(显示分、秒、0.1秒);
2.有启动按钮、暂停按钮及清零按钮;
3.每到一秒钟有声音提醒功能,可通过按钮打开及关闭该提醒音。
附加功能:
1.倒计时功能。
2.数据暂停存储功能
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitsda=P2^0;
sbitscl=P2^1;
sbitdula=P2^6;
sbitwela=P2^7;
sbitbeep=P2^3;//蜂鸣器
ucharaddress=23;
uchartemp;
uinttime;//时间
uchara=0;
uchartt=0,beepc;//定时器溢出次数,表示蜂鸣器工作与否的变量
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//数码管的编码
voidinit();
voiddelay(uintz);
voiddisplay(uinttime);
voiddisplay_fen(uintfen);
voiddisplay_miao(uintmiao);
voiddisplay_num(uintnum);
voidkeyscan();
voiddelay1()
{;;}
voidstart()//开始信号
{
sda=1;
delay1();
scl=1;
delay1();
sda=0;
delay1();
}
voidstop()//停止
{
sda=0;
delay1();
scl=1;
delay1();
sda=1;
delay1();
}
voidrespons()//应答
{
uchari;
scl=1;
delay1();
while((sda==1)&&(i<250))i++;
scl=0;
delay1();
}
voidinit_I2C()
{
sda=1;
delay1();
scl=1;
delay1();
}
voidwrite_byte(uchardate)
{
uchari,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay1();
sda=CY;
delay1();
scl=1;
delay1();
//scl=0;
//delay1();
}
scl=0;
delay1();
sda=1;
delay1();
}
ucharread_byte()
{
uchari,k;
scl=0;
delay1();
sda=1;
delay1();
for(i=0;i<8;i++)
{
scl=1;
delay1();
k=(k<<1)|sda;
scl=0;
delay1();
}
returnk;
}
voidwrite_add(ucharaddress,uchardate)
{
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
}
ucharread_add(ucharaddress)
{
uchardate;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
returndate;
}
voidinit()
{
tt=0;//定时器0溢出次数
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256;//装入初值,设时钟频率12MHz
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
beep=1;//蜂鸣器初始不响
beepc=0;//初始蜂鸣器控制变量为0
}
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidtime0()interrupt1
{
TH0=(65536-50000)/256;//装入初值,设时钟频率12MHz
TL0=(65536-50000)%256;
tt++;
if(tt==2)
{
tt=0;
if(a==0)
time++;//多少个0.1
elseif(time!
=0)
time--;
elsetime=600;//当倒计时到0后开始一分钟倒计时
}
if((time%10)==0&&(time!
=0))
{
if(beepc==1)
{
beep=0;
delay(20);
beep=1;
}
}
}
voiddisplay(uinttime1)
{
ucharnum,miao,fen;//0.1秒,秒,分
uintfen1;
fen1=time1/10;
fen=fen1/60;
miao=fen1%60;
num=time1%10;
display_fen(fen);
display_miao(miao);
display_num(num);
}
voiddisplay_fen(ucharfen)
{
ucharshi,ge;
shi=fen/10;
ge=fen%10;
dula=1;
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay
(1);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay
(1);
}
voiddisplay_miao(ucharmiao)
{
ucharshi,ge;
shi=miao/10;
ge=miao%10;
dula=1;
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay
(1);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay
(1);
}
voiddisplay_num(ucharnum)
{
dula=1;
P0=table[num];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delay
(1);
}
voidkeyscan()
{
uchartime1,time2;
uintvar;
ucharb=100;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xee:
TR0=1;a=0;
break;
case0xde:
TR0=0;
time1=time/256;
time2=time%256;
write_add(23,time2);
delay(100);
write_add(24,time1);
delay(100);
break;
case0xbe:
time=0;
TR0=0;
TH0=(65536-50000)/256;//装入初值,设时钟频率12MHz
TL0=(65536-50000)%256;
break;
case0x7e:
if(beepc==0)
beepc=1;
else
beepc=0;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xed:
P1=0xff;
break;
case0xdd:
TR0=1;
a=1;
break;
case0xbd:
P1=0xff;
break;
case0x7d:
P1=0xff;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
}
///////////////////////////////////////////////////////////////////
voidmain()
{
init();
init_I2C();
time=read_add(24)*256+read_add(23);
while
(1)
{
keyscan();
display(time);
}
}