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来控制并存放溢出中断标志。

51单片机定时器c语言

51单片机定时器c语言

51单片机定时器c语言51单片机是一款广泛应用于嵌入式系统中的芯片,其具有强大的功能和较高的性能表现。

在51单片机中,定时器是其中一项非常重要的功能,因为它可以帮助我们完成很多任务。

在51单片机中使用定时器,我们需要编写相应的c语言程序。

接下来,我将为大家介绍一些关于51单片机定时器c语言编程的知识。

首先,我们需要了解51单片机定时器的工作原理。

51单片机中的定时器是一个计数器,它的计数值会随着时间的流逝而增加。

当计数值达到了设定的阈值时,定时器就会产生一个中断信号。

我们可以通过对这个中断信号进行相应的处理,来完成各种任务。

为了使用51单片机的定时器,我们需要用c语言编写相应的程序。

比如,我们可以通过以下代码来初始化定时器:void timer_init(int time) {TMOD &= 0xF0; // 设定计数模式TL0 = time; // 设置定时器初值TH0 = time >> 8; // 设置定时器初值TR0 = 1; // 开始定时器}这段代码中,我们首先设定了计数模式,并且通过设置初值来调节定时器的计数时间。

最后,我们开启了定时器,让它开始进行计时。

除了初始化定时器之外,我们还需要为定时器编写中断处理程序。

比如,下面是一个简单的定时器中断处理程序:void timer_interrupt() interrupt 1 {// 处理中断信号}在这个中断处理程序中,我们可以编写相应的代码来完成各种任务。

比如,我们可以通过判断定时器计数的次数来控制LED的闪烁频率,或者通过定时器中断信号来完成数据发送等任务。

总结来说,51单片机定时器是非常重要的一个功能,它可以帮助我们完成很多任务。

要使用定时器,我们需要首先了解定时器的工作原理,并且编写相应的c语言程序实现。

如果我们掌握了这些技能,就可以开发出更加完善的嵌入式系统。

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单片机能实现任意时间倒计时

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

二、实训内容本次实训设计一款基于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单片机定时器/计数器功能实现计时功能,了解了中断编程的基本方法。

c51单片机计数器触发机制

c51单片机计数器触发机制

C51单片机的计数器是通过触发机制来工作的。

在C51单片机中,有两种常见的计数器类型:定时器和计数器/计时器。

1. 定时器(Timer):
定时器用于生成一定时间间隔的定时事件。

C51单片机中的定时器是基于内部或外部时钟源进行计数的。

当定时器达到设定的计数值时,会触发定时器中断,并执行相应的中断服务程序(ISR)。

可以使用定时器来生成精确的时间延迟、控制周期性任务等。

2. 计数器/计时器(Counter/Timer):
计数器/计时器可以用来计数外部事件的脉冲数量或测量时间间隔。

它可以根据外部事件的触发边沿(上升沿或下降沿)来触发计数动作。

当计数器达到设定的计数值时,也可以触发计数器中断,并执行相应的中断服务程序(ISR)。

计数器还可以被配置为计时器模式,用于测量时间间隔。

在C51单片机中,计数器的触发机制通常是通过设置相关的寄存器来实现的。

这些寄存器包括计数器的初始值、计数模式、计数触发边沿等。

通过配置这些寄存器,可以灵活地控制计数器的工作方式和触发条件。

需要注意的是,具体的计数器触发机制可能会因不同的单片机型号而有所差异。

因此,在编程时应参考相关的芯片手册或数据表,以了解具体的计数器触发机制及其相应的寄存器设置。

1。

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单片机的一种程序,用于控制和显示时间的各个参数,如小时、分钟、秒等。

在计时、计数、算术运算、控制输出、中断处理等领域都起到重要的作用。

本文将简单介绍51单片机时钟程序设计的基本框架和其实现方法。

1. 硬件准备在进行51单片机时钟程序设计之前,需要先准备好相关的硬件,包括51单片机芯片、晶振、LCD液晶显示屏等。

其中晶振是时钟源,用来产生稳定的时钟信号,LCD液晶显示屏则用于显示时钟相关信息。

2. 时钟程序的设计框架(1)初始化程序:此步骤的主要作用是设置相关的寄存器和标志位,为后续程序的正常运行做好准备。

(2)计时程序:此步骤的主要作用是对秒、分、时等时间参数进行计数,并将结果存储到相应的寄存器里。

(3)中断程序:此步骤的主要作用是设置中断触发条件和相应的处理程序,用来处理一些紧急事件。

(4)显示程序:此步骤的主要作用是将计时程序的结果以数字形式显示到LCD液晶显示屏上,同时可以进行一些特殊字符的显示。

(5)调试程序:此步骤的主要作用是用于调试程序代码,检测是否存在问题,比如程序写错了等等。

3. 时钟程序的实现方法(1)初始化程序初始化程序是开发52单片机时钟程序的第一步,可以根据实际需求进行相应的设置。

在本程序中,初始化程序需要进行以下设置:a. 定义输入输出端口;b. 配置定时器;c. 设置中断源;d. 初始化LCD液晶显示屏等相关参数;(2)计时程序计时程序是时钟程序的核心,其主要作用是计算并更新当前的时间参数。

在本程序中,计时程序需要进行以下操作:a. 设置定时器的时钟源和计数频率;b. 定义中断触发条件;c. 设置中断处理程序并对时间参数进行计数,并存储到相应的寄存器里;d. 根据时间参数更新液晶显示屏的显示内容。

(3)中断程序中断程序主要用于响应一些紧急事件,比如硬件异常、按键输入等。

在52单片机时钟程序中,中断程序需要以下操作:a. 定义中断触发条件;b. 检测中断源;c. 判断中断类型,并调用相应的处理程序;d. 清除中断标志位。

51单片机计数器程序c语言

51单片机计数器程序c语言

下面是一个51单片机计数器的简单程序,使用C语言编写。

c
#include <reg51.h>
// 定义计数器的值
volatile unsigned int counter = 0;
// 定义外部中断0的服务函数
void INT0_Handler() interrupt 0 {
// 清除外部中断0标志位
EX0 = 0;
// 计数器值加1
counter++;
}
void main() {
// 设置外部中断0触发方式为下降沿触发
IT0 = 1;
// 使能外部中断0
EX0 = 1;
// 全局中断使能
EA = 1;
while(1) {
// 在此处添加处理计数器值的代码,例如:
// if (counter >= 100) {
// // 计数器值达到100,执行某些操作
// counter = 0; // 计数器清零
// }
}
}
此代码实现了51单片机的外部中断0的计数器功能。

当INT0引脚检测到下降沿时,会触发外部中断0,并执行INT0_Handler()函数,使counter值加1。

在main()函数中,可以添加处理counter值的代码。

例如,当counter值达到某个阈值时,可以执行特定的操作。

注意,这只是一个基础的示例,具体的代码可能会因具体硬件和应用需求而略有不同。

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单片机计数器原理

51单片机计数器原理51单片机计数器是一种常用的计数器,可以在嵌入式系统中实现多种功能。

本文将介绍51单片机计数器的原理及其应用。

一、计数器的原理计数器是一种能够进行数字计数的电路。

它包括一个或多个触发器、逻辑门和时钟信号。

计数器接收时钟信号作为输入,每次接收到时钟信号时,计数器的值增加或减少一个固定值。

计数器的值可以在特定条件下重置为初始值。

计数器可以用于计算事件的发生次数、测量时间间隔或者进行时序控制。

51单片机中的计数器是由几个触发器(T)、逻辑门和时钟信号(的分频输出)组成的。

其中,计数器的位数取决于使用的触发器数量。

常见的有8位计数器(8T)和16位计数器(16T)。

除了计数值,计数器还可以具备其他功能,如使能控制、复位功能和输出控制等。

二、51单片机计数器的工作原理51单片机中的计数器可以通过计数器/定时器模块(Timer)来实现。

单片机内部的定时器模块包含至少一个计数器,可以根据需要进行配置。

定时器模块由控制位、计数器和寄存器组成。

控制位用于设置计数器的功能和模式,如选择计数或定时模式、选择时钟源、使能控制等。

计数器用于进行计数操作,并将计数值存储在寄存器中。

寄存器用于存储计数值、控制位设置和其他参数。

单片机的时钟信号用于驱动计数器的计数操作。

时钟信号可以来自内部时钟源或外部时钟源。

通过设置控制位和时钟源,可以调整计数器的工作时间和速度。

三、51单片机计数器的应用1. 计时功能51单片机计数器可以应用于计时功能。

通过设置计数器的工作模式和计数值,可以实现精确的计时操作。

计数器可以接收外部时钟信号或内部时钟源,以确定计时的精度。

2. 频率测量计数器还可以用于测量频率。

通过计数器统计的时钟脉冲数,可以计算出输入信号的频率。

通过设定计数值和计时模式,可以提高测量的准确度。

3. 脉冲宽度测量计数器可以用于测量脉冲宽度。

通过设置计数器的计数模式和计数值,可以精确地测量输入计时脉冲的宽度。

4. 时序控制计数器还可以应用于时序控制。

51单片机1秒定时C语言程序(通过调试)

51单片机1秒定时C语言程序(通过调试)

51单片机1秒定时C语言程序(通过调试)#include // 晶振为12MHz,#include #include #include/**************************** 定义硬件引脚连接****************************/sbit p1_0=P1;/**************************定义全局变量***********************/// Byte data intrCounter; // 计时器中断次数// Byte data beginNum; // 开始倒计时的时间//Byte data counterBack; // 将中断次数放在里面以备后用unsigned char intrCounter;unsigned char beginNum;unsigned char counterBack;void IT0_Init(void);void Timer0_Overflow();void GetCounter(void);void main(){p1_0=1;GetCounter() ;每一秒改变一次;p1_0=!p1_0;;}/********************************** GetCounter** Description: 取得预先设置的倒计时时间*******************************/void GetCounter(void){//beginNum=1;//在所有开关都没有拨动的时候倒计时为1 秒,比设置为0 秒要好intrCounter=20;//每一秒对应的中断次数为20 次}/****************************** IT0_Init* Description: 初始化计时器T0 的状态********************************/voidIT0_Init(void){TMOD=0x01;//设置T0 在方式1 下工作TH0=0x3C;TL0=0xAF;//这两个寄存器存的是计数器的计数开始的值,计算发现这两个值累加至溢出后正好是50msET0=1;//使T0 中断可以溢出EA=1;//开启总中断TF0=0;//溢出位清零TR0=1;//开启T0}/******************************* Timer0_Overflow() interrupt 1* Description: 中断溢出服务程序, 采用的是中断方式1, 后面最好不加using 选择寄存器组以免与系统用在主程序的寄存器冲突*********************************/void Timer0_Overflow() interrupt。

51单片机秒表程序设计

51单片机秒表程序设计

51单片机秒表程序设计标题:51单片机秒表程序设计:从基础到高级探索摘要:本文将深入探讨51单片机秒表程序设计的各个方面,从基础知识到高级技巧,为读者提供有关该主题的全面理解。

我们将从基础的硬件和软件要求开始,介绍秒表的原理和功能,然后逐步展示如何设计和实现一个完整的秒表程序。

文章中还将提供总结和回顾性的内容,帮助读者更全面、深刻和灵活地掌握秒表程序设计。

第一节:介绍51单片机秒表程序设计1.1 概述51单片机和秒表程序设计的重要性1.2 了解秒表的基本原理和功能1.3 硬件要求:选择合适的51单片机和外围元件第二节:基础知识与技术2.1 学习51单片机的基本架构和指令集2.2 理解计时和计数器的工作原理2.3 掌握基本的时钟输入和输出控制技术第三节:秒表程序设计的步骤和实例3.1 设计秒表程序的整体思路和步骤3.2 编写初始化程序,设置计时器和中断3.3 实现按键扫描和功能选择3.4 编写显示程序,将计时结果显示在数码管或液晶屏上3.5 添加其他功能,如计圈、计时暂停等第四节:提高技术与扩展功能4.1 优化程序效率和减少资源占用4.2 添加声音提示或报警功能4.3 实现串口通信和数据上传4.4 探索更多高级功能,如记录、回放和存储计时数据总结和回顾:在本文中,我们从基础到高级的层次进行了51单片机秒表程序设计的全面探索。

通过学习其基本架构和指令集,了解计时和计数器的原理,设计并实现一个完整的秒表程序。

同时,我们提供了优化、扩展和高级功能的相关技巧和实例,以帮助读者深入理解该主题。

通过掌握这些知识和技能,读者可以运用在其他嵌入式系统设计中,进一步拓展应用领域。

观点和理解:在51单片机秒表程序设计中,我认为理解硬件和软件的基本原理非常重要。

通过合理选择合适的单片机和外围元件,我们能够提高程序的性能和功能。

另外,灵活运用中断、时钟输入和输出控制等技术,可以实现更高效和可靠的秒表程序。

在提高技术和扩展功能方面,我认为优化程序效率和减少资源占用是关键,同时添加声音提示、数据上传和高级功能能够提升用户体验和扩展应用场景。

51单片机99秒倒计时C语言源程序

51单片机99秒倒计时C语言源程序

51单片机99秒倒计时C语言源程序51单片机实现数码管99秒倒计时,其实很简单,就是使用定时器中断来实现。

目的就是学习怎样用单片机实现倒计时,从而实现一些延时控制类的东西,99秒只是一个例子,你完全可以做出任意倒计时如10秒倒计时程序。

定时器定时时间计算公式:初值X=M(最大计时)-计数值。

初值,换算成十六进制,高位给TH0,低位给TL0,如果用定时器0的话。

M(最大计时)如果是16位的,就是2的16次方,最大定时,65535 微秒,实现1秒定时,可以通过定时10毫秒,然后100次改变一次秒值即可。

10*100毫秒=1S计数值:你要定时多长时间,如果定时1毫秒,就是1000微秒,(单位为微秒),如果定时10毫秒,就是10000(微秒),当然,最大定时被定时器本身位数限制了,最大2的16次方(16位定时计数器),只能定时65.535毫秒。

定时1S当然不可能1S定时器中断。

下面为实现99秒倒计时C语言源程序/*了解定时器,这样的话,就可以做一些基本的实验了,如定时炸弹~~,10秒后打开关闭继电器*//*数码管,12M晶振*/#include <reg52.h>#define uchar unsigned charsbit p11=P1^1; //连的是继电器。

code unsigned chartab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar shiwei;uchar gewei;void delay(unsigned int cnt){while(--cnt);}void main(){TMOD|=0x01; /*定时器0 16位定时器 X=65535-10000(10毫秒)=55535=D8F0(十六进制)定时10ms*/TH0=0xd8;TL0=0xf0;IE=0x82; //这里是中断优先级控制EA=1(开总中断),ET0=1(定时器0允许中断),这里用定时器0来定时TR0=1; //开定时器0while(1){P0=shiwei; //99的十位P2=0; //99的个位,delay(300); //动态扫描数码管延时P0=gewei;P2=1;delay(300);}}void tim(void) interrupt 1 using 1 //定时器0中断{static uchar second=99,count; //99只是一个数,可以任意改,因为这里只学习怎样实现倒计时TH0=0xd8; //定时10毫秒TL0=0xf0;count++;if(count==100) //10毫秒定时,10*100=1000(毫秒)=1秒{count=0;second--;if(second==0){p11=0; //这里让继电器动作,当然动作之后,要复位才能等下次倒定时再动作。

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;}}}}。

51单片机定时器设置

51单片机定时器设置

51单片机定时器设置51单片机,也被称为8051微控制器,是一种广泛应用的嵌入式系统。

它具有4个16位的定时器/计数器,可以用于实现定时、计数、脉冲生成等功能。

通过设置相应的控制位和计数初值,可以控制定时器的启动、停止和溢出等行为,从而实现精确的定时控制。

确定应用需求:首先需要明确应用的需求,包括需要定时的时间、计数的数量等。

根据需求选择合适的定时器型号和操作模式。

设置计数初值:根据需要的定时时间,计算出对应的计数初值。

计数初值需要根据定时器的位数和时钟频率进行计算。

设置控制位:控制位包括定时器控制寄存器(TCON)和中断控制寄存器(IE)。

通过设置控制位,可以控制定时器的启动、停止、溢出等行为,以及是否开启中断等功能。

编写程序代码:根据需求和应用场景,编写相应的程序代码。

程序代码需要包括初始化代码和主循环代码。

调试和测试:在完成设置和编程后,需要进行调试和测试。

可以通过观察定时器的状态和输出结果,检查定时器是否按照预期工作。

计数初值的计算要准确,否则会影响定时的精度。

控制位的设置要正确,否则会导致定时器无法正常工作。

需要考虑定时器的溢出情况,以及如何处理溢出中断。

需要考虑定时器的抗干扰能力,以及如何避免干扰对定时精度的影响。

需要根据具体应用场景进行优化,例如调整计数初值或控制位等,以达到更好的性能和精度。

51单片机的定时器是一个非常实用的功能模块,可以用于实现各种定时控制和计数操作。

在进行定时器设置时,需要注意计数初值的计算、控制位的设置、溢出处理以及抗干扰等问题。

同时需要根据具体应用场景进行优化,以达到更好的性能和精度。

在实际应用中,使用51单片机的定时器可以很方便地实现各种定时控制和计数操作,为嵌入式系统的开发提供了便利。

在嵌入式系统和微控制器领域,51单片机因其功能强大、使用广泛而备受。

其中,定时器中断功能是51单片机的重要特性之一,它为系统提供了高精度的定时和计数能力。

本文将详细介绍51单片机定时器中断的工作原理、配置和使用方法。

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。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LCD_WriteCommandE2(0xa4);
LCD_WriteCommandE1(0xa9);
LCD_WriteCommandE2(0xa9);
LCD_WriteCommandE1(0xa0);
LCD_WriteCommandE2(0xa0);
LCD_WriteCommandE1(0xc0);
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,
for(seg=0;seg<5;seg++)
{
display_number(lin,col,k[seg]);
coHale Waihona Puke =col+10;}
}
void display_unsigned_char(unsigned char lin,unsigned int col,unsigned char dat)
{
unsigned int seg;
}
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;
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)
}
void LCD_WriteDataE1(unsigned char dat)
{
while(CRADD1 & 0x80);
DWADD1 = dat;
}
void LCD_WriteCommandE2(unsigned char com)
{
while(CRADD2 & 0x80);
CWADD2 = com;
{
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;}
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;
计时器
1、LCD.c
#include <reg51.h>
#include<LCD.h>
unsigned char code number_X[]=
{ //宽x高=8x16,纵向字节倒序
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, //0
0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
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);
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;}
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)
extern void timer0_init(void);
#endif
3、MAIN.c
#include <reg51.h>
#include<LCD.h>
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00, //3
0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00, //4
0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
#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);
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>
void timer0_init(void)
{//ok
TMOD|=0x01;//Timer0 is 16 bits timer, timer1 is Baud rate generator
TH0=0x97;
TL0=0xd5;
TR0=1;
ET0=1;
}
2、MCU.h
#ifndef __MCU__
#define __MCU__
{
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);
#ifndef __LCD__
#define __LCD__
#define CWADD1 XBYTE[0x8000]
#define DWADD1 XBYTE[0x8001]
#define CRADD1 XBYTE[0x8002]
#define DRADD1 XBYTE[0x8003]
#define CWADD2 XBYTE[0x8004]
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00, //5
0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00, //6
0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
LCD_WriteDataE1(number_X[k++]);
}
else
{
a = L-61;
LCD_WriteCommandE2(a);
LCD_WriteDataE2(number_X[k++]);
相关文档
最新文档