51单片机实现通过串口用delay延时方式发送一串数据

发布者:masphia最新更新时间:2021-11-08 来源: eefocus关键字:51单片机  串口  delay  延时方式  数据 手机看文章 扫描二维码
随时随地手机看文章

一、使用proteus绘制简单的电路图,用于后续仿真

二、编写程序


/********************************************************************************************************************

---- @Project: USART

---- @File: main.c

---- @Edit: ZHQ

---- @Version: V1.0

---- @CreationTime: 20200713

---- @ModifiedTime: 20200713

---- @Description:

---- 波特率是:9600 。

---- 按一次按键S1,单片机就往上位机发送以下一串数据:eb 00 55 01 00 00 00 00 41

---- 单片机:AT89C52

********************************************************************************************************************/

#include "reg52.h"

/*——————宏定义——————*/

#define FOSC 11059200L

#define BAUD 9600

#define T1MS (65536-FOSC/12/500)   /*0.5ms timer calculation method in 12Tmode*/

 

#define const_send_size 20 /*串口发送数据的缓冲区数组大小*/

 

#define const_voice_short 40 /*蜂鸣器短叫的持续时间*/

#define const_key_time1 20 /*按键去抖动延时的时间*/

 

/*——————变量函数定义及声明——————*/

/*蜂鸣器的驱动IO口*/

sbit BEEP = P2^7;

/*LED*/

sbit LED = P3^5;

 

/*按键*/

sbit Key_S1 = P0^0;

sbit Key_Gnd = P0^4;

 

unsigned char ucSendregBuf[const_send_size]; /*接收串口中断数据的缓冲区数组*/

 

/*为串口计时器多增加一个原子锁,作为中断与主函数共享数据的保护*/

unsigned char ucVoiceLock = 0; /*蜂鸣器鸣叫的原子锁*/

 

unsigned int uiVoiceCnt = 0; /*蜂鸣器鸣叫的持续时间计数器*/

 

unsigned char ucKeySec = 0; /*被触发的按键编号*/

unsigned int uiKeyTimeCnt1 = 0; /*按键去抖动延时计数器*/

unsigned char ucKeyLock1 = 0; /*按键触发后自锁的变量标志*/

/**

* @brief  定时器0初始化函数

* @param  无

* @retval 初始化T0

**/

void Init_T0(void)

{

TMOD = 0x01;                    /*set timer0 as mode1 (16-bit)*/

TL0 = T1MS;                     /*initial timer0 low byte*/

TH0 = T1MS >> 8;                /*initial timer0 high byte*/

}

 

/**

* @brief  串口初始化函数

* @param  无

* @retval 初始化T0

**/

void Init_USART(void)

{

SCON = 0x50;

TMOD = 0x21;                    

TH1=TL1=-(FOSC/12/32/BAUD);

}

 

/**

* @brief  外围初始化函数

* @param  无

* @retval 初始化外围

* 让数码管显示的内容转移到以下几个变量接口上,方便以后编写更上一层的窗口程序。

* 只要更改以下对应变量的内容,就可以显示你想显示的数字。

**/

void Init_Peripheral(void)

{

ET0 = 1;/*允许定时中断*/

TR0 = 1;/*启动定时中断*/

TR1 = 1;

ES = 1; /*允许串口中断*/

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

}

 

/**

* @brief  初始化函数

* @param  无

* @retval 初始化单片机

**/

void Init(void)

{

LED  = 0;

BEEP = 1;

Key_Gnd = 0;

Init_T0();

Init_USART();

}

/**

* @brief  延时函数

* @param  无

* @retval 无

**/

void Delay_Long(unsigned int uiDelayLong)

{

   unsigned int i;

   unsigned int j;

   for(i=0;i   {

      for(j=0;j<500;j++)  /*内嵌循环的空指令数量*/

          {

             ; /*一个分号相当于执行一条空语句*/

          }

   }

}

/**

* @brief  延时函数

* @param  无

* @retval 无

**/

void Delay_Short(unsigned int uiDelayShort)

{

  unsigned int i;

  for(i=0;i  {

; /*一个分号相当于执行一条空语句*/

  }

}

/**

* @brief  串口发送函数

* @param  ucSendData

* @retval 在发送一串数据中,每个字节之间必须添加一个延时,用来等待串口发送完成。

* 不增加延时,单单靠发送完成标志位来判断还是容易出错,在51,PIC单片机中都是这么做。

* 在stm32单片机中,可以不增加延时,直接靠单片机自带的标志位来判断就很可靠。

**/

void eusart_send(unsigned char ucSendData)

{

ES = 0; /*关串口中断*/

TI = 0; /*清零串口发送完成中断请求标志*/

SBUF = ucSendData; /*发送一个字节*/

 

Delay_Short(400); /*每个字节之间的延时。延时的大小请根据实际项目来调整*/

 

TI = 0; /*清零串口发送完成中断请求标志*/

ES = 1; /*允许串口中断*/

}

 

/**

* @brief  按键扫描函数

* @param  无

* @retval 放在定时中断里

**/

void key_scan(void)

{

if(Key_S1 == 1) /*IO是高电平,说明按键没有被按下,这时要及时清零一些标志位*/

{

ucKeyLock1 = 0; /*按键自锁标志清零*/

uiKeyTimeCnt1 = 0; /*按键去抖动延时计数器清零*/

}

else if(ucKeyLock1 == 0) /*有按键按下,且是第一次被按下*/

{

uiKeyTimeCnt1 ++; /*累加定时中断次数*/

if(uiKeyTimeCnt1 > const_key_time1)

{

uiKeyTimeCnt1 = 0;

ucKeyLock1 = 1; /*自锁按键置位,避免一直触发*/

ucKeySec = 1;

}

}

}

 

/**

* @brief  按键服务的应用程序

* @param  无

* @retval 无

**/

void key_service(void)

{

unsigned int i;

switch(ucKeySec) /*按键服务状态切换*/

{

case 1:

ucSendregBuf[0] = 0xeb; /*把准备发送的数据放入发送缓冲区*/

ucSendregBuf[1] = 0x00;

ucSendregBuf[2] = 0x55;

ucSendregBuf[3] = 0x01;

ucSendregBuf[4] = 0x00;

ucSendregBuf[5] = 0x00;

ucSendregBuf[6] = 0x00;

ucSendregBuf[7] = 0x00;

ucSendregBuf[8] = 0x41;

for(i = 0; i <= 8; i ++)

{

eusart_send(ucSendregBuf[i]); /*发送一串数据给上位机*/

}

 

ucVoiceLock = 1; /*原子锁加锁,保护中断与主函数的共享数据*/

uiVoiceCnt = const_voice_short; /*按键声音触发,滴一声就停。*/

ucVoiceLock = 0; /*原子锁解锁*/

ucKeySec = 0; /*响应按键服务处理程序后,按键编号清零,避免一致触发*/

break;

}

}

 

/**

* @brief  定时器0中断函数

* @param  无

* @retval 无

**/

void ISR_T0(void) interrupt 1

{

TF0 = 0;  /*清除中断标志*/

TR0 = 0; /*关中断*/

/* 

* 此处多增加一个原子锁,作为中断与主函数共享数据的保护

*/

if(ucVoiceLock == 0) /*原子锁判断*/

{

if(uiVoiceCnt != 0)

{

uiVoiceCnt --;

BEEP = 0;

}

else

{

;

BEEP = 1;

}

}

 

key_scan();

 

TL0 = T1MS;                     /*initial timer0 low byte*/

TH0 = T1MS >> 8;                /*initial timer0 high byte*/

  TR0 = 1; /*开中断*/

}

 

/**

* @brief  串口接收数据中断

* @param  无

* @retval 无

**/

void usart_receive(void) interrupt 4

{

if(RI == 1)

{

RI = 0;

}

else

{

TI = 0;

}

}

 

/*————————————主函数————————————*/

/**

* @brief  主函数

* @param  无

* @retval 实现LED灯闪烁

**/

void main()

{

/*单片机初始化*/

Init();

/*延时,延时时间一般是0.3秒到2秒之间,等待外围芯片和模块上电稳定*/

Delay_Long(100);

/*单片机外围初始化*/

Init_Peripheral();

while(1)

{

key_service(); /*按键服务的应用程序*/

}

}

 

三、仿真实现


关键字:51单片机  串口  delay  延时方式  数据 引用地址:51单片机实现通过串口用delay延时方式发送一串数据

上一篇:51单片机实现通过串口用计数延时方式发送一串数据
下一篇:51单片机实现在串口接收中断里即时解析数据头的特殊程序框架

推荐阅读最新更新时间:2024-11-06 13:42

51单片机系列之串口
---------------------------------------------------- 名称:51单片机自带串口 平台:Keil 4, Ly-51S学习板 引脚定义如下:RXD TXD MAX232与51连接:TXD-T1IN RXD-R1OUT -----------------------------------------------------*/ #include reg52.h /*串口初始化*/ void UART_init() { SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收 TMOD |= 0x20;
[单片机]
51单片机之闪烁一个小灯
让灯可以闪烁,通过延时达到目的: /*----------------------------------------------- 内容:点亮P1口的1个LED灯闪烁 该程序是单片机学习中最简单最基础的, 通过程序了解如何控制端口的高低电平 ------------------------------------------------*/ #include reg52.h //包含头文件,一般情况不需要改动, //头文件包含特殊功能寄存器的定义 sbit LED0=P1^0;// 用sbit 关键字 定义 LED到P1.0端口, //LED是自己任意定义且容易记忆的符
[单片机]
如何高效完成电池充放电测试及数据采集?
引言:随着电池行业的高速发展,电池管理系统的性能要求也越来越高。早期的电池管理系统只是对电池的电压电流以及温度做数据采集监控,之后对容量和内阻也会进行跟踪测量,并分析反馈的实时参数。测试项目增多后,动力电池测试系统中集成的仪器也越来越多,同步处理数据也变得复杂,IT6000C优秀的性能保障用户高速充放电及高速采集数据需求。 IT6000C是一款双向直流电源,只用一台设备既可以给电池充电也可以放电,广泛应用于电池、BMS测试领域。传统的测试采用源+负载的形式,不仅仅测试流程复杂,而且无法在充电与放电之间高速切换,IT6000C双向电源满量程充放电切换速度仅需2ms,在动力电池的高速道路工况模拟测试中能保证真实的模拟效果。
[电源管理]
如何高效完成电池充放电测试及<font color='red'>数据</font>采集?
51单片机I/O模拟I2C 程序
/ 此程序是I2C操作平台(主方式的软件平台)的底层的C子程序,如发送数据 及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的 与用户程序连接并扩展..... 经过本人验,绝对好用! / bit ack; /*应答标志位*/ /* 起动总线函数 函数原型: void Start_I2c(); 功能: 启动I2C总线,即发送I2C起始条件. / void Start_I2c() { SDA=1; /*发送起始条件的数据信号*/ _Nop(); SCL=1; _Nop(); /*起始条件建立时间大于4.7u
[单片机]
DSP程序构造的加密体制
目前,DSP以其卓越的性能、独有的特点,已经成为通信、计算机、消费类电子产品等领域的基础器件。同时,随着对知识产权的重视,在利用DSP进行产品设计时,如何保护自己的成果,防止破译者窃取,也成为设计者工作在一个重要方面 。如果产品大批量生产,那么可以利用掩膜技术等工艺将操作程序及数据写入芯片,使它们不能被读出,达到保护的效果。对于还没有形成规模的产品,使用这样的方法就会使成本大大增加。因此,本文提出一种方法,利用3DES、Geffe发生器和MD5等算法,构造一种加密体制,来保护DSP程序。 1 加密原理及硬件结构 1.1 加密原理 该体制的加密原理可分为2个层次。首先是对程序的初始保护,就是把程序写入DSP芯片之前,对源代码进
[应用]
基于51单片机设计的数字温度计设计
一、项目介绍 数字温度计是一种广泛应用于日常生活和工业领域中的电子测量仪器,用于检测环境温度并将其转换为数字信号进行显示。随着现代科技的发展,数字温度计逐渐取代了传统的水银温度计等方式,具有快速响应、高精度、便携式等优点。 基于51单片机设计的数字温度计具体应用于制造业中的温度检测,例如温度控制器、烤箱温度控制、食品加工、工业炉等领域。通过DS18B20这种数字温度传感器来进行温度采集,使用STC89C52这种常用的单片机控制芯片,配合4位共阳数码管实现温度数据显示,并通过按键设置温度上限阀值,一旦温度超过阀值,系统会触发蜂鸣器进行报警提示,从而保证了温度的精准控制和安全性。 DS18B20是一种数字温度传感器,由Maxi
[单片机]
基于<font color='red'>51单片机</font>设计的数字温度计设计
基于8051单片机温度采集及无线发送
摘要:为了远程监控实时温度数据,利用温度传感器DS18B20的特点,与AT89C51单片机构成实时温度检测系统,并通过LED数码管显示。利用无线传输模块SRWF-1的特点,与单片机构成数据传输部分,将所测量的温度无线传输发送给上位机。给出了DS18B20,SRWF-1分别和AT89-C51所构成系统的应用电路和部分程序。通过无线模块的引入,能较好地实现远程温度检测系统。 关键词:8051单片机;DS18B20;温度采集;SRWF-1无线模块 0 引言 随着数字化脚步的加快,越来越多的数字化产品取代了原有的机械式仪表,从而大大提高了数据的准确率。然而,多数情况下,温度的采集过程只在现场实时显示,在增加了工作量的同时,也可能会造
[单片机]
基于80<font color='red'>51单片机</font>温度采集及无线发送
14. 串口控制台建立
串口控制台建立这一节的主要有三个内容: 1.控制台框架搭建 1.1控制台的分类介绍: 1.1.1菜单型控制台:就是选中设置好的数字或者字母选项后执行相应功能的控制台: 例如刚进入uboot之后的界面,就是菜单型控制台: 等待我们输入命令,来执行相应的操作。例如上面,如果此时我们输入1,就是进行Format the nand Flash的操作: 1.1.2解析型控制台:在上面的菜单型控制台里,选择5:Exit to command line:后会出现: 就进入了解析型控制台: 我们输入help后,控制台会去解析这一命令是不是该控制台所支持的,如果是,它会去调用相应的help函数来运行。会列出这个uboot
[单片机]
14. <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