《单片机课程设计设计(论文)-电子钟设计.doc》由会员分享,可在线阅读,更多相关《单片机课程设计设计(论文)-电子钟设计.doc(22页珍藏版)》请在三一文库上搜索。
1、单片机课程设计设计(论文)用纸摘 要单片机应用技术是目前应用最为广泛的一项计算机控制技术。本设计充分利用单片机的内部资源,结合基本的功能电路完成基本的电子钟设计。电子钟时间可以调整,可以用于定时,有基本的温度测量电路可以实时地测量当前的温度并用于显示。时间信息用六位数码管显示,温度信息用两位数码管显示,独立键盘用于时间的调整和定时,蜂鸣器用于定时。关键词:单片机 电子钟 数码管 温度测量目 录摘 要I第1章设计说明11.1设计目的1 1.2 设计任务.11.3原理描述21.2.1原理框图21.2.2系统原理2第2章硬件设计22.1数码管驱动电路32.2键盘接口电路3第3章软件设计43.1软件仿
2、真43.2软件设计53.2.1程序流程图53.2.2程序调试63.2.3源程序设计7结论19参考文献2019第1章 设计说明1.1 设计目的 单片机原理及应用是一门技术性、应用性很强的学科,实践教学是它的一个极为重要的环节。不论是硬件扩展、接口应用还是编程方法、程序调试,都离不开实验教学。如果不在切实认真地抓好学生的实践技能的锻炼上下功夫,单凭课堂理论课学习,势必出现理论与实践脱节,学习与应用脱节的局面。任随书本上把单片机技术介绍得多么重要、多么实用、多么好用,同学们仍然会感到那只是空中楼阁,离自己十分遥远,或者会因此而对它失去兴趣,或者会感到它高深莫测无从下手,这些情况都会令课堂教学的效果大
3、打折扣。本次仿真设计的目的就是让同学们在理论学习的基础上,通过完成一个涉及MCS-51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用,使学生不但能够将课堂上学到的理论知识与实际应用结合起来,而且能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独进行某些单片机应用系统的开发设计工作打下一定的基础。1.2 设计任务单片机是一门技术性、应用性很强的学科,实践教学是它的一个极为重要的环节。不论是硬件扩展、接口应用还是编程方法、程序调试,都离不开实验教学。如果不在切实认真地
4、抓好学生的实践技能的锻炼上下功夫,单凭课堂理论课学习,势必出现理论与实践脱节,学习与应用脱节的局面。本设计充分利用单片机的内部资源,结合基本的电路模块实现数字电子钟的设计和实时温度的采集。基本要求如下:(1)24小时计时功能用6位LED显示器显示时、分、秒。(2) 时间调整功能用功能移位键、功能加键和功能减键实现时间的调整。(3) 闹铃功能用定闹键配合功能移位键、功能加键和功能减键三个按键设定闹铃,并用蜂鸣器实现响铃功能。(4) 环境温度采集与显示功能选用温度传感器DS18B20采集环境温度,并用2位LED显示器显示环境温度。在这里我们只考虑采集室内温度,即零度以上的温度。1.3 原理描述1.
5、3.1 原理框图本设计的总图原理框图如图1-1所示:显示模块MCU按键温度采集闹铃图1-1 系统总体框图1.3.2 系统原理C51单片机作为微处理器MCU,是系统设计的核心部分。显示模块为八位的数码管,前六位用于时间的显示,后两位显示当前的温度值。按键部分位5个独立的按键,用于时间的调整和定时。温度采集模块的核心部件是数字温度传感器DS1820。闹铃部分用蜂鸣器来实现。系统的工作原理是单片机的内部定时器模拟时钟信号,作为时间信息传给数码管的前六位,同时单片机一定的时间间隔分别采集温度传感器的温度信息并送至数码管的后两位和扫描键盘,若发现某个键盘被按下,则作出相应的处理。定时时间到时,蜂鸣器发出
6、响声,响1分钟后自动停止。第2章 硬件设计硬件电路主要包括数码管驱动电路、温度采集电路、键盘接口电路、稳压电路和蜂鸣器驱动电路。系统电路原理图如图2-1所示:图2-1 系统原理图2.1 数码管驱动电路本设计用的数码管为LG5641BH,是四位一体的共阳极红色数码管。数码管采用动态扫描的方式显示。寄存器74LS244用与数码管的位选信号的控制,移位寄存器74LS164用于段信号的产生,即若要某一位数码管点亮,需要74LS244产生该位的选通信号同时需要74LS164产生一定的段点亮信号。这些信号都是有单片机控制产生的。本设计使用的数码管是共阳极的,要点亮某一位数码管,需要74LS244产生一个高
7、电平的位选通信号,同时74LS164的八个输出引脚输出对应的数码管编码信号。2.2 键盘接口电路具体接口如图2-2-1所示图2-2-1 按键接口第一个按键用于时间的调整,接在了单片机的外部中断0端,按键信号的产生由外部中断源产生,把时间调整键设为外部中断是因为,调整时间的时候时间不应该仍在走动,而中断正好符合这一特点。其余四个键盘分别接单片机的P2.4P2.7口,用扫描的方式检测按键是否被按下。具体的操作如下:调整时间:SetTime用于调整时间,Hour用于“时”的设定,Minute用于“分”的设定,最后OK用于确认设定有效。定时:Clocking用于定时,Hour用于“时”的设定,Minu
8、te用于“分”的设定,最后OK用于确认设定有效。第3章 软件设计3.1 软件仿真仿真软件使用的是proteus,使用该软件仿真系统可以将程序代码加载进单片机内,实现较好的仿真效果。加载的文件要以.hex为后缀的文件。加载的方法是在单片机上双击,打开Edit Component对话框,在Program File项选择要加载的文件,加载完单击对话框右侧的OK键即可。加载完文件以后,就可以进行系统仿真了。仿真的方法是分别单击软件界面左下方的 可以开启仿真、单步执行、暂停仿真和停止仿真。系统仿真图如图3-1所示图3-1 系统仿真图3.2 软件设计3.2.1 程序流程图程序流程图图3-2-1所示:初始化
9、开始读温度信息显示温度、时间是否定时蜂鸣器响显示温度、时间是否定时是否否是图3-2 程序流程图3.2.2 闹铃设置子程序的设计闹钟的设置时通过K5键的按下次数来判断。当单片机检测到K5键按下一次时则进入闹钟设置界面,光标并自动跳到秒设置位置,可以对秒进行设置,当K5键一次按下2、3、4次时,则分别进入到闹钟的时、分、开关的设置。3.2.3 程序调试编译软件使用Keil软件,调试的基本步骤为:新建一个工程命名并保存、新建一个源程序文件命名并保存、将源文件添加进工程、向源文件中输入源程序、编译调试。若出现什么错误,修改后重新编译,直至最后没有错误为止。用Keil软件调试程序的界面如图3-2-2所示
10、:图3-2-2 软件调试界面3.2.4 源程序设计源程序如下/*电子钟设计源程序*/#include/*位定义*/sbit bee=P22;sbit DQ=P21;sbit R=P20;sbit K2=P24;/按键sbit K3=P25;sbit OK=P26;sbit Ring=P27;bit mark1,mark2;/*数码管编码*/char hour,minute,second,A,clockH,clockMin,aa;char code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/*函数原型声明*/void dis
11、play_hour(char);void display_minute(char);void display_second(char);void display_temp(char);void display(char,char,char,char);void chu_shi_hua();void Clocking();void delay(int);unsigned char templow_byte,temphi_byte;unsigned char ow_reset(void);unsigned char read_bit(void);void write_bit(char bitval
12、);unsigned char read_byte(void);void write_byte(char val);void wendu();/main函数/void main()char choice;chu_shi_hua();while(1)wendu();if(Ring=0)delay(100);if(Ring=0)choice=1; /定时键按下,则定时 else choice=0;switch(choice)case 0:display(hour,minute,second,A);break;case 1: Clocking();/*函数名:display(char hour,ch
13、ar minute,char second,char A)*调用:display_hour(hour)、display_minute(minute)、display_second(second) display_temp(A)*作用:显示时间信息和温度信息*/void display(char hour,char minute,char second,char A)display_hour(hour); display_minute(minute);display_second(second);display_temp(A);if(hour=clockH&minute=clockMin) /闹
14、钟bee=0;delay(100);bee=1;/*函数名:display_hour(char hour)*调用:delay()*作用:显示时*/void display_hour(char hour) /显示时char h1,h2;h1=hour/10;h2=hour%10;R=0;R=1;SBUF=tableh1;while(!TI);P1=0x01;delay(20);P1=0;TI=0;R=0;R=1;SBUF=tableh2;while(!TI);P1=0x02;delay(20);P1=0;TI=0;/*函数名:display_minute(char minute) *调用:del
15、ay()*作用:显示分*/void display_minute(char minute) /显示分char min1,min2;min1=minute/10;min2=minute%10;R=0;R=1;SBUF=tablemin1;while(!TI);P1=0x04;delay(20);P1=0;TI=0;R=0;R=1;SBUF=tablemin2;while(!TI);P1=0x08;delay(20);P1=0;TI=0;/*函数名:display_second(char second)*调用:delay()*作用:显示秒*/void display_second(char sec
16、ond) /显示秒char sec1,sec2;sec1=second/10;sec2=second%10;R=0;R=1;SBUF=tablesec1;while(!TI);P1=0x10;delay(20);P1=0;TI=0;R=0;R=1;SBUF=tablesec2;while(!TI);P1=0x20;delay(20);P1=0;TI=0;/*函数名:display_temp(char A)*调用:delay()*作用:显示温度*/void display_temp(char A) /显示温度char shi,ge;shi=A/10;ge=A%10;R=0;R=1;SBUF=ta
17、bleshi; /向发送缓冲器SBUF中写数据while(!TI); /直到发送完8位数据P1=0x40;delay(20);P1=0;TI=0;R=0;R=1;SBUF=tablege;while(!TI);P1=0x80;delay(20);P1=0;TI=0;/*函数名:chu_shi_hua() *调用:*作用:初始化一些参数*/void chu_shi_hua() /初始化函数SM0=0; /串行口设置为工作方式0SM1=0;aa=0;mark1=1;mark2=1;hour=12;minute=0;second=30;clockH=0;clockMin=0;K2=1; /键盘读之前
18、先置1K3=1;OK=1;TMOD=0X01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;EX0=1;IT0=0; /外部中断0为电平触发方式PX0=1; /外部中断为高优先级中断/*函数名:SetTime()*调用:*作用:中断函数,用于调整时间*/void SetTime() interrupt 0 /调整时间函数while(OK) display_hour(hour); display_minute(minute);if(K2=0)delay(100);if(K2=0)while(!K2);delay(100)
19、;while(!K2);hour+;if(hour=24)hour=0;if(K3=0)delay(100);if(K3=0)while(!K3);delay(100);while(!K3);minute+;if(minute=60)minute=0;/*函数名:timer0()*调用:*作用:中断函数,用于模拟时间信息*/void timer0() interrupt 1 /定时器0中断函数TH0=(65535-50000)/256;TL0=(65535-50000)%256;aa+;if(aa=20)aa=0;second+;if(second=60)second=0;mark1=0;if
20、(mark1=0)mark1=1;minute+;if(minute=60)minute=0;mark2=0;if(mark2=0)mark2=1;hour+;if(hour=24)hour=0;/*函数名:Clocking()*调用:display_hour(clockH)、display_minute(clockMin)*作用:用于定时*/void Clocking() /定时函数while(OK) display_hour(clockH); display_minute(clockMin);if(K2=0)delay(100);if(K2=0)while(!K2);delay(100);
21、while(!K2);clockH+;if(clockH=24)clockH=0;if(K3=0)delay(100);if(K3=0)while(!K3);delay(100);while(!K3);clockMin+;if(clockMin=60)clockMin=0;/温度采集函数/延时函数void delay(int us)int s;for(s=0;sus;s+);/复位函数unsigned char ow_reset(void)unsigned char presence;DQ=0;delay(29);DQ=1;delay(3);presence=DQ;delay(25);retu
22、rn(presence);/读位函数unsigned char read_bit(void)unsigned char i;DQ=0;DQ=1;for(i=0;i3;i+);return(DQ);/写位函数void write_bit(char bitval)DQ=0;if(bitval=1)DQ=1;delay(5);DQ=1;/读字节unsigned char read_byte(void)unsigned char i;unsigned char value=0;for(i=0;i8;i+)if(read_bit()value|=0x01i;delay(6);return(value);
23、/写字节void write_byte(char val)unsigned char i;unsigned char temp;for(i=0;ii;temp&=0x01;write_bit(temp);delay(5);void wendu()ow_reset();write_byte(0xcc);write_byte(0x44);ow_reset();write_byte(0xcc);write_byte(0xbe);templow_byte=read_byte(); /DS18B20 先输出低八位再高八位temphi_byte=read_byte();A=(temphi_byte*256
24、+templow_byte)*0.0625;结论本设计可以满足电子钟的常规应用要求,即可实现时间的调整和定时,外加温度的实时采集。本设计直接采用寄存器和锁存器驱动数码管,没有用三极管驱动。一方面,设计电路得到了简化。另一方面,由于寄存器和锁存器的电流不够大,所以数码管的亮度不是特别的亮,但足以满足要求。由于数码管的位数限制,本设计只用了两只数码管显示温度信息,所以温度的精度是1度,并且无法显示温度的正负。通过这次电子钟的设计,对C51单片机的内部资源得到了进一步的理解,使理论和实践得到了结合。参考文献1 张毅刚.单片机原理及应用M.北京:高等教育出版社,20032 吕凤翥.Pretus基础教程M.北京:清华大学出版社,1999.33 张齐,杜群贵.单片机应用系统设计技术M.北京:电子工业出版社,2004.84 孙传友,孙晓斌.测控系统原理与设计M.北京:北京航空航天大学出版社,2007.12