📄 uart.c
字号:
#include "NEW_8051.H"
#include "main.h"
//起始标志 0x5A 结束标志 0xA5 0x00 无反应
#define START 0X5A //起始位
#define END 0XA5 //结束位
sbit LED1=P2^5;
/*
0x5a+C+L+DATA+CS+0xA5
C 控制码
L 长度
DATA 数据
CS 较验和 C+L+DATA
和取模
接收成功返回1字节:0x06
*/
bit uart_rBIT=0;
uchar ReceVeryfy=0;
uint uiAddressCount=0x200;
uchar ReceState=0;
uchar ucDataBuff[220];
uchar ReceCount=0;
bit bEanle=0;
uchar ucControlCode;
uchar ucLength;
void uart_init()
{
SCON = 0x50;
BRT= 0xf4; //0xfb: 30MHz,12T,SMOD=0,9600bps
AUXR |= 0x11; // 使用独立波特率发生器
ES=1;
PS = 1; //"串行中断优先"
PSH;
EA=1;
}
/*******************************************/
void MAIN_RS_INT(void) interrupt 4
{
uchar DataTemp;
//uart_rBIT=1;
if(RI) // 接收
{
RI = 0;
//ucUdateTime=200;
DataTemp = SBUF;
bEanle=1;
/************************************/
switch (ReceState)
{
case 0:
if(START == DataTemp)
{
ReceState = 1;
}
break;
case 1:
ucControlCode=DataTemp; //接收控制码
ReceVeryfy += ucControlCode;//开始计算校验和
ReceState = 2;
break;
case 2:
ucLength=DataTemp;
ReceVeryfy += ucLength;//计算校验和
ReceState = 3;
break;
case 3:
if(ReceCount<ucLength)
{
ReceVeryfy += DataTemp;
ucDataBuff[ReceCount]=DataTemp;
ReceCount++;
}
else
{
if(ReceVeryfy == DataTemp)
{
ReceVeryfy=0;
ReceCount=0;
ReceState=4;
//LED1=~LED1;
}
else
{
ReceState=0;
}
}
break;
case 4:
if(END == DataTemp)
{
uart_rBIT=1;
ReceState=0;
}
break;
default:
ReceState=0;
break;
}
/********************************************/
if( uart_rBIT )
{
uart_rBIT = 0;
switch (ucControlCode)
{
case 0x01://扇区擦除命令
for(i=1;i<=ucDataBuff[0];i++)
{
sector_erase(i*0x200);
}
Send_data(0x06);
break;
case 0x02://字幕数据命令
for(BuffCount=0;BuffCount<ucLength;BuffCount++)
{
byte_program(0x200+BuffCount+uiBaseAddress,ucDataBuff[BuffCount]);//把字幕数据写入EEP
}
uiBaseAddress=uiBaseAddress+ucLength;
if(ucLength<180)
{
uiFontNumber=uiBaseAddress;//字模的总数量
byte_program(0x100,uiFontNumber>>8);
byte_program(0x101,uiFontNumber);
uiBaseAddress=0;
bEanle=0;
}
//ucEEPArray=1;//EEP有字幕数据标志
Send_data(0x06);
break;
case 0x03://参数设置命令
sector_erase(0);
for(BuffCount=0;BuffCount<ucLength;BuffCount++)
{
byte_program(BuffCount,ucDataBuff[BuffCount]); //把设置的参数写入EEP
}
byte_program(0x100,uiFontNumber>>8);
byte_program(0x101,uiFontNumber);
ucSpeed=ucDataBuff[0]<<1; //移动速度
ucFontSize=ucDataBuff[1]<<4; //字体大小
ucFontColor=ucDataBuff[2]; //字体颜色
ucPlateNum=ucDataBuff[3]<<3; //级联块数(32*64一块)
ucShowMode=ucDataBuff[4];//显示模式
Send_data(0x06);
break;
case 0x04:
ES = 0;
//Send_data(uiBaseAddress>>8);
//Send_data(uiBaseAddress);
/*for( i=0;i<250;i++ )
{
SBUF = byte_read(0x200+i);
while( TI == 0 );
TI = 0;
}*/
ES = 1;
break;
default:
break;
}
}
}
/*****************************************/
/* if(TI)
{
TI = 0;
} */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -