基于89C51单片机的秒表课程设计

单片机原理及系统课程设计

专    业:  电气工程及其自动化   

班    级:   113       

姓    名:       34     

学    号:      112342   

指导教师:      22      

兰州交通大学自动化与电气工程学院

 年 月 日

1 引言

随着电子技术的发展,电子技术在各个领域的运用也越来越广泛,人们对它的认识也逐步加深。秒表计时器常常用于体育竞赛及各种其他要求有较精确时间的各领域中。其中启/停开关的使用方法与传统的机械计时器相同,即按一下启/停开关,启动计时器开始计时,再按一下启/停开关计时终止。而复位开关可以在任何情况下使用,即使在计时过程中,只要按一下复位开关,计时应立即终止。

2 设计方案及原理

以单片机为核心,设计一个秒表,具有计时功能,按键有启动计时、数据清零、停止、时间显示。

采用3个LED数码管显示时间,计时范围设置为0~99.9秒,即精确到0.1秒,用按键控制秒表的“开始”、“暂停”、“复位”,按“开始”按键,开始计时;按“暂停”按键,系统暂停计时;再按“开始”键,系统继续计时;数码管显示当前计时值;按“复位”按键,系统清零。

3 硬件设计

MCS-51系列单片机是8位单片机产品,89C51是其中的典型代表,基本模块包括以下几个部分:

(1)CPU:89C51的CPU是8位的,另外89C51内部有1个位处理器;

(2)R0M:4KB的片内程序存储器,存放开发调试完成的应用程序;

(3)RAM:256B的片内数据存储器,容量小,但作用大;

(4)I/O口:P0-P3,共4个口32条双向且可位寻址的I/O口线;

(5)中断系统:共5个中断源,3个内部中断,2个外部中断;

(6)定时器/计数器:2个16位的可编程定时器/计数器;

(7)通用串行口:全双工通用异步接收器/发送器;

(8)振荡器:89C51的外接晶振与内部时钟振荡器为CPU提供时钟信号;

(9)总线控制:89C51对外提供若干控制总线,便于系统扩展。

89C51单片机内部的振荡电路是一个高增益反相放大器,引线XTAL1和XTAL2分别为反相振荡放大器的输入及内部时钟工作电路的输入和来自反相振荡器的输出,该反相放大器可以配置为片内振荡器。

采用上电复位,上电后,由于电容充电,使RST持续一段时间的高电平,从而实现上电复位操作。

采用3个LED数码管,LED是七段显示器,内部有7个条形发光二极管和1个小圆点发光二极管,根据各管的亮暗组成字符。用Proteus软件画出主电路图见附录一。

4 软件设计

(1)秒表的初始化

根据程序流程图,先进行秒表的初始化,即:①将I/O口P3全写一,为秒表的控制输入做好准备;②将数码管全部置零,使其处于秒表计时的初始状态;③将工作寄存器R0~R2以及30H初始化,留待后面的计时程序备用;④将定时器0置于工作方式1,并为其装入计时预置数D8FE(因为程序运行过程中占用的时间会导致一定误差,此为经实物测试之后的修正值),即将定时器定为每10ms溢出;⑤开总中断允许和定时器0中断允许。初始化完成后,即进入之后的按键扫描程序。

(2)按键检测程序

轮流检测开始计时(P3.2)、暂停计时(P3.3)、秒表清零(P3.4)三个按键。若发现有一个按键出现低电平(可能被按下),则延时10ms(调用延时子程序DELAY),延时完成后,若发现低电平消失,则说明该按键实际上未被按下,此时转回按键检测处继续检测;若发现仍然是低电平,则说明此键确实被按下了,此时就跳转至相应的程序标号处,执行相应的功能。

(3)开始计时

若确认“开始计时”键被按下,则跳转至程序标号“RUN”处,将定时器0计时允许控制位TR0置位,则定时器开始运行。此动作完成后,返回按键检测程序,等待操作者的下一次指令。

(4)计时程序

定时器0计时至10ms,溢出,引发中断,程序跳转至定时器0中断服务程序入口000BH处执行。程序跳转至中断服务程序TIME0。由于秒表的最小计时单位是0.1s,即100ms,因此需加入软件计时,使定时器0溢出10次之后才改变数码管的显示状态。因此每来一次中断就将30H中的数加1,若30H中的数没有到10,则给定时器0重新装入预置数,之后中断返回并继续等待中断;到10了,才进入显示程序,改变数码管的显示状态,执行完毕之后中断返回并继续等待中断。

(5)显示程序

将数码管的段选码放在数表TAB中。每次100ms计时完成后,将R0中的值(初值为0)送入A,然后自加1。若R0中的值没到10,则使用累加器A查表,并将查得的数码管段选码送入毫秒位数码管。之后将30H中的数置零,中断返回。若发现R0中的数到10了,则将R0置零,并转入秒位进位子程序SECOND,向秒位进位,之后,继续照常向毫秒位送数。

(6)暂停计时

若确认“暂停计时”键被按下,则跳转至程序标号“PAUSE”处,将定时器0计时允许控制位TR0置零,则定时器暂停运行。此动作完成后,返回按键检测程序,等待操作者的下一次指令。

(7)秒表清零

若确认“秒表清零”键被按下,则跳转至程序标号“STOP”处,将TR0置零,关闭定时器0运行。并且将数码管、工作寄存器、定时器0预置数全部重置,使其处于秒表计时的初始状态。此动作完成后,返回按键检测程序,等待操作者的下一次指令。

(8)延时程序

用于按键延时防抖,延时10ms。程序清单见附录二。

程序流程图如图1所示。

图1 程序流程图

4.3 程序仿真

将以上程序清单导入先前做好的Proteus仿真电路,汇编之后,按

键开始进行仿真。

仿真结果如图2。

图2 仿真结果图

仿真开始后,第一个按钮为计时按钮,点击开始计时;第二个按钮为暂停按钮,点击则暂停计时;第三个按钮为复位按钮,点击后秒表复位归零。三个显示器分别是十秒、秒、微秒的显示。如图2显示的为21.9秒。

5 总结

在此次课程设计中秒表虽然是一个非常简单的功能,但要在单片机中使用汇编语言来实现这个功能,仍然花了我不少心思。

首先是计时的问题,由于单片机计时器最大只能计时65.5ms,因此要实现毫秒位的变化,我采用了软件计时的方法,单片机只需计时10ms,然后用软件重复10次,即可达到计时100ms的目的。

显示方面,为了使编程简单,我使用了静态显示。不过这使得占用I/O口线过多,而且连线复杂繁琐,为实物的制作带来了不便。在以后的学习和应用中我会努力加深动态扫描显示的理解,争取熟练运用。

根据书本知识,我们一开始只给P0口加上了上拉电阻,但是实物做成后我们发现P1和P2口得输出显示非常暗,初步确定是驱动能力不足的问题后,我们给二者也加上了上拉电阻,结果使得显示正常了。由此我们了解到,实践才是检验真理的唯一标准,有时候书本上的知识需要经过实践的改进,才能运用到实际中。

此次课程设计巩固了我的基础知识,提高了我的应用水平,锻炼了我的动手能力,使我受益匪浅。然而,在吸取经验的同时,我也吃了不少教训。在编程、仿真、焊接方面都走了不少弯路。但是,学则要有所收获,经过此次的锻炼,我在很多方面都已经有所提高,知识也掌握得更加扎实了。

   在今后的学习和实践中,我将继续努力钻研,提高自己,争取在学术和记忆上获得更大的进步。

参考文献

[1]张毅刚, 彭喜元.单片机原理及接口技术[M].人民邮电出版社.

[2]单片机课程设计实例指导  李光飞等.   北京航空航天大学出版社

[3]51系列单片机原理、开发与应用实例   孙进平等编著

[4]单片机程序设计实例   先锋工作室编著   清华大学出版社 

.

7 附录

附录一主电路图

附录二 主程序

ORG 0000H          ;程序开始

AJMP START         ;跳转到主程序START

ORG 000BH          ;定时器0中断的地址入口

AJMP TIME0         ;定时器0溢出,跳转到中断程序TIME0

START:             ;主程序

MOV P3,#0FFH       ;输入端口P3全写1

MOV P0,#3FH        ;

MOV P1,#3FH        ;

MOV P2,#0BFH       ;数码管初始化

MOV 30H,#00H       ;

MOV R0,#00H        ;

MOV R1,#0AH        ;

MOV R2,#00H        ;工作寄存器初始化

MOV TMOD,#01H      ;定时器0工作于方式1

MOV TH0,#0D8H      ;

MOV TL0,#0FEH       ;定时器0预置数(D8FEH=55550D)

SETB EA            ;开总中断允许

SETB ET0           ;开定时器0中断允许

READ:              ;读键程序

L1:JB P3.2,L2      ;

LCALL DELAY        ;按键延时防抖

JB P3.2,L1         ;

AJMP RUN           ;确认计时键被按下,开始/继续计时

L2:JB P3.3,L3      ;

LCALL DELAY        ;按键延时防抖

JB P3.3,L2         ;

AJMP PAUSE         ;确认暂停键被按下,暂停计时

L3:JB P3.4,L1      ;

LCALL DELAY        ;按键延时防抖

JB P3.4,L3         ;

AJMP STOP          ;确认清零键被按下,秒表重置

RUN:               ;计时键按下,跳转至此

SETB TR0           ;定时器0开始/继续运行

AJMP READ          ;

PAUSE:             ;暂停键按下,跳转至此

CLR TR0            ;

AJMP READ          ;   

TIME0:             ;定时器0溢出,中断,跳转至此

INC 30H            ;

MOV A,30H          ;

CJNE A,#0AH,TIME1  ;30H单元中的值到10了吗?(计时到10毫秒了吗,也就是说,该向毫秒位送数了吗?)

MOV DPTR,#TAB      ;30H中的值到10了,顺序执行

MOV A,R0           ;

INC R0             ;

CJNE R0,#0AH,GET   ;R0中的值到10了吗?(该向秒位进位了吗?)

MOV R0,#00H        ;

LCALL SECOND       ;到了,R0清零,调用进位子程序SECOND,向秒位进位

GET:               ;没到,跳过进位子程序

MOVC A,@A+DPTR     ;

MOV P1,A           ;查表并向数码管毫秒位送数

MOV 30H,#00H       ;重置30H单元

TIME1:             ;

MOV TH0,#0D8H      ;

MOV TL0,#0FEH       ;给定时器0重新预置数

RETI               ;中断返回

SECOND:            ;秒位进位子程序

PUSH ACC           ;

PUSH PSW           ;将ACC和PSW推入堆栈保护

MOV A,R1           ;

INC R1             ;

CJNE R1,#14H,GET1  ;R1中的值到20了吗,也就是说,该向十秒位进位了吗?

MOV R1,#0AH        ;

LCALL SECOND1      ;到了。R1重置,调用进位子程序SECOND1,向十秒位进位

GET1:              ;没到,跳过进位子程序

MOVC A,@A+DPTR     ;

MOV P2,A           ;查表并向数码管秒位送数

POP PSW            ;

POP ACC            ;PSW,ACC出栈

RET                ;子程序返回

SECOND1:           ;十秒位进位子程序

PUSH ACC           ;

PUSH PSW           ;将ACC和PSW推入堆栈保护

MOV A,R2           ;

INC R2             ;

CJNE R2,#0AH,GET2  ;R2中的值到10了吗,也就是说,该将此位归零了吗?

MOV R2,#00H        ;到了,R2清零

GET2:              ;没到,跳过清零程序

MOVC A,@A+DPTR     ;

MOV P0,A           ;查表并向数码管十秒位送数

POP PSW            ;

POP ACC            ;PSW,ACC出栈

RET                ;子程序返回

STOP:              ;清零键按下,跳转至此

MOV P3,#0FFH       ;

MOV P0,#3FH        ;

MOV P1,#3FH        ;

MOV P2,#0BFH       ;数码管清零

MOV 30H,#00H       ;

MOV R0,#00H        ;

MOV R1,#0AH        ;

MOV R2,#00H        ;工作寄存器初始化

CLR TR0            ;计时器0停止计时

MOV TH0,#0D8H      ;

MOV TL0,#0FEH       ;定时器0预置数

AJMP READ          ;

DELAY:             ;延时10ms子程序

MOV R3,#50D        ;

D1:MOV R4,#100D    ;

D2:DJNZ R4,D2      ;

DJNZ R3,D1         ;

RET                ;子程序返回

TAB: DB 06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,3FH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH,0BFH ;数码管段选码数表

END                ;程序结束

 

第二篇:单片机秒表设计课程设计报告

单片机课程设计报告

一、实验题目
秒表系统设计——用两个数码管来显示秒表数据,一个显示秒,另一个显示十分之一秒。

二、系统总体功能
用两个数码管来显示秒表数据,一个显示秒,另一个显示十分之一秒。有一个按键来启动秒表的开始和结束。增加一个清零按钮,计时结束后可以清零。

三、实验目的

1、利用单片机定时器/计数器中断设计秒表,从而实现秒、十分之一秒的计时。2、综合运用所学的《单片机原理与应用》理论知识,通过实践加强对所学知识的理解,具备设计单片机应用系统的能力。
3、 通过本次课程设计加深对单片机掌握定时器、外部中断的设置和编程原理的全面认识复习和掌握,对单片机实际的应用作进一步的了解。
4、 通过本次试验,增强自己的动手能力。认识单片机在日常生活中的应用的广泛性,实用性。

四、系统设计方案

本实验利用单片机的定时器/计数器定时和记数的原理,通过采用proteus仿真软件来模拟实现。模拟利用AT89C51单片机、LED数码管以及控件来控制秒表的计数以及计数的开启/暂停/继续与复位!
    其中有两个数码管用来显示数据,一个数码管显示秒(两位),另一个数码管显示十分之一秒,十分之一秒的数码管计数从0~9,满十进一后显示秒的数码管的数字加一,并且十分之一秒显示清零重新从零计数。计秒数码管采用两位的数码管,当计数超过范围是所有数码管全部清零重新计数。

五、试验设计所需硬件(模拟硬件)

    Atmel89C51单片机芯片一个、LED数码显示管三个,低压电源、开关(按钮)两个、电阻、电容及导线若干。

由于条件限制本实验采用软件模拟硬件系统,采用proteus软件进行模拟设计及调试工作。

 
图1  七段数码管引脚图

     图2  Atmel89C51单片机外部引脚图

六、试验设计原理图 

图3  试验设计电路图

七、软件设计分析

程序流程图:

实验程序清单:

 #include <reg51.H>

{

sbit sta_end=P3^4;

sbit reset=P3^7;

unsigned char code table0[]={0x3f,0x06,0x5b,0x4f,0x66,

                            0x6d,0x7d,0x07,0x7f,0x6f};

unsigned char code table1[]={0xc0,0xf9,0xa4,0xb0,0x99,

                         0x92,0x82,0xf8,0x80,0x90};

/*声明second10用于计数十分之一秒变化,second1用于记录秒的个*/       /*位,second2用于记录秒的十位*/

unsigned int second10,second1,second2;

bit bdata flag;

/*以下是设置延时功能的函数*/

void delay()                    

{

  unsigned char i,j;

  for(i=90;i>0;i--)

  for(j=200;j>0;j--);

}

}

/*以下是设置时间的函数*/

void  setTime()  

{               

  second10++;

  if(second10==10)             /*当十分之一秒计数到十后从零重新计时*/

  {

    second10=0;                 /*同时秒计时个位加一*/

    second1++;

    if(second1==10)             /*当秒计数个位到十后从零重新计时*/

    {

       second1=0;

       second2++;               /*同时秒计时十位加一*/

       if(second2==6)

         second2=0;

    }

  }

}

/*以下是向LED管输数据并使之显示的函数*/

void dispact()                                      

{

  P3=0xfe;                     

  P0=table1[second1];    

  delay();

  P3=0xfd;

  P0=table1[second2];   

  delay();

  P2=table0[second10];  

}

/*以下是设置时间函数和输数据函数被此函数调用实现,利用定时器中断*/

/*十分之一秒刷新一次,实现十分之一秒进一*/

Timer0 () interrupt 1 using 1       

{

  TH0 = (65535 - 50000)/256;

  TL0 = (65535 - 50000)%256;

  if(flag)

    setTime();

  dispact();

}

void main(void)                  

{

  TMOD = 0x01;

  TH0 = (65535 - 50000)/256;         /*定时器赋初值*/

  TL0 = (65535 - 50000)%256;

  flag = 0;

  EA = 1;                            /*cpu开中断*/

  TR0 = 1;                           /*利用定时器0*/

  ET0 = 1;                           /*外部中断允许*/

  do

  {

    if(!sta_end)

    {

       if(flag == 0)

         flag = 1;

       else flag = 0;

    }

   

if(!reset)                            /*复位设置,全部清零*/

    {

      flag = 0;

      second10 = 0;

      second1 = 0;

      second2 = 0;

    }

  }while(1);

}

八、试验设计总结

 通过这一周的课程设计,我对一些专业知识和电子设计有了更深的了解,同时也尝试着去应用自己的所掌握的知识。本次电子课程设计主要是对已学习的模拟电子技术、数字电子技术和单片机的综合应用,同时加上电路等知识,设计完成了利用软件模拟的秒表。经过几天的奋战,我感受很深.

 我和刘傲辉、龙贤三个人一块儿讨论设计了此次试验,在设计过程中深感自己在培养动手能力这方面还需很大的努力。同时,通过这次我们积极的通过网络,书籍等资源,在同学的帮助下,把这个课程设计作为一次锻炼,为以后生活学习中培养善于动手,乐于动手的习惯。

 单片机课程设计不仅给我们提供了一个很好的展现应用自己所掌握的知识的平台,又是检验自己所学知识的一次考核。 我们运用各自在各方面的优势中和起来,形成了一个团队.通过团队力量,才使设计得以完成.可以说,我们三个人是一个不可或缺的整体,少了任何一个人都是无法完成任务的。

在设计的过程中我们也不可避免的遇到了很多的问题。尤其是在调试过程中,会因为某些原因出不来结果,或三个人之间出现了意见分歧,但在最后都达成了

一致。通过这次的课程设计,我们也发现了不少自己不会的知识,通过查询各方面资料,我们也进步了很多,有学会了很多上课时没掌握的东西, 最后在调试结果出来后,我们更是无比的兴奋,无比的自豪。总之,通过这次电子课程设计,我不仅对自己的知识有了更好的掌握和应用,更了解到团队精神的力量.在以后的学习和生活中受用终身.

二十世纪跨越了三个“电”的时代,即电气时代、电子时代和现已进入的电脑时代。但是,实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机难道要用P4吗?应用的关键是看是否够用,是否有很好的性能价格比。单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。自从1976年问世以来,单片机获得了巨大的发展。现在比较流行的单片机是美国Intel 的MCS51/96以及Motorola的MC系列,Zilog 的Z8系列,同时还有更多新型的、功能更强的单片机不断出现。 目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录象机、摄象机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械了。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。 

中国使用单片机的历史只有短短的30年,在初始的短短五年时间里 发展极为迅速。纵观我们现在生活的各个领域,从导 弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据 处理,以及我们生活中广泛使用的各种智能IC 卡、电子宠物等,这些都离不开单片机。以前没有单片机时,这些 东西也能做,但是只能使用复杂的模拟电路,然而这样做出来的产品不仅体积大,而且成本高,并且由于长期使用, 元器件不断老化,控制的精度自然也会达不到标准。在单片机产生后,我们就将控制这些东西变为智能化了,我们 只需要在单片机外围接一点简单的接口电路,核心部分只是由人为的写入程序来完成。这样产品的体积变小了,成 本也降低了,长期使用也不会担心精度达不到了。所以,它的魔力不仅是在现在,在将来将会有更多的 人来接受它、使用它。据统计,我国的单片机年容量已达3 亿片,且每年以大约20%的速度增长,但相对于 世界市场我国的占有率还不到1%。特别是沿海地区的玩 具厂等生产产品多数用到单片机,并不断地辐射向内地。 所以,学习单片机在我国是有着广阔前景的。

十、参考文献

1、51单片机学习网  http://www.51c51.com/

2、单片机学习网   http://www.mcustudy.com/

3、《单片机C语言应用程序设计》,第四版,马忠梅主编,北京航空航天大学出版社

4、《单片机开发与典型工程项目实例详解》,边海龙、孙永奎编著,电子工业出版社

相关推荐