单片机设计报告秒表 2.docx
《单片机设计报告秒表 2.docx》由会员分享,可在线阅读,更多相关《单片机设计报告秒表 2.docx(16页珍藏版)》请在冰豆网上搜索。
单片机设计报告秒表2
单片机秒表课程设计
前言
本设计主要是对51单片机的一个方面的扩展,是能实现一般定时功能的设计。
系统采用单片机AT89C51作为本设计的核心元件,在其基础上外围扩展芯片和外围电路,附加时钟电路,复位电路,键盘接口及LED显示器,键盘采用独立连接式。
外围设备有LED显示驱动器及相应的显示数字电子钟设计与制作可采用数字电路实现,也可以采用单片机来完成。
若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。
若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且其成本也有所降低,所以在该设计与制作中采用单片机AT89C51,它是低功耗、高性能的CMOS型8位单片机。
片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。
另外,AT89C51的指令系统和引脚与8051完全兼容,片内有128B的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。
按键电路设有两个按键:
从上往下为k1和k2键。
按下k1键用于启动和暂停秒表;k2键用于复位。
另外还有一个单片机的复位按键,此按键用于总复位,使单片机和LED数码管同时复位。
目录
一、设计任务和要求3
(一)系统功能任务3
(二)系统设计要求3
二、方案设计与论证3
三、硬件设计4
(1)时钟电路4
(2)按钮电路5
(3)显示电路6
(4)动态显示原理7
(5)80C51中断的控制7
(6)定时/计数器的控制7
(7)单片机8
(8)MAX72199
四、总原理图及元器件清单9
(1)总原理图10
(2)元器件清单11
五、源程序...............................................................................................................................11
六、结论与心得15
七、参考文献16
秒表设计
一、设计任务和要求
(一)系统功能任务
1)2路秒表时间记时功能
2)具有时间启动、暂停、复位功能
3)采用LED数码管显示
(二)系统设计要求
1)可以自增系统功能
2)允许采用MCS-51系列或其他类型单片机
3)系统程序采用汇编或C语言编制
二、方案设计与论证
本设计分为时钟电路、按钮电路、显示电路和单片机四大部分,这些模块中单片机占主控地位。
时钟电路常用的有内部时钟方式和外部时钟方式,但因为本设计中只需要一片单片机,所以采用内部时钟方式比较简单。
按钮电路中的“复位”按钮是按键手动复位,它有电平和脉冲两种方式,比较电路的复杂程度,本设计选择了按钮电平复位电路,其他几个按钮则是通过单片机判断高低电平的不同来控制按钮。
显示电路所用的数码管有共阴和共阳之分,不管使用何种数码管,P0口作为I/O使用时都是需要上拉电阻才能驱动数码管。
本课程设计不是直接用单片机的I/O口直接来驱动LED显示器,而是用芯片MAX7219来驱动LED显示器,故不需要上拉电阻。
为了使电路简单化,本设计选用共阳数码管。
但根据显示方式的不同选择,我们可以有几种方案:
方案一:
使用静态显示方式。
静态显示方式下的数码管的显示字符一经确定,相应锁存器锁存的断码输出將维持不变,直到送入另一个字符的断码为止。
因而此设计中使用的显示位数使用了三个8位并行I/0口。
如果另外想扩展单片机功能,则能使用的输出管脚很是有限。
方案二:
使用动态显示方式。
这个显示方式是将所有显示位的段码线的相应段并联在一起,由一个8位I/O口控制,而各位的共阴或共阴极分别由相应的I/O线控制,形成各位的分时选通。
这种显示方式,简化了硬件电路,特别在多位数码管显示时尤为突出,在本次设计中我采用的是动态显示。
三、硬件设计
其模块电路如图3-1所示。
图3-1
(1)时钟电路
单片机的时钟产生方法有两种:
内部时钟方式和外部时钟方式。
本系统中AT89S51单片机采用内部时钟方式。
最常用的内部时钟方式是采用外接晶体和电容组成的并联谐振回路。
振荡晶体可在1.2MHz~12MHz之间。
电容值无严格要求,但电容取值对振荡频率输出的稳定性、大小和振荡电路起振速度有少许影响,一般可在20pF~100pF之间取值。
AT98S51单片机的时钟电路如图3-2所示,时钟电路的晶振频率越高,系统的时钟频率越高,单片机的运行速度也就越快。
晶振频率根据设计需要设为12MHz,又根据谐振性质,电路中的电容C1、C2选择为30pF左右。
该电容的的大少会影响振荡器频率的高低、振荡器的稳定性和起振的快速性。
图3-2时钟电路
(2)按钮电路
键盘分编码键盘和非编码键盘。
键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘而靠软件编程来识别的称为非编码键盘;非编码键盘有分为:
行列式(又称为矩阵式)键盘;行列式键盘如图3-3a
图3-3
(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语言来编写。
▪(8)MAX7219
MAX7219是MAXIM公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。
该芯片具有10MHz传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有LED的段电流。
。
它的操作很简单,MCU只需通过模拟SPI三线接口就可以将相关的指令写入MAX7219的内部指令和数据寄存器,同时它还允许用户选择多种译码方式和译码位。
此外它还支持多片7219串联方式,这样MCU就可以通过3根线(即串行数据线、串行时钟线和芯片选通线)控制更多的数码管显示。
MAX7219的外部引脚分配如图1所示及内部结构如图2所示。
四、总原理图及元器件清单
(1)总原理图
(2)元器件清单
1)AT89C51的引脚图和数码管的引脚图
图4-1aAT89C51引脚图图4-1b数码管引脚图
2)元器件总清单
元件名称
数量
备注
AT89C51
1块
MAX7219
1块
数码管
1块
按钮
3个
开关
电阻
1个
1K
电阻
3个
10K
晶振
1个
12MHz
电容
2个
30pF
电容
1个
1uF
五、源程序
#include
#defineHIGH1
#defineLOW0
#defineTRUE1
#defineFALSE0
#defineZERO0
#defineMSB0x80
#defineLSB0x01
//max7219part
#defineDECODE_MODE0x09
#defineINTENSITY0x0A
#defineSCAN_LIMIT0x0B
#defineSHUT_DOWN0x0C
#defineDISPLAY_TEST0x0F
//pindefined
/***********************************************************************/
//changethispartatdifferentboard
sbitLOAD=P1^2;//MAX7219Load-DataInput:
risingedgepin12
sbitDIN=P1^1;//MAX7219Serial-DataInput:
risingedgepin1
sbitCLK=P1^0;//MAX7219Serial-ClockInput:
maximum10MHzpin13
sbitkey0=P1^3;
sbitkey1=P1^4;
//functiondefine
/***********************************************************************/
voidWrite_Max7219_byte(unsignedchartemp);//writemax7219abyte
voidWrite_Max7219(unsignedcharaddress,unsignedchardat);//writemax7219commandanddata
voidInit_Max7219(void);//Initizemax7219
voiddelay_ms(unsignedinttime);
voidInit_interrupt();
unsignedintcntb,n=0;
//testprogramdisplayfrom1~8
/***********************主函数********************************/
voidmain(void)
{
Init_Max7219();
Init_interrupt();
while
(1)
{
Write_Max7219(4,n%10);
delay_ms
(1);
Write_Max7219(3,n/10%10);
delay_ms
(1);
}
}
/*************中断初始化******************/
voidInit_interrupt()
{
TMOD=0x01;
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
TR0=0;//开启定时0
ET0=1;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;//开启中断
}
/******************延时程序****************************/
voiddelay_ms(unsignedinttime)
{
unsignedinti,j;
for(i=time;i>0;i--)
for(j=125;j>0;j--);
}
/*********************中断服务子程序**************************************/
voidt0(void)interrupt1using0
{
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
cntb++;
if(cntb==5)
{
n++;
cntb=0;
}
if(n==60)
n=0;
}
/*********************外部中断0子程序**********************************/
voidint0(void)interrupt0
{
//EX0=0;
if(TR0==0)
TR0=1;
else
TR0=0;
//EX0=1;
}
/*********************外部中断1子程序**************************************/
voidint1(void)interrupt2
{
//EX0=0;
n=0;
TR0=0;
//EX0=1;
}
/*********************7219驱动程序************************************/
voidWrite_Max7219_byte(unsignedchartemp)
{
unsignedchari;
for(i=0;i<8;i++)
{
CLK=LOW;
DIN=(bit)(temp&MSB);
temp<<=1;
CLK=HIGH;
}
}
/***********************************************************************/
voidWrite_Max7219(unsignedcharaddress,unsignedchardat)
{
LOAD=LOW;
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
LOAD=HIGH;
}
/***********************************************************************/
voidInit_Max7219(void)
{
Write_Max7219(SHUT_DOWN,0x01);//NormalOperationXXXXXXX1ShutdownModeXXXXXXXX0
Write_Max7219(DISPLAY_TEST,0x00);//NormalOperationXXXXXXX0DisplayTestModeXXXXXXXX1
Write_Max7219(DECODE_MODE,0xff);//DecodeModeSelectD7~D01Bdecode0Nodecode
Write_Max7219(SCAN_LIMIT,0x07);//SCANLIMIT0~70xX0~0xX7
Write_Max7219(INTENSITY,0x04);//SetIntensity0xX0~0xXf
}
六、结论与心得
1:
本次的课程设计,使关于51系列单片机的,正是我们刚刚学到的51单片机,在平时课程的学习中,我们仅限于理论知识的讲解,即使知识是很扎实的,实际应用并不是这样的。
开始时我也觉得自己的理论知识已经够了,但当我拿到课题时,在脑海里想的是非常好的,但真正编成和控制时,理论和实际结合不到一起,甚至于51芯片的使用我都感觉很迷茫,还是经过搜集大量资料才将理论与实际结合到一起了。
本次课程设计我主要负责编程,这次不仅锻炼了我C语言的知识,更加我们正在学习的51的定时与中断结合在一起,进行了实际的操作,让我的知识掌握得更加牢固。
本次的实际经验之后,让我对单片机定时赋初值有了更新的认识,对程序的循环顺序、结构类型都有了非常深刻的认识,对真正硬件的连接也有了认识,不再将自己的知识局限于自己狭隘的空间中。
2:
通过这次课程设计——秒表,使我又重新开始学习C语言,因为C语言是大一学的,至从学完就再也没用过,所以开始很陌生,我又找了有关资料来了解,才有了一点眉目。
对于单片机,我们课本学习的是AT89S51,但是这次做课程设计用的是89C51,这样不仅使我们掌握了AT89S51,而且对89C51也有了一定的了解了,在课堂上学习的都理论的,跟实际永远有一定的差距,不实践就不会发现问题。
通过这次课程设计使我把课堂上学习的东西都用到了实践中,例如:
定时/计数器的应用与中断。
学习的时候不怎么理解,但是在实践中应用了以后就自然了解了。
这次课程设计使我受益匪浅,而且都是实际的东西。
3:
这次课程设计,我们做的是秒表,最终我们选择的是用C语言编程,但原来学的也只是能看懂别人写好的程序而已,通过这次课程设计,更加熟练了C语言的程序设计思路。
通过本次秒表的设计实验,使我对这学期学所学51系列的单片机从理论知识到实践硬件的应用以及C语言知识的回顾,更加熟悉了89C51单片机的每一个拐角的输出和各项功能,而且对硬件电路的掌握有了很大的进步。
本次仿真后终于完全实现了秒表的功能。
这次课程设计终于圆满的完成了,我从理论和硬件以及实践上懂得了很多,也明白了一个团队的合作精神可以让我们战胜所有的困难。
七、参考文献
[1]单片机原理与接口技术.牛昱光主编,电子工业出版社.
[2]单片机技术基础教程与实践.夏路易编著,电子工业出版社.
[3]51单片机C语言教程入门、提高、开发、拓展全攻略.郭天祥著,电子工业出版社.
[4]单片机程序设计实例.先锋工作室编著,清华大学出版社.
[5]电子工程师之家、豆丁网、XX、搜狗、电子工程专辑等等.