单片机秒表课程设计(C语言)
广东工业大学华立学院 课 程 设 计(论文)
课程名称 MCS-51单片机 题目名称 单片机秒表设计
学生学部(系) 机电学部 专业班级 08自动化一班 学 号 [1**********] 学生姓名 李赛文 指导教师 黄淑芬
2010年 12 月 10 日
目录
1课程设计的目的和任务
1.1 单片机秒表课程设计的概述 1.2课程设计思路及描述 1.3 课程设计任务和要求
2硬件与软件的设计流程
2.1系统硬件方案设计 2.2软件方案设计
3 程序编写流程及课程设计效果
3.1源程序及注释 3.2原理图分析 3.3课程设计效果
4 参考文献
1. 课程设计的目的和任务 1.1单片机秒表课程设计的概述
一、课程设计题目
秒表系统设计——用STC89C52RC设计一个3位LED数码显示“秒表”,显示时间为00.0~59.9秒,每毫秒自动加一,每十毫秒自动加一秒。 二、增加功能
增加一个“复位00.0”按键(即清零),一个“暂停”和“开始”按键,一个“复位60.0”按键(用来60秒倒计时),一个倒计时“逐渐自减”按键。 三,课程设计的难点
单片机电子秒表需要解决三个主要问题,一是有关单片机定时器(一个控制顺序计时,一个控制倒计时)的使用;二是如何实现LED的动态扫描显示;三是如何对键盘输入进行编程。 四、课程设计内容提要
本课程利用单片机的定时器/计数器定时和记数的原理,结合集成电路芯片8051、LED数码管以及课程箱上的按键来设计计时器。将软、硬件有机地结合起来,使得系统能够正确地进行计时,数码管能够正确地显示时间。其中本课程设计有四个开关按键:其中key2按键按下去时开始计时,即秒表开始键(同时也用作暂停键),key1按键按下去时数码管清零,复位为“00.0”,key3按键按下去时数码管复位为“60.0”(用于倒计时),key4按键按下去则是数码管开始“逐渐自减”倒计时。
课程设计的意义
1) 通过本次课程设计加深对单片机课程的全面认识复习和掌握,对单片机课程的应用进一
步的了解。
2) 掌握定时器、外部中断的设置和编程原理。
3) 通过此次课程设计能够将单片机软硬件结合起来,对程序进行编辑,校验。
4) 该课程通过单片机的定时器/计数器定时和计数原理,设计简单的计时器系统,拥有正
确的计时、暂停、清零,并同时可以用数码管显示,在现实生活中应用广泛,具有现实意义 课程设计仪器
集成电路芯片8051,七段数码管,TX-1C单片机开发板, MCS-51系列单片机微机仿真课程系统中的软件(Keil uvision2)。
1.2课程设计思路及描述
该课程设计要求进行计时并在数码管上显示时间,则可利用MCS-51系列单片机的芯片AT89C52的P3.4,P3.5,P3.6,P3.7作为按键的入口;定时器T0作为每0.1秒减一的定时器;定时器T1作为每0.1秒加一的定时器。其中“开始”按键当开关由上向下拨时开始计时,此时若再拨“开始”按键则数码管暂停;“清零”按键当开关由上向下拨时数码管清零,此时若再拨“开始”按键则又可重新开始计时。
方框图如下图1:
图1数字秒表设计导向
1.3 课程设计任务和要求
1.设计指标 。
了解8051芯片的的工作原理和工作方式 ,使用该芯片对LED数码管进行显示控制,实现用单片机的端口控制数码管,显示分、秒,并能用按钮实现秒表起动、停止、60秒、倒计时清零等功能,精确到0.1秒。
要求选用定时器的工作方式,画出使用单片机控制LED数码管显示的电路图,并实现其硬件电路,并编程完成软件部分,最后调试秒表起动、停止、清零等功能。 2.设计要求
① 画出电路原理图(或仿真电路图); ② 软件编程与调试; ③ 电路仿真与调试;
2.软件与硬件设计 2.1系统硬件方案设计
单片机应用系统由硬件系统和软件系统两部分组成。硬件系统是指单片机以及扩展的存储器、I\O接口、外围扩展的功能芯片以及接口电路。软件系统包括监控程序和各种应用程序。
在单片机应用系统中,单片机是整个系统的核心,对整个系统的信息输入、处理、信息输出进行控制。与单片机配套的有相应的复位电路、时钟电路以及扩展的存储器和I\O接口,使单片机应用系统能够运行。
在一个单片机应用系统中,往往都会输入信息和显示信息,这就涉及键盘和显示器。在单片机应用系统中,一般都根据系统的要求配置相应的键盘和显示器。配置键盘和显示器一般都没有统一的规定,有的系统功能复杂,需输入的信息和显示的信息量大,配置的键盘和显示器功能相对强大,而有些系统输入/输出的信息少,这时可能用几个按键和几个LED指示灯就可以进行处理了。在单片机应用系统在中配置的键盘可以是独立键盘,也可能是矩阵键盘。
图2系统硬件结构框
3个数码
管显示
11.0592MHz晶振
电源开关
STC89C52RC
4个独立电源指示灯
2.2软件方案设计
此次选用C51来编程,首先要有初始化程序,通过初始化程序,将对主程序所用到的变量、常量以及各个参数和所调用的子函数定义。其次还有显示程序、按键扫描及处理程序、
时钟程序和倒计时程序,系统软件流程图图如图 3所示:
图3
3 程序编写的流程及课程设计效果 3.1 源程序及注释
#include //52系列单片机头文件 #define uchar unsigned char //宏定义 #define uint unsigned int
sbit dula=P2^6; //申明U1锁存器的锁存端 sbit wela=P2^7; //申明U2锁存器的锁存端 sbit key1=P3^4; //申明四个按键的锁存端 sbit key2=P3^5; sbit key3=P3^6; sbit key4=P3^7;
uchar code table[]={ //含有0~9的数字数组 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f};
void delayms(uint); //声明延时函数 void display(uchar,uchar,uchar); //声明显示函数 void keyscan(); //声明按键函数 uchar num1,num2,bai,shi,ge; //变量声明 uint num;
void main() //主函数入口 {
TMOD=0x11; //设置TO,T1定时器
TH0=(65536-45872)/256; //装初值11.05992M晶振定时50ms数为45872
TL0=(65536-45872)%256; TH1=(65536-45872)/256; TL1=(65536-45872)%256;
EA=1; //开总中断
ET0=1; //开启定时器T0中断 ET1=1; //开启定时器T1中断
while(1) //程序停在这里等待中断的发生,这个大循环也是实现数据显示的主体循环 {
keyscan();
//三个数码管要选送的数据
bai=num/100; //百位 shi=(num-100*bai)/10; //十位 ge=num-100*bai-shi*10; //个位
//直接把第二只数码管的小数点烧出来 dula=1; //打开段选 P0=0x80; //送段选数据 dula=0; //关闭断选
P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位锁存端造成混乱
wela=1; //打开位选 P0=0xfd; //送位选数据 wela=0; //关闭位选 delayms(5); //延时
display(bai,shi,ge); } }
void display(uchar bai, uchar shi,uchar ge) //数码管显示子函数 {
dula=1; //打开段选 P0=table[bai]; //送段选数据 dula=0; //关闭断选
P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位锁存端造成混乱
wela=1; //打开位选 P0=0xfe; //送位选数据 wela=0; //关闭位选 delayms(5); //延时
dula=1; //打开段选 P0=table[shi]; //送段选数据 dula=0; //关闭断选
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位锁存端造成混乱
wela=1; //打开位选 P0=0xfd; //送位选数据 wela=0; //关闭位选 delayms(5); //延时
dula=1; //打开段选 P0=table[ge]; //送段选数据 dula=0; //关闭断选 P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位锁存端造成混乱
wela=1; //打开位选 P0=0xfb; //送位选数据 wela=0; //关闭位选 delayms(5); //延时 }
void delayms(uint xms) //延时子函数 {
uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒 for(j=110;j>0;j--); }
void keyscan() //按键子函数 {
if(key1==0) //清零 {
delayms(10); //延时去抖 if(key1==0) {
while(!key1) //等待按下 {
TR0=0; //定时器TR0关闭 TR1=1; //定时器TR1打开 num=0; //送数据num=0 TR1=0; //定时器TR1关闭 } } }
if(key2==0) //暂停和开始 {
delayms(10); if(key2==0) {
while(!key2); TR0=0;
TR1=~TR1; //每次按下,TR1的状态时相反的 } }
if(key3==0) //使计数器显示为60.0 {
delayms(10); if(key3==0) {
while(!key3); TR0=0; TR1=1; num=600; TR1=0; } }
if(key4==0) // {
delayms(10); if(key4==0) {
while(!key4); TR1=0; TR0=1; } } }
void T0_time()interrupt 1 //{
TH0=(65536-45872)/256; // TL0=(65536-45872)%256; num2++;
if(num2==2) // {
num2=0; // num1++;
if(num1==10)
num1=0;
if(num==0) // num=600;
num--; //num } }
实现计数器的倒数功能 定时器T0,中断序号为1 重装初值 如果到了2次,说明0.1秒的时间到 然后把num2清零重新再计2次 当num自减为0时,重新为60.0,再开始倒计时逐渐自减
void T1_time()interrupt 3 //定时器T1,中断序号为3 {
TH1=(65536-45872)/256; //重装初值 TL1=(65536-45872)%256; num2++;
if(num2==2) //如果到了2次,说明0.1秒的时间到 {
num2=0; //然后把num2清零重新再计2次 num1++;
if(num1==10) num1=0;
num++; //num逐渐自加
if(num==600) //这个数十用来送给数码管显示的,到了60.0后归零 num=0; } }
3.2原理图分析
图4按键原理图
图5显示电路
图6电源电路原理图
3.3
课
程设计效果
通过最后软件对程序的编译,组建,执行,还有最终生成.hex文件,把.hex下载到TX-1C开发板的STC89C52RC单片机上的最终效果图如下: 图7.复位“00.0”
图8.复位“60.0”
图9.“开始自加”运行
图10.“开始自减”运行
4 参考文献
【1】孙育才编著.MCS-51系列单片微型计算机及其应用.东南大学出版社.2009.12
【2】郭天祥编著.51单片机C语言教程-入门、提高、开发、拓展全攻略.电子工业出版社.2010.05
【3】刘刚编著.Protel DXP 2004 SP2原理图与PCB设计.电子工业出版社.2009.07 【4】丁峻岭主编.C语言程序设计.中国铁道出版社.2009.12