1、多功能秒表程序#include /包含文件#include #define uchar unsigned char/对数据类型的宏定义#define uint unsigned int#define Hi 0/点阵代表Hi#define xin 4/点阵代表心形#define xiaol 5#define xiaolm 6sbit wei=P27;/数码管锁存允许定义sbit duan=P26;sbit xzhou=P30;/点阵锁存允许定义sbit yzhou=P31;sbit DS=P34;/温度传感器I/O口sbit SCL=P36;/EEPROM时钟sbit SDA=P37;/EEPR
2、OM数据uchar FM=0;/sbit FM=P32;/蜂鸣器定义sbit ZSD=P33;/指示灯定义sbit k1=P25;/定义六颗按键sbit k2=P24;sbit k3=P23;sbit k4=P22;sbit k5=P21;sbit k6=P20;uchar key1=1;/ 用于键盘扫描函数对六颗按键的识别uchar key2=2;uchar key3=3;uchar key4=4;uchar key5=5;uchar key6=6;uchar fen,miao,miaoxs,wd,nk1;uchar ntime;/ntime用于定时器中断函数累加到40表示百分之一秒ucha
3、r i,address,ndisplay,time_END,nk2,changci;/i 用于写入数据时地址连续相加,ndisplay用于显示某场比赛数据,time_END表示某场参加的人数uint temp;/整合两个字节的温度到一个变量float f_temp;uchar time32;/8人次数据uchar ye;/页unsigned char code tableduan=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/不带冒号编码unsigned char code tabled=0xbf,0x86,0xdb,0xcf,0xe6,
4、0xed,0xfd,0x87,0xff,0xef;/带冒号编码unsigned char code tablewei=0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/数码管位编码unsigned char code tablex=0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01;/点阵X轴编码,共阴极unsigned char code tabley=0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe;/点阵Y轴编码,共阳极void delay(uint);void dis
5、play(uchar,uchar,uchar,uchar);void leddiandisplay(uchar,uchar,ucahr);void leddisplay(uchar);uchar keyscan(uchar);void shortdelay(void);void IICinit(void);void start(void);void respons(void);void stop(void);void writebyte(uchar);uchar readbyte(void);void shortdelay(void)/IIC简短延时;void delay(uint xms)
6、/简单延时函数 uint i,j; for(i=xms;i0;i-) for(j=55;j0;j-);void dsreset(void) /温度传感器初始化 uint i; DS=0; i=103; while(i0)i-; DS=1; i=4; while(i0)i-;bit tmpreadbit(void) /读一位 uint i; bit dat; DS=0;i+; /i+ 用于延时 DS=1;i+;i+; dat=DS; i=8;while(i0)i-; return (dat);uchar tmpread(void) /读一个字节数据 uchar i,j,dat; dat=0; f
7、or(i=1;i=8;i+) j=tmpreadbit(); dat=(j1); /读出的数据最低位在最前面,这样刚好一个字节在DAT里 return(dat);void tmpwritebyte(uchar dat) /写一个字节 uint i; uchar j; bit testb; for(j=1;j1; if(testb) /写1 DS=0; i+;i+; DS=1; i=8;while(i0)i-; else DS=0; /写0 i=8;while(i0)i-; DS=1; i+;i+; void tmpchange(void) /发送温度转换指令。开始转换 dsreset(); d
8、elay(1); tmpwritebyte(0xcc); / 地址 tmpwritebyte(0x44); / 跳过寻址uint tmp() /获取温度 uchar a,b; dsreset(); delay(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); a=tmpread(); b=tmpread(); temp=b; temp4; display(fen,miao,miaoxs,wd);void start(void)/启动信号 SDA=1; shortdelay(); SCL=1; shortdelay(); SDA=0; shortdelay(
9、);void respons(void)/应答信号 uchar i=0; SCL=1; shortdelay(); while(SDA=1)&(i255) i+; SCL=0; shortdelay();void stop(void)/停止信号 SDA=0; shortdelay(); SCL=1; shortdelay(); SDA=1; shortdelay();void writebyte(uchar date)/写一个字节 uchar i,tempofdate; tempofdate=date; for(i=0;i8;i+) tempofdate=tempofdate1; SCL=0;
10、 shortdelay(); SDA=CY; shortdelay(); SCL=1; shortdelay(); SCL=0; shortdelay(); SDA=1; shortdelay(); shortdelay(); shortdelay();uchar readbyte(void)/读一个字节 uchar i,k; SCL=0; shortdelay(); SDA=1; for(i=0;i8;i+) SCL=1; shortdelay(); k=(k1)|SDA; SCL=0; shortdelay(); shortdelay(); return(k);void write_add
11、(uchar address,uchar date) start(); writebyte(0xa0);/寻芯片地址 respons(); writebyte(address); respons(); writebyte(date); respons(); stop();uchar read_add(uchar address) uchar date; start(); writebyte(0xa0); respons(); writebyte(address); respons(); start(); writebyte(0xa1); respons(); date=readbyte();
12、stop(); return(date);void display(uchar fen,uchar miao,uchar miaoxs,uchar wd)/数码管显示函数,4个参数,带冒号 uchar fenshi,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=
13、1; P0=tablewei1; wei=0; duan=1; P0=tableduanfenshi; duan=0; delay(1); wei=1; P0=tablewei2; wei=0; duan=1; P0=tabledfenge; duan=0; delay(1) wei=1; P0=tablewei3; wei=0; duan=1; P0=tableduanmiaoshi; duan=0; delay(1); wei=1; P0=tablewei4; wei=0; duan=1; P0=tableduanmiaoge; duan=0; delay(1); wei=1; P0=ta
14、blewei5; wei=0; duan=1; P0=tableduanmiaoxsshi; duan=0; delay(1);wei=1; P0=tablewei6; wei=0; duan=1; P0=tableduanmiaoxsge; duan=0; delay(1); wei=1; P0=tablewei7; wei=0; duan=1; P0=tableduanwdshi; duan=0; delay(1); wei=1; P0=tablewei8; wei=0; duan=1; P0=tableduanwdge; duan=0; delay(1);void nodisplay(u
15、char fen,uchar miao,uchar miaoxs,uchar wd)/数码管显示函数,4个参数。不带冒号 uchar fenshi,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=tablewei1; wei=0; duan=1; P0
16、=tableduanfenshi; duan=0; delay(1); wei=1; P0=tablewei2; wei=0; duan=1; P0=tableduanfenge; duan=0; delay(1); wei=1; P0=tablewei3; wei=0; duan=1; P0=tableduanmiaoshi; duan=0; delay(1); wei=1; P0=tablewei4; wei=0; duan=1; P0=tableduanmiaoge; duan=0; delay(1); wei=1; P0=tablewei5; wei=0; duan=1; P0=tab
17、leduanmiaoxsshi; duan=0; delay(1); wei=1; P0=tablewei6; wei=0; duan=1; P0=tableduanmiaoxsge; duan=0; delay(1); wei=1; P0=tablewei7; wei=0; duan=1; P0=tableduanwdshi; duan=0; delay(1); wei=1; P0=tablewei8; wei=0; duan=1; P0=tableduanwdge; duan=0; delay(1); void ddisplay(uchar x,uchar y)/8*8红绿双色点阵基本控制
18、函数(像素点控制) xzhou=1; P1=tablexx; xzhou=0; yzhou=1; P1=tableyy; yzhou=0; delay(1);/使用例子:leddiandisplay(5,5)表示点亮点X=5,Y=5void lddisplay(uchar tx)/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);
19、 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);
20、 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); ddi
21、splay(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); ddi
22、splay(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(
23、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);
24、uchar keyscan(uchar x)/键盘扫描函数。/调用方法为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); else return(0); else return(0); if(x=2) if(k2=0) delay(18); if(k2=0) while(!k2) ZSD=0; FM=0; dis
25、play(fen,miao,miaoxs,wd); lddisplay(nk1); ZSD=1; FM=1; return(1); else return(0); else return(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); else return(0); else return(0); if(x=4) if(k4=0) delay(18); if(k4=0) whi
26、le(!k4) ZSD=0; FM=0; display(fen,miao,miaoxs,wd); lddisplay(nk1); ZSD=1; FM=1; return(1); else return(0); else return(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); else return(0); else return(0); if(x=6) if(k6=0) delay(10); if(k6=0) while(!k6)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1