多功能秒表程序.docx

上传人:b****7 文档编号:9029364 上传时间:2023-02-02 格式:DOCX 页数:46 大小:21.37KB
下载 相关 举报
多功能秒表程序.docx_第1页
第1页 / 共46页
多功能秒表程序.docx_第2页
第2页 / 共46页
多功能秒表程序.docx_第3页
第3页 / 共46页
多功能秒表程序.docx_第4页
第4页 / 共46页
多功能秒表程序.docx_第5页
第5页 / 共46页
点击查看更多>>
下载资源
资源描述

多功能秒表程序.docx

《多功能秒表程序.docx》由会员分享,可在线阅读,更多相关《多功能秒表程序.docx(46页珍藏版)》请在冰豆网上搜索。

多功能秒表程序.docx

多功能秒表程序

#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)

{

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1