江苏大学单片机课程设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

单片机课程实验报告班级J计算机1302学号4131110037姓名杨岚指导老师余景华2016.07.09一、多功能数字钟的设计要求:1.能在LED显示器上实现正常的时分秒计时2.能通过键盘输入当前时间,并从该时间开始计时3.有校时、校分功能4.有报时功能,通过指示灯表示5.有闹时功能,闹时时间可以设定,通过指示灯表示二、课程设计电路图:图1设计电路图•HD7279A的片选引脚CS连在P5.7;·通过C8051F020的P1.6、P1.7连接7279A的CLK和DATA实现串行数据编程;•KEY连在比较器1的同相输入端CP1P三、设计思路:根据课程设计要求,我们要设计一个多功能数字电子时钟,随着人类科技文明的发展,高精度、多功能、小体积、低功耗,是现代时钟发展的趋势。在这种趋势下,时钟的数字化、多功能化已经成为现代时钟生产研究的主导设计方向。本实验正是基于这种设计方向,以单片机(C8051F020)为控制核心,设计制作一个多功能的数字时钟。在这些当中,必须要求要有时钟功能、校时校分功能、整点报时和闹钟功能等。1.1首先要实现数码管的正常时分秒计时必须初始化系统时钟,初始化I/O端口以及定时器和使能比较器等,为系统的运行做必要的准备。1.2其次通过键盘输入当前时间并从当前时间开始计时,这个过程中搞清楚,通过键盘输入的数据送到了哪里,是通过什么样的方式送进去的,同时对时间的计时有一个严密的算法来控制。1.3在时间通过键盘输入并正常显示后,可以通过按键来进行校时、校分的功能。并显示出校正后的时间1.4通过按键实现闹钟功能,在设置闹钟的同时,原时间能确保正确行走。7279指令说明:88H,闪烁控制指令,d1-d8对应8个数码管,0表示闪烁,1表示不闪烁。开始输入按键(ABCD)输入按键(F)当达到整点时,A(校时的高位)F(输入闹钟)数码管闪烁3秒B(校时的低位)当当前时间与闹钟时间相等时,C(校分的高位)数码管闪烁2秒。D(校分的低位)图2功能模块图•输入按键A使得时钟的时高位加1,若时高位值超过2则返回0值。•输入按键B使得时钟的时低位加1,若时低位值超过9则返回0值同时时高位加1,最后判断时高位1且时低位3则时高位=0,时低位0。•输入按键C使得时钟的分高位加1,若分高位值超过5,则时低位加1,分高位至0。•输入按键D使得时钟的分低位加1,若分低位值超过9,则分高位加1,分低位至0。•输入按键E使得时钟的秒高位加1,若秒高位值超过5,则分低位加1,秒高位至0。•按键F进入闹钟模块。在键盘上输入时分秒进入校分校时功能进入校分校时功能进入闹钟功能四、程序的结构图否是图3主程序流程图开始关看门狗端口初始化定时器T0初始化使能比较器1开定时器0中断开总体中断复位7279在最右端数码管闪烁显示“—”从键盘上输入时间InputNum有效按键数码管更新显示DispValue校时校分模块整点报时模块闹钟功能返回显示时间五、具体功能模块的设计及实现:1、端口初始化:将允许SMBus、SPI0和UART0,使能交叉开关和弱上拉。实现代码:voidPORT_Init(void){XBR0=0x07;//允许SMBus、SPI0和UART0XBR1=0x00;XBR2=0x44;//使能交叉开关和弱上拉}2、定时器初始化将T0以方式一,系统时钟频率计数,1000个脉冲为一秒。实现代码:voidTimer0_Init(void){CKCON|=0x8;//T0按系统时钟频率计数TMOD|=0x1;//T0方式1Count1ms=10;TR0=0;//停止T0TH0=(-SYSCLK/1000)8;//定时1ms的时间常数TL0=-SYSCLK/1000;TR0=1;//启动T0IE|=0x2;//开T0中断}3、读取按键值首先需要判断是否按键,若未按键则返回-1,若按键则记录保存按键的值,将其放在keyvalue中保存。实现代码:unsignedcharGetKeyValue(void){unsignedcharKeyValue;if(CPT1CN&0x40)return-1;//if(P17==1)return-1;//无键按下Send7279Byte(0x15);//发读键盘命令KeyValue=Receive7279Byte();NOSELECT7279;returnKeyValue;}否是图4读取按键值流程图4、首次启动程序时输入初始时间首先在显示器上显示-,提示程序开始运行,其后将按键进来的六个数字依次保存在num中(若按键不是0-9则无效),然后再显示器上显示。实现代码:unsignedlongInputNum(void){unsignedlongNum=0;unsignedchari=0,KeyValue;DispLED(-,0);//输入提示FlashLED(0);//第一位闪烁Delay1s(1);while(1){KeyValue=GetKeyValue();是否按键发送读取读键盘命令接受键盘值将其保存在keyvalue中返回keyvalue值返回-1开始结束if(i==6)//6位数据输入完,返回{FlashLED(8);//关闪烁returnNum;}if((KeyValue=0)&&(KeyValue=9))//只接收十进制的0到9{i++;Send7279Byte(0xC8);//发送键码值,按方式1译码下载显示Send7279Byte(KeyValue);MoveLeft();//显示并左移一位,仍使低位显示并闪烁。Send7279Byte(0x90);Send7279Byte(0x01);NOSELECT7279;WaitKeyOff();Num*=10;//转换成十进制Num+=KeyValue;Delay1ms(200);}}}5、显示功能依次将小时的十位、个位,分钟的十位、个位,秒钟的十位、个位显示在显示器的相应LED上。实现代码:voidDispTime(void){Send7279Byte(0x85);//在最高位(第5位)LED显示小时的高位Send7279Byte(HourH);Send7279Byte(0x84);//在第4位LED显示小时的低位Send7279Byte(HourL);Send7279Byte(0x83);//在第3位LED显示分钟的高位Send7279Byte(MinuteH);Send7279Byte(0x82);//在第2位LED显示分钟的低位Send7279Byte(MinuteL);Send7279Byte(0x81);//在第1位LED显示秒钟的高位Send7279Byte(SecondH);Send7279Byte(0x80);//在第0位LED显示秒钟的低位Send7279Byte(SecondL);}图5显示功能流程图6、时钟计时功能每接受1000次脉冲,保存秒钟个位值的SecondL加一,判断如果SecondL9,则SecondL=0,SecondH加一。再判断SecondH是否大于5,若SecondH5,则SecondH=0,MinuteL加一。再判断MinuteL是否大于9,若MinuteL9,则MinuteL=0,MinuteH加一。再判断MinuteH是否大于5,若MinuteH5,则MinuteH=0,HourL加一。再判断HourL是否大于9,若HourL9,则HourL=0,HourH加一。再判断HourH是否大于2,若HourH2,则HourH=0。最后判断HourH1且HourL3则HourH=0,HourL=0。实现代码:SecondL++;if(SecondL9){SecondH++,SecondL=0;}if(SecondH5){SecondH=0,MinuteL++;}if(MinuteL9){MinuteH++,MinuteL=0;}if(MinuteH5){MinuteH=0,HourL++;}if(HourL9){HourH++;HourL=0;}if(HourH2)HourH=0;if(HourH1&HourL3){HourH=0,HourL=0;}在第5位LED显示小时的高位在第4位LED显示小时的低位在第3位LED显示分钟的高位在第2位LED显示分钟的低位在第1位LED显示秒钟的高位在第0位LED显示秒钟的低位开始从键盘输入时间并显示时钟计时秒低位大于9秒低位为0秒高位加1秒高位大于5分低位加1秒高位为0分低位大于9分低位为0分高位加1开始分高位大于5时低位加1分高位为0时低位大于9时低位为0时高位加1时高位大于时高位为0YNNYNYNYNYNY时高位大于1且时低位大于3时高位为0时低位为0结束7、校时校分功能根据按键来判断运行,若按键是A,则执行HourH+1的操作。若按键是B,则执行HourL+1的操作。若按键是C,则执行MinuteH+1操作。若按键是D,则执行MinuteL+1操作。若按键是E,则执行SecondH+1操作。实现代码:if(KeyValue==10){HourH++;}if(KeyValue==11){HourL++;}if(KeyValue==12){MinuteH++;}if(KeyValue==13){MinuteL++;}否是否是否是是图7校时校分功能流程图开始从键盘上输入校时校分KeyValue==10HourH++KeyValue==11HourL++KeyValue==12MinuteH++KeyValue==13MinuteL++8、整点报时功能在SecondL在0到3之间时并且SecondH=、MinuteL=0、MinuteH=0时显示器内容闪烁表示报时。SecondL超过3后取消闪烁,回复正常。实现代码if((SecondL=0&&SecondL=3)&SecondH==0&MinuteL==0&MinuteH==0){Send7279Byte(0x88);Send7279Byte(0x00);}if((SecondL3)&SecondH==0&MinuteL==0&MinuteH==0){FlashLED(8);}否是否图8整理报时功能流程图开始(SecondL=0&&SecondL=3)&SecondH==0&MinuteL==0&&MinuteH==0显示器内容闪烁SecondL3显示器闪烁取消9、闹钟功能在按键为F的时候进入闹钟模式。输入设定时间,系统保存设定的时间,并在计时的每秒上面与保存的时间进行比较,若一致,则显示器闪烁,时间暂停计时,表示闹钟。实现代码:KeyValue=GetKeyValue();if(KeyValue==15){SetTime=InputNum();NowTime[0]=(unsignedchar)((SetTime/100000)4);//时SetTime=SetTime%100000;NowTime[0]=NowTime[0]|(SetTime/10000);SetTime=SetTime%10000;NowTime[1]=(unsignedchar)((SetTime/1000)4);//分SetTime=SetTime%1000;NowTime[1]=NowTime[1]|(SetTime/100);SetTime=SetTime%100;NowTime[2]=(unsignedchar)((SetTime/10)4);//秒SetTime=SetTime%10;NowTime[2]=NowTime[2]|SetTime;S[0]=NowTime[0]/16;//转换成10进制S[1]=NowTime[0]%16;S[2]=NowTime[1]/16;S[3]=NowTime[1]%16;S[4]=NowTime[2]/16;S[5]=NowTime[2]%16;}if(SecondL==S[5]&&SecondH==S[4]&&MinuteL==S[3]&&Mi

1 / 24
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功