1长沙学院单片机技术和应用课程设计说明书题目:学校作息时间系统的设计系部:电信系专业:电气信息工程姓名:唐玉红学号:2008044121指导老师:王新辉刘辉谢明华起止时间:2010.12.20—12.312系(部):电子与通信工程系专业:08级电子信息工程指导教师:王新辉、刘辉、谢明华课题名称学校作息时间系统的设计设计内容及要求(1)课题内容:以单片机为核心,设计一个智能化作息时间控制器。该控制器要求的功能有:按本校作息时间接通/断开电铃(以蜂鸣器代替);并用液晶屏显示时钟(可以用数码管显示)。作息时间控制器常用于学校教学楼的时间控制,利用单片机内部定时器实现时间基准定时,显示的内容要求有时、分、秒各两位(数码管显示可以不显示秒),并能调节小时和分钟。(2)要求:完成该系统的硬件和软件的设计,在Proteus软件上仿真通过后,下载到单片机进行硬件验证。最后就课程设计本身提交一篇课程设计说明书。设计工作量1、汇编或C51语言程序设计;2、程序调试;3、在Proteus上进行仿真成功后,进行下载硬件实物验证;4、提交一份完整的课程设计说明书,包括封面,中文摘要,目录,正文(正文主要包括:设计原理、程序设计、程序分析、仿真分析、调试过程,调试结果等部分),参考文献、设计总结等。进度安排起止日期(或时间量)设计内容(或预期目标)备注第一天课题介绍,答疑,收集材料,C51介绍第二天设计方案论证,练习编写C51程序第三天~第六天程序设计第六天~第八天程序调试、仿真第九天~第十天系统测试并编写设计说明书教研室意见年月日系(部)主管领导意见年月日3长沙学院课程设计鉴定表姓名唐玉红学号2008044121专业08电子班级一班设计题目学校作息时间系统的设计指导教师王新辉、刘辉、谢明华指导教师意见:评定等级:教师签名:日期:答辩小组意见:评定等级:答辩小组长签名:日期:教研室意见:教研室主任签名:日期:系(部)意见:系主任签名:日期:说明课程设计成绩分“优秀”、“良好”、“及格”、“不及格”四类;4目录一、设计说明……………………………………5二、硬件设计……………………………………5三、程序设计……………………………………51、使用方法………………………………52、基本原理………………………………63、程序清单………………………………64、仿真测试………………………………11四、经验总结……………………………………11五、参考文献……………………………………125一、设计说明:(1)课题内容:以单片机为核心,设计一个智能化作息时间控制器。该控制器要求的功能有:按本校作息时间接通/断开电铃(以蜂鸣器代替);并用液晶屏显示时钟(可用数码管显示)。作息时间控制器常用于学校教学楼的时间控制,利用单片机内部定时器实现时间基准定时,显示的内容要求有时、分、秒各两位(用数码管可以不显示秒),并能调节小时和分钟。(2)要求:完成该系统的硬件和软件的设计,在Proteus软件上仿真通过后,下载到单片机进行硬件验证。最后就课程设计本身提交一篇课程设计说明书二、硬件设计如下图所示。单片机P3.3~P3.5与三个按钮连接,起分别控制秒钟、分钟和时钟,P2.6与led灯相连代替喇叭,到一定时间灯亮,P1.0~P1.7接数码管,控制数码管数字的形成,P2.0~P2.3接数码管的控制端,控制数码管的显示。三、程序设计1、使用方法接通电源后,程序开始工作,数码管“0000”并开始计时。(1)设置现在时间按s-set键设置现在的秒钟调整,按一下秒钟加一;按m-set键设置现在的分钟调整,按一下分钟加一;h-set按键设置小时的调整,按一下小时加一。小时超过24小时时自动跳为0,当分钟超过60时自动跳到0(2)设置作息时间6在程序中嵌入了我们学校的一套作息时间。(3)电铃的响停Proteus仿真运行时会自动判断是否到了打铃时间即灯亮的时间,每一次亮灯时时间为10s过了十秒之后自动熄灭。2、基本原理用独立式按键来实现分钟、小时、秒钟的可调,用中断和动态显示的方法时间数码管上时间的显示,用查询的方法在程序中嵌入一套作息时间系统。3、程序清单//硬件连接:段选码P1.0~P1.7(a,b,c,d,e,f,g,h,dp),位选码P2.0~P2.3(高到低)//K1--P3.5;K2--P3.4;K3--P3.3;K4--P3.2#includereg51.h#defineucharunsignedchar#defineuintunsignedint#defineHidden0x10;//消隐字符在字形码中的位置ucharcodeBitTab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};ucharcodeDispTab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};ucharDispBuf[6];//6字节的显示缓冲区//ucharminutevalue;bitSec;//1s到的标记bitMinute;//1m到的标记bitHour;//1h到的标记bitH_up;bitH_down;bitM_up;bitM_down;sbitP2_7=P2^7;//周期测试位sbitp2_6=P2^6;//测试位voidmDelay(unsignedintDelay);ucharled_alarm;//闹铃leducharSecValue;//秒计数ucharMinuteValue;//分计数ucharHourValue;//时计数ucharcodeTH0Val=63075/256;ucharcodeTL0Val=63075%256;//晶振为12M,定时2.5ms定时器初值(计算值为63036,校准值为63075)voidalarm()7{//if((minutevalue==0)&&(secvalue==0)&&(hourvalue==8))if((MinuteValue==5)&&(SecValue==0)&&(HourValue==8)){//p2_6=1;//mDelay(10000);//p2_6=0;led_alarm=1;}}voidTimer0()interrupt1{uchartmp;staticuchardCount;//计数器,显示程序通过它得知现在显示那个数码管staticuintCount;//秒计数器constuintCountNum=400;//预置值(400*2.5ms=1minute)P2_7=!P2_7;//外部测试位,用于调整定时器初值TH0=TH0Val;TL0=TL0Val;tmp=BitTab[dCount];//根据当前的计数值取位值P2=P2|0x3f;//P2与00111111相或,将低6位置1P2=P2&tmp;//P2与取出的值相与,将某一位清0tmp=DispBuf[dCount];//根据当前的计数值,取显示缓冲区的待显示值tmp=DispTab[tmp];//取字形码P1=tmp;//送出字形码dCount++;//计数值加1if(dCount==6)//如果计数值为6,归0dCount=0;//以下为秒计数Count++;//计数值加1if(Count=CountNum)//到达预置计数值{Count=0;//清零Sec=1;//置1秒到标志位8SecValue++;//秒值加1if(SecValue=60){SecValue=0;Minute=1;//置1分到标志位MinuteValue++;//分值加1}if(MinuteValue=60){Hour=1;//置1小时到标志位MinuteValue=0;HourValue++;//小时值加1}if((((HourValue==8)&&(MinuteValue==0))||((HourValue==8)&&(MinuteValue==45)))&&(SecValue=10)){p2_6=0;}elsep2_6=1;}}voidInit(){TMOD=0x01;TH0=TH0Val;TL0=TL0Val;ET0=1;//开T0中断EA=1;//开总中断TR0=1;//T0开始运行}voidmDelay(unsignedintDelay)//延时程序,用于键盘消抖{unsignedinti;for(;Delay0;Delay--){for(i=0;i124;i++){;}}}ucharKey()//键盘程序,获得键值{ucharKValue;9uchartmp;P3|=0x3c;//将P3口接键盘的4位置1KValue=P3;KValue|=0xc3;//将未接的四位置1if(KValue==0xff)//中间4位均为1,无键按下return(0);//返回mDelay(10);//延时10mS消抖KValue=P3;KValue|=0xc3;//再次读键盘if(KValue==0xff)return(0);for(;;){tmp=P3;if((tmp|0xc3)==0xff)//等待按键释放break;}return(KValue);}voidKProce(ucharKValue)//键值处理程序{if((KValue&0x20)==0)//K1H_up=1;if((KValue&0x10)==0)//K2H_down=1;if((KValue&0x08)==0)//K3M_up=1;if((KValue&0x04)==0)//K4M_down=1;}voidmain(){ucharKValue;//存放键值//p2_6=0;if((MinuteValue==5)&&(SecValue==0)&&(HourValue==0)){p2_6=0;}Init();//初始化//alarm();DispBuf[4]=SecValue/10;DispBuf[5]=SecValue%10;for(;;){DispBuf[2]=MinuteValue/10;10DispBuf[3]=MinuteValue%10;DispBuf[0]=HourValue/10;DispBuf[1]=HourValue%10;if(Sec)//1s时间到{DispBuf[4]=SecValue/10;DispBuf[5]=SecValue%10;if(DispBuf[4]==0)//DispBuf[4]=Hidden;//高位0消隐Sec=0;//清除1s到标志位}if(Minute){if(DispBuf[2]==0)//DispBuf[2]=Hidden;//高位0消隐Minute=0;//清除1m到标志位}if(Hour){if(DispBuf[0]==0)//DispBuf[0]=Hidden;//高位0消隐Hour=0;//清除1h到标志位}KValue=Key();//调键盘程序获得键值if(KValue)//该值不等于0{KProce(KValue);//调键盘处理程序}if(H_up)//小时值调整{HourValue++;if(HourValue=24){HourValue=0;}H_up=0;}if(H_down){HourValue--;H_down=0;}if(M_up)//分值调整{MinuteValue++;if(MinuteValue=60){MinuteValue=0;}M_up=0;}if(M_down)11{MinuteValue--;M_down=0;}}}4、仿真测试将写好的程序仿真无误后,导入到硬件图的51芯片里面进行测试,结果如下:把程序下载到实物上时,一到设定时间蜂鸣器就会叫,表示打铃。四、经验总结做了两周的课程设计,让人感受颇深,有关于单片机知识的,但更多的是团队的合作。此次单片机的课程设计题目是作息时间系统,与我们学生的学习生活息息相关,自己对功能的实现不是很满意,因为有一个功能没有实现,通过这次的课程设计作品的制作让我对单片机的理论有了更加深入的了解,同时