自动打铃控制器_第1页
自动打铃控制器_第2页
自动打铃控制器_第3页
自动打铃控制器_第4页
自动打铃控制器_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机课程设计第1章 引言单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。 单片机内部也用和电脑功能类似的模块,比如CPU,内存,并行总线,还有和硬盘作用相同的存储器件,不同的是它的这些部件性能都相对我们的家用电脑弱很多,不过价钱也是低的,一般不超过10元即可用它来做一些控制电器一类不是很复杂的工作足矣了。我们现在用的全自动滚筒洗衣机

2、、排烟罩、VCD等等的家电里面都可以看到它的身影!它主要是作为控制部分的核心部件。可以说,二十世纪跨越了三个“电”的时代,即电气时代、电子时代和现已进入的电脑时代。不过,这种电脑,通常是指个人计算机,简称PC机。它由主机、键盘、显示器等组成。还有一类计算机,大多数人却不怎么熟悉。这种计算机就是把智能赋予各种机械的单片机(亦称微控制器)。顾名思义,这种计算机的最小系统只用了一片集成电路,即可进行简单运算和控制。因为它体积小,通常都藏在被控机械的“肚子”里。它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。现在,这种单片机的使用领域已十分广泛,如产品未使用单片机或其它可编程逻辑

3、器件上智能控制、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词“智能型”,如智能型洗衣机等。今天我利用单片机控制学校的打铃系统,下面是我的设计思路第2章 设计要求用单片机、数字温度传感器、实时时钟芯片、点阵液晶模块设计一个简易的自动打铃系统,系统工作时,在LCD显示器的第一行用16×16点阵的汉字显示“自动打铃系统”,第二行显示当前时间,第三行显示当前温度值,在随后的四行显示一页最近的打铃时间,即将要打铃的时间用黑底白字显示,如果该页的最后一个时间打过铃后,自动翻页,将下一页的4个打铃时间显示出来;用户可以通

4、过按键修改当前时间或打铃时间;用户可以通过按指定键获知各键的功能。2.1 总体设计思想用TG12864B液晶模拟块设计一个简易的自动打铃系统,系统正常工作是,在LCD显示器的第一行用16*16的点阵的汉字显示“自动打铃系统”,第二行显示当前时间,第三行显示当前温度,在随后的四行显示一页的最近的打铃时间,即将要打铃的时间用黑底白字显示,如果该页的最后一个时间打过铃后,自动翻页,将下一个的4个打铃时间显示出来;用户可以通过按键修改当前时间或打铃时间。利用KDOWN键进入HELP功能;打铃时用音乐声代替。第3章 硬件电路设计分析:自动打铃系统的本质就是电子钟,如果当前的时间与打铃时间相同,就控制蜂鸣

5、器发出打铃声。虽然利用单片机本身的定时器也能够实现走时功能,但精度不够高,程序也比较复杂,而实时时钟芯片PCF8563能够轻松的解决以上问题。由于打铃时间可能多达数十个,如果用户设置完打铃时间后将其保存在片内RAM中,一旦断电或重新启动,打铃时间又必须重新设置,为此可利用串行E²PROM器件24C02来保存打铃时间。另外用4个按键来设置当前时间和打铃时间。系统正常工作时,按KDOWN键进入帮助菜单;按KSET键进入当前时间的设置,长按KSET键则进入打铃时间的设置;进入设置方式后,按KSET键移动光标,用黑底白字指示当前正在修改的时、分、秒,KINC,KDEC键分别对当前的修改对象加

6、、减1,如果是修改的打铃时间,用KDOWN键对下一个打铃时间进行设置,长按KSET键退出当前时间或打铃时间的设置方式,回到正常状态。电子钟是一个以“分”,“秒”显示于人的视觉器官的计时装置。它的计时周期为24小时,显示满刻度为23时59分59秒,另外应有校时功能和一些显示星期、报时、停电查看时间等附加功能。因此,一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”,“星期”计数器、校时电路、报时电路和振荡器组成。干电路系统由秒信号发生器、“时、分、秒、星期”计数器、译码器及显示器、校时电路、整点报时电路组成。秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用石英晶体振荡

7、器加分频器来实现。将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。“时计数器”采用24进制计时器,可实现对一天24小时的累计。每累计24小时,发出一个“星期脉冲”信号,该信号将被送到“星期计数器”,“星期计数器” 采用7进制计时器,可实现对一周7天的累计。译码显示电路将“时”、“分”、“秒”、“星期”计数器的输出状态送到七段显示译码器译码,通过七位LED七段显示器显示出来。整点报时电路时根据计时系统

8、的输出状态产生一脉冲信号,然后去触发一音频发生器实现报时。校时电路时用来对“时”、“分”、“秒”、“星期”显示数字进行校对调整的。 晶振用一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。在通常工作条件下,普通的晶振频率绝对精度可达百万分之五十。高级的精度更高。有些晶振还可以由外加电压在一定范围内调整频率,称为压控振荡器(VCO)晶体振荡器电路给数字钟提供一个频率稳定准确的32768Hz的方波信号,此外还有一校正电容可以对温度进行补偿,以提高频率准确度和稳定度,使稳定度优于10-4,可保证数字钟的走时准确及稳定,下面我画出硬件电路图C2R104.7KC3Y211

9、.0592MC4VCCVCCVCCP24P25P26P27K4K3K2K1R1VCCBL-20BL+19VEE18RES17CSB16CSA15D714D613D512D411D310D29D18D07E6R/W5D/I4VCC2VO3GND1LCD1LCD12864R84.7KQ1PNPVCCR982RB1BUZZERVCC3DQ2GND1DS1DS1820VCC8CLKOUT7/INT3SCL6SDA5OSCI1OSCO2GND4U4PCF8563R5R6R7C1A01A22A33WP7GND4VCC8SCL6SDA5U524C02Y132768RP18RESVCC40EA/VP31RES

10、ET9X218X119PSEN29WR16T115T014INT113P2728P2627P156P11/T2ALE/P30P0732P0633P0534P0435P0336P0237P0138P0039TXD11RXD10P2021P2122P2223P2324P2425P10/T1P2526P123P134P145P167P178RD17INT012GND20U1SST89E58RDR2R3R4SCLSDARSTENRWRSCS1CS2RSTCS1ENRWRSSPKVCCVCCCS2VCCINTDQ12USBCON2R11POT2硬件电路图3.1 PCB图PCB电路图3.2 程序流程图开

11、始初始化定时器T0初始化外部中断0 初始化液晶屏显示”自动打铃系统”显示当前时间显示当前温度发DS18B20复位命令发跳过ROM命令发启动温度转换命令发DS18B20复位命令发跳过ROM命令发读暂存器指令读取2字节的温度值将温度值转换为BCD码送显示缓存、调用显示程序24C02中的打铃时间有效?将打铃时间从24C02中至数组alatime中初始化PCF8563允许定是、报警中断写入当前时间显示当前温度显示1页最近打铃时间确定下一个要打铃的时间将其设为PCF8563的报警时间将其以黑底白字方式显示YYNKDOWN键按下翻页KINC键按下显示HELP功能修改打铃时间写入24C02修改当前时间写入P

12、CF8563KDOWN键按下KSET键按下KSET_LONG键按下PCF8563产生中断?从PCF8563读取当前时间,显示当前时间控制定时器T0产生方波将正在打铃时间以正常方式显示指向下一个打铃时间将其设为PCF8563的打铃时间将其以黑底白字方式显示音乐声是否结束?3.3 程序清单文件I2C.C的清单如下:#include <reg51.h> #include <intrins.h>#define uchar unsigned char #define delay1us() _nop_() #define delay5us() _nop_();_nop_();_no

13、p_();_nop_();_nop_() sbit SDA=P17; /P1.1模拟I2C总线的SDAsbit SCL=P16; /P1.0模拟I2C总线的SCLbit ack_mk; /应答标志位,有应答为1,无应答为0 void Start()/始信号/产生起 SDA=1; /将SDA、SCL置为1 SCL=1; delay5us(); /起始条件建立时间大于4.7us,故延时5us SDA=0; /SCL为高时,SDA由高变低,发送起始信号 delay5us(); /延时5us SCL=0; /SCL变低,准备发送或接收数据 void Stop() /产生停止信号 SDA=0; /将SD

14、A清0, SCL置1 SCL=1; delay5us();/结束条件建立时间大于4.7us,所以延时5us SDA=1; /当SCL为高电平时,SDA由低变高,产生结束信号 delay5us(); /延时5us SCL=0;void Ack(void) /产生应答信号 SDA=0; /SDA先清0,发应答信号 SCL=1; /SCL由低变高,产生一个时钟 delay5us(); /延时5us SCL=0; /时钟线SCL恢复到低电平,以便继续接收void NAck(void)/产生非应答信号 SDA=1; /SDA先置1,发非应答信号 SCL=1; /SCL由低变高,产生一个时钟 delay5

15、us(); /延时5us SCL=0; /时钟线SCL清恢复到低电平,以便继续接收 void SendByte(uchar c) /向I2C总线发送一个字节 uchar n ; for(n=0;n<8;n+) /一字节为8位,循环8次 if(c&0x80) SDA=1; /根据发送位将数据线SDA置为1或清0 else SDA=0; SCL=1; /置SCL为高,通知被控从机开始接收数据位 delay5us(); /延时5us SCL=0; /SCL变低电平,准备发送下一位数据 c=c<<1; /将下一位要发送的数据移到最高位,先高后低 delay5us(); /延时

16、5us SDA=1; /一字节发送完后释放数据线,准备接收应答位 delay5us(); SCL=1; /SCL由低变高,产生一个时钟,读取SDA的状态 delay5us(); /延时5us if (SDA=1) ack_mk=0; /如果SDA=1,则发送失败,将ack_mk清0 else ack_mk=1; /否则发送成功,将ack_mk置1 SCL=0;/SCL变低uchar RcvByte()/接收一个字节 uchar c; uchar n; for(n=0;n<8;n+) /一字节为8位,循环8次 SDA=1; /置数据线SDA为输入方式,进入接收方式 SCL=1; /SCL由

17、低变高,产生一个时钟 if (SDA=0) /根据数据线SDA的状态,将c的最高位清0或置1 c=c&0x7f; else c=c|0x80; c= _crol_(c,1); /将c循环左移一位,先接收高位,后接收低位 SCL=0; /时钟线SCL清0 return(c);/*从指定器的的子地址开始写入多个字节*/bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) uchar i; Start(); /启动总线 SendByte(sla); /*发送器件地址*/ if(ack_mk=0)return(0); SendByte(sub

18、a); /*发送器件子地址*/ if(ack_mk=0)return(0); for(i=0;i<no;i+) SendByte(*s); /*发送数据*/ if(ack_mk=0)return(0); s+; Stop(); /*结束总线*/ return(1);/*从指定器的的子地址开始读取多个字节*/bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no) uchar i; Start(); /*启动总线*/ SendByte(sla); /*发送器件地址*/ if(ack_mk=0)return(0); SendByte(suba);

19、 /*发送器件子地址*/ if(ack_mk=0)return(0); Start(); SendByte(sla+1); if(ack_mk=0)return(0); for(i=0;i<no-1;i+) *s=RcvByte(); /*发送数据*/ Ack(); /*发送就答位*/ s+; *s=RcvByte(); NAck(); /*发送非应位*/ Stop(); /*结束总线*/ return(1);文件LCD12864IO.C的清单如下:#include <reg51.h>#include <intrins.h>#include <absacc.

20、h>#define uchar unsigned char#define uint unsigned intsbitLCD_RST= P37;/液晶屏复位脚定义sbit DI=P34;/DI引脚定义sbit RW=P35;/RW引脚定义sbit CS=P33;/片选信号定义sbit EN=P36;/使能信号定义sbit RDY=P07;/对应状态信息中的BF位sfr LCD=0x80; /P0口作为数据口#defineLCD_DISPON 0x3f/ 打开LCD显示 #define LCD_STARTROW0xc0/ 设置起始行,可用LCD_STARTROW+x设置起始行(x<64

21、) #defineLCD_ADDRSTRY0xb8/ 页起始地址, 可用LCD_ADDRSTRX+x设置当前页(x<8)#defineLCD_ADDRSTRX0x40/ 列起始地址,可用LCD_ADDRSTRY+x设置当前列(x<64) #define CS1 0 /左半屏选择#define CS2 1 /右半屏选择/命令字cmd送左半屏(port=0)/右半屏(port=1)命令口voidLCD_WrCmd(bit port,uchar cmd) EN=0; CS=port; DI=0;/选择命令寄存器 RW=0; EN=1; LCD=cmd; /命令码送总线 EN=0;/数据w

22、rdata送左半屏(port=0)/右半屏(port=1)数据口void LCD_WrDat(bit port ,uchar wrdata) EN=0; CS=port; DI=1;/选择命令寄存器 RW=0; EN=1; LCD=wrdata; /命令码送总线 EN=0;/以filldata充填液晶屏void LCD_DispFill(uchar filldata) uchar x, y; LCD_WrCmd(CS1,LCD_STARTROW);/设置左半屏显示起始行为0 LCD_WrCmd(CS2,LCD_STARTROW);/设置右半屏显示起始行为0 for(y=0; y<8; y

23、+) /循环充填8页 LCD_WrCmd(CS1,LCD_ADDRSTRY+y);/ 设置左半屏页地址 LCD_WrCmd(CS1,LCD_ADDRSTRX); / 设置左半屏列地址 LCD_WrCmd(CS2,LCD_ADDRSTRY+y);/ 设置右半屏页地址 LCD_WrCmd(CS2,LCD_ADDRSTRX);/ 设置右半屏列地址 for(x=0; x<64; x+) /充填每页的64个单元(列) LCD_WrDat(CS1,filldata); LCD_WrDat(CS2,filldata); /液晶模块初始化void LCD_DispIni(void) uint i; LC

24、D_RST = 0; / 复位驱动芯片 for(i=0; i<500; i+); LCD_RST = 1; LCD_WrCmd(CS1,LCD_DISPON); / 打开显示 LCD_WrCmd(CS1,LCD_STARTROW); / 设置显示起始行为0 LCD_WrCmd(CS2,LCD_DISPON); LCD_WrCmd(CS2,LCD_STARTROW); LCD_DispFill(00);/ 清屏 LCD_WrCmd(CS1,LCD_ADDRSTRY+0);/ 设置页(字符行)地址 LCD_WrCmd(CS1,LCD_ADDRSTRX+0);/ 设置列地址 LCD_WrCmd

25、(CS2,LCD_ADDRSTRY+0); LCD_WrCmd(CS2,LCD_ADDRSTRX+0);/在液晶屏的cy(0-7)行、cx(0-15)列显示字符dispdatavoid LCD_DispChar(bit color,uchar cy, uchar cx, char dispdata) uchar code *pch; uchar i; bit port; cy = cy&0x07;/ 参数过滤 cx = cx&0x0f; pch = &ASCII_TAB(dispdata-0X20)*5; /指向字符起始列的点阵码 if( (cx&0x08) =

26、 0 )/ 列号cx<8,在左半屏显示 port=CS1; i=cx<<3; else port=CS2; i = (cx&0x07)<<3; LCD_WrCmd(port,LCD_ADDRSTRX+i);/ 设置当前列地址 LCD_WrCmd(port,LCD_ADDRSTRY+cy);/ 设置当前页地址 for(i=0; i<5; i+); /延时 if (color=0) LCD_WrDat(port,0x00);/ 显示一列空格 else LCD_WrDat(port,0xff);/ 显示一列空格 for(i=0; i<5; i+) /

27、送出字符的5列点阵码 if(color=0) LCD_WrDat(port,*pch); else LCD_WrDat(port,*pch); pch+; if (color=0) LCD_WrDat(port,0x00);/ 显示一列空格 else LCD_WrDat(port,0xff);/ 显示一列空格 for(i=0; i<5; i+); if (color=0) LCD_WrDat(port,0x00);/ 显示一列空格 else LCD_WrDat(port,0xff);/ 显示一列空格 /在液晶屏的cy(0-7)行、cx(0-15)列显示字符disp_strvoid LCD

28、_DispStr(bit color,uchar cy, uchar cx, char *disp_str) while( *disp_str != '0') cy = cy&0x07; / 参数过滤 cx = cx&0x0f; LCD_DispChar(color,cy, cx, *disp_str); / 显示字符 disp_str+;/ 指向下一字符数据 cx+; if(cx>15) cy+; / 指向下一显示行 /在液晶屏的cy(0-3)行、cx(0-7)列显示汉字字符dispdata void LCD_DispHZ(uchar cy, uchar

29、 cx, uchar dispdata) uchar code *pdat; uchar i,s,page; bit port; cy = cy&0x03;/ 参数过滤 cx = cx&0x07; pdat = &HZTABdispdata*32; if( (cx&0x04) = 0 )/ 如果在左半屏显示 port=0; s = cx<<4;/ 求出该汉字在屏幕上的起始列 else/在右半屏上显示 port=1; s = (cx<<4)-64;/ 求出该汉字在屏幕上的起始列 for(page=0;page<2;page+) /每个

30、汉字2页 LCD_WrCmd(port,LCD_ADDRSTRX+s);/ 设置当前列地址 LCD_WrCmd(port,LCD_ADDRSTRY+(cy<<1)+page);/ 设置当前页地址 for(i=0; i<5; i+); for(i=0; i<16; i+) /每个汉字16列 LCD_WrDat(port,*pdat);/ 发送数据 pdat+; for(i=0; i<5; i+); /在液晶屏的cy(0-3)行、cx(0-7)列显示汉字字符串disp_str void LCD_DispHZStr(uchar cy, uchar cx, uchar *

31、disp_str) while( *disp_str!=0xff) cy = cy&0x03;/ 参数过滤 cx = cx&0x07; LCD_DispHZ(cy, cx, *disp_str); / 显示汉字 disp_str+;/ 指向下一汉字 cx+;/列号加1 if(cx>7) cy+;/ 指向下一显示行 cx=0; void Help(void)Help2();while (1)k=GetKey();if(k=KINC)m+;if(m%2=0)Help2();else Help1();else if(k=KDOWN)break;bit reset(void) /

32、初始化DS18B20 bit err; DQ=0;/在数据线上产生600us的低电平 delay15(40); DQ=1;/数据线拉高 delay15(4);/延时60us err=DQ;/读取数据线状态,err=0:复位成功 delay15(18);/ err=1:复位失败 return(err); void wrbyte(uchar d)/向DS18B20写入一个字节 uchar i; dat=d; for(i=8;i>0;i-) /循环写8位(先低位,后高位) DQ=0; /产生15us的负脉冲 delay15(1); DQ=dat0;/将当前数据位送数据线 dat=dat>

33、>1;/将下一位要写入的数据移到最低位 delay15(1);/延时15us DQ=1; /数据线拉高,为写入下一位做准备 uchar rdbyte(void)/从DS18B20读取一个字节 uchar i; dat=0;/读出数据初值为0 for(i=8;i>0;i-) /循环读8位(先低位,后高位) dat=dat>>1; /读出数据先右移一位DQ=0; /产生1us的负脉冲_nop_(); DQ=1;/数据总线拉高 delay15(1); /延时15us dat7=DQ;/读取数据 delay15(4); /延时,为读下一位做准备 return(dat); voi

34、d late() /延时700ms uchar i; for(i=0;i<200;i+) delay15(200);void gettemp(void) int temp; uchar zf; uchar h,l; reset(); /复位所有DS18B20 wrbyte(0xcc); /跳过ROM wrbyte(0x44); /启动所有DS18B20转换 late(); /延时750ms reset(); / 复位 wrbyte(0xcc);/发跳过ROM命令 wrbyte(0xbe); /发读暂存器命令 l=rdbyte(); /读取温度低字节、高字节 h=rdbyte(); tem

35、p=h*256+l; zf=0; if(temp<0) /如果温度在0度以下 zf=1; /置负数标志 temp=-temp; /求补 dbuf4=dptemp&0x0f+0x30;/求出温度的小数 temp=temp>>4; dbuf0=temp/100+0x30;/求出百位 temp=temp%100; dbuf1=temp/10+0x30; /求出十位 dbuf2=temp%10+0x30; /求出个位dbuf3='.' if(zf=1) if(dbuf1='0') dbuf0=' ' dbuf1='-&#

36、39; else dbuf0='-' else if(dbuf0='0') if(dbuf1='0') dbuf1=' ' dbuf0=' ' ; dbuf5='C'LCD_DispStr(0,3,4,dbuf); 文件自动打铃系统.C的清单如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned int#define KSET 0xe0#define KSET_LONG 0xe1#define KINC 0

37、xd0#define KDEC 0xb0#define KDOWN 0x70#define AT24C02 0xa0#define PCF8563 0xa2extern bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no);extern bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no);extern void LCD_DispIni(void);extern void LCD_DispFill(uchar filldata);extern void LCD_DispChar(bit col

38、or,uchar cy,uchar cx,char dispdata);extern void LCD_DispStr(bit color,uchar cy,uchar cx,char *disp_str);extern void LCD_DispHZ(uchar cy,uchar cx,uchar dispdata);extern void LCD_DispHZStr(uchar cy,uchar cx,uchar *disp_str);extern void gettemp(void);extern void Help(void);sbit SOUND=P15;uchar th,tl;uc

39、har tiee;uint code tab1=64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217;/*uchar code tab3=0x42,0x82,0x82,0x82,0x84,0x02,0x72,0x62,/兰花草0x72,0x62,0x52,0x48,0xb2,0xb2,0xb2,0xb2,0xb4,0x02,0xa2,0x82,0xa2,0xA2,0x92,0x88,0x82,0xb2,0xb2,0xa2,0x84,0x02,0x

40、72,0x62,0x72,0x62,0x52,0x44,0x02,0x12,0x12,0x62,0x62,0x52,0x44,0x02,0x82,0x72,0x62,0x52,0x32,0x48,0x00;*/uchar code tab3=0x64,0x64,0xa4,0xa4,0xb4,0xb4,0xa4,/小星星0x94,0x94,0x84,0x84,0x74,0x74,0x64,0xa4,0xa4,0x94,0x94,0x84,0x84,0x74,0xa4,0xa4,0x94,0x94,0x84,0x84,0x74,0x64,0x64,0xa4,0xa4,0xb4,0xb4,0xa4,

41、0x94,0x94,0x84,0x84,0x74,0x74,0x64,0x00;uchar max3=24,60,60;uchar time3=05,50,55;uchar idata sbuf5;uchar hzmsg7=0,1,2,3,4,5,0xff;uchar idata alatime162=6,00,6,46,6,47,6,48,10,05,10,45,11,40,13,30,14,10,14,50,15,20,16,00,16,40,17,20,19,30,21,00;bit mk;void delay(uchar t)uchar i;while(t-)for(i=0;i<

42、250;i+);uchar HexBcd(uchar hex)return (hex/10)<<4)|(hex%10);uchar BcdHex(uchar bcd)uchar hex,hex1;hex=bcd&0x0f;hex1=(bcd>>4)*10;return (hex+hex1);uchar Locate(void) uchar n;n=0;while(n<16)if(time0<alatimen0)break;else if(time0=alatimen0)&&(time1<=alatimen1) break;n+;

43、if(n=16)n=0;return (n);void LCD_DispDat(bit color,uchar cy,uchar cx,char dat)uchar str3;str0=dat/10+0x30;str1=dat%10+0x30;str2=0;LCD_DispStr(color,cy,cx,str);uchar GetKey(void)uchar key;uchar t;if(key=P2&0xf0)=0xf0)return 0xff;for(t=0;t<5;t+)delay(5);if(key=P2&0xf0)=0xf0)return 0xff;while

44、(P2&0xf0)!=0xf0)delay(5);if(t<250)t+;if(t>100)&&(key=0xE0)return 0xE1; return key;void DispTime(void)LCD_DispDat(0,2,4,time0);LCD_DispChar(0,2,6,':');LCD_DispDat(0,2,7,time1);LCD_DispChar(0,2,9,':');LCD_DispDat(0,2,10,time2);void DispAla(bit color,uchar no)LCD_DispD

45、at(color,4+no%4,8,alatimeno0);LCD_DispChar(color,4+no%4,10,':');LCD_DispDat(color,4+no%4,11,alatimeno1);void DispPage(uchar page)uchar i;for(i=0;i<4;i+)LCD_DispChar(0,4+i,3,'(');LCD_DispDat(0,4+i,4,page*4+i+1);LCD_DispChar(0,4+i,6,')');DispAla(0,page*4+i);void ReadTime(void)IRcvStr(PCF8563,0X01,sbuf,4);time0=B

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论