河北大学单片机课程设计
题 目 基于STCC52单片机的数字钟设计 学 院____电子信息工程学院 _ __ 专 业__ _ 电子科学与技术 ___ 学 号___ ********** ____ 姓 名______ ****** ______ 指导老师______ ****** ______ 完成日期_____ 2016.07.13 __ __
摘要
本次设计采用单片机型号为STCC52,利用keil4软件以C语言为编程语言来设
计基于C52单片机设计的数字钟。本次设计用到的芯片有SN74HC138N一片、N74LS07N一片、MAX232CPE一片、LM311一片。另用到排阻一个,数码管6个,12MHz晶振一个,电容、电阻、二极管、按键诺干。完成电路焊接并下载程序后经调试能够成功的实现数字钟的功能。可利用按键进行时间的调节。
1
目录
摘要„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„1 目录„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„2 引言„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„3 实验设计„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„3 模块介绍„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„4 复位电路与时钟电路„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„4 LED 显示驱动电路„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„5 按键控制电路„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„6 串行通信电路„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„7 信号处理电路„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„7 电源电路„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„8 程序设计„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„8 程序设计总体思路„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„8 时间处理子程序„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„8 时钟显示子程序„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„8 时钟延时子程序„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„8 程序设计流程图„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„9 参考文献 „„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„10 总结 „„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„10 致谢 „„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„10 附录一: 实验源程序„„„„„„„„„„„„„„„„„„„„„„„„„„„„„11 附录二: 实际效果图„„„„„„„„„„„„„„„„„„„„„„„„„„„„„17
2
引言
单片机有着长寿命、速度快、低电压低功耗、低噪声、可靠性高等优点。近年来
单片机的应用越来越广泛。线代人类生活中所用的几乎每件电子、机械产品中都会集成有单片机。小至电话座机、计算器、洗衣机、数字闹钟,甚至包括键盘鼠标,大至工业控制系统都有单片机的应用。可见单片机的应用不亚于计算机。
以本学期对单片机的学习和认识,并通过本次课程设计加以应用,从而达到一个对
所学知识的巩固、更深一步的理解,面对一个电子设计,应对出系统的方案,分析出各个板块来,再对各个板块进一步的具体的设计,先进行硬件电路设计,此时一定要考虑好要用什么元件、各个元件的具体参数、是否能实现应有功能,从而得到一个完整的硬件电路。在根据该电路设计出软件的功能模块、从而完成程序流程图,在根据流程图完成程序的设计,并通过反复的调试、运行、更正,直至完成既定功能为止,最后将软件、硬件结合进行调试、运行,对其功能进行最终测试,并反复思考其测试中遇到相应问题的原因,并将其一一处理,从而完成本次设计的实验要求,以及本次课程设计的最终目的。
本次实验设计以STCC52单片机为核心芯片控制电路,以6个八段数码管为显示器件,以 Keil4为编程软件并用C语言编写程序,以STC_ISP为程序烧写软件对单片机进行烧写,以基本实现用单片机控制数码管显示时、分、秒的功能。当秒计数计满60后就向分进位,分计数器计满60后向时进位,时计数器记到23变成0的计数功能,并可以用四个按键对时间的各位进行任意调节。
与传统的指针式钟表相比,基于单片机设计的数字钟具有稳定性高、可读性高、无噪声、受干扰小、夜间易读等优点。此外,可使用按键设置时间,方便简单。
【1】
实验设计
本次实验设计以STCC52单片机为核心芯片控制电路,以6个八段数码管为显示器件,以 Keil4为编程软件并用C语言编写程序,以STC_ISP为程序烧写软件对单片机进行烧写,以基本实现用单片机控制数码管显示时、分、秒的功能。当秒计数计满60后就向分进位,分计数器计满60后向时进位,时计数器记到23变成0的计数功能,并可以用四个按键对时间的各位进行任意调节。
3
电路原理图
Figure 1 基于单片机设计的数字钟电路原理图
Figure 1为基于STCC52单片机设计的数字钟的电路原理图。主要由复位电路、
时钟电路、数码管显示驱动电路、按键控制电路、串口通信电路、信号处理电路、电源电路七大模块组成。
模块介绍
1.复位电路与时钟电路
Figure 2为复位电路和时钟电路。
复位电路:包含了上电复位和按键复位两种。上电复位是利用电容的充电来实现的。在复位引脚RST上连接一个10uF电容到VCC,再连接一个10K电阻到地,由此形成一个RC充放电回路保证单片机在上电时RST引脚上有足够时间(两个机器周期以上)的高电平进行复位,随后回归到低电平进入正常工作状态。按键复位就是在复位电容上并联一个开
4
关,当开关按下时电容被放电,RST也被拉到高电平,而且由于电容的充电,会保持一段时间的高电平来使单片机复位。
Figure 2 复位电路与时钟电路
时钟电路:单片机有内部时钟和外部时钟,本实验采用内部时钟,即由晶振产生。在单片机的XTAL1、XTAL2外接石英晶体就可以构成自激振荡并在单片机内部产生时钟脉冲信号,晶振为12MHz。图中电容C1、C2的作用是稳定频率和快速起振,电容值为30pF。
2.LED显示驱动电路
如Figure 3所示,74LS138为38译码器,当一个选通端E3为高电平,另两个选通端E1,E2为低电平时,可将地址端(ABC)的二进制编码在Y0至Y7对应的输出端以低电平译出。Y0到Y5经反相器连到数码管的选通端,实现数码管的位选。而六个数码管由8个发光二极管组成,为共阴型。单片机的P0口八位连接在a、b、c、d、e、f、g、dp八段,实现数字显示。
为了使电路简单采用数码管动态显示方式。数码管不同位显示的时间间隔可以通过调整延时程序的延时长短来完成。由于扫描频率远远大于人眼的分辨能力,所以可以实现全部数
5
码管的显示。
Figure 3 LED显示驱动电路
3.按键控制电路
Figure 4 按键控制电路
Figure4为按键控制电路。本次实验中用到4个按键开关,为与P2.4,P2.5,P2.6,
6
P2.7分别相连的K4,K3,K2,K1开关,功能分别为进入调时(选择不同数码管),调时(改变其中一个数码管的值),确认调时结果。在程序中,把按键调节时间放到了主程序中,调时时时分秒的个位都遵循遇9变0的规律,时的十位遵循遇2变0的规律,分和秒则是遇5变0,其他情况都是自加。
4.串行通信电路
Figure 5 串口通信电路
Figure 5为串口通信电路。本次设计串口通信电路用到MAX232芯片, RS-232C标准的电平采用负逻辑,规定+3V~+15V之间的任意电平为逻辑“0”电平,-3V~-15V之间的任意电平为逻辑“1”电平,与TTL和CMOS电平是不同的。在接口电路和计算机接口芯片中大都为TTL或CMOS电平,所以在通信时,必须进行电平转换,以便与RS-232C标准的电平匹配。MAX232芯片可以实现TTL电平与232电平间的转换。本次实验还用到九针插头的串行口,用到2,3,5引脚。
5.信号处理电路
Figure 6 信号处理电路
7
如Figure 6所示。信号处理=电路由1N4148电压钳位,LM311电压比较器组成。
6.电源电路
Figure 7 电源电路
Figure 7为电源电路。外接9V电压。电路由二极管1N4007,稳压管LM7805组成。
程序设计
1.程序设计总体思路
本次设计要实现数字钟的可调功能,我把程序分化为五个模块分别进行编写,分别为时间处理子程序、显示子程序、按键扫描子程序、整点报时子程序以及中断子程序。 2. 时间处理子程序
在此模块中把秒sec设置为六十进制,分钟min设置为六十进制,小时hour设置为二十四进制,即当时间增加1s时,将显示部分的“秒”位加一,加到60以后进位为“分”,“秒”位清零;当“分”累加到60后进位为 “时” ,“分” 位清零;当“时”位为24以后,所有位清零后重新开始记时。 3.时钟显示子程序
此段子程序用于实现数码管的动态显示,分为段选和片选。当系统处于正常计时状态时,数码管正常显示时钟,时与分之间和分与秒之间的小数点以1Hz的频率闪烁;当调节按键按下时,adjust_flag==1,小数点停止闪烁,当调节哪一位时(时、分、秒),哪一位的个位的小数点常亮,便于显示哪一位正在处于调节状态。 4.时钟延时子程序 void delay(uint ms) { uint i,j;
for(i=0;i //延时 8 程序设计流程图 Figure 8 程序设计流程图 Figure 8为数字钟程序设计的流程图。如图所示,程序开始时先对单片机进行初 始化。然后对计数器装初值,当计数器请求中断的时候,但累计计数未达到一秒时,重装初值。当计数器请求中断且累计计数达到一秒时,重装初值并对时间的秒加1。在此过程中还要同时对按键进行扫描以检测是否有按键被按下。 9 总结 通过这次对数字钟的设计与制作,让我了解了设计电路的程序,也让我了解了关于 数字钟的原理与设计理念。坐而言不如立而行,对于这些电路还是应该自己动手实际操作才会有深刻理解。作为本科生希望学院能够多多开展这样的课程设计,让我们学以致用。 并且在这次课程设计中,我学会了对简单电路的焊接。已经巩固了之前学过的C语 言的知识,能切能够掌握并熟练运用C语言编写程序完成设计,以达到设计要求。另外,完成电路焊接并下载程序后作品并非能够成功工作。因此需要进行一系列的调试,以找出错误所在。在电路调试的过程中,是让我受到锻炼最多的地方。完成电路调试后,让我了解了一般电路常见的错误以及电路的调试方法。 参考文献: [1]邵贝贝. 单片机技术的发展与单片机应用的广泛选择[J]. 电子技术应用, 1999(3):4-6. 致谢 大三的学习时光已经接近尾声。在此,我对母校,老师,同学表达我由衷的感谢。 对于本次课程设计,特别感谢老师协助我完成电路的调试并对设计报告进行指导。此外,还要感谢同学们在一同协助我完成程序的设计。在此,向老师和同学表达诚挚的谢意。 附录一:实验源程序 10 #include #define uchar unsigned char #define uint unsigned int sbit key_set=P2^4; //按下键(为0时)开始调时,选择数码管 sbit key_add=P2^5; //按下键(为0时)加1调时 sbit key_enter=P2^6; //按下键(为0时)表示确认 sbit EE1=P2^3; //3-8译码器选通端,为0选通 sbit led=P1^0; //发光二极管 uchar code led_tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管段码0-9编码 uchar sec=0; uchar min=0; uchar hour=0; //时分秒都是两位数 uchar weix=0; //取值为1-6,分别对应从右往左调节六个数码管 bit count=0; //0 计数模式, 1 调时模式 bit shake=0; //以2Hz的频率变化,取值0,1 void delay(uint ms); //延时 void display(); //显示 void wx( uchar x ); //位选 void main() { TMOD=0x01; //设控制字:定时器T0;方式一:16位定时计数; 定时为50ms(机器周期为1us) TH0=0X3c; //(65536-50000)/256=60(0X3c) TL0=0Xb0; //(65536-50000)%256=176(0Xb0) TR0=1; //T0工作 ET0=1; // 开T0中断 EA=1; //开总中断 EE1=0; //选通3-8译码器 while(1) { display(); if( key_set == 0 ) { display(); if( key_set == 0 ) //调时模式 { if( weix < 6 ) weix++; { count = 1; } else 11 } } weix = 1; while( key_set == 0 ) display(); if( key_add == 0 && count == 1 ) { display(); if(key_add==0) { switch(weix) //选择调节哪个数码管 { case 1:if(sec%10 < 9) sec++; //秒个位加1 sec-=9; //秒个位为9时加1变成0 else break; case 2:if(sec/10 < 5) sec+=10; //秒十位加1 else sec-=50; //秒十位为5时加1变成0 break; case 3:if(min%10 < 9) min++; else min-=9; break; min+=10; else min-=50; break; //分,时和秒是一样的,故程序一样 case 4:if(min/10 < 5) case 5:if(hour%10 < 9) else hour-=9; break; hour+=10; else case 6:if(hour/10 < 2) hour++; 12 } } } } hour-=20; break; default:break; } while(key_add==0) display(); if( key_enter == 0 ) //确认键 { display(); } if( key_enter == 0 ) { count = 0; //计数模式 } while( key_enter == 0 ) display(); weix = 0; TR0=0; TH0=0X3c; TL0=0Xb0; //(65536-50000)/256 //(65536-50000)%256 TR0=1; //T0工作 void wx( uchar x ) { x>>=1; } void display() //秒显示 { P2|=0x07; //数码管全灭 if(weix==1&&shake==1) //进入调时模式,数字以2Hz的频率闪烁;计 数模式时weix==0;调时计数小数点常亮 P0=0x80; else P0=led_tab[sec%10]|0x80; P2^0=CY; x>>=1; P2^1=CY; x>>=1; P2^2=CY; //38译码器进行位选 13 wx(0x05); delay(2); //表示秒个位的数码管 P2|=0x07; P0=led_tab[sec/10]; if(weix==2&&shake==1) P2|=0x07; else wx(0x04); //表示秒十位的数码管 delay(2); P2|=0x07; // P0=led_tab[min%10]; if(weix==3&&shake==1) P2|=0x07; else wx(0x03); delay(2); P2|=0x07; P0=led_tab[min/10]; if(weix==4&&shake==1) P2|=0x07; else wx(0x02); delay(2); P2|=0x07; // P0=led_tab[hour%10]; if(weix==5&&shake==1) P2|=0x07; else wx(0x01); delay(2); P2|=0x07; P0=led_tab[hour/10]; if(weix==6&&shake==1) P2|=0x07; else wx(0x00); delay(2); } 分显示 时显示 14 void Timer0() interrupt 1 using 1 { static uchar a1=0; static uchar a2=0; TH0=0X3c; TL0=0Xb0; if(a2<9) else { a2=0; if(shake==0) } else { a1=0; if(count==0) { if(sec<59) sec++; else { sec=0; if(min<59) min++; else { min=0; if(hour<23) hour++; else hour=0; } } { shake=1; //发光二极管2Hz闪动 led=0; } else { shake=0; led=1; } a2++; TR0=0; //关定时器 //(65536-50000)/256 //(65536-50000)%256 if(a1<19) a1++; //定时为50ms,中断20次即为1s,进行一次秒加1 15 } } } TR0=1; //开定时器 void delay(uint ms) { uint i,j; for(i=0;i 附录二:实际效果图 for(j=0;j<123;j++); 16 Figure 9 实际作品正面效果图 Figure 10 实际作品背面效果图 Figure 9和Figure 10分别为实际效果图的正面和背面。 17
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务