wsf单片机课程设计论文.docx
- 文档编号:24294878
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:30
- 大小:171.38KB
wsf单片机课程设计论文.docx
《wsf单片机课程设计论文.docx》由会员分享,可在线阅读,更多相关《wsf单片机课程设计论文.docx(30页珍藏版)》请在冰豆网上搜索。
wsf单片机课程设计论文
山东财经大学
单片机课程设计
题目:
基于单片机的秒表系统设计
学院计算机科学与技术学院
专业电子信息科学与技术
班级电子0902
学号
姓名
学号
姓名
指导教师
山东财经大学教务处制
二O一二年六月
基于单片机的秒表系统设计
摘要
本文讲述了一个基于单片机的秒表系统的设计与实现,系统有启动、暂停、清零按钮,每一秒钟都有提醒功能,秒表的最长计时长度为9:
59.9,超过此长度,报警。
本文首先分析对秒表系统,研究设计方案,根据自己所学对秒表系统的硬件及软件进行开发。
最后总结经验及实验心得。
关键词:
单片机;秒表系统;LCD显示
Abstract
Thisarticledescribesthedesignandimplementationofamicrocontroller-basedstopwatch,thesystemhastostart,pause,clearbuttoneverysecondtoremindfunction,thethestopwatchlongesttiminglengthof9:
59.9,morethanthislength,alarm.
Thispaperfirstanalyzesthestopwatchsystem,studydesign,accordingtothestopwatchsystemhardwareandsoftwaredevelopment.Finally,sumupexperienceandexperimentalexperience.
Keywords:
microcontroller;stopwatch;LCDdisplay
目录
摘要I
Abstract1
引言I
一、设计要求2
二、设计方案分析2
(1)方案设计2
(2)知识背景介绍3
三、硬件设计3
四、软件设计3
五、测试结果及分析9
六、测试出现的错误及解决方案2
(1)测试出现的错误及解决方案2
(2)实验心得3
七、参考文献3
附录9
引言
数字电子秒表具有显示直观、读取方便、精度高等优点,在计时中广泛使用。
本设计用单片机组成数字电子秒表,力求结构简单、精度高为目标。
本系统采用C51系列单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合硬件电路如电源电路,晶振电路,复位电路,显示电路,以及一些按键电路等来设计计时器,将软、硬件有机地结合起来。
其中软件系统采用C语言编写程序,开发板实际操作,易于观察,在实验中就可以观察到实际的工作状态。
本设计利用STC89C52单片机的定时器/计数器定时和计数的原理,使其能精确计时。
利用中断系统使其能实现开始暂停的功能。
根据要求知道秒表设计主要实现的功能是计时和显示。
因此设置了三个按键和LCD显示时间,三个按键分别是开始、暂停和复位按键。
利用这两个建来实现秒表的全部功能,而LCD则能显示最多9.59.9秒的计时。
一、设计要求
1.系统的功能要求
(1)该实验通过单片机的定时器/计数器定时和计数原理,设计简单的计时器系统,拥有正确的计时、暂停、清零功能,并同时可以用数码管显示,在现实生活中应用广泛,具有现实意义。
(2)设计内容:
1、设计精度为0.1S的秒表系统
2、设置启动、暂停、清零按钮
3、设计每一秒钟都有提醒功能
4、秒表的最长计时长度为9:
59.9,超过此长度,报警。
图示:
二、设计方案分析
1.方案设计
数字电子秒表具有显示直观、读取方便、精度高等优点,在计时中广泛使用。
本设计用单片机组成数字电子秒表,力求结构简单、精度高为目标。
本系统采用C51系列单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合硬件电路如电源电路,晶振电路,复位电路,显示电路,以及一些按键电路等来设计计时器,将软、硬件有机地结合起来。
其中软件系统采用C语言编写程序,开发板实际操作,易于观察,在实验中就可以观察到实际的工作状态。
本设计利用STC89C52单片机的定时器/计数器定时和计数的原理,使其能精确计时。
利用中断系统使其能实现开始暂停的功能。
根据要求知道秒表设计主要实现的功能是计时和显示。
因此设置了三个按键和LCD显示时间,三个按键分别是开始、暂停和复位按键。
利用这两个建来实现秒表的全部功能,而LCD则能显示最多9.59.9秒的计时。
电路原理图设计最基本的要求是正确性,其次是布局合理,最后在正确性和布局合理的前提下力求美观。
主要硬件电路图:
图1.1数字秒表硬件电路主要原理图
本设计中,数码管显示的数据存放在内存单元31H-33H中。
其中31H存放分钟变量,32H存放秒钟变量,33H存放10ms计数值,即存放毫秒位数据,每一地址单元内均为十进制BCD码。
由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中。
显示时,先取出31H-33H某一地址中的数据,然后查得对应的显示位,并从P1口输出,就能显示该地址单元的数据值。
计时通过
中断完成,定时溢出中断周期为1ms,当一处中断后向CPU发出溢出中断请求,每发出一次中断请求就对毫秒计数单元进行加一,达到10次就对十毫秒位进行加一,依次类推,直到9.59.9秒重新复位。
再看按键的处理。
这三个键可以采用中断的方法,也可以采用扫描的方法来识别。
复位键主要功能在于数值复位,对于时间的要求不是很严格。
而开始和暂停键则是用于对时间的锁定,需要比较准确的控制。
因此可以对复位按键采取扫描的方式。
而对开始和暂停键采用外部中断的方式。
设计中包括硬件电路的设计和系统程序的设计。
其硬件电路主要有主控制器,显示电路和回零、启动、查看、停表电路等。
主控制器采用单片机STC89C52,显示电路采用LCD显示计时时间,三个按键均采用触点式按键。
2.背景知识介绍
2.1单片机相关知识
本课题在选取单片机时,充分借鉴了许多成形产品使用单片机的经验,并根据自己的实际情况, 选择了STC89S51。
STC89C52单片机采用40引脚的双列直插封装方式。
图1.2为引脚排列图,40条引脚说明如下:
主电源引脚Vss和Vcc
①Vss接地
②Vcc正常操作时为+5伏电源
外接晶振引脚XTAL1和XTAL2
①XTAL1内部振荡电路反相放大器的输入端,是外接晶体的一个引脚。
当采用外部振荡器时,此引脚接地。
②XTAL2内部振荡电路反相放大器的输出端。
是外接晶体的另一端。
当采用外部振荡器时,此引脚接外部振荡源。
图1.2STC89C52单片机引脚图
控制或与其它电源复用引脚RST/VPD,ALE/
,
和
/Vpp
①RST/VPD当振荡器运行时,在此引脚上出现两个机器周期的高电平(由低到高跳变),将使单片机复位在Vcc掉电期间,此引脚可接上备用电源,由VPD向内部提供备用电源,以保持内部RAM中的数据。
②ALE/
正常操作时为ALE功能(允许地址锁存)提供把地址的低字节锁存到外部锁存器,ALE引脚以不变的频率(振荡器频率的1/6)周期性地发出正脉冲信号。
因此,它可用作对外输出的时钟,或用于定时目的。
但要注意,每当访问外部数据存储器时,将跳过一个ALE脉冲,ALE端可以驱动(吸收或输出电流)八个LSTTL电路。
对于EPROM型单片机,在EPROM编程期间,此引脚接收编程脉冲(
功能)
③
外部程序存储器读选通信号输出端,在从外部程序存储取指令(或数据)期间,
在每个机器周期内两次有效。
同样可以驱动八LSTTL输入。
④
/Vpp、
/Vpp为内部程序存储器和外部程序存储器选择端。
当
/Vpp为高电平时,访问内部程序存储器,当
/Vpp为低电平时,则访问外部程序存储器。
对于EPROM型单片机,在EPROM编程期间,此引脚上加21伏EPROM编程电源(Vpp)。
输入/输出引脚P0.0-P0.7,P1.0-P1.7,P2.0-P2.7,P3.0-P3.7。
①P0口(P0.0-P0.7)是一个8位漏极开路型双向I/O口,在访问外部存储器时,它是分时传送的低字节地址和数据总线,P0口能以吸收电流的方式驱动八个LSTTL负载。
②P1口(P1.0-P1.7)是一个带有内部提升电阻的8位准双向I/O口。
能驱动(吸收或输出电流)四个LSTTL负载。
③P2口(P2.0-P2.7)是一个带有内部提升电阻的8位准双向I/O口,在访问外部存储器时,它输出高8位地址。
P2口可以驱动(吸收或输出电流)四个LSTTL负载。
④P3口(P3.0-P3.7)是一个带有内部提升电阻的8位准双向I/O口。
能驱动(吸收或输出电流)四个LSTTL负载。
AT89C52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
CPU是单片机的核心部件。
它由运算器和控制器等部件组成。
(1)运算器
运算器的功能是进行算术运算和逻辑运算。
可以对半字节(4位)、单字节等数据进行操作。
例如能完成加、减、乘、除、加1、减1、BCD码十进制调整、比较等算术运算和与、或、异或、求补、循环等逻辑操作,操作结果的状态信息送至状态寄存器。
89C52运算器还包含有一个布尔处理器,用来处理位操作。
它是以进位标志位C为累加器的,可执行置位、复位、取反、等于1转移、等于0转移、等于1转移且清0以及进位标志位与其他可寻址的位之间进行数据传送等位操作,也能使进位标志位与其他可移位寻址的位之间进行逻辑与、或操作。
(2)程序计数器PC
程序计数器PC用来存放即将要执行的指令地址,共16位,可对64K程序存储器直接寻址。
执行指令时,PC内容的低8位经P0口输出,高8位经P2口输出。
(3)令寄存器
指令寄存器中存放指令代码。
CPU执行指令时,由程序存储器中读取的指令代码送入指令寄存器,经译码后由定时与控制电路发出相应的控制信号,完成指令功能。
本设计采用ATMEL的AT89C52微处理器,主要基于以下几个因素:
①AT89C52为51内核,仿真调试的软硬件资源丰富。
②性价比高,货源充足。
③功耗低,功能强,灵活性高。
④DIP40封装,体积小,便于产品小型化。
⑤为EEPROM程序存储介质,1000次以上擦写周期,便于编程调试。
⑥工作电压范围宽:
2.7V-6V,便于交直流供电。
2.2TC1602
LCD的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面。
比CRT要好的多,但是价钱较其贵。
1)LCD的特点:
①低压微功耗
②平板型结构
③被动显示型(无眩光,不刺激人眼,不会引起眼睛疲劳)
④显示信息量大(因为像素可以做得很小)
⑤易于彩色化(在色谱上可以非常准确的复现)
⑥无电磁辐射(对人体安全,利于信息保密)
⑦长寿命(这种器件几乎没有什么劣化问题,因此寿命极长,但是液晶背光寿命有限,不过背光部分可以更换)
注:
1602的管脚功能
三、硬件设计
1.控制芯片的介绍
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止.
2.定时器
1.定时器的结构
定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。
TMOD是定时器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。
2.定时器的工作原理
加1计数器输入的计数脉冲有两个来源,一个是由系统的时钟振荡器输出脉冲经12分频后送来;一个是T0或T1引脚输入的外部脉冲源。
3.定时器的控制
89S52单片机定时器的工作由两个特殊功能寄存器控制。
TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。
3.独立按键控制模块
在按键电路中,我们可以在I/O口上直接接按键,或者通过I/O口设计一个键盘,然后通过键盘扫描程序判断是否有键按下等。
键盘扫描电路节省I/O口,但编程有些复杂,在这里,由于我们所用的按键较少,且系统是一个小系统,有足够的I/O口可以使用,为了使程序简化,我们采用按键电路,用部分P3口做开关,P3.1为开始,P3.,2为暂停,P3.3为清零,用外部中断INT1开始,另外用软件法消除抖动。
四、软件设计
1.软件设计概述
在软件设计中,一般采用模块化的程序设计方法,它具有明显的优点。
把一个多功能的复杂的程序划分为若干个简单的、功能单一的程序模块,有利于程序的设计和调试,有利于程序的优化和分工,提高了程序的阅读性和可靠性,使程序的结构层次一目了然。
应用系统的程序由包含多个模块的主程序和各种子程序组成。
各程序模块都要完成一个明确的任务,实现某个具体的功能,在具体需要时调用相应的模块即可。
功能描述:
用LCD1602液晶显示"秒表",显示时间为0.00.0—9.59.9秒,每秒自动加1;一个"开始"键,一个"暂停"键,一个"清零"键。
2.主程序流程图
这里采用顺序结构,通过对按键的扫描,判断要实现什么功能。
如下所示:
1.主程序
#include
#include"lcd.h"//调用LCD模块,显示数据
#defineucharunsignedchar
#defineuintunsignedint
sbitled1=P3^0;//定义中断端口
sbitled2=P3^1;
sbitbuzz=P1^2;
sbitstart=P2^0;
sbitpush=P2^1;
sbitreset=P2^2;
ucharaa=0,shi=9,fen=59,miao=30,xx=0;//定义参数
ucharflag_old=0,flag;
voidinit()//初始化外部中断和定时器
{
TMOD=0x01;
TH0=0x4c;
TL0=0x00;
EA=1;
ET0=1;
TR0=0;
}
voidtixing()//定时模块,设置0.1秒报警
{
uinti,j;
for(i=0;i<100;i++)
{
for(j=0;j<80;j++);
buzz=~buzz;
}
for(i=0;i<100;i++)
{
for(j=0;j<150;j++);
buzz=~buzz;
}
}
voidmain()
{
lcd1602();
lcd1602_init();//计时显示“start”
init();
display_onechar(0,11,'s');
display_onechar(0,12,'t');
display_onechar(0,13,'a');
display_onechar(0,14,'r');
display_onechar(0,15,'t');
TR0=1;
while
(1)
{
display_onechar(0,0,shi+0x30);
display_onechar(0,1,':
');
display_onechar(0,2,fen/10+0x30);
display_onechar(0,3,fen%10+0x30);
display_onechar(0,4,':
');
display_onechar(0,5,miao/10+0x30);
display_onechar(0,6,miao%10+0x30);
display_onechar(0,7,'.');
display_onechar(0,8,xx+0x30);
if(start==0&&shi!
=10)//开始计时模块
{
delay(15000);
while(start==0);
delay(5000);
TR0=1;
display_onechar(0,11,'s');
display_onechar(0,12,'t');
display_onechar(0,13,'a');
display_onechar(0,14,'r');
display_onechar(0,15,'t');
}
if(stop==0)//暂停模块,同步显示“push”
{
delay(15000);
while(push==0);
delay(5000);
TR0=0;
display_onechar(0,11,'');
display_onechar(0,12,'p');
display_onechar(0,13,'u');
display_onechar(0,14,'s');
display_onechar(0,15,'h');
}
if(reset==0)//复位模块
{
delay(15000);
while(reset==0);
delay(5000);
TR0=0;
shi=0;
fen=0;miao=0;xx=0;
}
if(xx==0&&shi!
=10)//每1秒提示
{
tixing();
}
if(shi==10)//超出量程9:
59:
9报警,显示“over”
{
tixing();
display_onechar(0,11,'');
display_onechar(0,12,'o');
display_onechar(0,13,'v');
display_onechar(0,14,'e');
display_onechar(0,15,'r');
}
}
}
voidtimer0()interrupt1
{
TH0=0x4c;
TL0=0x00;
aa++;
if(aa==2)
{
aa=0;
xx++;
if(xx==1)
{
led1=0;
led2=0;
}
if(xx==2)
{
led1=1;
led2=1;
}
if(xx==10)
{
xx=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==10)
TR0=0;
}
}
}
}
}
2.LCD模块化程序
#include"lcd.h"
voidlcd1602()
{
en=0;
rs=1;
rw=1;
lcd_data=0xff;
}
voidread_busy()
{
lcd_data=0xff;
rs=0;
rw=1;
en=1;
while(lcd_data&0x80);
en=0;
}
voidwrite_lcd(unsignedcharvalue,biti)
{read_busy();
lcd_data=value;
rs=i;
rw=0;
en=1;
en=0;
}
voidlcd1602_init()
{
delay(15000);
write_lcd(0x38,0);
delay(5000);
write_lcd(0x38,0);
delay(5000);
write_lcd(0x38,0);
delay(5000);
write_lcd(0x08,0);
write_lcd(0x01,0);
write_lcd(0x06,0);
write_lcd(0x0c,0);
}
voiddelay(unsignedinti)//延时子程序
{
while(--i);
}
voiddisplay_onechar(unsignedchary,unsignedcharx,unsignedcharvalue)
{
y&=0x01;
x&=0x0f;
if(y)
{
x+=0x40;
}
x+=0x80;
write_lcd(x,0);
write_lcd(value,1);
}
五、仿真结果及分析
基于单片机的秒表系统设计完成之后,最终通过一个独立按键控制暂停与开始,另一个独立按键控制清零,同时实现秒表每一秒都要提示,同时将独立按键的控制信息在液晶屏上显示出来,还要同时实现蜂鸣器的报警功能。
图4-1整体连线图4-2结果显示
6.调试中出现的错误及解决方法
1.实验中遇到的问题及解决方法
①问题:
LCD显示模糊
原因:
VEE接高电平,LCD的对比度太低,从而无法正常显示数据。
解决方法:
将VEE接地,提高了LCD的对比度,数据显示清晰。
②问题:
蜂鸣器声音小
原因:
试验箱子的问题,换个好的试验箱子声音变大。
2.实验心得
①王术芳
接到题目时,发现是关于电子秒表的设计,先在网上查阅了一些有关电子秒表设计的材料,熟悉了设计思想与工作原理,并且具体的分析了单片机、数码管显示器的工作过程,从理论上分析了该工作过程。
将程序考入单片机后开始测试,刚开始时LCD显示器无数据显示,经过对
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- wsf 单片机 课程设计 论文