
本设计主要是对51单片机的一个方面的扩展,是能实现一般定时功能的设计。系统采用单片机ATC51作为本设计的核心元件,在其基础上外围扩展芯片和外围电路,附加时钟电路,复位电路,键盘接口及LED显示器,键盘采用连接式。外围设备有LED显示驱动器及相应的显示数字电子钟设计与制作可采用数字电路实现,也可以采用单片机来完成。若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且其成本也有所降低,所以在该设计与制作中采用单片机ATC51,它是低功耗、高性能的CMOS型8位单片机。片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。另外, ATC51的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。 在LED显示器中,分成静态显示和动态显示两类,在这个设计的最小系统中主要用了它的动态显示功能,动态显示器利用了人视觉的短暂停留,在数据的传输中是一个一个传输的,且先传输低位。按键电路设有四个按键:从上往下为k1,k2,k3和k4键。按下k1键用于启动和暂停秒表;k2键用于复位;k3键用于当秒表暂停时,增加其显示值;k4键用于秒表暂停时减少其显示值。
一、设计任务和要求………………………………………….….3
(1)设计任务…………………………..…………………...…..…3
(2)设计要求…………………..……………..………………....…3
二、设计方案与论证………………………………………….....3
三、硬件设计…………………………………………………….4
(1)时钟电路…………………………………………………….4
(2)按钮电路…………………………………………………….4
(3)显示电路…………………………………………………….5
(4)动态显示原理…………………………………………………7
(5)80C51中断的控制………………………………………..……7
(6) 定时/计数器的控制…………………………………..………..7
(7) 单片机………………………………………..……………..9
四、原理图及器件清单………………………………………….9
( 1 )总原理图…………………………………………………..…..9
(2)PCB图………………………………………………….…….10
(3)元器件清单………………………………………..……….…11
五、实验效果图……………………………………………..…..11
六、结论和心得…………………………………………………11
七、参考文献……………………………………………….…...12
八、附录………………………………………………………….12
秒表设计
一、设计任务和要求
(1)设计任务
用ATC51设计一个3位的LED数码作为“秒表”。
(2)设计要求
显示时间为0.0-99.9秒,每0.1秒自动加1,另外设计一个“开始、停止”键、一个“复位”键、一个“加1”键和一个“减1”键。秒表可单独分别计时,当秒表停止时,可根据实际时间调整。
二、方案设计与论证
本设计分为时钟电路、按钮电路、显示电路和单片机四大部分,这些模块中单片机占主控地位。时钟电路常用的有内部时钟方式和外部时钟方式,但因为本设计中只需要一片单片机,所以采用内部时钟方式比较简单。按钮电路中的“复位”按钮是按键手动复位,它有电平和脉冲两种方式,比较电路的复杂程度,本设计选择了按钮电平复位电路,其他几个按钮则是通过单片机判断高低电平的不同来控制按钮。显示电路所用的数码管有共阴和共阳之分,不管使用何种数码管,P0口作为I/O使用时都是需要上拉电阻才能驱动数码管。另外,因为单片机的4个并行I/O口的输出电流一般是1mA,短路电流为4mA左右,而数码管的最少驱动电流也需要10mA,因而不管在使用共阴数码管时,单片机输出口也必须使用上拉电阻提高输出电流,才能驱动数码管。为了使电路简单化,本设计选用共阳数码管。 但根据显示方式的不同选择,我们可以有几种方案:
方案一:使用静态显示方式。静态显示方式下的数码管的显示字符一经确定,相应锁存器锁存的断码输出將维持不变,直到送入另一个字符的断码为止。因而此设计中使用的显示位数使用了三个8位并行I/0口。如果另外想扩展单片机功能,则能使用的输出管脚很是有限。
方案二:使用动态显示方式。这个显示方式是将所有显示位的段码线的相应段并联在一起,由一个8位I/O口控制,而各位的共阴或共阴极分别由相应的I/O线控制,形成各位的分时选通。这种显示方式,简化了硬件电路,特别在多位数码管显示时尤为突出。
在本次设计中我采用的是动态显示。
三、硬件设计
其模块电路如图2-1所示。
图2-1
(1)时钟电路
单片机的时钟产生方法有两种:内部时钟方式和外部时钟方式。本系统中ATS51单片机采用内部时钟方式。最常用的内部时钟方式是采用外接晶体和电容组成的并联谐振回路。振荡晶体可在1.2MHz~12MHz之间。电容值无严格要求,但电容取值对振荡频率输出的稳定性、大小和振荡电路起振速度有少许影响,一般可在20pF~100pF之间取值。AT98S51单片机的时钟电路如图2-2所示,时钟电路的晶振频率越高,系统的时钟频率越高,单片机的运行速度也就越快。晶振频率根据设计需要设为12MHz,又根据谐振性质,电路中的电容C1、C2选择为30pF左右。该电容的的大少会影响振荡器频率的高低、振荡器的稳定性和起振的快速性。
图2-2 时钟电路
(2)按钮电路
键盘分编码键盘和非编码键盘。键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘而靠软件编程来识别的称为非编码键盘;非编码键盘有分为:键盘和行列式(又称为矩阵式)键盘;行列式键盘如图2-3a;键盘如图2-3b。
图2-3a
图2-3b
键盘消抖电路如下:
(3)显示电路
显示电路用的是前三位数码管,第一位用于显示毫秒,第二位用于显示个位,第三位用于显示十位,对应的最适合的共阴或者共阳级的数码管也不同。下图中图(a)为共阴数码管,图(b)为共阳数码管。静态显示的适宜选共阳的数码管,动态显示的适宜选共阴的数码管。如果动态显示方式下选择共阳的数码管,位选端直接用单片机驱动则数码管的亮度不够,因而应该在位选端使用上拉电阻以提高数码管的驱动电流,但因为显示那个的数据段选的数目不同,故而需要用电阻对各段进行限流,以保证显示的每个数据亮度相同。相同情况下,静态显示的数码管的亮度要比动态的亮。本次设计中数码管使用的是动态显示。
(4)动态显示原理
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。这样一来,就没有必要每一位数码管配一个锁存器,从而大大地简化了硬件电路。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。
(5)80C51中断的控制
中断允许控制
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。
▪EX0(IE.0),外部中断0允许位;
▪ET0(IE.1),定时/计数器T0中断允许位;
▪EX1(IE.2),外部中断0允许位;
▪ET1(IE.3),定时/计数器T1中断允许位;
▪ES(IE.4),串行口中断允许位;
▪EA (IE.7), CPU中断允许(总允许)位。
(6) 定时/计数器的控制
80C51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。
工作方式寄存器TMOD
工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下:
GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。即此时定时器的启动多了一条件。
:定时/计数模式选择位。 =0为定时模式; =1为计数模式。
M1M0:工作方式设置位。定时/计数器有四种工作方式,由M1M0进行设置。
在本次课设中,使用的为方式0。方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。
定时器模式时有:N=t/ Tcy
计数初值计算的公式为:
定时器的初值还可以采用计数个数直接取补法获得。
计数模式时,计数脉冲是T0引脚上的外部脉冲。
门控位GATE具有特殊的作用。当GATE=0时,经反相后使或门输出为1,此时仅由TR0控制与门的开启,与门输出1时,控制开关接通,计数开始;当GATE=1时,由外中断引脚信号控制或门的输出,此时控制与门的开启由外中断引脚信号和TR0共同控制。当TR0=1时,外中断引脚信号引脚的高电平启动计数,外中断引脚信号引脚的低电平停止计数。这种方式常用来测量外中断引脚上正脉冲的宽度。
(7)单片机
单片机的程序可用汇编语言也可用C语言,为了提高使用汇编语言的能力,本设计特用了C语言了编写程序主程序流程图如下所示,具体程序见附录。主程序流程图:
四、总原理图及元器件清单
(1)总原理图
(2)PCB图
(3)元器件清单
1) ATC51的引脚图和数码管的引脚图
图4-3a ATC51引脚图 图4-3b 5101引脚图
2)元器件总清单
| 元件名称 | 数量 | 备注 | 元件名称 | 数量 | 备注 |
| 数码管 | 3块 | ATC51 | 1块 | ||
| 按钮 | 4个 | 开关 | 排阻 | 1个 | 8个引脚 |
| 拨动开关 | 1个 | 电容 | 2个 | 33pF | |
| 发光二极管 | 1个 | 红色 | 电容 | 1个 | 100uF |
| 电阻 | 2个 | 1K | 晶振 | 1个 | 12MHz |
| 电阻 | 1个 | 100殴 |
六、结论与心得
在做课程设计的过程中,我进一步认识到全面专业知识以及逻辑思考方式对研究问题的重要性,同时我也更加具体的掌握了课程设计的基本方法。 经过不断的的努力,我终于完成了这次课程设计,总的来说,我学到了不少的东西,知道了理论联系实际的重要性。在设计过程中我遇到了很多的困难,但没放弃,查阅了许多相关的书籍,自己思考和借鉴了前人的许多优秀成果,并与所学的知识紧密的结合了起来。我相信这过程对我今后的学习和工作给与积极的影响,搭好了平台。
通过这次设计,我对这门课有了更好的理解,尤其结合了这几年学的相关的专业知识,对各门课都有了一个较全面的理解。这必将对我以后的学习和工作有很大的帮助。本次课程设计的定时闹钟电路,可以满足人们的基本要求,但因为知识水平有限,此电路中存在一定的问题,虽可以通过增加电路解决,但过于复杂和现有水平有限,本次设计就未深入涉及,想要更好的改进电路,需要进一步的努力,如果有好的意见,希望老师给以支持。
七、参考文献
[1] 单片机原理与接口技术 牛昱光 主编 电子工业出版社
[2] 单片机技术基础教程与实践 夏路易 编著 电子工业出版社
[3] 51单片机C语言教程入门、提高、开发、拓展全攻略 郭天祥著 电子工业出版社
[4] 单片机程序设计实例 先锋工作室编著 清华大学出版社
[5] 电子工程师之家 、豆丁网 、百度、搜狗、电子工程专辑 等等
八、附录
课程设计中编写的程序:
#include sbit SPK=P1^2; sbit LATCH1=P2^6;// 段锁存 sbit LATCH2=P2^7;// 位锁存 sbit key1=P3^5; //定义开关 sbit key2=P3^4; sbit key3=P3^3; sbit key4=P3^2; unsigned char aa;bb; unsigned int t;num; unsigned char code DuanMa[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 显示段码值0~9 unsigned char code WeiMa[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; unsigned char TempData[8]; //存储显示值的全局变量 void Delay(t); //函数声明 void Display(unsigned char FirstBit,unsigned char Num); void Timer0(void) { TMOD= 0x01; 使用模式1,16位定时器 TH0=(65536-50000)/256;//给定初值,这里使用定时器最大值从0开始计数一直到65535溢出 TL0=(65536-50000)%256; 总中断打开 定时器中断打开 } void KEY() { aa++; //子函数,用于秒表计数 aa=0; num++; if(num==1000) num=0; } /*主函数*/ void main() { P3=0xff; LATCH2=1; P0=0xc0; 初始化数码管 LATCH1=1; P0=DuanMa[0]; LATCH1=0; 检测按键K2 等待按键释放 把当前数值显示到数码管 键盘检测 TR0=1; //如果bb=1开始计数 } TR0=0; //如果bb=0停止计数 TempData[2]=DuanMa[num/100] //把当前值显示到数码管; if(key3==0) //检测按键K3 num++; //key1按一下,key3按一下加1; TempData[2]=DuanMa[num/100]; //加一后的数分解显示到数码管; if(key4==0) num--; //key1按下,key4按一下减1; 减一后的数分解显示到数码管 } } /*延时子函数*/ void Delay( t) { 延时子函数 } void Display(unsigned char FirstBit,unsigned char Num)//显示函数,用于动态扫描数码管,FirstBit 表示需要显示的第一位, { P0=0; //清空数据,防止有交替重影 LATCH1=1; //段锁存 取位码 LATCH2=1; 取显示数据,段码 LATCH1=1; 动态扫描时间 }
