第一篇:基于单片机的定时闹钟课程设计报告书
任务书
一、设计目的
本设计主要是对51单片机的一个方面的扩展,是能实现一般定时闹钟功能的设计。需要实现某一功能时,按对应的按键即可,经过多次验证,此设计灵活简便,可以实现显示、定时、修改定时、定时时间到能发出报警声的功能。
二、设计要求
1、能显示时时—分分—秒秒。
2、能够设定定时时间,并修改定时时间。
3、定时时间到能发出警报声。
目 录
1.绪论..........................................................................................................1 2.方案论证..................................................................................................1 3.方案说明..................................................................................................2 4.硬件方案设计.........................................................................................2 4.1单片机STC89C52.........................................................................2 4.2 时钟电路.......................................................................................4 4.3数码管显示电路............................................................................4 4.4键盘电路........................................................................................6 4.5报警电路........................................................................................7 5.软件方案设计.........................................................................................7 5.1系统软件设计................................................................................7 5.2键盘程序........................................................................................7 5.3 LED.................................................................................................8 5.4音响报警电路................................................................................8 5.5 程序流程图...................................................................................8 6.调试..........................................................................................................9 7.小结........................................................................................................10 8.参考文献................................................................................................11 9.附录:定时闹钟源程序.......................................................................12 1.绪论
系统采用单片机STC89C52作为本设计的核心元件,在其基础上外围扩展芯片和外围电路,附加时钟电路,复位电路,键盘接口及LED显示器。键盘采用独立连接式。还有定时报警系统,即定时时间到,通过扬声器发出报警声,提示预先设定时间时间到,从而起到定时作用。
外围器件有LED显示驱动器及相应的显示数字电子钟设计与制作可采用单片机来完成。由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且其成本也有所降低,所以在该设计与制作中采用单片机STC89C52,它是低功耗、高性能的CMOS型8位单片机。片内带有8KB的Flash存储器,且允许在系统内改写或用编程器编程。另外, STC89C52的指令系统和引脚与8051完全兼容,片内有512B的RAM、32条I/O口线、3个16位定时计数器、4个外部中断、一个7向量4级中断结构(兼容传统51的5向量2级中断结构)等。
在LED显示器中,分成静态显示和动态显示两类,在这个设计的最小系统中主要用了它的动态显示功能,动态显示器利用了人视觉的短暂停留,在数据的传输中是一个一个传输的,且先传输低位。
2.方案论证
单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大,而且可以随时的更新系统,进行不同状态的组合。
本系统采用单片机STC89C52作为本设计的核心元件,利用两个4位7段共阴LED作为显示器件。接入共阴LED显示器,可显示时,分钟,秒,单片机外围接有定时报警系统,定时时间到,蜂鸣器发出报警声,提示预先设定时间到。
电路由下列部分组成:时钟电路、复位电路、控制电路、LED显示、报警电路,芯片选用STC89C52单片机。
系统基本框图如图2.1所示: 时钟电路数码显示STC89C52键盘电路报警电路
图2.1 系统基本框图
3.方案说明
此设计主要是通过单片机系统,综合运用定时器、中断、数码显示等知识设计一个可定时的电子钟。它包括系统总体方案及硬件设计,软件设计,Proteus软件仿真等部分。
系统总体方案及硬件设计是本设计的重要组成部分,在这部分详细介绍了时钟原理,硬件设计,数码管LED,以及在设计过程中考虑到技术指标,机型的选择,器件的选择等一系列问题。
硬件设计的主要任务是根据总体设计要求,以及在所选机型的基础上,确定系统扩展所要用的存储器,I/O电路及有关外围电路等然后设计出系统的电路原理图。
合理的软件结构是设计出一个性能优良的单片机应用性系统软件的基础,因此必须充分重视。在本设计中采用应用广泛的C语言。用Proteus软件仿真检查设计是否合理。
4.硬件方案设计
4.1单片机STC89C52 STC89C52是一个低电压,高性能CMOS型8位单片机,片内含8KB的可反复擦写的Flash只读程序存储器(ROM)和512B的随机存取数据存储器(RAM),器件采用STC公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,内置功能强大的微型计算机的STC89C52提供了高性价比的解决方案。其引脚图如下图4.1所示:
P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78RST940VCC***2P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7EAALEPSENP2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.0P3.010P3.111P3.212P3.313P3.414P3.515P3.616P3.717XTAL218XTAL119GND20STC89C523***2524232221
图4.1 STS89C52 STC89C52具体介绍如下: 1)主电源引脚(2根)
VCC(40):电源输入,接+5V电源
GND(20):接地线 2)外接晶振引脚(2根)
XTAL1(19):片内振荡电路的输入端
XTAL2(18):片内振荡电路的输出端 3)控制引脚(4根)
RST/VPP(9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。
ALE/PROG(30):地址锁存允许信号
PSEN(29):外部存储器读选通信号
EA/VPP(31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。4)可编程输入/输出引脚(32根)
STC89C52单片机有4组8位的可编程I/O口,分别为P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。
PO口(39~32):8位双向I/O口线,名称为P0.0~P0.7
P1口(1~8):8位准双向I/O口线,名称为P1.0~P1.7
P2口(21~28):8位准双向I/O口线,名称为P2.0~P2.7
P3口(10~17):8位准双向I/O口线,名称为P3.0~P3.7 4.2 时钟电路
单片机的时钟产生方法有两种:内部时钟方式和外部时钟方式。
本系统中STC89C52单片机采用内部时钟方式。最常用的内部时钟方式是采用外接晶体和电容组成的并联谐振回路。振荡晶体可在1.2MHz~12MHz之间。电容值无严格要求,但电容取值对振荡频率输出的稳定性、大小和振荡电路起振速度有少许影响,一般可在20pF~100pF之间取值。STC89C52单片机的时钟电路如图4.2所示。
XTAL230pF12MHzSTC89C5230pFXTAL1
图4.2 时钟电路
4.3数码管显示电路
单片机中通常使用7段LED,LED是发光二极管显示器的缩写。LED显示器由于结构简单,价格便宜,体积小,亮度高,电压低,可靠性高,寿命长,响应速度快,颜色鲜艳,配置灵活,与单片机接口方便而得到广泛应用。LED显示器是由若干个发光二极管组成显示字段的显示部件,当发光二极管导通时,相应的一个点或一个笔划发光,控制不同组合的二极管导通,就能显示出各种字符。LED显示器有多种形式,如:“米”字型显示器,点阵显示器和七段数码显示器等,在单片机系统中使用最多的是七段数码显示器。
LED七段数码显示器由8个发光二极管组成显示字符,根据内部发光二极管 的连接形式不同,LED有共阴极和共阳极两种,如图4.3.1所示为4为7段共阴数码管的引脚图。
A1afA2A3beddpcgA4
图4.3.1 4段共阴数码管引脚图
采用高亮共阴型s位数码管,为示区别,显示秒的两个数码管个头较小,另外4个较大。共阴数码管连接线路如下:一般用7个发光二极管构成显示数字和符号,另外还用一段发光二极管显示小数点。这种显示器一般分为两种,共阳极显示器和共阴极显示器,共阳极显示器是把每个二极管的正端连在一起,共阴极显示器是把每个二极管的阴极连在一起。一只显示器是有8个发光二极管构成,当把某段加正向电压时,则该段所对应的笔划亮,不加正向电压则暗,为了保护各段不受损坏需要加限流电阻,无论是共阳极显示器还是共阴极显示器,它的8段排列顺序都是一样的:A段、B段、C段、D段、E段、F段、G段和DP段。在单片机中通常使用7段LED。数码管的显示电路如下图4.3.2所示:
图4.3.2 数码管的显示电路 数码管中二极管电流的计算
二极管本身有2V的电压降,一般二极管电流取10mA,则需添加的电阻为
R=(U-ULed)/ILed,代入相关数值,即为300Ω。
本设计中,选用的电阻为470Ω,则电流为
I=(U-ULed)/R´, 代入实际数值,即为6.4mA,能够满足显示效果。
4.4键盘电路
设计方案中使用的是3个开关键组成的键盘电路,如下图4.4所示:
图4.4 键盘电路图 4.5报警电路
设计方案中,采用的是蜂鸣器和PNP型三极管组成的报警电路。如下图4.5所示:
图4.5 报警电路
5.软件方案设计
5.1系统软件设计
该系统软件主要有主程序模块,定时中断服务程序,中断等待服务程序,键盘程序,显示子程序服务程序等六大模块组成,因为C语言容易理解和记忆,所以我们用C语言来写此程序。
5.2键盘程序
键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦有键按下,便转向相应的子程序处理,处理结束后再返回。5.3 LED 七段LED由七个发光二极管按日字排开,所有发光二极管的阳极连在一起成共阳极,阴极连在一块称共阴极接法。当采用芯片驱动时不需要加限流电阻,其他情况下一般应外接限流电阻。动态显示电路有显示块,字形码封锁驱动器,字位锁存驱动器三部分组成。
5.4音响报警电路
在STC89C52外围的一个管口上加蜂鸣器,通过软件与硬件的结合可实现定时闹钟功能。
5.5 程序流程图
开始初始化判断闹钟时间是否到调用显示程序否P1.0是否按下是P1.1和P1.2调节时间和闹钟图5.5 程序流程图
6.调试
设几个按键从左往右为K1,K2,K3。K1与P1.0相连,K2与P1.1相连,K3与P1.2相连。
按一下启动开关,显示为时间显示。按一下K1,进入时间显示的小时设定状态;按两下K1,进入时间显示的分钟设定状态;按三下K1,进入定时的小时设定状态;按四下K1,进入定时的分钟设定状态;按五下K1,退出设定,进入当前时间显示状态;K2和K3分别是对当前设定值的加和减。如下图6.1和6.2所示。
图6.1 调时仿真效果图
图6.2 定时仿真效果图
7.小结
在做课程设计的过程中,我进一步认识到全面专业知识以及逻辑思考方式对研究问题的重要性,同时我也更加具体的掌握了课程设计的基本方法。
经过不断的努力,我终于完成了这次课程设计,总的来说,我学到了不少的东西,知道了理论联系实际的重要性。在设计过程中我遇到了很多的困难,但没放弃,查阅了许多相关的书籍,自己独立思考和借鉴了前人的许多优秀成果,并与所学的知识紧密的结合了起来。我相信这过程对我今后的学习和工作有着积极的影响,并搭好了平台。
通过这次设计,我对这门课有了更好的理解,尤其结合了这几年学的相关的专业知识,对各门课都有了一个较全面的理解。这必将对我以后的学习和工作有很大的帮助。本次课程设计的定时闹钟电路,可以满足人们的基本要求,但因为知识水平有限,此电路中存在一定的问题,虽可以通过增加电路解决,但过于复杂和现有水平有限,本次设计就未深入涉及,想要更好的改进电路,需要进一步的努力,如果有好的意见,希望老师给予支持指导。8.参考文献
[1] 何立民.单片机应用技术选编10.北京:北京航空航天大学出版社 [2] 林立.单片机原理及应用.北京:电子工业出版社
[3] 沙占友等.单片机外围电路设计.西安:电子工业出版社
[4] 江力.蔡骏.王艳春.董泽芳.单片机原理与应用技术.北京,清华大学出版社 [5] 潘永红.柳殊.单片机原理与应用.西安,西安电子科技大学出版社 9.附录:定时闹钟源程序
#include
9、横杠、全灭 unsigned char a[8];
unsigned char second=0,minute=0,hour=1;unsigned char minute1=0,hour1=0;unsigned char b[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//扫描 unsigned char k=0;unsigned int temp;// 记录毫秒为秒的变量
unsigned char M,S_flag;//M是模式,更新时间的种模式加上正常模式 S_flag闪烁标志 sbit K1=P1^0;sbit K2=P1^1;sbit K3=P1^2;sbit BEEP=P3^3;void delay(unsigned n)//0.2毫秒 { int x,y;for(x=0;x void time1()interrupt 3 //定时器中断函数 { TH1=0xfc; //定时ms TL1=0x18;temp++;if(temp==1000)//配合定时器定时s { temp=0;second++;} if(second==59){ second=0;if(minute<59)minute++;else { minute=0; hour++; hour%=24; } } if(hour1==hour&&minute1==minute&&second<10){ if(M==0)BEEP=!BEEP;} if(temp%250==0)//每ms S_flag=!S_flag;//闪烁标志位取反 if(k==8)k=0;P0=a[k]; P2=b[k++];delay(1); P2=0xff; } void display(){ switch(M){ case 0: { a[0]=led[hour/10]; a[1]=led[hour%10]; a[2]=led[10]; a[3]=led[minute/10]; a[4]=led[minute%10]; a[5]=led[10]; a[6]=led[second/10]; a[7]=led[second%10]; }break;case 1: { if(S_flag==1) { a[0]=led[hour/10]; a[1]=led[hour%10]; } else { //闹钟时间到 a[0]=led[11]; a[1]=led[11]; } a[2]=led[10]; a[3]=led[minute/10]; a[4]=led[minute%10]; a[5]=led[10]; a[6]=led[second/10]; a[7]=led[second%10];}break;case 2: { a[0]=led[hour/10]; a[1]=led[hour%10]; a[2]=led[10]; if(S_flag==1) { a[3]=led[minute/10]; a[4]=led[minute%10]; } else { a[3]=led[11]; a[4]=led[11]; } a[5]=led[10]; a[6]=led[second/10]; a[7]=led[second%10];}break;case 3: { if(S_flag==1) { a[0]=led[hour1/10]; a[1]=led[hour1%10]; } else { a[0]=led[11]; a[1]=led[11]; } a[2]=led[10]; a[3]=led[minute1/10]; a[4]=led[minute1%10]; a[5]=led[11]; a[6]=led[11]; a[7]=led[11]; }break;case 4: { a[0]=led[hour1/10]; a[1]=led[hour1%10]; a[2]=led[10]; if(S_flag==1) { a[3]=led[minute1/10]; a[4]=led[minute1%10]; } else { a[3]=led[11]; a[4]=led[11]; } a[5]=led[11]; a[6]=led[11]; a[7]=led[11]; } } } void key_prc(){ if(K1==0) { delay(10);//延时去抖 if(K1==0)//按K1进行模式切换 { M++; if(M==5)M=0; } while(!K1);//等待按键释放 } if(M!=0){ switch(M){ case 1: //模式--调时 { if(K2==0) { delay(10);//延时去抖 if(K2==0)//加键按下 { if(hour<23)hour++; else hour=0; } while(!K2);//等待按键释放 } if(K3==0) { delay(10); if(K3==0) { if(hour> 0)hour--; else hour=23; } while(!K3); } } break; case 2: //模式--调分 { if(K2==0) { delay(10); if(K2==0) { if(minute<59)minute++; else minute=0; } while(!K2); } if(K3==0) { delay(10); if(K3==0) { if(minute>0)minute--; else minute=59; } while(!K3);} } break;case 3: //模式--闹钟调时 { if(K2==0) { delay(10); if(K2==0) { if(hour1<23) hour1++; else hour1=0; } while(!K2); } if(K3==0) { delay(10); if(K3==0) { if(hour1>0)hour1--; else hour1=23;} while(!K3); } } break; case 4: //模式--闹钟调分 { if(K2==0) { delay(10); if(K2==0) { if(minute1<59) minute1++; else minute1=0; } while(!K2); } if(K3==0) { delay(10);//延时去抖 if(K3==0)//减键按下 { if(minute1>0) minute1--; else minute1=59; } while(!K3); } } break; } } } void main(){ M=0;S_flag=0;//闪烁标志位 TMOD=0x10;//定时器以方式定时 TL1=0x18;EA=1;//打开总中断 ET1=1;//允许定时器中断 TR1=1;//开启定时器(开始定时计数)while(1){ key_prc(); display();} } 单片机课程设计报告 定时闹钟,共29页,6864字 摘要 本设计是定时闹钟的设计,由单片机AT89C51芯片和LED数码管为核心,辅以必要的电路,构成的一个单片机电子定时闹钟。电子钟设计可采用数字电路实现,也可以采用单片机来完成。数字电子钟是用数字集成电路构成的,用数码管显示“时”,“分”,“秒”的现代计时装置。若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且其成本也有所降低,所以在该设计中采用单片机利用AT89C51,它是低功耗、高性能的CMOS型8位单片机。片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。另外, AT89C51的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。AT89C51单片机结合七段显示器设计的简易定时闹铃时钟,可以设置现在的时间及显示闹铃设置时间,若时间到则发出一阵声响,进—步可以扩充控制电器的启停。设计内容包括了秒信号发生器、时间显示电路、按键电路、供电电源以及闹铃指示电路等几部分的设计。采用四个开关来控制定时闹钟的工作状态,分别为:K1、设置时间和闹钟的小时;K2、设置小时以及设置闹钟的开关;K3、设置分钟和闹钟的分钟;K4、设置完成退出。 课设准备中我根据具体的要求,查找资料,然后按要求根据已学过的时钟程序编写定时闹钟的程序,依据程序利用proteus软件进行了仿真试验,对出现的问题进行分析和反复修改源程序,最终得到正确并符合要求的结果。 设计完成的定时闹钟达到课程设计的要求,在到达定时的时间便立即发出蜂鸣声音,持续一分钟。显示采用的六位数码管电路,如果亮度感觉不够,可以通过提升电阻来调节,控制程序中延迟时间的长短,可以获得不同的效果。也可以改蜂鸣器为继电器,通过控制继电器从而进一步扩展的来控制一些家电开关。 目录概述……………………………………………………………………………… 系统总体方案及硬件设计……………………………………………………… 42.1 总体设计……………………………………………………………………4 2.2 系统时钟电路设计…………………………………………………………4 2.3 系统复位电路设计…………………………………………………………4 2.4 闹钟指示电路设计………………………………………………………… 52.5 电子闹钟的显示电路设计…………………………………………………5软件设计 3.1 概述…………………………………………………………………………6 3.2 主模块的设计………………………………………………………………6 3.3 基本显示模块设计…………………………………………………………7 3.4 时间设定模块设计…………………………………………………………7 3.5 闹钟功能的实现……………………………………………………………8Proteus软件仿真………………………………………………………………1课程设计体会……………………………………………………………………13 参考文献……………………………………………………………………………13 附1:源程序代码…………………………………………………………………14 附2:系统原理图…………………………………………………………………27 相关说明: 1、欲下载本站资料,必须成为本站会员。如果你尚未注册或登录,请首先注册或登录。 2、48小时内下载同一文件,不重复扣金币。 3、下载后请用解压缩后使用。 4、下载后仍有问题,请看常见问题解答。 下载地址: 目录: 0、任务书...............................................................................2 1、系统总体设计方案规划与选定.......................................2 2、硬件设计...........................................................................5 3、软件设计...........................................................................6 4、调试...................................................................................8 5、新增功能及实现方法.......................................................8 6、小结与体会.......................................................................9 7、参考文献...........................................................................9 8、附录.................................................................................10 单片机课程设计 0.任务书 基于51单片机设计一个电子数字钟,显示时、分、秒,且具有闹钟功能。用8255接口实现4*8键盘及8位LED显示。 32个键:0~9共10个键,调时(设置当前时间)键;设定闹钟(定时)键;走时键;光标左右移动各一个键。 要求键复位后,应该最后面的LED上显示H(待命状态)。 1.系统总体设计方案规划与选定 1.1主控制芯片选择 方案一:采用ARM微处理,做主控芯片,计算速度快,缺点;成本高,控制较复杂,不容易焊接。 方案二:采用80C51单片机做主控制器,由单片机来完成采集和信号处理等底层的核心计算,做主控芯片,成本低,易控制,易实现。 经过以上两个方案比较,在此题方案二明显优于方案一,故采用80C51单片机做主控制器。 1.2定时模块选择 方案一:采用时钟芯片DS1302。 DS1302 可以用于数据记录,特别是对某些具有特殊意义的数据点的记录,能实现数据与出现该数据的时间同时记录,且较单片机计时简单节约硬件资源,但存在时钟精度不高,易受环境影响,出现时钟混乱等缺点。 方案二:采用单片机内部的定时系统,外接晶振进行分频脉冲计数。 单片机课程设计 此系统采用12MHz晶振。 由于方案二使用简单,比方案一更适用该系统设计,所以选择方案二。 1.3 LED显示及计时模块选择 方案一:74LS192计数器——74LS47七点显示译码器 74LS192芯片是一块可预置数可逆计数芯片,功能强大。将74LS192芯片CPU引脚接高电平可实现减法计数,以倒计时显示。可通过74LS47与LED共阳极数字显示器配合使用。 方案二:使用移位寄存器74HC595与译码器相连 74HC595具有8位移位寄存器和一个存储器,使用时可直接与数字显示器相连。 方案三:使用8255扩展LED显示计时模块 8255是一个可编程并行接口芯片,有一个控制口和三个8位数据口,外设通过数据口与单片机进行数据通信,各数据口的工作方式和数据传送方向是通过用户对控制口写控制字控制的。我们用到了A与B口分别进行对数码显示管的片选和段选,且B口同时作为键盘扫描模块的输入口,与数码显示模块分时复用。故采用方案三 1.4蜂鸣器的选择 方案一:电磁式蜂鸣器 电磁式蜂鸣器主要是利用通电导体会产生磁场的特性,用一个固定的永久磁铁与通电导体产生磁力推动固定在线圈上的鼓膜。电磁式由于音色好,所以多用于语音、音乐等设备。对于不同提示音且考虑实际,此种较好。 方案二:压电式蜂鸣器 单片机课程设计 压电式蜂鸣器用的是压电材料,即当受到外力导致压电材料发生形变时压电材料会产生电荷。同样,当通电时压电材料会发生形变。压电式结构简单耐用但音调单一音色差,适用于警报器等设备。 由于闹铃为音乐闹铃,所以使用电磁式蜂鸣器更为合适。 2.硬件设计 2.1 芯片的选择 2.1.1 单片机80C51 2.1.1.1单片机80C51的组成 80c51单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明: 中央处理器: 中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。 数据存储器(RAM)8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。 程序存储器(ROM): 8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。 单片机课程设计 定时/计数器(ROM): 8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。 并行输入输出(I/O)口: 8051共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的传输。 2.1.1.2 MCS-51的引脚说明: MCS-52系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。现在我们对这些引脚的功能加以说明: MCS-51的引脚说明: MCS-52系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。 单片机课程设计 图1 80C51的引脚 2.1.1.3 MCS-51单片机内部定时器计数器、中断系统简介(1)定时器计数器 1、MCS-51系列中51子系列有两个16位的可编程定时计数器可:定时计数器T0和定时计数器T1。它由加法计数器、方式寄存器TMOD、控制寄存器TCON等组成。方式寄存器用于设定定时计数器T0和T1的工作方式,控制寄存器用于对定时计数器启动、停止进行控制。 2、每个定时计数器既可以对系统时钟计数实现定时,也可以外部信号计数实现计数功能通过编程设定来实现。 3、每个定时计数器都有多种工作方式,其中T0有四种工作方式,T1有三种工作方式,T2有三种工作方式。通过编程可设定工作于某种方式。四种工作方式为:13位定时计数器、16位定时计数器、8位自动重置定时 6 单片机课程设计 计数器、两个8位定时计数器(只有T0有) 4、每一个定时计数器定时计数时间到时产生溢出,使相应的溢出位置位,溢出可通过查询或中断方式处理。 (2)中断系统 1、MCS-51单片机提供5个硬件中断源,2个外部中断源,2个定时计数器T0和T1的溢出中断TF0和TF1,1个串行口发送TI和接收RI中断。 2、MCS-51单片机中没有专门的开中断和关中断指令,对各个中断源的允许和屏蔽是由内部的中断允许寄存器IE的各位来控制的。中断允许寄存器IE的字节地址为A8H,可以进行位寻址。系统复位时,中断允许寄存器IE的内容为00H,如果要开放某个中断源,则必须使IE中的总控置位和对应的中断允许位置“1”。 3、MCS-51单片机有5个中断源,为了处理方便,每个中断源有两级控制,高优先级和低优先级。通过由内部的中断优先级寄存器IP来设置,中断优先级寄存器IP的字节地址为B8H,可以进行位寻址。如果某位被置“1”,则对应的中断源被设为高优先级;如果某位被清零,则对应的中断源被设为低优先级。对于同级中断源,系统有默认的优先权顺序,从高到低优先权顺序为外部中断0、定时计数器T0中断、外部中断 1、定时计数器T1中断、串行口中断。通过设置中断优先级寄存器IP能够改变系统默认的优先级顺序。 4、MCS-51单片机响应中断的条件为:中断源有请求且中断允许。 2.1.2 八位一体七段数码管 单片机课程设计 数码管使用条件: a、段及小数点上加限流电阻。 b、使用电压:段:根据发光颜色决定; 小数点:根据发光颜色决定。c、使用电流:静态:总电流 80mA(每段 10mA);动态:平均电流 4-5mA 峰值电流 100mA 上图为七段数码管引脚图,其中共阳极数码管引脚图和共阴极相同。LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。右图是共阴和共阳极数码管的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已。 将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。以共阴式为例,如把阴极接地,在相应段的阳极接上正电源,该段即会发光。当然,LED的电流通常较小,一般均需在回路中接上限流电阻。假如我们将“b”和“c”段接上正电源,其它端接地或悬空,那么“b”和“c”段发光,此时,数码管显示将显示数字“1”。而将“a”、“b”、“d”、“e”和“g”段都接上正电源,其它引脚悬空,此时数码管将显示“2”。其它字符的显示原理类同。 单片机课程设计 2.1.3 并行接口扩展芯片8255 8255内部包括三个并行数据输入/输出端口,两个工作方式控制电路,一个读/写控制逻辑电路和8位总线缓冲器。 各部分功能概括如下:(1)端口A、B、C A口:是一个8位数据输出锁存器/缓冲器和一个8位数据输入锁存器。B口:是一个8位数据输入/输出锁存器/缓冲器和一个8位数据输入锁存器。C口:是一个8位数据输出锁存器/缓冲器和一个8位数据输入缓冲器(输入不锁存)。 通常A口、B口作为数据输入/输出端口。C口作为控制/状态信息端口,它在“方式控制字”的控制下可分为两个4位端口,每个端口有一个4位锁存器,分别与A口、B口配合使用,作为控制信号输出或状态信息输入端口。 (2)工作方式控制电路 工作方式控制电路有两个,一个是A组控制电路,另一个是B组控制电路。 单片机课程设计 这两组控制电路具有一个控制命令寄存器,用来接受中央处理器发来的控制字,以决定两组端口的工作方式,也可根据控制字的要求对C口按位清“0”或者按位置“1”。 A组控制电路用来控制A口和C口的上半部分(PC7-PC4)。B组控制电路用来控制B口和C口的下半部分(PC3-PC0)。 (3)总线数据缓冲器 总线数据缓冲器是一个三态双向8位缓冲器,作为8255与系统总线之间的接口,用来传送数据、指令、控制命令以及外部状态信息。 (4)读/写控制逻辑电路 读/写控制逻辑电路接受CPU发来的控制信号RD、WR、RESET、地址信号A1-A0等,然后根据控制信号的要求,将端口数据读出,发往CPU,或者将CPU送来的数据写入端口。 2.2 电路的组成 2.2.1 数码管显示电路 数码管显示器成本低,配置灵活,与单片机接口简单,在单片机应用系统中广泛应用。 数码管的工作原理如下: 数码管是由8个发光二极管构成的显示器件。在数码管中,若将二极管的阳极连在一起,称为共阳极数码管;若将二极管的阴极连在一起,称为共阴极数码管。本次课程设计用到的8个数码管均是共阳极的。当发光二极管导通时,它就会发光。每个二极管就是一个笔划,若干个二极管发光时,就 单片机课程设计 构成了一个显示字符。将单片机的I/O口控制相应的芯片与数码管的a-g相连,高电平的位对应的发光二极管亮,这样,由I/O口输出不同的代码,就可以控制数码管显示不同的字符。8个数码管均采用动态显示方式,显示当前的时间。 2.2.2 键盘扫描电路 键盘扫描电路图 键盘可分为两类:非编码键盘和编码键盘;常见的非编码键盘有两种结构:独立式键盘和矩阵式键盘。本次课程设计使用矩阵式键盘。 矩阵键盘的工作原理:按键设置在行、列线交点上,行、列线分别连接到按键开关的两端。列线通过上拉电阻接到+5V 电源上。无按键按下时,列线处于高电平的状态,而当有按键按下时,列线电平与此列线相连的行线电平决定。 行列扫描法原理:第一步,使列线为编程的输入线,行线是输出线,拉低所有的行线,判断列线的变化,如果有按键按下,按键按下的对应列线被拉低,否则所有的列线都为高电平。第二步,在第一步判断有键按下后,延时10ms消除机械抖动,再次读取列值,如果此列线还处于低电平状态则进入下一步,否则返回第一步重新判断。第三步,开始扫描按键位置,采用 11 单片机课程设计 逐行扫描,分别拉低第一行,第二行,第三行,第四行,无论拉低哪一行其他三行都为高电平,读取列值找到按键的位置,分别把行值和列值储存在寄存器里。第四步,从寄存器中找到行值和列值并把其合并,得到按键值,对此按键值进行编码,与已经设定好的键码表进行一一对比,如果不等,则继续比较,如果相等,则利用转移指令实现键盘扫描到按键功能的转移。 2.2.3 音乐闹铃电路 蜂鸣器电路 2.2.3.1 蜂鸣器 蜂鸣器是一种一体化结构的电子讯响器,主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型,他广泛应用于计算机、打印机、复印机、报警器、电话 12 单片机课程设计 机等电子产品中作发声器件。 2.2.3.2 单片机驱动 单片机上面使用的蜂鸣器一般都是无源电磁式的蜂鸣器(如下图所示)。它由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。 蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。 2.2.4 复位电路 RESET/Vpd为复位信号复用脚,当80C51通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。初始化后,程序计数器PC指向0000H,P0-P3输出口全部为高电平,堆栈指针写入07H,其它专用寄存器被清“0”。RESET由高电平下降为低电平后,系统即从0000H地址开始执行程序。然而,初始复位不改变RAM(包括工作寄存器R0-R7)的状态,80C51的初始态。 上电复位:上电复位电路是—种简单的复位电路,只要在RST复位引脚接一个电容到VCC,接一个电阻到地就可以了。上电复位是指在给系统上电时,复位电路通过电容加到RST复位引脚一个短暂的高电平信号,这个复 13 单片机课程设计 位信号随着VCC对电容的充电过程而回落,所以RST引脚复位的高电平维持时间取决于电容的充电时间。为了保证系统安全可靠的复位,RST引脚的高电平信号必须维持足够长的时间。 电路图如下: 上电自动复位是通过外部复位电路的电容充电来实现的。只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。 3软件设计 4.调试 5.新增功能及实现方法 5.1定时器产生音乐的原理 音乐的产生主要是通过单片机的I/O口输出高低不同的脉冲信号来控制蜂鸣器发音。要想产生音频脉冲信号,需要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用单片机定时器计时这个半个周期时间,每当计时到后就将输出脉冲的I/O口反相,然后重复计时此半周期时间再对I/O口反相,这样就能在此I/O口上得到此频率的脉冲。 单片机课程设计 通常,利用单片机的内部定时器0,工作在方式1下,改变计数初值TH0和TL0来产生不同频率。 对于音乐的节拍,每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍。如果1拍为0.4S,1/4拍为0.1S,只要设定延迟时间就可求得节拍的时间。假设1/4拍为1DELAY,那么1拍应为4DELAY,以此类推。所以只要求得1/4拍的DELAY,其余的节拍就是它的倍数。 总而言之,一首乐曲是由音阶和节拍两大要素构成。一首乐曲演奏的原理是:不同音阶分别对应不同的频率,发出不同的音调,而节拍则控制发出音调时间的长短;若将乐曲的音调连续发出,并使其按相应的节拍变化,即可演奏一首乐曲。根据这一特点,我们采用单片机辅以相应的接口来设计音乐播放器。 5.2实现方法 利用定时器产生音乐,添加了音乐闹钟功能,能在闹钟时间到来时蜂鸣器发出《祝你生日快乐》歌,但缺点是在响铃时间里,无法正常显示时间。在此次课程设计中,产生的音乐是利用查表法来改变定时器T1的初值,即改变音高,而通过延时来确定每个音符的长短,即确定音长。 6.小结与体会 7.参考文献 【1】《单片机原理、接口及应用——单片机嵌入式系统技术基础(第2版)》,肖看、李群芳,清华大学出版社 【2】《单片机原理及应用》,霍孟友,机械工程出版社 【3】《51系列单片机设计实例(第二版)》,楼然苗、李光飞,北京航 单片机课程设计 空航天大学出版社 8.附录 8.1 源程序代码ORG 0000H LJMP START ORG 000BH LJMP T0INT;T0中断服务程序 ORG 001BH LJMP TIM0 ;;;;;主程序;;;;;;;;START:LCALL CLEA START1:LCALL SCAN LCALL BELLSCAN LCALL KEYSCAN SJMP START1 CLEA:MOV R0,#70H MOV R7,#0EH CLEAR:MOV @R0,#00H INC R0 DJNZ R7,CLEAR;70H~7CH赋值0 MOV TMOD,#11H MOV TL0,#0B0H MOV TH0,#03CH SETB EA SETB ET0 SETB EX0 SETB TR0 CLR IT0 MOV 72H,#10 MOV 75H,#10 MOV 68H,#55H MOV 69H,#01H MOV 6AH,#00H CLR P1.0 RET ;延时子程序1MS DL1MS: MOV R6,#14H DL1: MOV R7,#19H DL2: DJNZ R7,DL2 DJNZ R6,DL1 RET DL10MS:ACALL SCAN ACALL SCAN ACALL SCAN RET ;《祝你生日快乐》音乐闹铃程序BELLSCAN:MOV A,6AH CJNE A,7AH,BELLOUT MOV A,69H CJNE A,79H,BELLOUT MOV A,68H CJNE A,78H,BELLOUT LCALL MUSIC BELLOUT:RET MUSIC: MOV IE,#8AH MOV 30H,#00H NEXT1:MOV A,30H MOV DPTR,#TABLE MOVC A,@A+DPTR MOV R2,A JZ END0 ANL A,#0FH MOV R5,A MOV A,R2 SWAP A ANL A,#0FH 单片机课程设计 JNZ SING CLR TR1 LJMP D1 SING:DEC A MOV 22H,A RL A MOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV TH1,A MOV 21H,A MOV A,22H RL A INC A MOVC A,@A+DPTR MOV TL1,A MOV 20H,A SETB TR1 D1:LCALL DELAY INC 30H LJMP NEXT1 END0:CLR TR1 LCALL BELLOUT TIM0:PUSH ACC PUSH PSW MOV TL1,20H MOV TH1,21H CPL P1.0 POP PSW POP ACC RETI DELAY:MOV R7,#02H D2:MOV R4,#187 D3:MOV R3,#248 DJNZ R3,$ DJNZ R4,D3 DJNZ R7,D2 DJNZ R5,DELAY RET TABLE1:DW 64260,64400,64521,64580 DW 64684,64777,64820,64898 DW 64968,65030,65058,65110 DW 65157,65178,65217 TABLE:;1 DB 82H,01H,81H,94H,84H DB 0B4H,0A4H,04H DB 82H,01H,81H,94H,84H DB 0C4H,0B4H,04H;2 DB 82H,01H,81H,0F4H,0D4H DB 0B4H,0A4H,94H DB 0E2H,01H,0E1H,0D4H,0B4H DB 0C4H,0B4H,04H DB 00H SCAN:;把记的数送给偏移量 MOV DPTR,#7FFFH MOV A,#80H MOVX @DPTR,A;写控制字,在显示程序中A口输出,B口输出 MOV A,78H;秒 MOV B,#0AH DIV AB MOV 71H,A MOV 70H,B MOV A,79H;分 MOV B,#0AH DIV AB MOV 74H,A MOV 73H,B MOV A,7AH;时 MOV B,#0AH DIV AB MOV 77H,A MOV 76H,B; 单片机课程设计 T0中断允许 ;循环扫描显示,数码管显示程序,数码管为共阳型 MOV R1,#70H MOV R5,#80H;位选 MOV R3,#08H SCAN1:MOV A,R5 MOV DPTR,#7FFCH MOVX @DPTR,A;送A口位选 MOV A,@R1 MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#7FFDH MOVX @DPTR,A;送B口字形码 LCALL DL1MS INC R1;字形码偏移量 MOV A,R5 RR A;位选码 MOV R5,A DJNZ R3,SCAN1;8次 MOV DPTR,#7FFCH MOV A,#00H MOVX @DPTR,A;A口清位选 RET TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH;对应于“0”~“9”、“_” ;定时器T0中断服务程序 T0INT:PUSH ACC CLR ET0;停 CLR TR0;停T0工作 MOV TL0,#0B0H MOV TH0,#03CH SETB TR0;开T0工作 INC 7BH;7BH存放20 MOV A,7BH CJNE A,#14H,OUTT0;20 MOV 7BH,#00H INC 78H;78H秒 MOV A,78H CJNE A,#3CH,OUTT0;60 MOV 78H,#00H INC 79H ;79H分 MOV A,79H CJNE A,#3CH,OUTT0;60 MOV 79H,#00H INC 7AH ;7AH时 MOV A,7AH CJNE A,#18H,OUTT0;24 MOV 7AH,#00 OUTT0:SETB ET0;开T0中断允许 POP ACC RETI ;;;;;;键盘扫描子程序;;;;;;;; KEYSCAN:MOV DPTR,#7FFFH MOV A,#82H MOVX @DPTR,A;写控制字,此时A口输出,B口输入 MOV DPTR,#7FFEH MOV A,#00H MOVX @DPTR,A;C口写0 单片机课程设计 MOV DPTR,#7FFDH MOVX A,@DPTR MOV B,A ;B口输入 CJNE A,#0FFH,HAVE KEYOUT: RET HAVE: LCALL DL10MS1 MOVX A,@DPTR CJNE A,B,KEYOUT;延时一段时间再检测有键按下才开始扫描处理 INC DPTR MOV A,#0FEH MOV B,A MOVX @DPTR,A;C口输出行值 MOV DPTR,#7FFDH MOVX A,@DPTR;B口输入列值 CJNE A,#0FFH,KEYLIE0 MOV A,B RL A MOV B,A MOV DPTR,#7FFEH MOVX @DPTR,A;C口输出行值 MOV DPTR,#7FFDH MOVX A,@DPTR;B口输入列值 CJNE A,#0FFH,KEYLIE1 MOV A,B RL A MOV B,A MOV DPTR,#7FFEH MOVX @DPTR,A;C口输出行值 MOV DPTR,#7FFDH MOVX A,@DPTR;B口输入列值 CJNE A,#0FFH,KEYLIE2 MOV A,B RL A MOV DPTR,#7FFEH MOVX @DPTR,A;C口输出行值 MOV DPTR,#7FFDH MOVX A,@DPTR;B口输入列值 CJNE A,#0FFH,KEYLIE3 ACALL KEYOUT; KEYLIE0:MOV R2,#00H;R2 键码 行值,第1行八个数 LJMP KEYGET KEYLIE1:MOV R2,#08H;第2行,八个数 LJMP KEYGET KEYLIE2:MOV R2,#10H;第3行,八个数 LJMP KEYGET KEYLIE3:MOV R2,#18H;第4行,八个数 LJMP KEYGET KEYGET:MOV B,A ;B中存放B口读入的列值 MOV DPTR,#KEYTAB MOV A,#0 NEXT: PUSH ACC MOVC A,@A+DPTR CJNE A,B,AGAIN POP ACC;A是偏移值,即列值 ADD A,R2;A中存放键码 单片机课程设计 MOV B,A RL A ADD A,B;PC偏移量 MOV LJMP KEYFUN30 LJMP KEYFUN31 RET KEYTAB:DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH DPTR,#KEYFUNTAB JMP @A+DPTR AGAIN: POP ACC INC A CJNE A,#8,NEXT ACALL KEYOUT KEYFUNTAB: LJMP KEYFUN00 LJMP KEYFUN01 LJMP KEYFUN02 LJMP KEYFUN03 LJMP KEYFUN04 LJMP KEYFUN05 LJMP KEYFUN06 LJMP KEYFUN07 LJMP KEYFUN08 LJMP KEYFUN09 LJMP KEYFUN10 LJMP KEYFUN11 LJMP KEYFUN12 LJMP KEYFUN13 LJMP KEYFUN14 LJMP KEYFUN15 LJMP KEYFUN16 LJMP KEYFUN17 LJMP KEYFUN18 LJMP KEYFUN19 LJMP KEYFUN20 LJMP KEYFUN21 LJMP KEYFUN22 LJMP KEYFUN23 LJMP KEYFUN24 LJMP KEYFUN25 LJMP KEYFUN26 LJMP KEYFUN27 LJMP KEYFUN28 LJMP KEYFUN29 ;0 1 2 3 4 5 6 7 RET DL10MS1:MOV R4,#20 DL3: MOV R5,#7DH DL4: NOP NOP DJNZ R5,DL4 DJNZ R4,DL3 RET KEYFUN00:MOV @R0,#00H MOV A,7EH CJNE A,#0FFH,CALCU RET KEYFUN01:MOV @R0,#01H MOV A,7EH CJNE A,#0FFH,CALCU RET KEYFUN02:MOV @R0,#02H MOV A,7EH CJNE A,#0FFH,CALCU RET KEYFUN03:MOV @R0,#03H MOV A,7EH CJNE A,#0FFH,CALCU RET KEYFUN04:MOV @R0,#04H MOV A,7EH CJNE A,#0FFH,CALCU RET KEYFUN05:MOV @R0,#05H MOV A,7EH CJNE A,#0FFH,CALCU RET KEYFUN06:MOV @R0,#06H MOV A,7EH CJNE A,#0FFH,CALCU RET 单片机课程设计 KEYFUN07:MOV @R0,#07H MOV A,7EH CJNE A,#0FFH,CALCU RET KEYFUN08:MOV @R0,#08H MOV A,7EH CJNE A,#0FFH,CALCU RET KEYFUN09:MOV @R0,#09H MOV A,7EH CJNE A,#0FFH,CALCU RET CALCU: MOV A,71H MOV B,#0AH MUL AB ADD A,70H MOV 78H,A MOV A,74H MOV B,#0AH MUL AB ADD A,73H MOV 79H,A MOV A,77H MOV B,#0AH MUL AB ADD A,76H MOV 7AH,A RET KEYFUN10://调时键 CLR TR0 MOV R0,#77H;R0指向时的偏移量 MOV 7DH,#00H;闪烁标志位 LCALL FLASH RET FLASH:MOV A,@R0 MOV @R0,#0BH;R0(此时77H)指向熄灭的偏移量 MOV 7CH,#3DH;7CH单元存放循环次数 RE: LCALL OFFSCAN DJNZ 7CH,RE;调用OFFSCAN60次,半秒 MOV @R0,A;R0(此时77H)指向原来的偏移量 MOV 7CH,#3DH RE1: LCALL OFFSCAN DJNZ 7CH,RE1;调用OFFSCAN60次,半秒 LCALL KEYSCAN;键盘扫描 MOV A,7DH CJNE A,#0FFH,FLASH;判断闪烁标志位 RET OFFSCAN: PUSH ACC MOV R1,#70H MOV R5,#80H;位选 MOV R3,#08H OFFSCAN1:MOV DPTR,#7FFFH MOV A,#80H MOVX @DPTR,A;写控制字 MOV A,R5 MOV DPTR,#7FFCH MOVX @DPTR,A;A口输出位选 MOV A,@R1 MOV DPTR,#OFFTAB MOVC A,@A+DPTR MOV DPTR,#7FFDH MOVX @DPTR,A;B口输出字形码 LCALL DL1MS INC R1 ;R1指向下一个单元 MOV A,R5 RR A MOV R5,A;位选 DJNZ R3,OFFSCAN1;8次 单片机课程设计 MOV DPTR,#7FFCH MOV A,#00H MUL AB ADD A,73H MOV 69H,A MOVX @DPTR,A;A口位选清零 POP ACC RET OFFTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH,0FFH,89H RET //调时键按下 KEYFUN11:INC R0 RET KEYFUN12:DEC R0 RET KEYFUN13://走时键 MOV 7DH,#0FFH SETB TR0 RET KEYFUN14://闹铃键 MOV R0,#77H MOV 7EH,#0FFH;改变显示单元,不改变计数单元 MOV 7DH,#00H;开FLASH标志位 LCALL FLASH RET KEYFUN15://闹钟时间确认键,写入计数比较单元 MOV A,71H MOV B,#0AH MUL AB ADD A,70H MOV 68H,A MOV A,74H MOV B,#0AH MOV A,77H MOV B,#0AH MUL AB ADD A,76H MOV 6AH,A RET KEYFUN16:RET KEYFUN17:MOV 7DH,#00H MOV 70H,#0CH MOV 71H,#0BH MOV 72H,#0BH MOV 73H,#0BH MOV 74H,#0BH MOV 75H,#0BH MOV 76H,#0BH MOV 77H,#0BH;送熄灭符以及H符 MOV R0,#70H LCALL FLASH RET KEYFUN18:MOV 7DH,#0FFH;关闭闪烁 LCALL CLEA RET KEYFUN19:RET KEYFUN20:RET KEYFUN21:RET KEYFUN22:RET KEYFUN23:RET KEYFUN24:RET KEYFUN25:RET KEYFUN26:RET KEYFUN27:RET KEYFUN28:RET KEYFUN29:RET KEYFUN30:RET KEYFUN31:RET ACALL KEYOUT END 单片机课程设计 8.2电路图 总体电路图 单片机课程设计 课题: 简易电子琴设计 学 院: 电气与信息工程学院 专 业: 电子信息工程 姓 名: 李琳琳 学 号: 093411106 指导老师: 田巍 河南城建学院 2014年 01 月 01 日 课 程 设 计 设计题目: 基于单片机的8*8点阵显示数字设计 学生姓名: 指导教师: 二级学院: 专 业: 班 级: 学 号: 目 录 摘要„„„„„„„„„„„„„„„„„„„„„„„„„„Ⅱ 1 方案选择及总体设计„„„„„„„„„„„„„„„„„„„1 1.1方案确定„„„„„„„„„„„„„„„„„„„„„1 1.1.1功能要求„„„„„„„„„„„„„„„„„„„„1 1.1.2方案确定„„„„„„„„„„„„„„„„„„„„1 1.2器件选择„„„„„„„„„„„„„„„„„„„„„1 2 控制系统设计„„„„„„„„„„„„„„„„„„„„„„2 2.1 控制系统硬件设计„„„„„„„„„„„„„„„„„2 2.1.1整体模块设计„„„„„„„„„„„„„„„„„„2 2.1.2单片机AT89C51„„„„„„„„„„„„„„„„„2 2.1.3单片机最小系统设计„„„„„„„„„„„„„„„5 2.1.3.1晶振电路设计„„„„„„„„„„„„„„„„„5 2.1.3.2复位电路设计„„„„„„„„„„„„„„„„„5 2.1.4驱动电路设计„„„„„„„„„„„„„„„„„„6 2.1.5LED点阵显示设计„„„„„„„„„„„„„„„„9 2.2控制系统软件设计„„„„„„„„„„„„„„„„„11 2.2.1软件设计思想„„„„„„„„„„„„„„„„„„11 2.2.2主程序流程图„„„„„„„„„„„„„„„„„„11 2.2.3子程序流程图„„„„„„„„„„„„„„„„„„13 3 系统仿真及调试„„„„„„„„„„„„„„„„„„„„14 3.1系统调试„„„„„„„„„„„„„„„„„„„„„14 3.2系统仿真„„„„„„„„„„„„„„„„„„„„„14 3.2.1protrus软件仿真„„„„„„„„„„„„„„„„14 3.2.2程序„„„„„„„„„„„„„„„„„„„„„„14 总结„„„„„„„„„„„„„„„„„„„„„„„„„^„17 参考文献„„„„„„„„„„„„„„„„„„„„„„„„18 I 摘 要 现在市场上各类基于LED的显示屏较多,但大部分产品为单一模式的LED显示屏,其在显示内容的更换及显示屏的重组等方面都存在不便之处。但随着信息化社会的迅速发展,LED显示屏正在向显示内容丰富、信息更改方便等方面发展。因此制作一款多功能的LED广告显示屏是非常有意义地。 LED驱动显示采用动态扫描方法,动态扫描方式是逐行轮流点亮,这样扫描驱动电路就可以实现多行的同名列共用一套列驱动器。以8×8点阵为例,把所有同一行的发光管的阳极连在一起,把所有同一列的发光管的阴极连在一起(共阳的接法),先送出对应第1行发光管亮灭的数据并锁存,然后选通第1行使其燃亮一定的时间,然后熄灭;再送出第2行的数据并锁存,然后选通第2行使其燃亮相同的时间,然后熄灭;第8行之后,又重新燃亮第1行,反复轮回。当这样轮回的速度足够快(每秒24次以上),由于人眼的视觉暂留现象,就能看到显示屏上稳定的图形。该方法能驱动较多的LED,控制方式较灵活,而且节省单片机的资源。 本次课程设计的题目为8×8点阵数字显示,设计的任务为使用单片机控制8×8的点阵显示0到9的数字,不仅显示清晰,并且每经过一定时间,显示的数字加一,从0 到 9 循环。以AT89C51单片机为核心,采用串行传输、动态扫描技术,制作一款模块化LED多功能显示屏。 在资料收集方面,主要是参考了《51单片机原理及应用—基于Keil C与Proteus》一书,结合了一些网络资料,以及一些集成块的使用说明书。 在整个工作过程中,根据收集来的资料绘制出大概的原理图,然后通过Proteus仿真,与此同时运用Keil 编程,用Keil 与Proteus进行联调,调试成功后确定了原理图和控制程序。 II 第一章 方案选择及总体设计 1.1 方案确定 1.1.1 功能要求 1、采用STC-51单片机作为微处理器。 2、设计一个8×8点阵LED数码字符显示器。 3、在目测条件下LED显示屏各点亮度均匀、充足、稳定、清晰无串扰。 4、动态显示“0——9”几个字符。 1.1.2 方案确定 采用ST89C51单片机作为微处理器,将共阳极二极管用共阴型接法连接成8×8点阵LED数码字符阵列,通过程序控制,采用动态显示,建立字符库“0——9”。 1.2 器件选择 微处理器采用ST89C51系列单片机,ST89C51单片机是这几年在我国非常流行的单片机,是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)高性能单片机,可擦除只读存储器可以反复擦除100次,具有低功耗、高性能的特点。 AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 第二章 控制系统设计 2.1控制系统硬件设计 2.1.1整体模块设计 本设计行、列驱动电路,显示器电路,运用单片机的智能化,系统的将每个功能电路模块连接在一起,总体结构设计如图2-1所示。 点阵显示器行驱动电路PC上位机单片机8×8点阵LED显示器电路点阵显示器列驱动电路 图2-1 硬件系统框图 此次需要实现的功能是利用一个ST89C51,一个8×8LED点阵,动态显示“0——9”10个字,采用PC上位机驱动显示电路。 2.1.2 单片机AT89C51 AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4k bytes的可反复擦写的只读程序存储器(PEROM)和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产, 兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C51单片机能提供许多高性价比的应用场合,可灵活应用于各种控制领域。 AT89C51单片机引脚图如图2-2所示。 图2-2 AT89C51引脚图 AT89C51管脚说明: VCC:供电电压。GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1 口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行 存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 P3口也可作为AT89C51的一些特殊功能口,如下所示: P3口管脚 备选功能: P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通) P3口同时为闪烁编程和编程校验接收一些控制信号。 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。 /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。 /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2: 来自反向振荡器的输出。 2.1.3 单片机最小系统设计 单片机的最小系统是能够让单片机工作的最小硬件电路。除了单片机外,最小系统还包括复位电路和时钟电路。 复位电路:单片机的复位电路接在复位信号RST上,复位电路用于将单片机内部电路的状态恢复到初始值。需要复位时按下按钮即可。 时钟电路:时钟电路为单片机工作提供基本时钟。时钟电路中包含一个晶体振荡器,简称晶振,频率范围是1.2~12MHz。晶体振荡频率越高,系统的时钟频率也越高,单片机的运行速度也就越快 ST89C51单片机最小系统电路由复位电路、晶振电路两部分组成。2.1.3.1 晶振电路设计 ST89C52单片机芯片内部设有一个由反向放大器构成的振荡器,XTAL1和XTAL2分别为振荡电路的的输入端和输出端,时钟可有内部或外部生成,在XTAL1和XTAL2引脚上外接定时元件,内部振荡电路就会产生自激振荡。系统采用的定时元件为石英晶体和电容组成的并联谐振回路。晶振频率采用12MHZ,C1、C2的电容值取30pF,电容的大小起频率微调的作用。晶振电路图如图2-3所示。 C1XTAL130pFC2XTAL230pF图2-3 晶振电路图 X112MHZ 2.1.3.2 复位电路设计 ST89C51单片机在启动运行时或者出现死机时需要复位,使CPU以及其他功能部件处于一个确定的初始状态,并从这个状态开始工作。单片机有多种复位方式,常用的复位操作有上电复位和手动复位方式。本设计采用最简单的上电复位方式,电路如图2-4所示。上电复位是通过外部复位电路的电容充电来实现的,复位电路产生的复位信号(高电平有效)由RST引脚送入到内部的复位电路,对ST89C51单片机进行复位,复位信号要持续两个机器周期(24个时钟周期)以上,才能使ST89C51单片机可靠复位。当上电时,C1相当于短路,有时碰到干扰时会造成错误复位,可在复位端加个去耦电容,可以取得很好的效果。 ST89C51单片机复位电路如下图所示: VCCAT89C51VCCC510MF/25VRSTR94.7KVSSR24.7KVSSRSTR1C10MF/25VS5 RSTVCCAT89C51VCC 图2-4 上电复位电路图 图2-5 按键电平复位电路图 复位电路工作原理: 上电瞬间RST引脚的电位与VCC等电位,RST引脚为高电平,随着电容C5充电电流的减少,RST引脚的电位不断下降,可以保持RST引脚在为高电平的时间内完成复位操作。 当单片机已在运行当中时,按下复位键S5后再松开,也能使RST引脚为一段时间的高电平,从而实现ST89C51单片机复位。 2.1.4 驱动电路设计 驱动电路图如图2-6所示。 图2-6 驱动电路图 74LS245引脚图如图2-7所示。 图2-7 74LS245引脚图 引出端符号: A A总线端 B B总线端 /G 三态允许端(低电平有效)DIR 方向控制端 74LS245是用来驱动LED或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。74LS245还具有双向三态功能,既可以输出,也可以输入数据。 如果用89C51的P0口输出到数码管,那就要考虑到数码管的亮度以及P0口带负载的能力,当89C51单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS245等总线驱动器。选用74LS245提高驱动能力。P0口的输出经过74LS245提高驱动后,输出到数码管显示电路。 工作原理: 当片选端/CE低电平有效时,DIR=“0”,信号由B向A传输;(接收)DIR=“1”,信号由A向B传输;(发送)当CE为高电平时,A、B均为高阻态。 正向点亮一颗LED,至少也要10~20mA,若电流不够大,则LED不够大。而不管是ST89C51的I/O口,还是TTL、CMOS的输出端,其高态输出电流都不是很高,不过1~2mA而已。因此很难直接高态驱动LED,这时候就需要额外的驱动电路,通常有共阳型与共阴型LED阵列驱动电路,本设计才用共阴型高态扫描信号驱动电路。 共阴型LED阵列驱动电路采用高态扫描,也就是任何时间只有一个高态信号,其它则为低态。一行扫描完成后,再把高态信号转化到近邻的其他行,扫描信号接用一个反向驱动器,ST89C51本身内置一个反向驱动器,本设计将ST89C51作为点矩阵显示控制系统的控制核心,通过点矩阵实时显示并移动字符。 单片机的串口与行驱动器相连,用来发送显示数据信息。P3口与LED阵列的行引脚相连,送出数据、地址以及系统控制信号。输出低态时,最大可吸取0.5A,即500mA,若每个LED取30mA,7个LED同时点亮,需要210mA,完全满足LED点亮的基本条件。 所要显示的信号送入74LS245芯片,然后连接到LED阵列的列阵脚。对于高态的显示信号,将可提供其所连接LED的驱动电流,而这个驱动电流经过LED到输出端,形成正向回路,即可点亮该LED。其中每个晶体管任何时间只需负 责驱动一个LED,所以选择30mA射极电流的晶体管。驱动电路如图2-6所示。 2.1.5 LED点阵显示设计 本设计采用ATMEL公司的AT89C51作矩阵显示控制系统控制核心,12MHZ晶振,88点阵共阳LED显示器。其中,P0口作为字符数据输出口,P3口为字符显示扫描输出口,第31脚(EA)接电源,改变电阻(270×8)的大小可改变显示字符的亮度,驱动用74LS245芯片。 本设计LED矩阵显示器电路选用8×8点阵模块,系统由单片机控制。LED显示屏是将发光二极管按行按列布置的,在扫描驱动方式下可以按行扫描按列控制,也可以按列扫描按行控制。本文就是使用1块8×8点阵,采用按列扫描按行控制控制方式,扫描顺序自左向右,以满足数字显示的要求。8×8点阵LED结构如图2-8所示。 8×8点阵LEDabcdefgh12345678 图2-8 LED数码显示管 8×8 点阵LED的工作原理:LED点阵的显示方式是按显示编码的顺序,一行一行地显示。对于共阳型的点阵来说,当某一点所在的行对应高电平“1”并且其所在的列对应低电平“0”的时候,这一点就会被点亮。将每一行的显示时间进行一定的延时,由于人的视觉暂留现象,就会感觉到8行LED是在同时显示的。若显示的时间太短,则亮度不够,若显示的时间太长,将会感觉到闪烁。图2-9为8×8点阵LED外观及引脚图,其等效电路如图2-10所示,只要其对应的X、Y轴顺向偏压,即可使LED发亮。例如如果想使左上角LED点亮,则Y0=1,X0=0即可。应用时限流电阻可以放在X轴或Y轴。一个8×8点阵是由64个发光二极管按规律组成的,如图2-10所示。图中,行接高电平,列接低电平,发光二极管导通发光。 图2-9 8×8点阵LED外观及引脚图 图2-10 8×8点阵LED等效电路 8×8点阵数字显示的编码原理: 8×8点阵数字显示主要应用行扫描动态显示的方法实现,如图2-11所示,将行线依次置零,一次对列线编码,有红色填充部分为1,无填充部分为0。 图2-11 8×8点阵数字显示的编码原理 如此可得到“0”的编码为{0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00},同理可得到: {0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00} //1 {0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00} //2 {0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00} //3 {0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00} //4 {0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00} //5 {0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00} //6 {0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00} //7 {0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00} //8 {0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00} //9 2.2控制系统软件设计 2.2.1 软件设计思想 主程序先进行设置中断,并启动,再进行键盘扫描载入“0——9”字型,然后判断一组字型是否扫描完,按不同情况进行循环调用子程序。进入子程序后,首先设置相应的程序,反复调用显示子程序,并在显示过程中反复调用键盘扫描子程序进行延时,判断是否退出相应的方式显示子程序。设计过程中,能很好得提高按键响应速度。 2.2.2 主程序流程图 主程序首先设置并启动T0中断,然后调用初始化程序,为后面程序要用到的数据调入,并清零一些用到的数据单元,然后载入“0——9”字型,进行扫描。图2-12为主程序流程图。 图2-12 主程序流程图 2.2.3 子程序流程图(定时中断服务程序) 图11 子程序流程图(定时中断服务程序) 第三章 系统仿真及调试 3.1系统调试 根据硬件电路图核对了元器件的型号、极性,安装是否正确,检查硬件电路连线是否与电路原理图一致,检查电路元器件是否都已经连接好。 通电后,用示波器检测单片机的复位和晶振电路是否有复位信号和振荡信号。 3.2 系统仿真 3.2.1 proteus软件仿真 使用proteus原理及仿真如图3-1所示。 如图3-1 proteus原理及仿真图 3.2.2 程序 #include { 0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00, 0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00,//0 //1 0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00,//2 0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00,//3 0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00,//4 0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00, 0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00, 0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00 };uchar i=0,t=0,Num_Index;//主程序 void main(){ P3=0x80; Num_Index=0; //从0开始显示 TMOD=0x00; //T0方式0 TH0=(8192-2000)/32;//2ms定时 TL0=(8192-2000)%32;IE=0x82; //允许T0中断 TR0=1; //启动T0 while(1);} //T0中断函数 void LED_Screen_Display()interrupt 1 { TH0=(8192-2000)/32; //恢复初值 TL0=(8192-2000)%32;P0=0xff; //输出位码和段码 P0=~Table_of_Digits[Num_Index*8+i];P3=_crol_(P3,1); //P3循环向左一位 //5 //6 //7 //8 //9 } if(++i==8)i=0;if(++t==250){ } t=0; //每屏一个数字由8个字节构成 //每个数字刷新显示一段时间 if(++Num_Index==10)Num_Index=0;//显示下一个数字 总结 经过单片机的课程设计,我有了很大的收获。 首先,就是让我加深了对单片机的掌握和理解与应用,知道单片机到底是怎样控制点阵,怎样应用在生活中的。并且让我懂得了要善于思考,追求严谨,认真解决问题,才会有更多的收获。 然后,提高了通过查阅资料解决问题的能力。通过查阅大量的相关资料,详细了解了LED的发光原理和LED显示屏的原理,了解了LED的现状,清楚地了解了LED显示屏与其它显示屏相比较有那些优点,明确了研究目标。并且通过对单片机资料的查阅和应用,更进一步增加了对单片机知识的理解和运用能力。并证实了自己的思路:“查资料→思考总结→运用→找出差错,再查资料和向别人询问→再次运用”的正确性。 最后,本系统能够完成设计任务,能够显示数字0-9,并且显示也较为稳定清晰。本系统具有硬件少,结构简单,容易实现,性能稳定可靠,成本低等特点。在本次课程设计中,主要使用了Proteus和Keil等软件进行硬件电路和控制程序的设计,加深了对这些软件的了解。感到Proteus对电子专业的同学来说是一个很有用的软件。总体来说这次的课程设计很成功,达到了预想的目的:学到了知识,提高了能力,完成了任务。 参考文献 [1] 张靖武,周灵彬 《单片机系统的PROTEUS设计与仿真》北京 电子工业出版社 [2] 吴金戌,沈庆阳,郭庭吉 《8051单片机实践与应用》北京 清华大学出版社 [3] 李群芳,肖看 《单片机原理、接口及应用》北京 清华大学出版社 [4] 张毅刚,彭喜元等 《新编MCS-51单片机应用设计 》黑龙江 哈尔滨工业大学出版社 [5] 李朝青,刘艳玲编著 《单片机原理及接口技术》北京 航空航天大学出版社第二篇:单片机课程设计报告 定时闹钟
第三篇:单片机课程设计音乐闹钟定时器
第四篇:单片机课程设计
第五篇:单片机课程设计