单片机课程设计单片机电秒计时器.docx
《单片机课程设计单片机电秒计时器.docx》由会员分享,可在线阅读,更多相关《单片机课程设计单片机电秒计时器.docx(27页珍藏版)》请在冰豆网上搜索。
单片机课程设计单片机电秒计时器
中国矿业大学
单片机课程设计
姓名:
***学号:
*****
专业:
自动化
题目:
单片机电秒计时器
专题:
单片机系统设计
指导教师:
**
设计地点:
***时间:
***
2011年6月
单片机课程设计任务书
专业年级****学号***学生姓名*****
任务下达日期:
2011年6月18日
设计日期:
2011年6月18日至2011年6月28日
设计题目:
单片机电秒计时器
设计专题题目:
单片机系统设计
设计主要内容:
通过单片机系统实现秒表计时功能,可以进行暂停计时、恢复计时、设定时间和清零等操作。
设计要求:
1.系统上电,数码管显示“99”.
2.每隔1秒,数码管显示减1,减小到“00”后,数码管显示“00”,同时继电器开启。
3.设置按键S13,当S13按下时,秒表计时停止,数码管显示当前数值,再次按下时恢计时。
4.当停止计时时,按下S14键,可以设置秒数,按键S1-S10分别对应数字0-9;先输入数字为十位数,后输入数字为个位数,若输入数字大于99,数码管显示“99”。
按下S13键启动计时。
5.设置按键S15,当S15按下时,数码管显示为“99”,秒表从新开始计时。
6.考试过程中,应使用硬件平台指定的资源进行设计。
指导教师签字:
摘 要
单片机极高的性能价格比,受到人们的重视和关注,应用很广、发展很快,51单片机是各单片机中最为典型和最有代表性的一种。
本实验是基于MCS51系列单片机所设计的,可以实现键盘按键与数字动态显示并可以倒数的计数器。
本设计基于单片机技术原理,以单片机芯片AT89C51作为核心控制器,通过硬件电路的制作以及软件程序的编制,设计制作出一个电秒计时器,包括以下功能:
通过单片机系统实现秒表计时功能,可以进行暂停计时、恢复计时、设定时间和清零等操作。
该计数器系统主要由计数器模块、LCD显示器模块、键盘模块、复位模块等部分组成。
关键词:
AT89C51单片机、C语言编程、键盘模块、LCD显示器
1理论设计…………………………………………………..…..1
1.1系统设计要求…………………………………………..…..1
2AT89C51介绍……………………………………….……….…….2
2.1引脚定义及功能……………………………………………3
2.2I/O端口功能………………………………………………4
3系统硬件介绍……………………………………………………8
3.1单片机最小系统……………………………………………8
3.2复位电路……………………………………………………9
3.3时钟电路……………………………………………………10
3.4显示电路……………………………………………………10
3.5键控电路……………………………………………………12
4软件设计…………………………………………………………13
4.1基本任务………………………………………………13
4.2按键定义及显示标志……………………………………13
4.3主程序框图………………………………………………13
5小结15
参考文献:
16
附录17
附录一单片机印刷电路板原理图17
附录二元件清单18
1理论设计
1.1系统设计要求
(1)该倒计时器应具有基本倒时功能;
(2)具有暂停,复位功能;
(3)时间可以任意调整;
(4)时间用数码管显示,初始值为99S,扫描时间为1S。
采用单片机程序设计制作,它是利用芯片AT89S51的特殊功能,上电两个数码管将显示99,P3口控制4X4矩阵按键开关,输入数字。
通过P0口对两片74HC273进行控制,一片输出字型码,一片输出字位码。
P2.4和P2.5控制74HC02,来确定字位和字形码地址。
其系统框图如图1所示。
2AT89C51介绍
AT89C51是美国ATMEL公司生产的AT89系列单片机中的一种,它与MCS-51系列的许多机种都具有兼容性,并具有广泛的代表性。
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
AT89C51的特点
●与MCS-51兼容
●4K字节可编程闪烁存储器
●寿命:
1000写/擦循环
●数据保留时间:
10年
●全静态工作:
0Hz-24MHz
●三级程序存储器锁定
●128×8位内部RAM
●32可编程I/O线
●两个16位定时器/计数器
●5个中断源
●可编程串行通道
●低功耗的闲置和掉电模式
●片内振荡器和时钟电路
2.1引脚定义及功能
AT89C51有40条引脚,与其他51系列单片机引脚是兼容的。
这40条引脚可分为I/O端口线、电源线、控制线、外接晶体线四部分。
其封装形式有两种:
双列直插封装(DIP)形式和方形封装形式,如图3-1所示。
图3-1AT89C51引脚
主电源引脚
VCC:
供电电压(+5V)。
GND:
接地。
2.2I/O端口功能
P0口:
P0口有八条端口线,命名为P0.0~P0.7,其中P0.0为低位,P0.7为高位。
每条线的结构组成如图3-2所示。
它由一个输出锁存器,两个三态缓冲器,输出驱动电路和输出控制电路组成。
P0口是一个三态双向I/O口,它有两种不同的功能,用于不同的工作环境。
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
图3-2P0口位结构图
P1口:
P1口有八条端口线,命名为P1.0~P1.7,每条线的结构组成如图3-3所示。
P1口是一个准双向口,只作普通的I/O口使用,其功能与P0口的第一功能相同。
作输出口使用时,由于其内部有上拉电阻,所以不需外接上拉电阻;作输入口使用时,必须先向锁存器写入“1”,使场效应管T截止,然后才能读取数据。
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
图3-3P1口位结构图
P2口:
P2口有八条端口线,命名为P2.0~P2.7,每条线的结构如图3-4所示。
P2口也是一个准双向口,它有两种使用功能:
一种是当系统不扩展外部存储器时,作普通I/O口使用,其功能和原理与P0口第一功能相同,只是作为输出口时不需外接上拉电阻;另一种是当系统外扩存储器时,P2口作系统扩展的地址总线口使用,输出高8位的地址A7~A15,与P0口第二功能输出的低8位地址相配合,共同访问外部程序或数据存储器(64KB),但它只确定地址并不能像P0口那样还可以传送存储器的读写数据。
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口有八条端口线,命名为P3.0~P3.7,每条线的结构如图3-1所示。
P3口是一个多用途的准双向口。
第一功能是作普通I/O口使用,其功能和原理与P1口相同。
第二功能是作控制和特殊功能口使用,这时八条端口线所定义的功能各不相同,如表3-4所示。
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口同时为闪烁编程和编程校验接收一些控制信号。
图3-4P2口位结构图
图3-5P3口位结构图
表1P3口各位的第二功能
引脚
第二功能
功能说明
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
片外RAM写选通信号输出端
P3.7
RD
片外RAM读选通信号输出端
3系统硬件介绍
3.1单片机最小系统
该原理图包含单片机以及外部连接译码,锁存电路端口,其中的ALE,REST为高电平时用来启动ADC0809.P0口控制数码输出显示以及控制键盘的。
晶振采用12MHZ,该频率有利于提高串口的通信可靠性,同时又保证单片机有较高的运行速度。
3.2复位电路
单片机在开机时都需要复位,以便CPU及其他功能部件都处于一个确定的初始状态,并从这个状态开始工作。
单片机复位电路工作原理:
当通电瞬间稳压电源给电容充电。
RESET为复位输入端,当RESET引脚持续两个机器周期以上的高电平时,使单片机完成复位操作,随着电容充电结束,将使电容与电阻之间将呈现低电平,单片机复位结束。
复位操作的主要功能是把PC初始化为0000H,使单片机程序存储器从0000H单元开始执行程序。
本设计主要采用上电自动复位电路,其电路图如图4所示
图(4)复位电路
3.3时钟电路
本篇论文选择的方案中采用的是内部振荡方式。
采用内部方式时在XTAL1和XTAL2引脚上接石英晶体和微调电容可以构成振荡器,如图5所示。
图中C1、C2起稳定振荡频率、快速起振的作用。
内部振荡方式所得的时钟信号比较稳定,实用电路中使用较多。
振荡频率的选择范围为1MHz~12MHz。
图(5)振荡电路
3.4显示电路
显示器件有很多种,常用的有发光二极管,数码管,液晶显示器等,本文采用8位共阴极LED动态扫描显示,SN74HC273N输出所需字形,SN74HC273N选择字位。
在动态方式中,逐个地循环地点亮各位显示器。
如图所示:
数码管显示电路
显示译码电路部分由P0口输出显示包含:
显示译码电路显示译码电路
3.5键控电路
键盘是微机应用系统中使用最广泛的一种数据输入设备,按照键盘按键的结构形式,可分为独立式键盘和矩阵式键盘。
本文主要采用矩阵式键盘,此键盘控制电路主要是用于调整时间
4软件设计
4.1基本任务
利用单片机系统设计电秒表计时器
4.2按键定义及显示标志
1.设置按键S13,当S13按下时,秒表计时停止,数码管显示当前数值,再次按下时恢计时。
2.当停止计时时,按下S14键,可以设置秒数,按键S1-S10分别对应数字0-9;先输入数字为十位数,后输入数字为个位数,若输入数字大于99,数码管显示“99”。
按下S13键启动计时。
3.设置按键S15,当S15按下时,数码管显示为“99”,秒表从新开始计时。
4.3主程序框图
5小结
通过这次的课程设计作品的制作让我对单片机的理论有了更加深入的了解,同时在具体的制作过程中我们发现现在书本上的知识与实际的应用存在着不小的差距,书本上的知识很多都是理想化后的结论,忽略了很多实际的因素,或者涉及的不全面,可在实际的应用时这些是不能被忽略的,我们不得不考虑这方的问题,这让我们无法根据书上的理论就轻易得到预想中的结果,有时结果甚至很差别很大。
通过这次实践使我更深刻的体会到了理论联系实际的重要性,我们在今后的学习工作中会更加的注重实际,避免称为只会纸上谈兵的赵括。
参考文献:
1、胡汉才,《单片机原理及其接口技术》(2版),清华大学出版社
2、单片机实验指导书
3、张毅刚,彭喜元,孟升卫,刘兆庆MCS-51单片机实用子程序设计(第二版)哈尔滨工业大学出版社2003年
4、孙育才,《MCS-51系列单片微型计算机及其应用》,东南大学出版社
5、曹巧媛,《单片机原理及应用——教学、实践、设计指导》,电子工业出版社
6、谢自美,《电子线路设计·实验·测试》(2版),华中科技大学出版社
7、求是科技单片机通信技术与工程实践人民邮电出版社2005年
附录
附录一单片机印刷电路板原理图
附录二元件清单
单片机主板
型号
元件号
数量
0.01μF
电容
C21,C22
2
0.1μF
电容
C2,C3,C4,C5,C6,C7,C8,C9,C10,C17,C19,C25,C80,C81
14
1K
电阻
R1,R2,R4,R6,R7,R9,R10,R11,R12,R16,R17,R18,R19,R23,R28,R37,R39,R40,R41,R42,R43,R44,R45,R46,R47,R51,R53,R82,R85
29
1N4148
二极管
D1,D2,D3
3
1N4729
稳压二极管
D82,D83
2
2K
电阻
R31,R36
2
2.2K
电阻
R99
1
4.7K
9针排阻
RES2
1
4.7Kdon'tfitit
不焊接
RES1
1
4.7μF
电容
C23
1
10K
电阻
R5,R13,R21,R30,R35,R38,R49,R50,R52,R59,R89
11
10μF
电解电容
C18,C97
2
12MHz
晶振
U7,U15
2
22pF
电容
C1,C15,C86,C87
4
27
电阻
R48
1
68
电阻
R93,R95
2
74HC00
2输入4与非门
U1
1
74HC02
2输入4或非门
U2
1
100
电阻
R58
1
220u/16V
电解电容
C16
1
470
电阻
R20,R22,R24,R25,R26,R27,R29,R34
8
8050
PNP三极管
Q3,Q4,Q5,Q6,Q7,Q8,Q9,Q10
8
8550
PNP三极管
Q1,Q2,Q11,Q12
4
AT89S51
51单片机
U4
1
ATmega48-8
AVR单片机
U39
1
Bell
无源蜂鸣器
LS1
1
型号
元件号
数量
DAY-4
4位数码管
DS16,DS17
2
DpyBlue-CA
数码管
DS15
1
Header2
5.08mm2P端子
P1
1
Header3
5.08mm3P端子
P4
1
Header4
4-Pin单排针
P11,P12
2
Header5
5-Pin单排针
P13
1
Header5X2
5*2排线座
P3,P21
2
Header10
10-Pin单排针
P9,P10
2
Header15
15-Pin单排针
P2,P8
2
Header20
20-Pin单排针
P5,P6
2
LED0GREEN
绿色发光二极管
DS80,DS14,DS1,DS3,DS5,DS7,DS10
7
LED0RED
红色发光二极管
DS2,DS4,DS6,DS8,DS9,DS11,DS12,DS13,DS81
9
LEDFR
红外发光二极管
DS19
1
LM358
双运放
U10
1
MC74HC245AN
同相三态总线收发器
U11
1
SN74HC273N
8D触发器
U8,U9
2
SRD-5VDC-SL-C
5V继电器
REALAY1
1
SW
6*6*9按钮
KEY1,KEY2,KEY3,KEY4,KEY5,KEY6,KEY7,KEY8,KEY9,KEY10,KEY11,KEY12,KEY13,KEY14,KEY15,KEY16,K1,K2,K3,K4,S4
21
SW-DIP4
4*2双排针
S7,S28
2
SW-DIP8
4*8双排针
S1
1
SW-SPDT
3-Pin单排针
S3
1
SW-SPST
2-Pin单排针
S2,S6,S29,S80,S81,S94
6
TEST
1-Pin单排针
J1,J2,J3
3
TL0038BD
38KHz红外接收头
P7
1
USB
A型USB插座
J8
1
附录三程序代码
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineFont_codeXBYTE[0xefff]//字符码写地址
#definereg_codeXBYTE[0xdfff]//字位码写地址
#definekey_addrXBYTE[0xf7ff]//读按键地址
bitx=0;
bity=0;
ucharkey_n;
uintm;
uints;
sbitP12=P1^0;
unsignedcharconstjian[];
unsignedcharconstdofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};
voiddelay(ucharx)
{
uchari;
while(x--)
for(i=0;i<100;i++);
}
voidget_key(void)
{
uchartemp;
Font_code=0x00;
reg_code=0xfe;
temp=key_addr&0x0f;//第一列
if(temp==0x0e)
{delay(200);
if(temp==0x0e)
{
key_n=0;
if((x==1)&&(y==0))
{m=m%10;y=1;}
else
{m=(m/10)*10;y=0;}
}
}
if(temp==0x0d)
{delay(200);
if(temp==0x0d)
{
key_n=4;
if((x==1)&&(y==0))
{m=m%10+40;y=1;}
else
{m=(m/10)*10+4;y=0;}
}
}
if(temp==0x0b)
{delay(200);
if(temp==0x0b)
{
key_n=8;
if((x==1)&&(y==0))
{m=m%10+80;y=1;}
else
{m=(m/10)*10+8;y=0;}
}
}
if(temp==0x07)
{
key_n=12;
s++;
x=0;
y=0;
}
reg_code=0xfd;
temp=key_addr&0x0f;//第二列
if(temp==0x0e)
{delay(200);
if(temp==0x0e)
{
key_n=1;
if((x==1)&&(y==0))
{m=m%10+10;y=1;}
else
{m=(m/10)*10+1;y=0;}
}
}
if(temp==0x0d)
{delay(200);
if(temp==0x0d)
{
key_n=5;
if((x==1)&&(y==0))
{m=m%10+50;y=1;}
else
{m=(m/10)*10+5;y=0;}
}
}
if(temp==0x0b)
{delay(200);
if(temp==0x0b)
{
key_n=9;
if((x==1)&&(y==0))
{m=m%10+90;y=1;}
else
{m=(m/10)*10+9;y=0;}
}
}
if(temp==0x07)key_n=13;
reg_code=0xfb;
temp=key_addr&0x0f;//第三列
if(temp==0x0e)
{delay(200);
if(temp==0x0e)
{
key_n=2;
if((x==1)&&(y==0))
{m=m%10+20;y=1;}
else
{m=(m/10)*10+2;y=0;}
}
}
if(temp==0x0d)
{delay(200);
if(temp==0x0d)
{
key_n=6;
if((x==1)&&(y==0))
{m=m%10+60;y=1;}
else
{m=(m/10)*10+6;y=0;}
}
}
if(temp==0x0b)key_n=10;
if(temp==0x07)key_n=14;
reg_code=0xf7;
temp=key_addr&0x0f;//第四列
if(temp==0x0e)
{delay(200);
if(temp==0x0e)
{
key_n=1;
if((x==1)&&(y==0))
{m=m%10+30;y=1;}
else
{m