8051单片机实现可修改初值(并可命令启停)的单倒计时器

发布者:耿高良最新更新时间:2021-08-04 来源: eefocus关键字:单片机  初值 手机看文章 扫描二维码
随时随地手机看文章

程序实现功能:


1. 通过串口发送"Start.E"命令启动设备.


2. 通过串口发送"Stop.E"命令暂停设备.


3. 通过串口发送"Set init value as 12.E"(命令中的数字可以以两位数方式随意给定)设定下次计时开始初值.


注: 为了避免启动设备后第一次计时无法按照用户的意愿进行这一问题, 启动设备后第一次计时先显示0(耗费1s), 之后按照用户给定的值进行倒计时: 若用户在此期间未给出初值, 则从15开始计时.


学习意义:


帮助初学者理解前后台体系架构.


#include <STC89C5xRC.H>

 

unsigned char code DIG_CODE[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};//对应数码管显示0~9 

 

char buf[30];

 

int tcount = 0;//记录经过的10ms区间段个数

 

int sec = 15;//倒计时初始值记录

 

int sec2 = 0;//倒计时初始值

 

void T0_INT() interrupt 1 //timer0中断, 每10ms触发一次

{

TR0 = 0;//关闭timer0

TH0 = 0xD8;

TL0 = 0xF0;//65536 - 10000 = 55536

if(tcount % 2 == 0)

{

//显示个位数

P2 = 0;// P2 = 0 -> (P24, P23, P22) = (0, 0, 0) -> 右数第一个数字点亮

P0 = DIG_CODE[sec2 % 10];

tcount ++;

}

 

else if(tcount % 2 == 1)

{

//显示十位数

P2 = 1 << 2;//P2 = 0000 0100 -> (P24, P23, P22) = (0, 0, 1) -> 右数第二个数字点亮

P0 = DIG_CODE[sec2 / 10];

tcount ++;

}

if(tcount == 100) //10ms * 100 = 1000ms = 1s -> 1s时间到

{

tcount = 0;

sec2 --;

if(sec2 == -1)

{

sec2 = sec;

}

}

TR0 = 1;//重新开启timer0

}

 

int main()

{

int i = 0;

TMOD = 0x21;

SCON = 0x50;//设置串行通信格式

TH0 = 0xD8;

TL0 = 0xF0;//65536 - 10000 = 55536

IE = 0x82;//EA + ET0 -> 1000 0010

TH1 = 0xE6;

TL1 = 0xE6;//1200bps under 12MHz

RI = 0;

TR0 = 0;//暂不开启timer0

TR1 = 1;//开启timer1

while(1)

{

if(RI == 1)//收到数据

{

RI = 0;

buf[i ++] = SBUF;//接收串口发来的数据

if(i == 29)//防止数组访问越界

{

i = 0;

}

if(buf[i - 1] == 'E')//到达结尾

{

i = 0;

if(buf[0] == 'S' && buf[1] == 't' && buf[2] == 'a' && buf[3] == 'r' && buf[4] == 't' && buf[5] == '.')//Start.命令, 启动倒计时器

{

TR0 = 1;//启动timer0

}

else if(buf[0] == 'S' && buf[1] == 't' && buf[2] == 'o' && buf[3] == 'p' && buf[4] == '.')//Stop.命令, 关闭倒计时器

{

TR0 = 0;//关闭timer0

}

else if(buf[0] == 'S' && buf[1] == 'e' && buf[2] == 't' && buf[3] == ' ' && buf[4] == 'i' && buf[5] == 'n' && buf[6] == 'i' && buf[7] == 't' && buf[8] == ' ' && buf[9] == 'v' && buf[10] == 'a' && buf[11] == 'l' && buf[12] == 'u' && buf[13] == 'e' && buf[14] == ' ' && buf[15] == 'a' && buf[16] == 's' && buf[17] == ' ' && buf[20] == '.')//Set init value as **.命令, 设定计时初始值

{

sec = (buf[18] - 48) * 10 + (buf[19] - 48);

}

}

}

}

return 0;

}

 


关键字:单片机  初值 引用地址:8051单片机实现可修改初值(并可命令启停)的单倒计时器

上一篇:8051单片机以轮询方式实现串口通信(51接收数据后发送回PC端)
下一篇:对8051两个定时器(timer0和timer1)的使用解析

推荐阅读最新更新时间:2024-11-17 15:00

台积电RRAM技术引入英飞凌汽车MCU
11月25日,英飞凌和 台积电 宣布,两家公司正准备将 台积电 的电阻式RAM( RRAM )非易失性存储器(NVM)技术引 入英飞凌 的下一代AURIX™微控制器(MCU),并将在 台积电 的28纳米节点上制造。 自第一个发动机管理系统问世以来,嵌入式闪存微控制器一直是汽车电子控制单元(ECU)的主要构建块。目前,市场上大多数MCU系列都基于嵌入式闪存技术(eFlash)技术。而 RRAM 是嵌入式存储器的下一步,可以进一步扩展到28纳米及以上。 英飞凌AURIX TC4x MCU系列将性能扩展与虚拟化、安全和网络功能的最新趋势相结合,以支持下一代软件定义的车辆和新的E/E架构。 据介绍,基于台积电 RRAM 技术的
[汽车电子]
单片机四线步进电机驱动
单片机四线步进电机驱动 程序功能: 当按下SW1时步进电机正转,按下SW2后步进电机反转,并可以根据源码任意调节旋转速度和每一个脉冲旋转角度 程序参考源代码如下: /C语言程序:/ #include reg52.h //可用非常成功。 #define uchar unsigned char #define uint unsigned int uchar table_begin; uint maichong; //脉冲 uchar zhuansu; //转速 uchar flag; //方向 sbit key_fuwei=P3^0; //复位键 sbit key_z=P3^1; //正转键 sbit key_f=
[单片机]
<font color='red'>单片机</font>四线步进电机驱动
51单片机避坑指南
内存的使用 和stm32不同,51往往内存资源非常紧张,所以建立工程之时要列出资源使用统计表。 规则: 要给所有使用到的内存变量都指定好存放位置。 51单片机的存储器资源使用情况如下图所示: 各区域使用场合如下: 1、data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。 2、data区内最好放局部变量。因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),可以提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同; 4、程序中遇到的逻辑标志变量可以定义到bdata中,可以大大降低内存占用空间
[单片机]
51<font color='red'>单片机</font>避坑指南
51单片机内部定时器使用
/*------------------------------ Function: generate pulse signal Author: Zhang Kaizhou Date: 2019-5-15 22:50:43 ------------------------------*/ #include reg51.h #define uchar unsigned char sbit output = P1^0; uchar period = 250; uchar high = 50; uchar tcount = 0; void timer0() interrupt 1 using 1 { TH0 = (655
[单片机]
MCS-51单片机并行口输出彩灯移动程序举例
  1.程序结构采用主程序和中断服务子程序结构   2.定时中断程序,并行口输出,控制彩灯移动     定时器0于方式1,16位,10ms中断一次   40H 10ms计数单元 41H 初值为01101101B 位地址 00H=1     定时方式1为10MS:THX=0ECH,TLX=78H   3.参考程序 ; DISP EQU 0DE00H ;显示子程序入口 ; ORG 0000H START: AJMP MAIN ; ORG 000BH ;定时器0中断服务程序入口 AJMP TINT0 ; ORG 0030H MAIN: MOV R0,#39H
[单片机]
TI - MCU - MSP430使用指南12 -> GPIO
GPIO即通用输入输出接口,是MCU最基本的功能,可以控制I/O口的高低电平,输入输出或映射到其他模块等功能。 如下图所示,为MSP430FR2355芯片的引脚图: 在图中,每个引脚后标注的则是每个引脚具备的复用功能,GPIO是基本功能,除去电源,地,时钟等引脚,每个引脚都可作为通用IO口使用,那么如何按照自己的要求配置每个引脚的功能呢? 下面就描述下GPIO引脚相关的寄存器(MSP430FR2xx/FR4xx): 注:并非每个MSP430 MCU都包含下属所有的寄存器,根据MCU功能的复杂性决定,具体包含的寄存器名称和数量,请查看每个芯片的datasheet和user’s guide。 首先先整体看一下GP
[单片机]
TI - <font color='red'>MCU</font> - MSP430使用指南12 -> GPIO
基于单片机的SRS232/RS485转换器设计方案
为了便于对分布式的各个现场测控设备实现集中控制,现场总线技术得到了广泛的应用。RS485总线因其硬件设计和通信协议简单、控制方便、成本低廉、传输距离远以及可挂接多个从设备等优点而成为目前国内应用较多的现场总线之一。 目前大多数的分布式现场总线通信系统通常都使用PC机(或工控机)作为主机对各个现场设备进行集中控制和数据传输。PC机只有标准的RS232接口,而RS232总线和RS485总线的接口电平不兼容,要实现PC机和RS485总线构成的通信网络的连接就必须进行RS232和RS485之间的电平转换。因此,进行RS232/RS485转换器的设计就显得很有必要。 采用单片机进行RS232/RS485转换器的设计是比较常用的一种方法。传
[单片机]
基于<font color='red'>单片机</font>的SRS232/RS485转换器设计方案
基于单片机的频率特性测试仪设计
引言   频率特性测试仪也叫扫描仪,早期的频率特性测试仪是通过手动改变频率的方法逐点测量完成的,后来按照这种方法设计了专门的扫描仪用于频率特性的测量。早期的测量仪大都采用分立元件来实现各种功能,显示部分也是用传统的示波器。所以体积大、设备重、故障率高、操作复杂、价格昂贵,有的只能测量幅频特性,且精度不高。像BT6型超低频频率特性测试仪,就是采用分立元件。由于分立元件分散性大,参数变化与外部条件有关,因而产生的频率稳定度差、精度低、抗干扰能力不强,成本反而高。   随着频率合成技术及微电子技术的发展,频率特性测试仪也得到改进,扫频源采用数字量进行控制,数字化信号源可以弥补分立元件的不足,测量部分也进行了数字化的改进,大多都在低
[单片机]
基于<font color='red'>单片机</font>的频率特性测试仪设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved