proteus虚拟串口的实现:https://mp.csdn.net/console/editor/html/107251649
一、使用proteus绘制简单的电路图,用于后续仿真
二、编写程序
/********************************************************************************************************************
---- @Project: BigData
---- @File: main.c
---- @Edit: ZHQ
---- @Version: V1.0
---- @CreationTime: 20200811
---- @ModifiedTime: 20200811
---- @Description:
---- 波特率是:9600 。
---- 通讯协议:EB 00 55 XX YY YY … YY YY
---- 通过电脑串口调试助手模拟上位机,往单片机发送EB 00 55 XX YY YY … YY YY 指令,其中EB 00 55是数据头,XX 是指令类型。YY是具体的数据。
---- 指令类型01代表发送的是数值,需要转成组合BCD码和非组合BCD码,并且返回上位机显示。
---- 指令类型02代表发送的是组合BCD码,需要转成数值和非组合BCD码,并且返回上位机显示。
---- 指令类型03代表发送的是非组合BCD码,需要转成数值和组合BCD码,并且返回上位机显示。
----
---- 返回上位机的数据中,中间3个数据EE EE EE是分割线,为了方便观察,没实际意义。
----
---- 例如:十进制的数据52013140,它的十六进制数据是03 19 A8 54。
---- (a)上位机发送数据:eb 00 55 01 03 19 a8 54
---- 单片机返回:52 01 31 40 EE EE EE 05 02 00 01 03 01 04 00
---- (b)上位机发送组合BCD码:eb 00 55 02 52 01 31 40
---- 单片机返回:03 19 A8 54 EE EE EE 05 02 00 01 03 01 04 00
---- (c)发送非组合BCD码:eb 00 55 03 05 02 00 01 03 01 04 00
---- 单片机返回:03 19 A8 54 EE EE EE 52 01 31 40
---- 单片机: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_voice_short 19 /*蜂鸣器短叫的持续时间*/
/*
*此处的const_rc_size是20,比之前章节的缓冲区稍微改大了一点*
*/
#define const_rc_size 20 /*接收串口中断数据的缓冲区数组大小*/
#define const_receive_time 5 /*如果超过这个时间没有串口数据过来,就认为一串数据已经全部接收完,这个时间根据实际情况来调整大小*/
/*——————变量函数定义及声明——————*/
/*蜂鸣器的驱动IO口*/
sbit BEEP = P2^7;
/*LED*/
sbit LED = P3^5;
unsigned int uiSendCnt = 0; /*用来识别串口是否接收完一串数据的计时器*/
unsigned char ucSendLock = 1; /*串口服务程序的自锁变量,每次接收完一串数据只处理一次*/
unsigned int uiRcregTotal = 0; /*代表当前缓冲区已经接收了多少个数据*/
unsigned char ucRcregBuf[const_rc_size]; /*接收串口中断数据的缓冲区数组*/
unsigned int uiRcMoveIndex = 0; /*用来解析数据协议的中间变量*/
unsigned int uiVoiceCnt = 0; /*蜂鸣器鸣叫的持续时间计数器*/
/*
* 本程序规定数值的最大范围是0至99999999
* 数组中的数据。高位在数组下标大的方向,低位在数组下标小的方向。
*/
unsigned char ucBufferNumber[4]; /* 数值,用4个字节表示long类型的数值 */
unsigned char ucBufferBCB_bit4[4]; /* 组合BCD码 */
unsigned char ucBufferBCB_bit8[8]; /* 非组合BCD码 */
/**
* @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;/*开总中