单片机数字钟课件_第1页
单片机数字钟课件_第2页
单片机数字钟课件_第3页
单片机数字钟课件_第4页
单片机数字钟课件_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

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

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

①程序整体结构清晰、简洁、流程合理,主程序尽4数字钟程序模块划分数字钟程序模块划分5各模块对应的函数声明如下:voiddisplay(unsignedchar*p);//6位LED扫描函数,指针p为显示数据区首地址unsignedcharkeytest();//测试键盘有无键按下unsignedcharsearch();//查键值函数voidalarm(); //闹钟判断启动函数voidftion0(); //时钟修改函数voidftion1(); //闹钟修改程序voidcum(); //增1程序voidclock()interrupt1; //中断函数,该函数无需声明各模块对应的函数声明如下:6C51程序与汇编语言程序变量定义对应关系

C51程序与汇编语言程序变量定义对应关系7C51程序与汇编语言程序变量定义对应关系C51程序与汇编语言程序变量定义对应关系8主程序框图主程序框图9C51程序源代码#pragmaSMALL#include"REG51.H"#include"absacc.h"//********************函数声明************************voiddisplay(unsignedchar*p); //6位LED扫描函数,指针p为显示数据 区首地址unsignedcharkeytest(); //测试键盘有无键按下unsignedcharsearch(); //键盘扫描程序voidalarm();//闹钟程序voidftion0();//时钟修改程序voidftion1();//闹钟修改程序voidcum();//增1程序C51程序源代码10//******************全局变量定义*******************unsignedcharclockbuf[3]={0,0,0};//存放时、分、秒的十进制数unsignedcharbellbuf[3]={0,0,0};//存放闹钟时、分、秒的十进制数unsignedcharmsec1,msec2;//msec1:10ms中断次数,msec2:1s循环次数unsignedchartimdata,rtimdata;//时钟和闹钟修改位置标志unsignedcharcount; //闹钟启动后10s计时单元unsignedchar*dis_p; //显示缓冲区指针unsignedcharfcount;//闪烁计数单元bitarmbit;//闹钟标志,armbit=0,闹钟没有设定;armbit=1,闹钟已设定bitrtimbit;//闹钟是否启动标志,rtimbit=1,闹钟已启动bitrhourbit;//闹钟小时修改标志,rhourbit=1,正在修改闹钟小时bitrminbit;//闹钟分修改标志,rminbit=1,正在修改闹钟分钟bithourbit;//时钟小时修改标志,hourbit=1,正在修改时钟小时bitminbit; //时钟分修改标志,minbit=1,正在修改时钟分钟bitsecbit; //时钟秒修改标志bitflash;//闪烁标志位sbitP10=P1^0;sbitP27=P2^7;//******************全局变量定义****11//******************主函数*******************main(){unsignedchara;armbit=0; //清零闹钟标识位bellbuf[0]=23; //设置闹钟单元初值bellbuf[1]=59;clockbuf[0]=23; //设置时钟单元初值clockbuf[1]=59;clockbuf[2]=59;msec1=0; //设置10ms中断次数初值msec2=0; //设置1s中断次数初值timdata=0; //时钟内容修改位置记忆单元清零rtimdata=0; //闹钟内容修改位置记忆单元清零count=0; //闹钟启动后保持10s计时单元清零fcount=0;//闪烁计数单元清零flash=0;//闪烁标志位清零

//******************主函数*******12

TMOD=0x12;//初始化定时器,定时器T0方式2,定时器T1方式1TL0=0x06; //定时250μs初始值TH0=0x06;TH1=0X3C;TL1=0XB0;EA=1; //中断允许控制断ET0=1; //定时器0开中断TR0=1; //启动定时器0dis_p=clockbuf; //将时钟值送入显示指针dis_p=1;

TMOD=0x12;//初始化定时器,定时器T0方式2,13

while(1){a=keytest();if(a==0x07){ //调用判别键入测试程序display(dis_p); //无键输入调用显示程序if(armbit==1)alarm();} //判别闹钟设定否,若设定了,则调闹钟程序else{display(dis_p); //调用显示程序作为延时去抖动a=keytest(); if(a!=0x07){ //没有抖动,则表示有键按下a=search(); //调用键号测试程序switch(a){case0x00:ftion0();break;//若是时钟参数修改功能键,则调用时钟修改程序case0x01:ftion1();break;//若是闹钟参数修改功能键,则调用闹钟设定程序case0x02:cum();break; //若是加1功能键,则调用加1修改程序default:break;}}}}}while(1){14单片机数字钟课件15//****************6位LED扫描函数***************voiddisplay(unsignedchar*p){unsignedcharbuffer[]={0,0,0,0,0,0};unsignedchark,i,j,m,temp;unsignedcharled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//0~9的显示码buffer[0]=p[0]/10; //将缓冲区中的数的十位和个位分开buffer[1]=p[0]%10;buffer[2]=p[1]/10;buffer[3]=p[1]%10;buffer[4]=p[2]/10;buffer[5]=p[2]%10;//****************6位LED扫描函数***16for(k=0;k<3;k++){temp=0x20;if(flash&secbit) {buffer[4]=10;buffer[5]=10;}if(flash&(minbit|rminbit)) {buffer[2]=10;buffer[3]=10;}if(flash&(hourbit|rhourbit)) {buffer[0]=10;buffer[1]=10;}for(i=0;i<6;i++){j=buffer[i]; P0=led[j]; //B口送段码P2=temp|0X80; //A口选位temp>>=1;for(m=0;m<50;m++); //每一位显示延时P2=0X80;//灭显示}}}for(k=0;k<3;k++){17单片机数字钟课件18//**************键盘测试函数***************unsignedcharkeytest(){unsignedcharc;P3=0XFF; c=P3;c=c&0x07;return(c);}//**************键盘测试函数********19单片机数字钟课件20//**********扫描键盘得到键值函数**********unsignedcharsearch(){unsignedchara,b,c,i;P3=0xff;a=P3&0x07;while(1){if(a==0x06){b=0;break;}//有s0键按下else{if(a==0x05){b=1;break;}//有s1键按下else{if(a==0x03){b=2;break;}//有s2键按下}}}

do{display(dis_p);}while((c=keytest())!=0x07);//等待键释放for(i=0;i<10;i++)display(dis_p);//延时消抖do{display(dis_p);}while((c=keytest())!=0x07);//等待键释放return(b);}//**********扫描键盘得到键值函数********21单片机数字钟课件22//*****************闹钟函数**************voidalarm(){P10=1;if((clockbuf[0]==bellbuf[0])&&(clockbuf[1]==bellbuf[1])){P10=0;rtimbit=1; //设置闹钟计时标志,时钟将进行10s计时

if(count==10) //判断闹钟保持10s时间到否{count=0; //清除闹钟保持10s计时P10=1; //清除闹钟armbit=0; //清闹钟标识,否则闹钟设置将继续保持有效rtimbit=0;}}

}//*****************闹钟函数*******23单片机数字钟课件24//*******************时钟修改函数*****************//voidftion0(){TR0=0; //关定时器rhourbit=0; //禁止闹钟时间参数修改,清闹钟修改标识rminbit=0;dis_p=clockbuf; //将时钟缓冲区首地址送显示指针rtimdata=0; //清闹钟修改位置标识记录timdata++; //将时钟修改记录值加1switch(timdata){case0x01:secbit=1;ET1=1;flash=1;TR1=1;break;//若记录值为1,则将时钟秒修改标识置1case0x02:secbit=0;minbit=1;break;//若记录值为2,则将时钟分修改标识置1case0x03:minbit=0;hourbit=1;break;//若记录值为3,则将时钟时修改标识置1casex04:timdata=0;hourbit=0;flash=0;ET1=0;TR1=0;TR0=1;break;

//若按4次,则清时钟单元修改位default:break;}}//*******************时钟修改函数***25单片机数字钟课件26//******************闹钟修改函数****************voidftion1(){secbit=0; //禁止时钟时间修改minbit=0;hourbit=0;dis_p=bellbuf;//设置闹钟显示标志timdata=0; //清时钟修改位置标识记录rtimdata++; //将闹钟修改记录值加1switch(rtimdata){case0x01:rminbit=1;flash=1;ET1=1;TR1=1;break;//若记录值为1,则将闹钟分修改标识置1case0x02:rminbit=0;rhourbit=1;break; //若记录值为2,则将时钟分修改标识置1case0x03:{rtimdata=0;rhourbit=0;//若按3次,则清闹钟单元修改位置记录flash=0;ET1=0;TR1=0;armbit=1; //设置闹钟已设定标志位dis_p=clockbuf; //恢复时钟显示标志break;}default:break;}}//******************闹钟修改函数****27单片机数字钟课件28//******************增1函数******************voidcum(){if(secbit==1){//若时钟秒修改标识为1,则秒单元内容加1if(clockbuf[2]==59)clockbuf[2]=0;elseclockbuf[2]++;}else{if(minbit==1){//若时钟分修改标识为1,则分单元加1if(clockbuf[1]==59)clockbuf[1]=0;elseclockbuf[1]++;}else{if(hourbit==1){//若时钟小时修改标识为1,则小时单元内容加1if(clockbuf[0]==23)clockbuf[0]=0;elseclockbuf[0]++;}else{if(rminbit==1){//若闹钟分修改标识为1,则分单元加1if(bellbuf[1]==59)bellbuf[1]=0;elsebellbuf[1]++;}else{if(rhourbit==1){//若闹钟小时修改标识为1,则小时单元加1if(bellbuf[0]==23)bellbuf[0]=0;elsebellbuf[0]++;}}}}}}//******************增1函数******29单片机数字钟课件30//*******************定时器0中断函数********************voidclock()interrupt1{EA=0; //关中断if(msec1!=40)msec1++; //到10ms否,不到则msec1加1else{msec1=0;if(msec2!=100)msec2++; //到1s否,不到则msec2加1else{if(rtimbit==1)count++;msec2=0;if(clockbuf[2]!=59)clockbuf[2]++; //到1min否,不到则clockbuf[2]加1else{clockbuf[2]=0;if(clockbuf[1]!=59)clockbuf[1]++;//到1h否,不到则clockbuf[1]加1else{clockbuf[1]=0;if(clockbuf[0]!=23)clockbuf[0]++;//到1min否,不到clockbuf[2]加1elseclockbuf[0]=0;}}}}EA=1; //开中断}//*******************定时器0中断函数*31单片机数字钟课件32经常不断地学习,你就什么都知道。你知道得越多,你就越有力量StudyConstantly,AndYouWillKnowEverything.TheMoreYouKnow,TheMorePowerfulYouWillBe写在最后经常不断地学习,你就什么都知道。你知道得越多,你就越有力量写33ThankYou在别人的演说中思考,在自己的故事里成长ThinkingInOtherPeople‘SSpeeches,GrowingUpInYourOwnStory讲师:XXXXXXXX年XX月XX日ThankYou34第3章数字钟系统设计本章主要内容一目的和要求二设计原则三各模块的设计四总调试和小结第3章数字钟系统设计本章主要内容35一设计目的和要求1目的:(1)掌握单片机硬件资源的合理运用。(2)掌握模块化程序设计的基本方法和设计过程。(3)比较汇编语言程序与C语言程序的不同。一设计目的和要求1目的:362要求:芯片:AT89C51;功能:设计完成具有计时、调时、调闹多种功能的产品化的电子钟:上电即开始计时,用S0实现设置/工作状态的转换;S1实现闹钟设置/工作状态的转换,S2实现时、分、秒的+1调整。用LED0—LED5实现时、分、秒的显示,修改“时”时,加到23后“清0”,再加1;修改“分”时,加到59后“清0”,再加1。2要求:37二设计原则

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

①程序整体结构清晰、简洁、流程合理,主程序尽38数字钟程序模块划分数字钟程序模块划分39各模块对应的函数声明如下:voiddisplay(unsignedchar*p);//6位LED扫描函数,指针p为显示数据区首地址unsignedcharkeytest();//测试键盘有无键按下unsignedcharsearch();//查键值函数voidalarm(); //闹钟判断启动函数voidftion0(); //时钟修改函数voidftion1(); //闹钟修改程序voidcum(); //增1程序voidclock()interrupt1; //中断函数,该函数无需声明各模块对应的函数声明如下:40C51程序与汇编语言程序变量定义对应关系

C51程序与汇编语言程序变量定义对应关系41C51程序与汇编语言程序变量定义对应关系C51程序与汇编语言程序变量定义对应关系42主程序框图主程序框图43C51程序源代码#pragmaSMALL#include"REG51.H"#include"absacc.h"//********************函数声明************************voiddisplay(unsignedchar*p); //6位LED扫描函数,指针p为显示数据 区首地址unsignedcharkeytest(); //测试键盘有无键按下unsignedcharsearch(); //键盘扫描程序voidalarm();//闹钟程序voidftion0();//时钟修改程序voidftion1();//闹钟修改程序voidcum();//增1程序C51程序源代码44//******************全局变量定义*******************unsignedcharclockbuf[3]={0,0,0};//存放时、分、秒的十进制数unsignedcharbellbuf[3]={0,0,0};//存放闹钟时、分、秒的十进制数unsignedcharmsec1,msec2;//msec1:10ms中断次数,msec2:1s循环次数unsignedchartimdata,rtimdata;//时钟和闹钟修改位置标志unsignedcharcount; //闹钟启动后10s计时单元unsignedchar*dis_p; //显示缓冲区指针unsignedcharfcount;//闪烁计数单元bitarmbit;//闹钟标志,armbit=0,闹钟没有设定;armbit=1,闹钟已设定bitrtimbit;//闹钟是否启动标志,rtimbit=1,闹钟已启动bitrhourbit;//闹钟小时修改标志,rhourbit=1,正在修改闹钟小时bitrminbit;//闹钟分修改标志,rminbit=1,正在修改闹钟分钟bithourbit;//时钟小时修改标志,hourbit=1,正在修改时钟小时bitminbit; //时钟分修改标志,minbit=1,正在修改时钟分钟bitsecbit; //时钟秒修改标志bitflash;//闪烁标志位sbitP10=P1^0;sbitP27=P2^7;//******************全局变量定义****45//******************主函数*******************main(){unsignedchara;armbit=0; //清零闹钟标识位bellbuf[0]=23; //设置闹钟单元初值bellbuf[1]=59;clockbuf[0]=23; //设置时钟单元初值clockbuf[1]=59;clockbuf[2]=59;msec1=0; //设置10ms中断次数初值msec2=0; //设置1s中断次数初值timdata=0; //时钟内容修改位置记忆单元清零rtimdata=0; //闹钟内容修改位置记忆单元清零count=0; //闹钟启动后保持10s计时单元清零fcount=0;//闪烁计数单元清零flash=0;//闪烁标志位清零

//******************主函数*******46

TMOD=0x12;//初始化定时器,定时器T0方式2,定时器T1方式1TL0=0x06; //定时250μs初始值TH0=0x06;TH1=0X3C;TL1=0XB0;EA=1; //中断允许控制断ET0=1; //定时器0开中断TR0=1; //启动定时器0dis_p=clockbuf; //将时钟值送入显示指针dis_p=1;

TMOD=0x12;//初始化定时器,定时器T0方式2,47

while(1){a=keytest();if(a==0x07){ //调用判别键入测试程序display(dis_p); //无键输入调用显示程序if(armbit==1)alarm();} //判别闹钟设定否,若设定了,则调闹钟程序else{display(dis_p); //调用显示程序作为延时去抖动a=keytest(); if(a!=0x07){ //没有抖动,则表示有键按下a=search(); //调用键号测试程序switch(a){case0x00:ftion0();break;//若是时钟参数修改功能键,则调用时钟修改程序case0x01:ftion1();break;//若是闹钟参数修改功能键,则调用闹钟设定程序case0x02:cum();break; //若是加1功能键,则调用加1修改程序default:break;}}}}}while(1){48单片机数字钟课件49//****************6位LED扫描函数***************voiddisplay(unsignedchar*p){unsignedcharbuffer[]={0,0,0,0,0,0};unsignedchark,i,j,m,temp;unsignedcharled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//0~9的显示码buffer[0]=p[0]/10; //将缓冲区中的数的十位和个位分开buffer[1]=p[0]%10;buffer[2]=p[1]/10;buffer[3]=p[1]%10;buffer[4]=p[2]/10;buffer[5]=p[2]%10;//****************6位LED扫描函数***50for(k=0;k<3;k++){temp=0x20;if(flash&secbit) {buffer[4]=10;buffer[5]=10;}if(flash&(minbit|rminbit)) {buffer[2]=10;buffer[3]=10;}if(flash&(hourbit|rhourbit)) {buffer[0]=10;buffer[1]=10;}for(i=0;i<6;i++){j=buffer[i]; P0=led[j]; //B口送段码P2=temp|0X80; //A口选位temp>>=1;for(m=0;m<50;m++); //每一位显示延时P2=0X80;//灭显示}}}for(k=0;k<3;k++){51单片机数字钟课件52//**************键盘测试函数***************unsignedcharkeytest(){unsignedcharc;P3=0XFF; c=P3;c=c&0x07;return(c);}//**************键盘测试函数********53单片机数字钟课件54//**********扫描键盘得到键值函数**********unsignedcharsearch(){unsignedchara,b,c,i;P3=0xff;a=P3&0x07;while(1){if(a==0x06){b=0;break;}//有s0键按下else{if(a==0x05){b=1;break;}//有s1键按下else{if(a==0x03){b=2;break;}//有s2键按下}}}

do{display(dis_p);}while((c=keytest())!=0x07);//等待键释放for(i=0;i<10;i++)display(dis_p);//延时消抖do{display(dis_p);}while((c=keytest())!=0x07);//等待键释放return(b);}//**********扫描键盘得到键值函数********55单片机数字钟课件56//*****************闹钟函数**************voidalarm(){P10=1;if((clockbuf[0]==bellbuf[0])&&(clockbuf[1]==bellbuf[1])){P10=0;rtimbit=1; //设置闹钟计时标志,时钟将进行10s计时

if(count==10) //判断闹钟保持10s时间到否{count=0; //清除闹钟保持10s计时P10=1; //清除闹钟armbit=0; //清闹钟标识,否则闹钟设置将继续保持有效rtimbit=0;}}

}//*****************闹钟函数*******57单片机数字钟课件58//*******************时钟修改函数*****************//voidftion0(){TR0=0; //关定时器rhourbit=0; //禁止闹钟时间参数修改,清闹钟修改标识rminbit=0;dis_p=clockbuf; //将时钟缓冲区首地址送显示指针rtimdata=0; //清闹钟修改位置标识记录timdata++; //将时钟修改记录值加1switch(timdata){case0x01:secbit=1;ET1=1;flash=1;TR1=1;break;//若记录值为1,则将时钟秒修改标识置1case0x02:secbit=0;minbit=1;break;//若记录值为2,则将时钟分修改标识置1case0x03:minbit=0;hourbit=1;break;//若记录值为3,则将时钟时修改标识置1casex04:timdata=0;hourbit=0;flash=0;ET1=0;TR1=0;TR0=1;break;

//若按4次,则清时钟单元修改位default:break;}}//*******************时钟修改函数***59单片机数字钟课件60//******************闹钟修改函数****************voidftion1(){secbit=0; //禁止时钟时间修改minbit=0;hourbit=0;dis_p=bellbuf;//设置闹钟显示标志timdata=0; //清时钟修改位置标识记录rtimdata++; //将闹钟修改记录值加1switch(rtimdata){case0x01:rminbit=1;flash=1;ET1=1;TR1=1;break;//若记录值为1,则将闹钟分修改标识置1case0x02:rminbit=0;rhourbit=1;break; //若记录值为2,则将时钟分修改标识置1case0x03:{rtimdata=0;rhourbit=0;//若按3次,则清闹钟单元修改位置记录flash=0;ET1=0;TR1=0;armbit=1; //设置闹钟已设定标志位dis_p=clockbuf;

温馨提示

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

评论

0/150

提交评论