多功能秒表程序.docx
《多功能秒表程序.docx》由会员分享,可在线阅读,更多相关《多功能秒表程序.docx(46页珍藏版)》请在冰豆网上搜索。
![多功能秒表程序.docx](https://file1.bdocx.com/fileroot1/2023-2/2/41b1590d-f0c6-417f-ae30-08dc545fe18e/41b1590d-f0c6-417f-ae30-08dc545fe18e1.gif)
多功能秒表程序
#include//包含文件
#include
#defineucharunsignedchar//对数据类型的宏定义
#defineuintunsignedint
#defineHi0//点阵代表Hi
#definexin4//点阵代表心形
#definexiaol5
#definexiaolm6
sbitwei=P2^7;//数码管锁存允许定义
sbitduan=P2^6;
sbitxzhou=P3^0;//点阵锁存允许定义
sbityzhou=P3^1;
sbitDS=P3^4;//温度传感器I/O口
sbitSCL=P3^6;//EEPROM时钟
sbitSDA=P3^7;//EEPROM数据
ucharFM=0;//sbitFM=P3^2;//蜂鸣器定义
sbitZSD=P3^3;//指示灯定义
sbitk1=P2^5;//定义六颗按键
sbitk2=P2^4;
sbitk3=P2^3;
sbitk4=P2^2;
sbitk5=P2^1;
sbitk6=P2^0;
ucharkey1=1;//用于键盘扫描函数对六颗按键的识别
ucharkey2=2;
ucharkey3=3;
ucharkey4=4;
ucharkey5=5;
ucharkey6=6;
ucharfen,miao,miaoxs,wd,nk1;
ucharntime;//ntime用于定时器中断函数累加到40表示百分之一秒
uchari,address,ndisplay,time_END,nk2,changci;//i用于写入数据时地址连续相加,ndisplay用于显示某场比赛数据,time_END表示某场参加的人数
uinttemp;//整合两个字节的温度到一个变量
floatf_temp;
uchartime[32];//8人次数据
ucharye;//页
unsignedcharcodetableduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//不带冒号编码
unsignedcharcodetabled[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带冒号编码
unsignedcharcodetablewei[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管位编码
unsignedcharcodetablex[]={0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//点阵X轴编码,共阴极
unsignedcharcodetabley[]={0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//点阵Y轴编码,共阳极
voiddelay(uint);
voiddisplay(uchar,uchar,uchar,uchar);
voidleddiandisplay(uchar,uchar,ucahr);
voidleddisplay(uchar);
ucharkeyscan(uchar);
voidshortdelay(void);
voidIICinit(void);
voidstart(void);
voidrespons(void);
voidstop(void);
voidwritebyte(uchar);
ucharreadbyte(void);
voidshortdelay(void)//IIC简短延时
{;;;}
voiddelay(uintxms)//简单延时函数
{
uinti,j;
for(i=xms;i>0;i--)
for(j=55;j>0;j--);
}
voiddsreset(void)//温度传感器初始化
{
uinti;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
bittmpreadbit(void)//读一位
{
uinti;
bitdat;
DS=0;i++;//i++用于延时
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return(dat);
}
uchartmpread(void)//读一个字节数据
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
voidtmpwritebyte(uchardat)//写一个字节
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//写1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0;//写0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
voidtmpchange(void)//发送温度转换指令。
开始转换
{
dsreset();
delay
(1);
tmpwritebyte(0xcc);//地址
tmpwritebyte(0x44);//跳过寻址
}
uinttmp()//获取温度
{
uchara,b;
dsreset();
delay
(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp<<=8;//整合两字节温度数据
temp=temp|a;
returntemp;
}
voidwdfunc(void)//其实已将wd写入新,不要返回值即可
{
tmpchange();
wd=tmp()>>4;
display(fen,miao,miaoxs,wd);
}
voidstart(void)//启动信号
{
SDA=1;
shortdelay();
SCL=1;
shortdelay();
SDA=0;
shortdelay();
}
voidrespons(void)//应答信号
{
uchari=0;
SCL=1;
shortdelay();
while((SDA==1)&&(i<255))
{
i++;
}
SCL=0;
shortdelay();
}
voidstop(void)//停止信号
{
SDA=0;
shortdelay();
SCL=1;
shortdelay();
SDA=1;
shortdelay();
}
voidwritebyte(uchardate)//写一个字节
{
uchari,tempofdate;
tempofdate=date;
for(i=0;i<8;i++)
{
tempofdate=tempofdate<<1;
SCL=0;
shortdelay();
SDA=CY;
shortdelay();
SCL=1;
shortdelay();
}
SCL=0;
shortdelay();
SDA=1;
shortdelay();
shortdelay();
shortdelay();
}
ucharreadbyte(void)//读一个字节
{
uchari,k;
SCL=0;
shortdelay();
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
shortdelay();
k=(k<<1)|SDA;
SCL=0;
shortdelay();
}
shortdelay();
return(k);
}
voidwrite_add(ucharaddress,uchardate)
{
start();
writebyte(0xa0);//寻芯片地址
respons();
writebyte(address);
respons();
writebyte(date);
respons();
stop();
}
ucharread_add(ucharaddress)
{
uchardate;
start();
writebyte(0xa0);
respons();
writebyte(address);
respons();
start();
writebyte(0xa1);
respons();
date=readbyte();
stop();
return(date);
}
voiddisplay(ucharfen,ucharmiao,ucharmiaoxs,ucharwd)//数码管显示函数,4个参数,带冒号
{
ucharfenshi,fenge,miaoshi,miaoge,miaoxsshi,miaoxsge,wdshi,wdge;//分离出8位数据
fenshi=fen/10;
fenge=fen%10;
miaoshi=miao/10;
miaoge=miao%10;
miaoxsshi=miaoxs/10;
miaoxsge=miaoxs%10;
wdshi=wd/10;
wdge=wd%10;
wei=1;
P0=tablewei[1];
wei=0;
duan=1;
P0=tableduan[fenshi];
duan=0;
delay
(1);
wei=1;
P0=tablewei[2];
wei=0;
duan=1;
P0=tabled[fenge];
duan=0;
delay
(1)
wei=1;
P0=tablewei[3];
wei=0;
duan=1;
P0=tableduan[miaoshi];
duan=0;
delay
(1);
wei=1;
P0=tablewei[4];
wei=0;
duan=1;
P0=tableduan[miaoge];
duan=0;
delay
(1);
wei=1;
P0=tablewei[5];
wei=0;
duan=1;
P0=tableduan[miaoxsshi];
duan=0;
delay
(1);
wei=1;
P0=tablewei[6];
wei=0;
duan=1;
P0=tableduan[miaoxsge];
duan=0;
delay
(1);
wei=1;
P0=tablewei[7];
wei=0;
duan=1;
P0=tableduan[wdshi];
duan=0;
delay
(1);
wei=1;
P0=tablewei[8];
wei=0;
duan=1;
P0=tableduan[wdge];
duan=0;
delay
(1);
}
voidnodisplay(ucharfen,ucharmiao,ucharmiaoxs,ucharwd)//数码管显示函数,4个参数。
不带冒号
{
ucharfenshi,fenge,miaoshi,miaoge,miaoxsshi,miaoxsge,wdshi,wdge;//分离出8位数据
fenshi=fen/10;
fenge=fen%10;
miaoshi=miao/10;
miaoge=miao%10;
miaoxsshi=miaoxs/10;
miaoxsge=miaoxs%10;
wdshi=wd/10;
wdge=wd%10;
wei=1;
P0=tablewei[1];
wei=0;
duan=1;
P0=tableduan[fenshi];
duan=0;
delay
(1);
wei=1;
P0=tablewei[2];
wei=0;
duan=1;
P0=tableduan[fenge];
duan=0;
delay
(1);
wei=1;
P0=tablewei[3];
wei=0;
duan=1;
P0=tableduan[miaoshi];
duan=0;
delay
(1);
wei=1;
P0=tablewei[4];
wei=0;
duan=1;
P0=tableduan[miaoge];
duan=0;
delay
(1);
wei=1;
P0=tablewei[5];
wei=0;
duan=1;
P0=tableduan[miaoxsshi];
duan=0;
delay
(1);
wei=1;
P0=tablewei[6];
wei=0;
duan=1;
P0=tableduan[miaoxsge];
duan=0;
delay
(1);
wei=1;
P0=tablewei[7];
wei=0;
duan=1;
P0=tableduan[wdshi];
duan=0;
delay
(1);
wei=1;
P0=tablewei[8];
wei=0;
duan=1;
P0=tableduan[wdge];
duan=0;
delay
(1);
}
voidddisplay(ucharx,uchary)//8*8红绿双色点阵基本控制函数(像素点控制)
{
xzhou=1;
P1=tablex[x];
xzhou=0;
yzhou=1;
P1=tabley[y];
yzhou=0;
delay
(1);
}//使用例子:
leddiandisplay(5,5)表示点亮点X=5,Y=5
voidlddisplay(uchartx)//tx代表图形,编码一个图形前,先宏定义一下代表符号
{
if(tx==0)//编码"HI"
{
ddisplay(2,2);
ddisplay(2,5);
ddisplay(2,7);
ddisplay(3,2);
ddisplay(3,5);
ddisplay(3,7);
ddisplay(4,2);
ddisplay(4,5);
ddisplay(4,7);
ddisplay(5,2);
ddisplay(5,5);
ddisplay(5,3);
ddisplay(5,4);
ddisplay(6,2);
ddisplay(6,5);
ddisplay(6,7);
ddisplay(7,2);
ddisplay(7,5);
}
if(tx==1)//编码"1".
{
ddisplay(2,4);
ddisplay(2,5);
ddisplay(2,6);
ddisplay(3,5);
ddisplay(4,5);
ddisplay(5,5);
ddisplay(6,5);
ddisplay(7,5);
ddisplay(6,4);
}
if(tx==2)//编码"2"
{
ddisplay(2,3);
ddisplay(2,4);
ddisplay(2,5);
ddisplay(2,6);
ddisplay(3,3);
ddisplay(4,4);
ddisplay(5,5);
ddisplay(6,6);
ddisplay(6,3);
ddisplay(7,4);
ddisplay(7,5);
}
if(tx==3)//编码"3"
{
ddisplay(1,4);
ddisplay(1,5);
ddisplay(2,3);
ddisplay(2,6);
ddisplay(3,6);
ddisplay(4,4);
ddisplay(4,5);
ddisplay(4,6);
ddisplay(5,6);
ddisplay(6,3);
ddisplay(6,6);
ddisplay(7,4);
ddisplay(7,5);
}
if(tx==4)//编码心形
{
ddisplay(2,4);
ddisplay(2,5);
ddisplay(3,3);
ddisplay(3,4);
ddisplay(3,5);
ddisplay(3,6);
ddisplay(4,2);
ddisplay(4,3);
ddisplay(4,4);
ddisplay(4,5);
ddisplay(4,6);
ddisplay(4,7);
ddisplay(5,1);
ddisplay(5,2);
ddisplay(5,3);
ddisplay(5,4);
ddisplay(5,5);
ddisplay(5,6);
ddisplay(5,7);
ddisplay(5,8);
ddisplay(6,1);
ddisplay(6,2);
ddisplay(6,3);
ddisplay(6,4);
ddisplay(6,5);
ddisplay(6,6);
ddisplay(6,7);
ddisplay(6,8);
ddisplay(7,2);
ddisplay(7,3);
ddisplay(7,6);
ddisplay(7,7);
}
if(tx==5)
{
ddisplay(2,4);
ddisplay(2,5);
ddisplay(3,3);
ddisplay(3,6);
ddisplay(6,1);
ddisplay(6,3);
ddisplay(6,6);
ddisplay(6,8);
ddisplay(7,2);
ddisplay(7,7);
}
if(tx==6)
{
ddisplay(2,4);
ddisplay(2,5);
ddisplay(3,3);
ddisplay(3,6);
ddisplay(6,1);
ddisplay(6,2);
ddisplay(6,3);
ddisplay(6,6);
ddisplay(6,7);
ddisplay(6,8);
}
}
ucharkeyscan(ucharx)//键盘扫描函数。
//调用方法为keyscan(key1),当按下时,返回值为1,当未按下时,返回值为0.
{
if(x==1)
{
if(k1==0)
{
delay(18);
if(k1==0)
{
while(!
k1)
{
ZSD=0;
FM=0;
display(fen,miao,miaoxs,wd);
lddisplay(nk1);
}
ZSD=1;
FM=1;
return
(1);
}
elsereturn(0);
}
elsereturn(0);
}
if(x==2)
{
if(k2==0)
{
delay(18);
if(k2==0)
{
while(!
k2)
{
ZSD=0;
FM=0;
display(fen,miao,miaoxs,wd);
lddisplay(nk1);
}
ZSD=1;
FM=1;
return
(1);
}
elsereturn(0);
}
elsereturn(0);
}
if(x==3)
{
if(k3==0)
{
delay(18);
if(k3==0)
{
while(!
k3)
{
ZSD=0;
FM=0;
display(fen,miao,miaoxs,wd);
lddisplay(nk1);
}
ZSD=1;
FM=1;
return
(1);
}
elsereturn(0);
}
elsereturn(0);
}
if(x==4)
{
if(k4==0)
{
delay(18);
if(k4==0)
{
while(!
k4)
{
ZSD=0;
FM=0;
display(fen,miao,miaoxs,wd);
lddisplay(nk1);
}
ZSD=1;
FM=1;
return
(1);
}
elsereturn(0);
}
elsereturn(0);
}
if(x==5)
{
if(k5==0)
{
delay(18);
if(k5==0)
{
while(!
k5)
{
ZSD=0;
FM=0;
display(fen,miao,miaoxs,wd);
lddisplay(nk1);
}
ZSD=1;
FM=1;
FM=1;
ZSD=1;
return
(1);
}
elsereturn(0);
}
elsereturn(0);
}
if(x==6)
{
if(k6==0)
{
delay(10);
if(k6==0)
{
while(!
k6)
{