#include <reg52.h>
#include "message5.h"
sfr rs_timerL = 0x8A; //TL0
sfr rs_timerH = 0x8C; //TH0
#define INT8U unsigned char
#define INT16U unsigned int
INT8U code headCommand[]={0x00,0xAA,0xFF,0x55};
INT8U code askCommand[] ={0x28,0x20,0x20,0x31,0x3B,0x05,0x3B,0x29,0x31,0x20,0x20,0X34,0x0D,0x0A};
INT8U code ackCommand[] ={0x28,0x20,0x20,0x31,0x3B,0x06,0x3B,0x29,0x31,0x20,0x20,0X37,0x0D,0x0A};
/********************************************************************
选择工作模式 产品 调试
*********************************************************************
#define SYSTEM_DEBUG
void null(){}
/********************************************************************
选择通道
*********************************************************************/
#define channel 0x05
/********************************************************************
选择晶振和波特率
*********************************************************************/
//选择以下一个晶体频率
#define Fosc 11059200 //9600//
//为模拟串口定时器0选择以下一个波特率:
//#efine Baud 300
//#define Baud 1200
//#define Baud 2400
//#define Baud 4800 //*//
#define Baud 9600 //*//
//为硬件串口定时器1选择以下一个波特率:
#define Baud1 9600 //11059200//
/*********************************************************************
串口堆栈设置
**********************************************************************/
#ifdef SYSTEM_DEBUG
#define uart_RECEIVE_MAX 128 //最大接收长度
#define uart_STACK 0x7F //堆栈长度
INT8U idata uartBuffer[uart_RECEIVE_MAX]; 、//为何定义 成这样啊
#else
#define uart_RECEIVE_MAX 1024 //最大接收长度
#define uart_STACK 0x3B4 //堆栈长度
INT8U xdata uartBuffer[uart_RECEIVE_MAX]; //? 为何定义成片外
#endif
INT8U uartBufLength,uartBufNum,uartBufFlag;
INT8U uartSum[]={0x00,0x00,0x00,0x00};
INT8U uartBufSum;
INT16U uartBufHead, uartBufTail;//askTime;
//接收缓冲设置
#define rs_RECEIVE_MAX 16 //最大接收长度
INT8U rs_buffer[rs_RECEIVE_MAX]; //收、发缓冲区
INT8U ReceivePoint; //接收数据存储指针
/*********************************************************************
模拟串口设置
**********************************************************************/
sbit ledPower = P2^3;
sbit ledUart = P2^4;
sbit ledRs = P2^5;
sbit ledTest = P2^6;
sbit rs_TXD = P2^0;
sbit rs_RXD = P2^1;
INT8U bdata rs_BUF; //串行收、发时用的移位暂存器。
sbit rs_BUF_bit7 = rs_BUF^7; //移位暂存器的最高位。
INT8U rs_shift_count; //移位计数器。
INT8U bdata rsFlags;
sbit rs_f_TI = rsFlags^0; //0:正在发送; 1: 一个字符完毕
sbit rs_f_RI_enable = rsFlags^1; //0:禁止接收; 1:允许接收
sbit rs_f_TI_enable = rsFlags^2; //0:禁止发送; 1:允许发送
sbit rs_f_com = rsFlags^3; //0:禁止上传;1:允许上传
sbit rs_f_sum = rsFlags^6; //0:校验正确;1:校验错误
sbit rs_f_message = rsFlags^7; //0:提取数据;1:提取信息
/*********************计算计数值***************************************/
//收、发一位所需定时器计数
#define rs_FULL_BIT0 ((Fosc/12) / Baud)
#define rs_FULL_BIT (65536 - rs_FULL_BIT0)
#define rs_FULL_BIT_H rs_FULL_BIT >> 8 //收、发一位所需定时器计数高位
#define rs_FULL_BIT_L (rs_FULL_BIT & 0x00FF) //收、发一位所需定时器计数低位
//检测起始位的时间间隔所需定时器计数
#define rs_TEST0 rs_FULL_BIT0 / 4 //波特率较低时可以除以 3 或除以 2
#define rs_TEST ((~rs_TEST0))
#define rs_TEST_H rs_TEST >> 8 //高位
#define rs_TEST_L rs_TEST & 0x00FF //低位
//发送起始位所需定时器总计数
#define rs_START_BIT0 ((Fosc/12)/Baud)
#define rs_START_BIT 0xFFFF -rs_START_BIT0+ 0x28
#define rs_START_BIT_H rs_START_BIT >> 8 //发送起始位所需定时器计数高位
#define rs_START_BIT_L rs_START_BIT & 0x00FF //发送起始位所需定时器计数低位
/******************************************************************
延时程序
******************************************************************/
void delay(unsigned char delayTime)
{
unsigned char i;
for(i=delayTime;i>0;i--);
}
/******************************************************************
波特率初始化程序
******************************************************************/
void baudInit()
{
TR0=0;// 关闭定时器0
TR1=0;// 关闭定时器1
TMOD=0X21;
SCON=0X50;
PCON=0X80;
TH1=(INT8U)(256-(Fosc/(16L*12L*Baud1)));
IP=0x02;
ET0=1;
ES=1;
EA=1;
TR0=1;// 启动定时器0
TR1=1;// 启动定时器1
}
/******************************************************************************
接收监听程序(需要提高2-4倍的波特率)
******************************************************************************/
void soft_receive_init() //监测起始位
{
TR0 = 0; //停止定时器
rs_timerH = rs_TEST_H;
rs_timerL = rs_TEST_L;
rs_shift_count = 0;
TR0 = 1; //启动定时器
}
/******************************************************************************
使能接收、废能发送
******************************************************************************/
void soft_receive_enable() //允许接收
{
rs_f_RI_enable = 1; //允许接收
rs_f_TI_enable = 0; //禁止发送
soft_receive_init(); //监测起始位, RXD 下降沿触发接收字节过程.
}
/******************************************************************************
使能发送、废能接收
******************************************************************************/
void soft_send_enable (void) //允许发送
{
TR0 = 0; //停止定时器
rs_f_TI_enable = 1; //允许发送
rs_f_RI_enable = 0; //禁止接收
rs_shift_count = 0; //清移位计数器
rs_f_TI = 1; //发送一个字符完毕标志
TR0= 1; //启动定时器
}
请问这段程序中, rs_f_TI_enable = 1; //允许发送
rs_f_RI_enable = 0; //禁止接收
这两句我不是很明白。为什么只是定义了一个寄存器和变量,就能达到他所说的效果了吗。就能实现允许发送和禁止接受了吗。这是为什么啊。 |