单片机课程设计报告秒表设计终.docx
《单片机课程设计报告秒表设计终.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告秒表设计终.docx(19页珍藏版)》请在冰豆网上搜索。
单片机课程设计报告秒表设计终
单片机数字秒表系统设计
专业:
通信工程
姓名:
李兰
班级:
B10073021
学号:
201007302130
老师:
王莉
2012年1月9日
前言
本设计主要是对51单片机的一个方面的扩展,是能实现一般定时功能的设计。
系统采用单片机AT89C51作为本设计的核心元件,在其基础上外围扩展芯片和外围电路,附加时钟电路,复位电路,键盘接口及LED显示器,键盘采用独立连接式。
外围设备有LED显示驱动器及相应的显示数字电子钟设计与制作可采用数字电路实现,也可以采用单片机来完成。
若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。
若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且其成本也有所降低,所以在该设计与制作中采用单片机AT89C51,它是低功耗、高性能的CMOS型8位单片机。
片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。
另外,AT89C51的指令系统和引脚与8051完全兼容,片内有128B的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。
在LED显示器中,分成静态显示和动态显示两类,在这个设计的最小系统中主要用了它的动态显示功能,动态显示器利用了人视觉的短暂停留,在数据的传输中是一个一个传输的,且先传输低位。
按键电路设有四个按键:
从上往下为k1,k2,k3和k4键。
按下k1键用于启动和暂停秒表;k2键用于复位;k3键用于当秒表暂停时,增加其显示值;k4键用于秒表暂停时减少其显示值。
目录
一、设计任务和要求3
(一)系统功能任务3
(二)系统设计要求3
二、方案设计与论证3
三、硬件设计4
(1)时钟电路4
(2)按钮电路5
(3)显示电路7
(4)动态显示原理8
(5)80C51中断的控制8
(6)定时/计数器的控制8
(7)单片机9
四、总原理图及元器件清单11
(1)总原理图11
(2)元器件清单12
五、源程序.....................................................................................................................................12
六、结论与心得16
七、参考文献16
秒表设计
一、设计任务和要求
(一)系统功能任务
1)2路秒表时间记时功能
2)具有时间查询功能
3)全部采用LED显示
(二)系统设计要求
1)可以自增系统功能
2)允许采用MCS-51系列或其他类型单片机
3)系统程序采用汇编或C语言编制
4)硬件原理图采用电子CAD绘制
二、方案设计与论证
本设计分为时钟电路、按钮电路、显示电路和单片机四大部分,这些模块中单片机占主控地位。
时钟电路常用的有内部时钟方式和外部时钟方式,但因为本设计中只需要一片单片机,所以采用内部时钟方式比较简单。
按钮电路中的“复位”按钮是按键手动复位,它有电平和脉冲两种方式,比较电路的复杂程度,本设计选择了按钮电平复位电路,其他几个按钮则是通过单片机判断高低电平的不同来控制按钮。
显示电路所用的数码管有共阴和共阳之分,不管使用何种数码管,P0口作为I/O使用时都是需要上拉电阻才能驱动数码管。
另外,因为单片机的4个并行I/O口的输出电流一般是1mA,短路电流为4mA左右,而数码管的最少驱动电流也需要10mA,因而不管在使用共阴数码管时,单片机输出口也必须使用上拉电阻提高输出电流,才能驱动数码管。
为了使电路简单化,本设计选用共阳数码管。
但根据显示方式的不同选择,我们可以有几种方案:
方案一:
使用静态显示方式。
静态显示方式下的数码管的显示字符一经确定,相应锁存器锁存的断码输出將维持不变,直到送入另一个字符的断码为止。
因而此设计中使用的显示位数使用了三个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语言了编写程序主程序流程图如下所示,具体程序见附录。
主程序流程图:
四、总原理图及元器件清单
(1)总原理图
(2)元器件清单
1)AT89C51的引脚图和数码管的引脚图
图4-1aAT89C51引脚图图4-1b5101引脚图
2)元器件总清单
元件名称
数量
备注
元件名称
数量
备注
数码管
3块
AT89C51
1块
按钮
4个
开关
排阻
1个
8个引脚
拨动开关
1个
电容
2个
33pF
发光二极管
1个
红色
电容
1个
100uF
电阻
2个
1K
晶振
1个
12MHz
电阻
1个
100殴
5、源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitkey1=P3^4;
sbitkey2=P3^5;
sbitkey3=P3^6;
sbitkey4=P3^7;
sbitdula=P2^6;
sbitwela=P2^7;
ucharnum,num0;
ucharcodetable[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
voiddelayms(unit);
voiddisplay(ucharnumdis)
{
ucharshi,ge;
shi=numdis/10;
ge=numdis%10;
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(5);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(5);
}
voidinit()
{
TMOD=0x11;
TH0=(65535-43872)/256;
TL0=(65535-43872)%256;
TH1=(65535-43872)/256;
TL1=(65535-43872)%256;
EA=1;
ET0=1;
TR0=0;
ET1=1;
TR1=0;
}
voidkeyscan()
{
if(key1==0)
{
delayms(10);
if(key1==0)
{
TR0=1;
while(!
key1);//判断是否按键释放
}
}
if(key2==0)
{
delayms(10);
if(key2==0)
{
TR0=0;
num=0;
while(!
key2);
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
if(num==0)
{num=60;
TR1=0;}
while(!
key3);
}
}
if(key4==0)
{
delayms(10);
if(key4==0)
{
while(!
key4);
TR1=1;
}
}
}
voidmain()
{
init();
while
(1)
{
keyscan();//不停地检测按键
display(num);//不停地在数码管上显示
}
}
voidT0_time()interrupt1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num0++;
if(num0==20)
{
num0=0;
num++;
if(num==60)
num=0;
}
}
voidT1_time()interrupt3
{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
num0++;
if(num0==20)
{
num0=0;
num--;
if(num==0)
num=60;
}
}
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
六、结论与心得
通过这次课程设计——数字秒表的系统设计,使我又重新熟悉了C语言,开始很陌生,我找了有关资料来了解,才有了一点眉目。
刚开始以为可以用汇编很容易就写出来,但是用汇编时才发现原来都不怎么熟练,编了一会程序发现只有一种感觉——举步维艰啊!
还是放弃汇编选择C语言吧!
对于单片机,我们课本学习的是80C51,但是这次做课程设计用的是89C51,这样不仅使我们掌握了80C51,而且对89C51也有了一定的了解了,在课堂上学习的都理论的,跟实际永远有一定的差距,不实践就不会发现问题。
通过这次设计,我对这门课有了更好的理解,尤其结合了这几年学的相关的专业知识,对各门课都有了一个较全面的理解。
这必将对我以后的学习和工作有很大的帮助。
但想要更好的改进电路,需要进一步的努力,同时感谢张老师对我们的指导。
七、参考文献
[1]单片机原理与接口技术.牛昱光主编,电子工业出版社.
[2]单片机技术基础教程与实践.夏路易编著,电子工业出版社.
[3]51单片机C语言教程入门、提高、开发、拓展全攻略.郭天祥著,电子工业出版社.
[4]单片机程序设计实例.先锋工作室编著,清华大学出版社.
[5]电子工程师之家、豆丁网、XX、搜狗、电子工程专辑等等.