📄 uart.c
字号:
#include <reg51.h>
#include "MAX485.h"
uchar temp[8];
data uchar Tbuffer[TCOUNT]; //定义发送缓冲区
data uchar Rbuffer[RCOUNT];//定义接受缓冲器
data unsigned char Tpointer; //定义当前位子指针
data unsigned char Rpointer;
data uchar count_10ms;
uchar time_over_flag;
void serial_init(void);
uchar RS485(){
receive();
if(Rbuffer[0] == 'A'){
temp[1] = Rbuffer[1];
temp[2] = Rbuffer[2];
return(0);
}
else {
return(-1);}
}
void command(void){
Tpointer = 0x00;
while(Tpointer<TCOUNT) { /* 发送缓冲区初始化 */
Tbuffer[Tpointer] = 'T';
Tpointer++;
}
send();
}
void send(void){
RE = 1;
Tpointer=0x00;
EA = 1;
TI = 1;
while(Tpointer <= TCOUNT); /* 等待全部数据帧发送完毕 */
RE = 0;
}
void receive(void){
RE = 0;
Rpointer = 0 ;
time_over_flag = 0;
EA = 0;
ET0=1; //关闭定时器T0中断
TR0=1; //停止定时器T0
ES = 1;
PS = 1;
EA = 1;
while((Rpointer+1 <= RCOUNT)&&!time_over_flag);
ET0 = 0;
TR0 = 0;
}
/* 发送中断服务函数 */
void serial (void) interrupt 4 using 3 {
if (RI){
RI=0; /* 清接收中断标志 */
Rbuffer[Rpointer++]=SBUF;
if((Rpointer+1 == RCOUNT)&&!time_over_flag) return; /* 如果已接收完全部数据帧, 则此次通信结束, 置SM2=1准备下一次通信 */
}
if (TI){
TI=0; /* 清发送中断标志并修改发送缓冲区当前位置指针 */
if(Tpointer == TCOUNT+1) return; /* 如果全部数据发送完毕则返回, 否则发送一帧数据 */
else {
SBUF=Tbuffer[Tpointer++]; /* 启动发送 */
}
}
}
timer0_interrupt(void) interrupt 1 using 2
{
count_10ms++;
if(count_10ms==0x30)
{
ET0=0; //关闭定时器T0中断
TR0=0; //停止定时器T0
time_over_flag=1;//设置接收超时标志
count_10ms=0x00; //10ms计数器复位
}
else
{
TL0=0x4C; //重装定时器初始值
TH0=0x00;
}
}
void serial_init(void){
/* 初始化串行口和波特率发生器 */
SCON=0x50;
TMOD=0x21;
TH1=0xfd;
TR1=1;
ET1=0;
ES=1;
PS=1;
/* 发送地址帧 */
}
void timer0_init()
{
time_over_flag=0;
count_10ms=0;
TL0=0x4C; //T0用于产生10ms的中断
TH0=0x00; //50次T0中断产生1次超时溢出
ET0=1; //允许定时器0中断
}
void system_init(void)
{
serial_init();
timer0_init();
EA =1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -