单片机 数字钟课件.ppt

上传人:小飞机 文档编号:1552718 上传时间:2022-12-04 格式:PPT 页数:33 大小:545KB
返回 下载 相关 举报
单片机 数字钟课件.ppt_第1页
第1页 / 共33页
单片机 数字钟课件.ppt_第2页
第2页 / 共33页
单片机 数字钟课件.ppt_第3页
第3页 / 共33页
单片机 数字钟课件.ppt_第4页
第4页 / 共33页
单片机 数字钟课件.ppt_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《单片机 数字钟课件.ppt》由会员分享,可在线阅读,更多相关《单片机 数字钟课件.ppt(33页珍藏版)》请在三一办公上搜索。

1、第3章 数字钟系统设计,本章主要内容一目的和要求二设计原则三 各模块的设计四 总调试和小结,一 设计目的和要求,1 目的:(1) 掌握单片机硬件资源的合理运用。(2) 掌握模块化程序设计的基本方法和设计过程。(3) 比较汇编语言程序与C语言程序的不同。,2 要求:芯片:AT89C51;功能:设计完成具有计时、调时、调闹多种功能的产品化的电子钟:上电即开始计时,用S0实现设置/工作状态的转换;S1 实现闹钟设置/工作状态的转换,S2实现时、分、秒的+1调整。用LED0LED5实现时、分、秒的显示,修改“时”时,加到23后“清0”,再加1;修改“分”时,加到59后“清0”,再加1。,二设计原则,

2、程序整体结构清晰、简洁、流程合理,主程序尽可能简单明了。 各种功能的实现应采用模块化、子程序化,以便于编制、阅读、连接、移植、修改和调试。 对各函数功能、参数及返回值类型等要明确,以便于分析调试。 程序存储区、数据存储区、寄存器区、位寻址区、堆栈区应规划合理,做到既节约资源又不会发生相互间的冲突。 运行状态标志化管理,对各功能程序的运行结果、操作状态应设置状态标志,以便查询和实现运行控制。* 运用软件或软硬件相结合等方法抑制干扰,提高系统的抗干扰能力。* 必要时可结合硬件采取加密措施。,数字钟程序模块划分,各模块对应的函数声明如下: void display(unsigned char *p)

3、; / 6位LED扫描函数,指针p为显示数据区 首地址 unsigned char keytest( ); / 测试键盘有无键按下 unsigned char search( ); / 查键值函数 void alarm(); / 闹钟判断启动函数 void ftion0(); / 时钟修改函数 void ftion1(); / 闹钟修改程序 void cum(); / 增1程序 void clock() interrupt 1; / 中断函数,该函数无需声明,C51程序与汇编语言程序变量定义对应关系,C51程序与汇编语言程序变量定义对应关系,主程序框图,C51程序源代码#pragma SMAL

4、L#include REG51.H#include absacc.h/*函数声明*void display(unsigned char *p); / 6位LED扫描函数,指针p为显示数据区首地址unsigned char keytest(); / 测试键盘有无键按下unsigned char search(); / 键盘扫描程序void alarm(); / 闹钟程序void ftion0(); / 时钟修改程序void ftion1(); / 闹钟修改程序void cum(); / 增1程序,/*全局变量定义*unsigned char clockbuf3=0,0,0; / 存放时、分、秒的

5、十进制数unsigned char bellbuf3=0,0,0; / 存放闹钟时、分、秒的十进制数unsigned char msec1,msec2; / msec1:10 ms中断次数, msec2:1 s循 环次 数unsigned char timdata,rtimdata; / 时钟和闹钟修改位置标志unsigned char count; / 闹钟启动后10 s计时单元unsigned char *dis_p; / 显示缓冲区指针unsigned char fcount; /闪烁计数单元bit armbit; / 闹钟标志, armbit=0, 闹钟没有设 定;armbit=1,闹

6、钟已设定bit rtimbit; / 闹钟是否启动标志,rtimbit=1,闹钟已启动 bit rhourbit; / 闹钟小时修改标志,rhourbit=1,正在修改闹钟小时bit rminbit; / 闹钟分修改标志,rminbit=1,正在修改闹钟分钟bit hourbit; / 时钟小时修改标志,hourbit=1,正在修改时钟小时bit minbit; / 时钟分修改标志,minbit=1,正在修改时钟分钟bit secbit; / 时钟秒修改标志bit flash; /闪烁标志位sbit P10=P10;sbit P27=P27;,/*主函数*main( ) unsigned ch

7、ar a; armbit=0; / 清零闹钟标识位 bellbuf0=23; / 设置闹钟单元初值 bellbuf1=59; clockbuf0=23;/ 设置时钟单元初值 clockbuf1=59; clockbuf2=59; msec1=0; / 设置10 ms中断次数初值 msec2=0; / 设置1 s中断次数初值 timdata=0; / 时钟内容修改位置记忆单元清零 rtimdata=0; / 闹钟内容修改位置记忆单元清零 count=0; / 闹钟启动后保持10 s计时单元清零 fcount=0; /闪烁计数单元清零 flash=0; /闪烁标志位清零,TMOD=0 x12;/

8、初始化定时器,定时器T0方式2,定时器T1方式1 TL0=0 x06; / 定时250 s初始值 TH0=0 x06; TH1=0X3C; TL1=0XB0; EA=1; / 中断允许控制断 ET0=1; / 定时器0开中断 TR0=1; / 启动定时器0 dis_p=clockbuf; / 将时钟值送入显示指针dis_p=1;,while(1) a=keytest(); if(a=0 x07) / 调用判别键入测试程序 display(dis_p); / 无键输入调用显示程序 if(armbit=1) alarm(); / 判别闹钟设定否,若设定了,则调闹 钟程序 else display(

9、dis_p); / 调用显示程序作为延时去抖动 a=keytest(); if(a!=0 x07) / 没有抖动,则表示有键按下 a=search(); / 调用键号测试程序 switch (a) case 0 x00:ftion0();break; / 若是时钟参数修改功能键,则调用时 钟修改程序 case 0 x01:ftion1();break; / 若是闹钟参数修改功能键, 则调用闹钟设定程序 case 0 x02:cum();break; / 若是加1功能键,则调用加1修改程序 default:break; ,/*6位LED扫描函数*void display(unsigned cha

10、r *p) unsigned char buffer=0,0,0,0,0,0; unsigned char k,i,j,m,temp; unsigned char led=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8, 0 x80,0 x90,0 xff; / 09的显示码 buffer0=p0/10; / 将缓冲区中的数的 十 位和个位分开 buffer1=p0%10; buffer2=p1/10; buffer3=p1%10; buffer4=p2/10; buffer5=p2%10;,for(k=0;k=1; for(m=0;m50;m+

11、); / 每一位显示延时 P2=0X80; /灭显示 ,/*键盘测试函数*unsigned char keytest() unsigned char c; P3=0XFF; c=P3; c=c ,/*扫描键盘得到键值函数*unsigned char search() unsigned char a,b,c,i; P3=0 xff; a=P3 ,/*闹钟函数* void alarm() P10=1; if(clockbuf0=bellbuf0) ,/*时钟修改函数*/void ftion0() TR0=0; / 关定时器 rhourbit=0; / 禁止闹钟时间参数修改,清闹钟修改标识 rmin

12、bit=0; dis_p=clockbuf; / 将时钟缓冲区首地址送显示指针 rtimdata=0; / 清闹钟修改位置标识记录 timdata+; / 将时钟修改记录值加1 switch (timdata) case 0 x01:secbit=1;ET1=1;flash=1;TR1=1;break; / 若记录值为1,则 将时钟秒修改标识置1 case 0 x02:secbit=0;minbit=1;break; / 若记录值为2,则将时钟分修改标 识置1 case 0 x03:minbit=0;hourbit=1;break; / 若记录值为3,则将时钟时修改 标识置1 case x04

13、:timdata=0;hourbit=0;flash=0;ET1=0;TR1=0;TR0=1;break; / 若按4次,则清时钟单元修改位 default:break; ,/*闹钟修改函数*void ftion1()secbit=0; / 禁止时钟时间修改 minbit=0; hourbit=0; dis_p=bellbuf; / 设置闹钟显示标志 timdata=0; / 清时钟修改位置标识记录 rtimdata+; / 将闹钟修改记录值加1 switch (rtimdata) case 0 x01:rminbit=1;flash=1;ET1=1;TR1=1;break; / 若记录值为

14、1,则将闹钟分修改标识置1 case 0 x02:rminbit=0;rhourbit=1;break; / 若记录值为2,则将时 钟分修改标识置1 case 0 x03:rtimdata=0;rhourbit=0; / 若按3次,则清闹钟单元修改 位置记录 flash=0; ET1=0; TR1=0; armbit=1; / 设置闹钟已设定标志位 dis_p=clockbuf; / 恢复时钟显示标志 break; default:break; ,/*增1函数*void cum() if(secbit=1) / 若时钟秒修改标识为1,则秒单元内容加1 if(clockbuf2=59)clock

15、buf2=0; else clockbuf2+; else if(minbit=1)/ 若时钟分修改标识为1,则分单元加1 if(clockbuf1=59)clockbuf1=0; else clockbuf1+; else if(hourbit=1)/ 若时钟小时修改标识为1,则小时单元内容加1 if(clockbuf0=23)clockbuf0=0; else clockbuf0+; else if(rminbit=1)/ 若闹钟分修改标识为1,则分单元加1 if(bellbuf1=59)bellbuf1=0; else bellbuf1+; else if(rhourbit=1)/ 若闹

16、钟小时修改标识为1,则小时单元加1 if(bellbuf0=23)bellbuf0=0; else bellbuf0+; ,/*定时器0中断函数*void clock() interrupt 1 EA=0; / 关中断 if(msec1!=40)msec1+; / 到10 ms否,不到则msec1加1 else msec1=0; if(msec2!=100)msec2+; / 到1 s否,不到则msec2加1 else if(rtimbit=1)count+; msec2=0; if(clockbuf2!=59)clockbuf2+; / 到1 min否,不到则clockbuf2加1 else clockbuf2=0; if(clockbuf1!=59)clockbuf1+; / 到1 h否,不到则clockbuf1加1 else clockbuf1=0; if(clockbuf0!=23)clockbuf0+; / 到1 min否,不到clockbuf2加1 else clockbuf0=0; EA=1; /开中断,void fla() interrupt 3TH1=0X3C; TL1=0XB0; fcount+; if (fcount=5) fcount=0;flash=!flash; ,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号