51单片机计时器

合集下载

单片机实训报告计时器

单片机实训报告计时器

一、概述随着科技的不断发展,单片机技术已经成为现代电子设备中不可或缺的核心技术。

为了提高自身对单片机应用技术的理解和掌握,本实训报告以设计一个基于单片机的计时器为例,通过实践操作,深入探究单片机的编程与应用。

二、实训目的1. 熟悉单片机的基本原理和开发环境。

2. 掌握51单片机的编程方法,提高编程能力。

3. 学会使用数码管、按键等外部器件与单片机进行交互。

4. 培养动手实践能力和创新意识。

三、实训内容本实训主要设计一个基于51单片机的计时器,计时范围设置为00.0~99.9秒,精确到0.1秒。

计时器具有以下功能:1. 计时开始:按下开始按钮,计时器开始计时。

2. 计时暂停:按下暂停按钮,计时器暂停计时。

3. 计时复位:按下复位按钮,计时器清零。

4. 显示计时:通过数码管实时显示当前计时值。

四、硬件设计1. 单片机:选用51单片机作为核心控制单元。

2. 数码管:采用共阴型4位数码管,用于显示计时值。

3. 按键:设计三个按键,分别用于控制计时器的开始、暂停和复位功能。

4. 晶振:用于提供单片机的时钟信号。

5. 电阻、电容等:用于搭建电路。

五、软件设计1. 主程序:初始化单片机,配置I/O端口,设置定时器,进入主循环。

2. 计时函数:根据按键输入,控制计时器的开始、暂停和复位功能。

3. 显示函数:将计时值转换为数码管可识别的编码,并通过I/O端口输出。

六、程序实现以下为计时器设计的主要程序代码:```c#include <reg51.h>#define uchar unsigned char#define uint unsigned intsbit key_start = P1^0; // 开始按键sbit key_pause = P1^1; // 暂停按键sbit key_reset = P1^2; // 复位按键sbit display_data = P0; // 数码管数据端口sbit display_control = P2; // 数码管控制端口uchar code code_display[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; // 数码管编码uint time = 0; // 计时器值void delay(uint t) {while(t--);}void display() {uchar i;for(i = 0; i < 4; i++) {display_control = 0x01 << i; // 选择数码管位display_data = code_display[time / 10]; // 显示十位delay(10000);display_control = 0x01 << i; // 选择数码管位display_data = code_display[time % 10]; // 显示个位 delay(10000);}}void main() {TMOD = 0x01; // 设置定时器模式TH0 = 0xFC; // 设置定时器初值TL0 = 0x18;TR0 = 1; // 启动定时器display_control = 0xFF; // 关闭所有数码管while(1) {if(key_start == 0) { // 开始计时while(key_start == 0);time = 0;while(TF0 == 0);TF0 = 0;}if(key_pause == 0) { // 暂停计时while(key_pause == 0);while(TF0 == 0);TF0 = 0;}if(key_reset == 0) { // 复位计时器while(key_reset == 0);time = 0;}display();}}```七、测试与分析1. 功能测试:经过多次测试,计时器功能稳定可靠,能够实现计时、暂停和复位功能。

51单片机定时器的使用

51单片机定时器的使用

151单片机定时器/计时器的使用步骤:1、 打开中断允许位:对IE 寄存器进行控制,IE 寄存器各位的信息如下图所示:EA : 为0时关所有中断;为1时开所有中断ET2:为0时关T2中断;为1时开T2中断,只有8032、8052、8752才有此中断 ES : 为0时关串口中断;为1时开串口中断 ET1:为0时关T1中断;为1时开T1中断 EX1:为0时关1时开 ET0:为0时关T0中断;为1时开T0中断 EX0:为0时关1时开2、 选择定时器/计时器的工作方式:定时器TMOD 格式CPU 在每个机器周期内对T0/T1检测一次,但只有在前一次检测为1和后一次检测为0时才会使计数器加1。

因此,计数器不是由外部时钟负边沿触发,而是在两次检测到负跳变存在时才进行计数的。

由于两次检测需要24个时钟脉冲,故T0/T1线上输入的0或1的持续时间不能少于一个机器周期。

通常,T0或T1输入线上的计数脉冲频率总小于100kHz 。

方式0:定时器/计时器按13位加1计数,这13位由TH 中的高8位和TL 中的低5位组成,其中TL 中的高3位弃之不用(与MCS-48兼容)。

13位计数器按加1计数器计数,计满为0时能自动向CPU 发出溢出中断请求,但要它再次计数,CPU 必须在其中断服务程序中为它重装初值。

方式1:16位加1计数器,由TH 和TL 组成,在方式1的工作情况和方式0的相同,只是计数器值是方式0的8倍。

2方式2:计数器被拆成一个8位寄存器TH 和一个8位计数器TL ,CPU 对它们初始化时必须送相同的定时初值。

当计数器启动后,TL 按8位加1计数,当它计满回零时,一方面向CPU 发送溢出中断请求,另一方面从TH 中重新获得初值并启动计数。

方式3:T0和T1工作方式不同,TH0和TL0按两个独立的8位计数器工作,T1只能按不需要中断的方式2工作。

在方式3下的TH0和TL0是有区别的:TL0可以设定为定时器/计时器或计数器模式工作,仍由TR0控制,并采用TF0作为溢出中断标志;TH0只能按定时器/计时器模式工作,它借用TR1和TF1来控制并存放溢出中断标志。

C51单片机秒表计时(C语言)

C51单片机秒表计时(C语言)

南开大学滨海学院C51嵌入式软件设计(C语言)题目:计时秒表●功能描述:本设计实现在99秒内的秒表计时,一个按键实现开始、暂停、复位。

●原理概述:P1接四位七段数码管,P3。

2接一按键产生外部中断0,P3。

4-P3。

7控制扫描显示。

计时使用定时器0产生10ms中断累计。

按键不同次序决定了对应的控制功能,因为第一次按键必定为开始计时,所以第二次按键判断为暂停,依次第三次为置零.主程序调用显示程序,显示程序实时显示计时时间.●效果显示●图一(电路总图)●图二(效果显示)注:第四位显示为单位:S●程序清单#include<reg51。

h>#include〈stdio.h>unsigned char Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };sbit P37=P3^7;sbit P36=P3^6;sbit P35=P3^5;sbit P34=P3^4;unsigned int a=0,cout=0,mm=0;x,y,p,q;/*********延时*********************/void delay(){int g;for(g=70;g>0;g—-);}/*********显示程序*****************/void display(){x=cout/10;//秒十位P34=0;P1=Tab[x];delay();P34=1;y=cout—x*10; //秒各位P35=0;P1=Tab[y]; delay();P1=0x80;delay();P35=1;p=mm/10; //ms的高位P36=0;P1=Tab[p];delay();P36=1;P37=0; //显示单位:SP1=Tab[5]; delay();P37=1;}/*********主程序********************/ void main(){IT0=1;EX0=1;ET0=1;TMOD=0x01;TH0=0xD8;//装初值,10msTL0=0xF0;EA=1;while(1){display(); };}/*********外部按键中断子程序*********/ void int0 ()interrupt 0{if(a==0)//开始计时{ TR0=1;mm=0;a++;}else if(a==1)//暂停计时{TR0=0;a++;}else//置零{ a=0;mm=0;cout=0;}}/*********定时器子程序****************/ void time0()interrupt 1{TH0=0xD8;TL0=0xF0;mm++;if(mm==80)//考虑其它损耗,调整后约为1S {cout++;mm=0;}}。

单片机计时器设计实训报告

单片机计时器设计实训报告

一、实训目的通过本次实训,使学生了解单片机计时器的基本原理和设计方法,掌握单片机计时器的硬件设计和软件编程,提高学生动手实践能力和创新能力。

二、实训内容本次实训设计一款基于51单片机的计时器,具备计时、暂停、复位功能,计时范围0-59秒,精确到0.1秒。

三、实训原理1. 计时原理:利用51单片机的定时器/计数器功能,通过定时器中断实现计时功能。

2. 暂停功能:在计时过程中,按下暂停按钮,关闭定时器中断,计时停止。

3. 复位功能:按下复位按钮,将计时器清零,数码管显示00.0。

四、实训步骤1. 硬件设计(1)选择51单片机作为核心控制单元。

(2)选择4位共阴数码管作为显示模块,用于显示计时时间。

(3)选择按键作为控制模块,实现计时、暂停、复位功能。

(4)设计电路原理图,包括单片机、数码管、按键等模块的连接。

2. 软件设计(1)编写程序,初始化定时器/计数器,设置中断时间。

(2)编写中断服务程序,实现计时功能。

(3)编写按键扫描程序,实现计时、暂停、复位功能。

(4)编写数码管显示程序,将计时时间显示在数码管上。

3. 系统调试(1)连接电路,将程序烧录到单片机中。

(2)测试计时功能,确保计时准确。

(3)测试暂停和复位功能,确保功能正常。

(4)测试按键功能,确保按键操作正确。

五、实训结果与分析1. 硬件设计结果根据设计要求,成功设计了一款基于51单片机的计时器,包括单片机、数码管、按键等模块的连接,电路原理图如下:```+3.3V||---[单片机]||---[数码管]||---[按键]|GND```2. 软件设计结果编写了完整的程序,实现了计时、暂停、复位功能,数码管显示计时时间,计时范围0-59秒,精确到0.1秒。

3. 系统调试结果经过调试,计时器功能正常,计时准确,按键操作正确,符合设计要求。

六、实训心得1. 通过本次实训,掌握了单片机计时器的基本原理和设计方法,提高了动手实践能力和创新能力。

2. 学会了如何使用51单片机定时器/计数器功能实现计时功能,了解了中断编程的基本方法。

51单片机定时计数器的工作原理

51单片机定时计数器的工作原理

51单片机定时计数器的工作原理
51单片机是一种常用的微控制器,它具有多个定时计数器,其中包括定时器0和定时器1。

这些定时计数器是通过内部时
钟源提供的脉冲进行计数的。

定时器0和定时器1是独立的计数器,它们可以用于不同
的应用。

这里我们将主要关注定时器0的工作原理。

定时器0
由一个八位计数器和一个控制寄存器组成。

当定时器0启动时,它会根据时钟源提供的脉冲进行计数,每个脉冲会使计数器的值增加1。

定时器0的计数范围为0-255,即八位二进制数。

通过控制寄存器,我们可以设置定时器0的工作模式、计
数器的初始值以及时钟源的频率。

定时器0可以以不同的方式工作,包括定时模式和计数模式。

在定时模式下,我们可以设置一个初始值,并在每次计数
器增加到该值时产生一个中断。

这样就可以实现精确的定时功能。

定时器0的中断服务程序可以完成各种操作,例如控制其他外设、延时等。

在计数模式下,定时器0将简单地计数外部触发信号的脉
冲次数。

这可以用于测量外部事件的时间间隔或频率。

需要注意的是,定时器0的工作需要通过编程来完成。


们可以使用汇编语言或C语言来配置定时器0的寄存器,并
设计相应的中断服务程序。

51单片机定时器的工作原理是通过定时器0和定时器1实
现计数功能。

定时器0可以在定时模式或计数模式下工作,通过设置计数值和时钟源频率,实现精确的定时功能或测量外部
事件的时间间隔或频率。

编程则是必不可少的,通过配置寄存器和编写中断服务程序来实现定时器的工作。

51单片机秒表计时(protues)

51单片机秒表计时(protues)

一、课设思路(1)利用单片机定时器中断和定时器计数方式实现秒定时。

(2)通过LED显示程序的调整,熟悉单片机与LED的接口技术,熟悉LED动态显示的控制过程。

(3)通过阅读和调试简易秒表整体程序,学会如何编制含LED动态显示和定时器中断等多种功能的综合程序,初步体会大型程序的编制和调试技巧。

(4)进一步学习单片机开发系统的整个流程。

二、所需元件名称数量7段数码管 2电阻10kΩ 1电阻1kΩ 8键盘开关 1电容10 µf 1电容30 pf 2晶振12 MHz 189C51 1万能板 1导线若干三、元件介绍AT89C51AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。

AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。

单片机的可擦除只读存储器可以反复擦除1000次。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL 的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。

AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

主要特性:与MCS-51 兼容·4K字节可编程FLASH存储器·寿命:1000写/擦循环·数据保留时间:10年·全静态工作:0Hz-24MHz·三级程序存储器锁定·128×8位内部RAM·32可编程I/O线·两个16位定时器/计数器·5个中断源·可编程串行通道·低功耗的闲置和掉电模式·片内振荡器和时钟电路特性概述:AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。

51单片机定时器初值的计算

51单片机定时器初值的计算

51单片机定时器初值的计算单片机中的定时器是实时计时器,一般用于测量时间或控制系统的时间间隔。

在51系列单片机中,定时器实际上是一个16位的计数器,可以以不同的方式工作,如定时器模式、计数器模式、定时/计数器模式等。

定时器的工作原理是根据晶振频率产生一个时钟信号,通过计数器进行计数,当计数值达到设定值时触发中断或产生相应的输出信号。

因此,在使用定时器之前,首先需要计算定时器的初值。

定时器的初值可以通过以下步骤计算:1.确定定时器的工作模式:定时器可以有多种工作模式,如定时模式、计数器模式等。

根据具体的应用需求选择相应的工作模式,并将定时器寄存器设置为相应的模式。

2.确定定时器的时钟源:定时器的时钟源可以是外部晶振或内部时钟信号,由于外部晶振的频率一般比较稳定,因此通常将晶振作为定时器的时钟源。

3.确定定时器的分频系数:定时器的分频系数决定了定时器的工作频率,可以通过设置定时器的分频寄存器来实现。

分频系数越大,定时器的工作频率越低。

4. 确定所需的定时时间:根据具体的应用需求确定需要的定时时间,例如10ms、100ms等。

5.计算初值:根据定时器的时钟源、分频系数和所需的定时时间,可以计算出定时器的初值。

计算公式为:初值=(2^16-1)-定时时间*定时器工作频率其中,2^16-1是定时器的最大计数值。

6.将初值写入定时器寄存器:最后,将计算得到的初值写入定时器的寄存器中,使得定时器按照设定的时间开始计数。

需要注意的是,计算出来的初值是一个16位的值,需要将其拆分为高8位和低8位,并分别写入定时器的高字节和低字节寄存器中。

总结起来,计算定时器初值的步骤包括确定定时器的工作模式、时钟源和分频系数,确定所需的定时时间,根据计算公式计算初值,将初值写入定时器寄存器中。

这样,定时器就可以按照设定的时间开始计数了。

51单片机计数器原理

51单片机计数器原理

51单片机计数器原理51单片机计数器是指基于51单片机的计数器电路。

在电子技术中,计数器是一种用来计算和储存输入脉冲个数的电子电路。

通过计数器,可以实现对脉冲的计数、频率测量、计时等功能。

51单片机是一种常用的8位单片机,由晶体振荡器、控制单元、存储器、输入输出端口等模块组成。

它具有指令系统完备、低功耗、易编程、强大的中断功能等特点,并且可以与外部电路进行连接,实现各种功能。

51单片机计数器可以通过外部输入端口接收外部的脉冲信号,并且根据设定的计数方式进行计数。

常见的计数方式有上升沿计数、下降沿计数和边沿计数。

在上升沿计数方式下,计数器在每个上升沿到来时计数值加1;在下降沿计数方式下,计数器在每个下降沿到来时计数值加1;在边沿计数方式下,计数器在每个脉冲边沿到来时计数值加1。

在使用51单片机计数器时,需要先初始化计数器的初始值,并且设置计数方式。

51单片机内部有一个特殊的寄存器,称为定时器计数器(TCON),用于控制计数器的计数方式。

通过设置TCON寄存器的相应位,可以选择计数方式。

同时,需要设置计数器的初始值,以确定计数器从何值开始计数。

当计数器开始计数后,每当一个脉冲到来,计数值就会加1。

当计数器溢出时,会触发中断信号。

可以通过中断服务程序来处理计数器溢出的情况,以实现相应的功能。

计数器还可以通过引入外部触发信号,来控制计数器的启动和停止。

通过设置特定的输入输出端口,并将外部触发信号与该端口相连,可以在满足触发条件时启动计数器,当不满足触发条件时停止计数器。

此外,51单片机计数器还可以通过定时器/计数器模式进行工作。

在定时器模式下,计数器会根据预设的时间间隔自动开始计数,当计数值达到设定的计数周期时,会触发中断信号。

通过设置特定的寄存器和输入输出端口,可以实现定时功能。

总之,51单片机计数器是一种基于51单片机的计数器电路,可以实现对脉冲的计数、频率测量、计时等功能。

通过设置计数方式、初始值和触发条件等参数,可以灵活地控制计数器的工作模式,以满足不同的应用需求。

51单片机定时器初值计算公式

51单片机定时器初值计算公式

51单片机定时器初值计算公式
51单片机定时器初值计算公式是一项重要的技能,对于嵌入式系统的开发非常有用。

定时器是一种计时器,可用于实现周期性操作和延时功能。

以下是51单片机定时器初值计算公式的详细介绍。

在51单片机中,定时器有两个,分别是定时器0和定时器1。

他们都是基于晶振的时钟,可以用于计算CPU的执行时间和控制外设的操作。

要计算定时器的初值,需要知道以下参数:
1.晶振频率(Fosc):晶振的频率通常为12MHz或11.0592MHz,可以在程序中进行定义。

2.定时器的工作模式(mode):定时器可以工作在多种不同的模式下,包括计数模式、定时模式、事件计数模式等。

每种模式下,定时器的计数方式不同。

3.所需的定时时间(T):定时器可以用来进行延时操作,需要计算所需的时间。

根据以上参数,我们可以使用以下公式来计算定时器的初值:
TH0 = (65536 - (T × Fosc)) / (12 × mode)
其中,TH0表示定时器0的初值,T表示所需的定时时间(单位为秒),Fosc为晶振频率,mode为定时器的工作模式。

在计算的过程中,需要将结果取整,然后将TH0的值写入到TH0寄存器中即可。

这就是51单片机定时器初值计算公式的详细介绍。

掌握这项技能可以帮助开发者更好地使用定时器来实现各种功能,提高嵌入式系统的性能和稳定性。

51单片机4位数码管秒表代码

51单片机4位数码管秒表代码

主题:51单片机4位数码管秒表代码内容:1. 介绍51单片机51单片机是一种通用的单片机系列,广泛应用于各种电子设备中。

它具有稳定性好、成本低、易于编程等优点,因此备受电子爱好者和专业工程师的青睐。

2. 4位数码管秒表4位数码管秒表是一种常见的电子计时器,通过LED数码管显示出当前的时间,可以用于各种计时应用,比如比赛计时、实验计时等。

3. 代码编写以下是一段简单的51单片机4位数码管秒表代码:```c#include <reg52.h>#include <intrins.h>// 数码管位选端口sbit wei1 = P2^2;sbit wei2 = P2^3;sbit wei3 = P2^4;sbit wei4 = P2^5;// 数码管显示段选端口sbit se2 = P0^2;sbit se1 = P0^3;sbit se4 = P0^4;sbit se3 = P0^5;unsigned char code smgduan[17] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00}; // 显示0~9,A,b,C,d,E,F,无的值void delay(unsigned int i) { // 延时while(i--);}void display(unsigned char *tab) { // 数码管显示 unsigned char i;for(i=0; i<7; i++) {P0=0; // 清除段选,以选中所显示的数码管 switch(i) { //确定位选case(0):wei1=0;wei2=wei3=wei4=1;break;case(1):wei2=0;wei1=wei3=wei4=1;break;case(2):wei3=0;wei1=wei2=wei4=1;break;case(3):wei4=0;wei1=wei2=wei3=1;break;default:break;}P0=tab[i]; //段码输出delay(5); // 数码管微秒级延迟}}void m本人n() {unsigned char a=0,b=0,c=0,d=0; //时钟的4位数据 unsigned int i=0;wei1=wei2=wei3=wei4=1; //段选、位选初始化while(1) {a++; // 微秒级的计数if(a==100) { //达到100a=0; b++; //b加1if(b==60) { //当b=60时b=0; c++; //c加1if(c==60) { //当c=60时c=0; d++; //d加1if(d==24) { //当d=24时d=0; //归零}}}}display(smgduan+d10); //显示个秒wei1=1;wei2=wei3=wei4=0; //位选delay(500); //延时display(smgduan+c/10+10); //显示十秒wei2=1;wei1=wei3=wei4=0; //位选delay(500); //延时display(smgduan+b10); //显示个分wei3=1;wei1=wei2=wei4=0; //位选delay(500); //延时display(smgduan+b/10+10); //显示十分wei4=1;wei1=wei2=wei3=0; //位选delay(500); //延时if(i++==200) { //当i=200时i=0;}}}```4. 代码分析该代码通过对51单片机的引脚进行控制,实现了4位数码管秒表的计时功能。

51单片机秒表程序设计

51单片机秒表程序设计

51单片机秒表程序设计1. 简介秒表是一种用于测量时间间隔的计时器,常见于体育比赛、实验室实验等场合。

本文将介绍如何使用51单片机设计一个简单的秒表程序。

2. 硬件准备•51单片机开发板•LCD液晶显示屏•按键开关•连接线3. 程序流程3.1 初始化设置1.设置LCD液晶显示屏为8位数据总线模式。

2.初始化LCD液晶显示屏。

3.设置按键开关为输入模式。

3.2 主程序循环1.显示初始界面,包括“00:00:00”表示计时器初始值。

2.等待用户按下开始/暂停按钮。

3.如果用户按下开始按钮,则开始计时,进入计时状态。

4.如果用户按下暂停按钮,则暂停计时,进入暂停状态。

5.在计时状态下,每隔1毫秒更新计时器的数值,并在LCD液晶显示屏上显示出来。

6.在暂停状态下,不更新计时器的数值,并保持显示当前数值。

3.3 计时器控制1.定义一个变量time用于存储当前的计时器数值,单位为毫秒。

2.定义一个变量running用于标记计时器的状态,0表示暂停,1表示运行。

3.定义一个变量start_time用于存储计时器开始的时间点。

4.定义一个变量pause_time用于存储计时器暂停的时间点。

5.在计时状态下,每隔1毫秒更新time的值为当前时间与start_time的差值,并将其转换为小时、分钟、秒的表示形式。

6.在暂停状态下,保持time的值不变。

3.4 按键检测1.检测按键开关是否被按下。

2.如果按键被按下,判断是开始/暂停按钮还是复位按钮。

3.如果是开始/暂停按钮,并且当前处于计时状态,则将计时状态设置为暂停状态,并记录暂停时间点为pause_time;如果当前处于暂停状态,则将计时状态设置为运行状态,并记录开始时间点为当前时间减去暂停时间的差值。

4.如果是复位按钮,则将计时器数值重置为0,并将计时状态设置为暂停。

4. 程序代码示例#include <reg51.h>// 定义LCD控制端口和数据端口sbit LCD_RS = P1^0;sbit LCD_RW = P1^1;sbit LCD_EN = P1^2;sbit LCD_D4 = P1^3;sbit LCD_D5 = P1^4;sbit LCD_D6 = P1^5;sbit LCD_D7 = P1^6;// 定义按键开关端口sbit START_PAUSE_BTN = P2^0;sbit RESET_BTN = P2^1;// 定义全局变量unsigned int time = 0; // 计时器数值,单位为毫秒bit running = 0; // 计时器状态,0表示暂停,1表示运行unsigned long start_time = 0; // 开始时间点unsigned long pause_time = 0; // 暂停时间点// 函数声明void delay(unsigned int ms);void lcd_init();void lcd_command(unsigned char cmd);void lcd_data(unsigned char dat);void lcd_string(unsigned char *str);void lcd_clear();void lcd_gotoxy(unsigned char x, unsigned char y);// 主函数void main() {// 初始化设置lcd_init();while (1) {// 显示初始界面lcd_clear();lcd_gotoxy(0, 0);lcd_string("00:00:00");// 等待用户按下开始/暂停按钮while (!START_PAUSE_BTN && !RESET_BTN);// 判断按钮类型并处理计时器状态if (START_PAUSE_BTN) {if (running) { // 当前处于计时状态,按下按钮将进入暂停状态 running = 0;pause_time = time;} else { // 当前处于暂停状态,按下按钮将进入计时状态running = 1;start_time = get_current_time() - pause_time;}} else if (RESET_BTN) { // 复位按钮按下,重置计时器time = 0;running = 0;}}}// 毫秒级延时函数void delay(unsigned int ms) {unsigned int i, j;for (i = ms; i > 0; i--) {for (j = 110; j > 0; j--);}}// LCD初始化函数void lcd_init() {lcd_command(0x38); // 设置8位数据总线模式lcd_command(0x0C); // 显示开,光标关闭lcd_command(0x06); // 光标右移,不移动显示器lcd_command(0x01); // 清屏}// 向LCD发送指令函数void lcd_command(unsigned char cmd) {LCD_RS = 0;LCD_RW = 0;LCD_EN = 1;LCD_D4 = cmd >> 4 & 1;LCD_D5 = cmd >> 5 & 1;LCD_D6 = cmd >> 6 & 1;LCD_D7 = cmd >> 7 & 1;delay(1);LCD_EN = 0;LCD_D4 = cmd >> 0 & 1;LCD_D5 = cmd >> 1 & 1;LCD_D6 = cmd >> 2 & 1;LCD_D7 = cmd >> 3 & 1;delay(1);LCD_EN = 0;}// 向LCD发送数据函数void lcd_data(unsigned char dat) { LCD_RS = 1;LCD_RW = 0;LCD_EN = 1;LCD_D4 = dat >> 4 & 1;LCD_D5 = dat >> 5 & 1;LCD_D6 = dat >> 6 & 1;LCD_D7 = dat >> 7 & 1;delay(1);LCD_EN = 0;LCD_D4 = dat >> 0 & 1;LCD_D5 = dat >> 1 & 1;LCD_D6 = dat >> 2 & 1;LCD_D7 = dat >> 3 & 1;delay(1);LCD_EN = 0;}// 向LCD发送字符串函数void lcd_string(unsigned char *str) {while (*str) {lcd_data(*str++);delay(5);}}// 清屏函数void lcd_clear() {lcd_command(0x01);}// 设置光标位置函数void lcd_gotoxy(unsigned char x, unsigned char y) {unsigned char addr;if (y == 0)addr = x | (0x80 + y);else if (y == 1)addr = x | (0xC0 + y);lcd_command(addr);}5. 总结本文介绍了使用51单片机设计一个简单的秒表程序。

51单片机定时器工作原理

51单片机定时器工作原理

51单片机定时器工作原理51单片机是一款广泛使用的微控制器,它的定时器功能可以用于实现定时操作、计时、脉冲计数等功能。

本文将介绍51单片机定时器的工作原理。

01、51单片机的定时器51单片机的定时器包括两个独立的定时器,即定时器0和定时器1。

每个定时器都由一个8位计数器和一组控制寄存器组成。

这些寄存器被映射到特定的内存地址,并且可以通过读写这些地址来控制定时器的工作方式。

02、定时器的计数器定时器的计数器是一个8位的寄存器,它通过每次递增来实现计时操作。

当计数器的值达到最大值255时,它会自动重置为0,从而形成一个循环计时器。

通过改变计数器的初值可以改变定时器的定时时长。

在51单片机中,计数器的初值可以通过内部RAM、外部RAM或IO 口进行设置。

03、定时器的工作模式51单片机的定时器可以工作在4种不同的模式下,分别是方式0、方式1、方式2和方式3。

每种模式下,定时器的工作方式都不同,可以实现不同的定时器操作,如定时操作、计时操作、脉冲计数等。

在每种模式下,定时器的一些控制寄存器的设置也是不同的。

04、定时器的中断控制定时器在计时过程中可以触发中断信号,用于提示系统完成定时操作。

在51单片机中,可以通过设置中断允许位来开启定时器中断功能。

当定时器计时满足中断触发条件时,会自动发出中断信号,通知系统进行相应的中断处理。

05、注意事项在使用51单片机定时器时需要注意以下问题:1) 在每次使用定时器之前,必须先进行相应的初始化设置。

2) 定时器操作时需要注意定时器的中断允许位的设置,以便及时处理定时器计时的中断。

3) 在使用定时器时不要过度依赖计时精度,因为51单片机的晶振精度和定时器的延时误差可能会导致计时误差。

4) 在设计系统时应合理规划定时器的使用,以充分利用定时器的功能,同时避免出现冲突或资源浪费现象。

以上就是51单片机定时器的工作原理和注意事项,仅供参考。

通过对单片机定时器的深入学习和了解,可以更好地控制单片机系统的定时操作,实现更高效、可靠的工作。

基于51单片机的9999秒倒计时器设计

基于51单片机的9999秒倒计时器设计
第八周
熟悉毕业设计方案,查阅相关资料
完成方案的初步设计,开题报告
电路的仿真和PCB板的设计
软件流程的设计和软件的编写
完成软件的编写与调试
硬件电路的装配与调试
电路的软硬件综合调试
完成毕业设计
参考文献
[1] 李朝青.单片机原理及接口技术(简明修订版).北京航空航天大学出版社,1998
[2] 李广弟.单片机基础[M].北京航空航天大学出版社,1994
A
0
1
1
1
0
1
1
1
77H
B
0
1
1
1
1
1
0
0
7CH
C
0
0
1
1
1
0
0
1
39H
D
0
1
0
1
1
1
1
0
5EH
E
0
1
1
1
1
0
0
1
79H
F
0
1
1
1
0
0
0
1
71H
.
1
0
0
0
0
0
0
0
80H
5.3LED 数码管显示方式
LED显示器工作方式有两种:静态显示方式和动态显示方式。
静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法的优点是占用CPU时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高。
①一个8位CPU;
②一个片内振荡器和时钟电路;
③4KB ROM(80C51有4KB掩膜ROM,87C51有4KB EPROM,80C31片内有无ROM);

51单片机秒表定时器

51单片机秒表定时器
sbit a138 = P2^2; //定义译码器输入端A 在 P2.2 管脚上
sbit b138 = P2^3; //定义译码器输入端B 在 P2.3 管脚上
sbit c138 = P2^4; //定义译码器输入端C 在 P2.4 管脚上
sbit scl=P2^0; //24C02串行时钟
sda=write_data&0x80;
scl=1;
nop5;scl=0;nop5;
write_data<<=1;
}
sda=1; //释放sda,等待24c02将其拉高确定写入
scl=1; //在scl上升沿中检测sda
nop5;
ack=sda;
scl=0; //完成写操作的第九个时钟周期
switch(site)
{
case 1: numcode=0;a138=1;b138=1;c138=1;break;
// case 2: numcode=0;a138=0;b138=1;c138=1;break;
case 3: numcode=0;a138=1;b138=0;c138=1;break;
while(temp!=0xff)
{
temp=alonekeyboard;
switch(temp)
{
case 0x7f:alonekeynum=8;break;
case 0xbf:alonekeynum=7;break;
case 0xdf:alonekeynum=6;break;
}
}
}
return alonekeynum;
}
void main ()

基于51单片机能实现任意时间倒计时。

基于51单片机能实现任意时间倒计时。

倒计时器只要修改此文档15页源程序的(如下图)的到计时初值即可实现想要的倒计时。

比如30分钟倒计时修改分钟十位和各位即可。

一、设计要求:由单片机接收小键盘阵列设定倒计时时间,倒计时的范围最大为60分钟,由LED 显示模块显示剩余时间,显示格式为 XX(分):XX(秒).X,精确到0.1s的整数倍。

倒计时到,由蜂鸣器发出报警。

绘制系统硬件接线图,并进行系统仿真和实验。

画出程序流程图并编写程序实现系统功能。

二、设计的作用目的:此次设计是我们更进一步了解基本电路的设计流程,提高自己的设计理念,丰富自己的理论知识,巩固所学知识,使自己的动手动脑能力有更进一步提高,为自己今后的学习和工作打好基础,为自己的专业技能打好基础。

通过解决实际问题,巩固和加深“单片机原理与应用”课程中所学的理论知识和实验能力,基本掌握单片机应用电路的一般设计方法,提高电子电路的设计和实验能力,加深对单片机软硬知识的理解,获得初步的应用经验,为以后从事生产和科研工作打下一定的基础。

本次设计注重对单片机工作原理以及键盘控制及显示原理的理解,以便今后自己在单片机领域的学习和开发打下基础,提高自己的动手能力和设计能力,培养创新能力,丰富自己的理论知识,做到理论和实践相结合。

本次设计的重要意义还在于对单片机的内部结构和工作状态做更进一步的了解,同时还对单片机的接口技术,中断技术,存储方式和控制方式作更深层次的了解。

三、具体设计:1.问题分析:在电子技术飞速发展的今天,电子产品的人性化和智能化已经非常成熟,其发展前景仍然不可估量。

如今的人们需求的是一种能给自己带来方便的电子产品,当然最好是人性化和智能化的,如何能做到智能化呢?单片机的引入就是一个很好的例子。

单片机又称单片微型计算机,也称为微控制器,是微型计算机的一个重要分支,单片机是20世纪70年代中期发展起来的一种大规模集成电路芯片,是集CPU,RAM,ROM,I/O接口和中断系统于同一硅片上的器件。

51单片机秒表计时(protues)[精彩]

51单片机秒表计时(protues)[精彩]

51单片机秒表计时器目录摘要 (3)一、实训目的 (3)二、实训设备与器件 (3)(1)实验设备 (3)(2)实训器件 (3)三、实训步骤与要求 (4)(1)要求 (4)(2)方法 (4)(3)实训线路分析 (4)(4)软件设计 (4)(5)程序编制 (4)四、硬件系统设计 (4)五、软件系统设计 (5)六、系统调试 (9)七、实训总结与分析 (10)八、参考资料: (11)九、附录 (12)摘要:秒表是由单片机的P0口和P2口分别控制两个数码管,使数码管工作,循环显示从00—59。

同时,用一个开关控制数码管的启动与停止,另外加上一个复位电路,使其能正常复位,通常还使用石英晶体振荡器电路构成整个秒表的结构电路。

一、目的(1)利用单片机定时器中断和定时器计数方式实现秒定时。

(2)通过LED显示程序的调整,熟悉单片机与LED的接口技术,熟悉LED动态显示的控制过程。

(3)通过阅读和调试简易秒表整体程序,学会如何编制含LED动态显示和定时器中断等多种功能的综合程序,初步体会大型程序的编制和调试技巧。

(4)进一步学习单片机开发系统的整个流程。

二、元件(1)实训设备:单片机开发系统、微机、万用表、电烙铁等。

(2)实训器件:名称数量7段数码管 2电阻10k 1电阻1k 8键盘开关 1电容10微法 1电容30皮法 2晶振12M 189C51 1万能板 1导线若干三、步骤(1)要求:利用实训电路板,以2位LED右边1位显示个位,左边1位显示十位,实现秒表计时显示。

以一个按键开关实现启动、停止、清零等功能。

(2)方法:用单片机定时器T0中断方式,实现1秒定时;利用单片机定时器0方式1计数,实现00--59计数。

(3)实验线路分析:采用实训电路板,其原理图参见附录。

两个7段LED 数码管分别由单片机的P0口和P2口控制,使数码管显示从00—59的字样。

用一个开关控制数码管的启动与停止,另外加上一个复位电路,使其能正常复位。

51单片机程序(计时器)

51单片机程序(计时器)

计时器1、LCD.c#include <reg51.h>#include<LCD.h>unsigned char code number_X[]={ //宽x高=8x16,纵向字节倒序0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, //00x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00, //10x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00, //20x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00, //30x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00, //40x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00, //50x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00, //60x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00, //70x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00, //8 0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, //9 0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // . 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00, //-0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //nop 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00, //:0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00};void LCD_WriteCommandE1(unsigned char com) {while(CRADD1 & 0x80);CWADD1 = com;}void LCD_WriteDataE1(unsigned char dat){while(CRADD1 & 0x80);DWADD1 = dat;}void LCD_WriteCommandE2(unsigned char com) {while(CRADD2 & 0x80);CWADD2 = com;}void LCD_WriteDataE2(unsigned char dat){while(CRADD2 & 0x80);DWADD2 = dat;}void LCD_Init(){LCD_WriteCommandE1(0xe2);LCD_WriteCommandE2(0xe2);LCD_WriteCommandE1(0xa4);LCD_WriteCommandE2(0xa4);LCD_WriteCommandE1(0xa9);LCD_WriteCommandE2(0xa9);LCD_WriteCommandE1(0xa0);LCD_WriteCommandE2(0xa0);LCD_WriteCommandE1(0xc0);LCD_WriteCommandE2(0xc0);LCD_WriteCommandE1(0xaf);LCD_WriteCommandE2(0xaf);}void LCD_Clear(void){unsigned char i,j;for(i=0;i<4;i++){LCD_WriteCommandE1(i+0xb8);LCD_WriteCommandE2(i+0xb8);LCD_WriteCommandE1(0x00);LCD_WriteCommandE2(0x00);for(j=0;j<0x50;j++){LCD_WriteDataE1(0x00);LCD_WriteDataE2(0x00);}}}void display_cn(unsigned char lin,unsigned int col,unsigned int len,unsigned char *p) {unsigned int seg,i,j;unsigned char a,L,n;switch(lin){case 0: n=0xba;break;case 1: n=0xb8;break;}for(i=0;i<len;i++){for(j=0;j<2;j++){L=col;LCD_WriteCommandE1(n+j);LCD_WriteCommandE2(n+j);for(seg=0;seg<16;seg++){if (L < 61){a = L;LCD_WriteCommandE1(a);LCD_WriteDataE1(*p++);}else{a = L-61;LCD_WriteCommandE2(a);LCD_WriteDataE2(*p++);}L++;}}col=col+16;}}void display_number(unsigned char lin,unsigned int col,unsigned char num) {unsigned int seg,i,j;unsigned char a,L,n,k;switch(lin){case 0: n=0xba;break;case 1: n=0xb8;break;}k=num*16;for(j=0;j<2;j++){L=col;LCD_WriteCommandE1(n+j);LCD_WriteCommandE2(n+j);for(seg=0;seg<8;seg++){if (L < 61){a = L;LCD_WriteCommandE1(a);LCD_WriteDataE1(number_X[k++]);}else{a = L-61;LCD_WriteCommandE2(a);LCD_WriteDataE2(number_X[k++]);}L++;}}}void display_unsigned_int(unsigned char lin,unsigned int col,unsigned int dat) {unsigned int seg;unsigned char k[4];k[3]=dat%10;k[2]=((dat/10)%10);k[1]=((dat/100)%10);k[0]=((dat/1000)%10);if(k[0]==0) {k[0]=12;}if((k[0]==12)&&(k[1]==0)){ k[0]=12;k[1]=12;}if((k[0]==12)&&(k[1]==12)&&(k[2]==0)){k[0]=12;k[1]=12;k[2]=12;}for(seg=0;seg<4;seg++){display_number(lin,col,k[seg]);col=col+10;}}void display_signed_int(unsigned char lin,unsigned int col,signed int dat) {unsigned int seg;unsigned char k[5],a;k[0]=12;if(dat<0){dat=(~dat)+1;k[0]=11;}k[4]=dat%10;k[3]=((dat/10)%10);k[2]=((dat/100)%10);k[1]=((dat/1000)%10);a=k[0];if(k[1]==0) {k[0]=12;k[1]=a;}if((k[1]==a)&&(k[2]==0)){ k[0]=12;k[1]=12;k[2]=a;}if((k[1]==12)&&(k[2]==a)&&(k[3]==0)){k[0]=12;k[1]=12;k[2]=12;k[3]=a;} for(seg=0;seg<5;seg++){display_number(lin,col,k[seg]);col=col+10;}}void display_unsigned_char(unsigned char lin,unsigned int col,unsigned char dat) {unsigned int seg;unsigned char k[3];k[1]=dat%10;k[0]=((dat/10)%10);for(seg=0;seg<2;seg++){display_number(lin,col,k[seg]);col=col+10;}}1、LCD.h#include <reg51.h>#include <absacc.h>#ifndef __LCD__#define __LCD__#define CWADD1 XBYTE[0x8000]#define DWADD1 XBYTE[0x8001]#define CRADD1 XBYTE[0x8002]#define DRADD1 XBYTE[0x8003]#define CWADD2 XBYTE[0x8004]#define DWADD2 XBYTE[0x8005]#define CRADD2 XBYTE[0x8006]#define DRADD2 XBYTE[0x8007]extern void LCD_Init();extern void display_cn(unsigned char lin,unsigned int col,unsigned int len,unsigned char *p);extern void display_signed_int(unsigned char lin,unsigned int col,signed int dat);extern void display_unsigned_int(unsigned char lin,unsigned int col,unsigned int dat);extern void display_unsigned_char(unsigned char lin,unsigned int col,unsigned char dat);extern void LCD_Clear(void);#endif1、MCU.c#include <reg51.h>#include "MCU.h"void timer0_init(void){ //okTMOD|=0x01; //Timer0 is 16 bits timer, timer1 is Baud rate generatorTH0=0x97;TL0=0xd5;TR0=1;ET0=1;}2、MCU.h#ifndef __MCU__#define __MCU__extern void timer0_init(void); #endif3、MAIN.c#include <reg51.h>#include<LCD.h>#include<main.h>#include "MCU.h"void wait(unsigned int x){unsigned int i;i=0;for(i=0;i<x;i++);}void timer0(void)interrupt 1 {TH0=0x3c;TL0=0xb0;ms_count++;if(ms_count>=20){ms_count=0;second_count++;if(second_count>=60){second_count=0;minute_count++;if(minute_count>=60){minute_count=0;hous_count++;if(hous_count>=24){hous_count=0;}}}}}void main(void){float F;signed int a;LCD_Init();LCD_Clear();timer0_init( );display_cn(0,20,3,dzb);display_cn(1,18,1,hous);display_cn(1,50,1,minute);display_cn(1,82,1,second);EA=1;while(1){display_unsigned_char(1,0,hous_count);display_unsigned_char(1,34,minute_count);display_unsigned_char(1,66,second_count);wait(5000);}}4、MAIN.h(字模通过软件自建)#ifndef MAIN_H__#define MAIN_H__// 中文字模库16x16点阵code unsigned char dzb[]={ //纵向字节倒序.....................................// 计.....................................// 时.....................................// 器};code unsigned char second[]={ ......................................// 秒};code unsigned char minute[]={ .....................................// 分};code unsigned char hous[]={ ......................................// 时};unsigned char ms_count,second_count,minute_count,hous_count; #endif。

51单片机定时时钟工作原理

51单片机定时时钟工作原理

51单片机定时时钟工作原理51单片机(也被称为8051微控制器)的定时器/计数器是一个非常有用的功能,它允许用户在特定的时间间隔内执行任务。

下面是其基本工作原理:1. 结构:8051单片机通常包含两个定时器/计数器,称为Timer0和Timer1。

每个定时器都有一个16位的计数器,可以用来跟踪经过的时间或事件。

2. 时钟源:定时器的核心是一个振荡器或外部时钟源,为计数器提供脉冲。

通常,这个时钟源可以是内部的,也可以是外部的。

内部时钟源通常基于系统时钟,而外部时钟源则直接从外部硬件输入。

3. 计数过程:每当振荡器产生一个脉冲,计数器就会增加(对于向上计数的定时器)或减少(对于向下计数的定时器)一个单位。

这取决于定时器的模式。

4. 溢出:当计数器达到其最大值(对于向上计数的定时器)或达到0(对于向下计数的定时器)时,会发生溢出事件。

这会导致一个中断,可以用来执行特定的任务或操作。

5. 分频:在某些模式下,计数器的输出可以用来分频系统时钟,从而产生更精确的定时器时钟。

6. 预分频器:预分频器允许用户设置一个值,该值决定了振荡器的输入脉冲被分频的次数。

这有助于控制计数器的速度,从而控制定时器的精度。

7. 工作模式:8051微控制器支持多种定时器模式,包括正常模式、自动重装载模式和比较模式。

每种模式都有其特定的应用和行为。

8. 中断:当定时器溢出时,可以产生一个中断。

这意味着微控制器可以暂时停止当前的任务,转而处理与定时器相关的特定任务。

通过合理配置和使用这些定时器/计数器,开发人员可以在8051单片机上实现精确的时间控制和事件调度。

这对于实现诸如延时、精确计时和脉冲生成等功能非常有用。

51单片机设计的计时器

51单片机设计的计时器

采用51单片机设计一个计时器前期准备一、所执行的功能1、可以计时;2、可以存储时间;3、可以查看存储的时间;二、器材1、51单片机(STC89C52RC)及单片机最小系统;2、7段数码管及74HC573锁存器2个;3、按键;4、电源;三、硬件电路的设计1、51单片机最小系统:电源、复位电路、晶振电路、下载电路、51单片机2、显示电路3、按键电路四、分析单片机编程的内部资源1、I/O口的使用;2、定时/计数器的使用;五、软件编写流程的设计1、定义端口(数码管显示端口,定义按键输入的端口,每个端口分配不同的名字)2、硬件资源的初始化(初始化定时计数器,初始化LED数码管、初始化按键)3、定时计数器:用于精确计时的产生;4、I/O口:LED数码管显示;按键检测;5、功能的初始化(工作状态初始化、显示器初始化);6、工作状态:a、等待状态;b、计数状态;c、存储状态;六、软件流程图1、计时流程图n_ten_ms,n_second,n_minute程序代码:#include<reg52.h>/*****************端口定义****************/ typedef unsigned int UINT16;typedef unsigned char UINT8;#define DATA P0sbit seg_sel=P2^0; //段选sbit bit_sel=P2^1; //位选sbit start=P2^2; //开始sbit store=P2^3; //存储sbit diskey=P2^4; //回显sbit reset=P2^5; //复位UINT8 code seg_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5 e,0x79,0x71,0x40};UINT8 code bit_table[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};UINT8 n_ten_ms,n_second,n_minute;UINT8 run_flag;UINT8 temp_buf[5][3];UINT8 arry_point;/************延时函数*************/void delayms(UINT8 ms){UINT8 x,y;for (x=ms;x>0;x--)for(y=112;y>0;y--);}/********定时器初始化**********/void InitTimer0(void){TMOD = 0x01; //定时器模式寄存器设置TH0 = 0x0DC; //定时器赋初值时间50微秒TL0 = 0x000;EA = 1; //打开总开关ET0 = 1; //打开中断//TR0 = 1; //打开定时器}/**********数码管的初始化********/void display_led(UINT8 which_bit,UINT8 which_number){bit_sel=1;DATA=bit_table[which_bit];bit_sel=0;seg_sel=1;DATA=0x00;seg_sel=0;seg_sel=1;DATA=seg_table[which_number];seg_sel=0;}/**************数码管显示***********/void display(UINT8 which_bit,UINT8 which_number){UINT8 ge,ten;ten=which_number/10;ge=which_number%10;display_led(5,16);delayms(5);display_led(2,16);delayms(5);if(which_bit==1){display_led(6,ten);delayms(5);display_led(7,ge);delayms(5);}if(which_bit==2){display_led(3,ten);delayms(5);display_led(4,ge);delayms(5);}if(which_bit==3){display_led(0,ten);delayms(5);display_led(1,ge);delayms(5);}}/*************回显按键函数***************/ void diskey_keyscan(){if(diskey==0){delayms(5);if(diskey==0){arry_point--;n_ten_ms=temp_buf[arry_point][0];n_second=temp_buf[arry_point][1];n_minute=temp_buf[arry_point][2];}while(!diskey);}}/*************开始键函数*************/ void start_keyscan(){if(start==0){delayms(5);if(start==0){run_flag=~run_flag;}while(!start);}if(run_flag){TR0=1;}else if(!run_flag){TR0=0;diskey_keyscan();}}/*************复位按键函数***********/ void reset_keyscan(){if(reset==0){delayms(5);if(reset==0){n_ten_ms=0;n_second=0;n_minute=0;run_flag=0;}while(!reset);}}/************存储按键函数************/void store_keyscan(){if(store==0){delayms(5);if(store==0){if((arry_point>=0)&&(arry_point<5)){temp_buf[arry_point][0]=n_ten_ms;temp_buf[arry_point][1]=n_second;temp_buf[arry_point][2]=n_minute;arry_point++;}}while(!store);}}/*************按键扫描函数***********/ void keyscan(){start_keyscan();delayms(5);reset_keyscan();delayms(5);store_keyscan();delayms(5);}/**********扫描函数************/void reflash(){display(1,n_ten_ms);display(2,n_second);display(3,n_minute);}/**********主函数**************/int main(void){InitTimer0();while(1){keyscan();reflash();}}/**********中断***************/ void Timer0Interrupt(void) interrupt 1 {TH0 = 0x0DC;TL0 = 0x000;n_ten_ms++;if(n_ten_ms>=100){n_ten_ms=0;n_second++;if(n_second>=60){n_second=0;n_minute++;if(n_minute>=60){n_minute=0;}}}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;; 定时器T0、T1溢出周期为50MS,T0为秒计数用,T1为调整时闪烁用,; P3.5为调整按钮,P0口为字符输出口,P2口为位选端,采用共阳显示管。

; 时间调整方法:按3。

5未超过1s进入省电模式,数码管不亮,内部时钟计时; 按3。

5超过1s进入调整模式,要调整的时间会闪动,此时,按下P3。

5超过0。

5S,进入下位调整; 按下P3。

5未超过0。

5S,当前位加一;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;中断入口程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ORG 0000H ;程序执行开始地址LJMP START ;跳到标号START执行ORG 0003H ;外中断0中断程序入口RETI ;外中断0中断返回ORG 000BH ;定时器T0中断程序入口LJMP INTT0 ;跳至INTTO执行ORG 0013H ;外中断1中断程序入口RETI ;外中断1中断返回ORG 001BH ;定时器T1中断程序入口LJMP INTT1 ;跳至INTT1执行ORG 0023H ;串行中断程序入口地址RETI ;串行中断程序返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;主程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;START: MOV R0,#70H ;清70H-7AH共11个内存单元MOV R7,#0BH ;CLEARDISP: MOV @R0,#00H ;INC R0 ;DJNZ R7,CLEARDISP ;MOV 20H,#00H ;清20H(标志用)MOV 7AH,#0AH ;放入"熄灭符"数据MOV TMOD,#11H ;设T0、T1为16位定时器MOV TL0,#0B0H ;50MS定时初值(T0计时用)MOV TH0,#3CH ;50MS定时初值MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)MOV TH1,#3CH ;50MS定时初值SETB EA ;总中断开放SETB ET0 ;允许T0中断SETB TR0 ;开启T0定时器MOV R4,#14H ;1秒定时用初值(50MS×20)START1: LCALL DISPLAY ;调用显示子程序JNB P3.5,SETMM1 ;P3.5口为0时转时间调整程序SJMP START1 ;P3.5口为1时跳回START1SETMM1: LJMP SETMM ;转到时间调整程序SETMM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1秒计时程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T0中断服务程序INTT0: PUSH ACC ;累加器入栈保护PUSH PSW ;状态字入栈保护CLR ET0 ;关T0中断允许CLR TR0 ;关闭定时器T0MOV A,#0B7H ;中断响应时间同步修正ADD A,TL0 ;低8位初值修正MOV TL0,A ;重装初值(低8位修正值)MOV A,#3CH ;高8位初值修正ADDC A,TH0 ;MOV TH0,A ;重装初值(高8位修正值)SETB TR0 ;开启定时器T0DJNZ R4, OUTT0 ;20次中断未到中断退出ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值MOV R0,#71H ;指向秒计时单元(71H-72H)ACALL ADD1 ;调用加1程序(加1秒操作)MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)CLR C ;清进位标志CJNE A,#60H,ADDMM ;ADDMM: JC OUTT0 ;小于60秒时中断退出ACALL CLR0 ;大于或等于60秒时对秒计时单元清0MOV R0,#77H ;指向分计时单元(76H-77H)ACALL ADD1 ;分计时单元加1分钟MOV A,R3 ;分数据放入ACLR C ;清进位标志CJNE A,#60H,ADDHH ;ADDHH: JC OUTT0 ;小于60分时中断退出ACALL CLR0 ;大于或等于60分时分计时单元清0MOV R0,#79H ;指向小时计时单元(78H-79H)ACALL ADD1 ;小时计时单元加1小时MOV A,R3 ;时数据放入ACLR C ;清进位标志CJNE A,#24H,HOUR ;HOUR: JC OUTT0 ;小于24小时中断退出ACALL CLR0 ;大于或等于24小时小时计时单元清0 OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移MOV 73H,77H ;入对应显示单元MOV 74H,78H ;MOV 75H,79H ;POP PSW ;恢复状态字(出栈)POP ACC ;恢复累加器SETB ET0 ;开放T0中断RETI ;中断返回; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;闪动调时程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T1中断服务程序,用作时间调整时调整单元闪烁指示INTT1: PUSH ACC ;中断现场保护PUSH PSW ;MOV TL1, #0B0H ;装定时器T1定时初值MOV TH1, #3CH ;DJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)MOV R2,#06H ;重装0.3秒定时用初值CPL 02H ;0.3秒定时到对闪烁标志取反JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"MOV 72H,76H ;02H位为0时正常显示MOV 73H,77H ;MOV 74H,78H ;MOV 75H,79H ;INTT1OUT: POP PSW ;恢复现场POP ACC ;RETI ;中断退出FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制MOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分MOV 73H,7AH ;显示单元(72H-73H),将不显示分数据MOV 74H,78H ;MOV 75H,79H ;AJMP INTT1OUT ;转中断退出FLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时MOV 73H,77H ;显示单元(74H-75H),小时数据将不显示MOV 74H,7AH ;MOV 75H,7AH ;AJMP INTT1OUT ;转中断退出;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;加1子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADD1: MOV A,@R0 ;取当前计时单元数据到ADEC R0 ;指向前一地址SWAP A ;A中数据高四位与低四位交换ORL A,@R0 ;前一地址中数据放入A中低四位ADD A,#01H ;A加1操作DA A ;十进制调整MOV R3,A ;移入R3寄存器ANL A,#0FH ;高四位变0MOV @R0,A ;放回前一地址单元MOV A,R3 ;取回R3中暂存数据INC R0 ;指向当前地址单元SWAP A ;A中数据高四位与低四位交换ANL A,#0FH ;高四位变0MOV @R0,A ;数据放入当削地址单元中RET ;子程序返回; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;清零程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;对计时单元复零用CLR0: CLR A ;清累加器MOV @R0,A ;清当前地址单元DEC R0 ;指向前一地址MOV @R0,A ;前一地址单元清0RET ;子程序返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;时钟调整程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;当调时按键按下时进入此程序SETMM: cLR ET0 ;关定时器T0中断CLR TR0 ;关闭定时器T0LCALL DL1S ;调用1秒延时程序JB P3.5,CLOSEDIS ;键按下时间小于1秒,关闭显示(省电)MOV R2,#06H ;进入调时状态,赋闪烁定时初值SETB ET1 ;允许T1中断SETB TR1 ;开启定时器T1SET2: JNB P3.5,SET1 ;P3.5口为0(键未释放),等待SETB 00H ;键释放,分调整闪烁标志置1SET4: JB P3.5,SET3 ;等待键按下LCALL DL05S ;有键按下,延时0.5秒JNB P3.5,SETHH ;按下时间大于0.5秒转调小时状态MOV R0,#77H ;按下时间小于0.5秒加1分钟操作LCALL ADD1 ;调用加1子程序MOV A,R3 ;取调整单元数据CLR C ;清进位标志CJNE A,#60H,HHH ;调整单元数据与60比较HHH: JC SET4 ;调整单元数据小于60转SET4循环LCALL CLR0 ;调整单元数据大于或等于60时清0CLR C ;清进位标志AJMP SET4 ;跳转到SET4循环CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。

开T0中断SETB TR0 ;开启T0定时器(开时钟)CLOSE: JB P3.5,CLOSE ;无按键按下,等待。

LCALL DISPLAY ;有键按下,调显示子程序延时削抖JB P3.5,CLOSE ;是干扰返回CLOSE等待WAITH: JNB P3.5,WAITH ;等待键释放LJMP START1 ;返回主程序(LED数据显示亮)SETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)SETHH1: JNB P3.5,SET5 ;等待键释放SETB 01H ;小时调整标志置1SET6: JB P3.5,SET7 ;等待按键按下LCALL DL05S ;有键按下延时0.5秒JNB P3.5,SETOUT ;按下时间大于0.5秒退出时间调整MOV R0,#79H ;按下时间小于0.5秒加1小时操作LCALL ADD1 ;调加1子程序MOV A,R3 ;CLR C ;CJNE A,#24H,HOUU ;计时单元数据与24比较HOUU: JC SET6 ;小于24转SET6循环LCALL CLR0 ;大于或等于24时清0操作AJMP SET6 ;跳转到SET6循环SETOUT: JNB P3.5,SETOUT1 ;调时退出程序。

相关文档
最新文档