📄 main.c
字号:
/*******************************************************************************
程序名称:RS-485接收测试
*******************************************************************************/
#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
//定义I/O接口
sbit LE_DIG = P1^2;
sbit LE_SEG = P1^3;
sbit LE_LED = P1^4;
sbit RS485_RE = P1^5;
//宏函数:向数码管位选寄存器(74HC573)加载数据
#define DIGLD(dat)\
{\
P0 = (dat);\
LE_DIG = 1;\
_nop_();\
LE_DIG = 0;\
}
//宏函数:向数码管段选寄存器(74HC573)加载数据
#define SEGLD(dat)\
{\
P0 = (dat);\
LE_SEG = 1;\
_nop_();\
LE_SEG = 0;\
}
//定义显示缓冲区(由定时中断程序自动扫描)
unsigned char DispBuf[8];
/*******************************************************************************
函数:DispClear()
功能:清除显示
*******************************************************************************/
void DispClear()
{
unsigned char i;
for ( i=0; i<8; i++ )
{
DispBuf[i] = 0x00;
}
DIGLD(0x00);
SEGLD(0x00);
}
/*******************************************************************************
函数:T0_ISR()
功能:定时器T0中断服务程序,定时扫描显示数码管
*******************************************************************************/
void T0_ISR() interrupt 1
{
code unsigned char com[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
static unsigned char n = 0;
TR0 = 0; //暂停T0(重新定时前应当暂停)
TH0 = 0xFC; //重新定时1ms
TL0 = 0x66;
TR0 = 1; //重启T0
SEGLD(0xFF); //暂停显示(重要操作)
DIGLD(com[n]); //更新位选信号
SEGLD(~DispBuf[n]); //更新段选数据
n++;
n &= 0x07;
}
/*
函数:DispChar()
功能:在数码管上显示字符
参数:
x:数码管的坐标位置(0~7)
c:要显示的字符(仅限十进制数字和减号)
*/
void DispChar(unsigned char x, unsigned char c)
{
//0123456789的数码管字型数据
code unsigned char Tab[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
x &= 0x07;
x = 7 - x;
if ( c == '-' )
{
DispBuf[x] = 0x40;
}
else if ( ( c >= '0' ) && ( c <= '9' ) )
{
DispBuf[x] = Tab[c-'0'];
}
}
/*
函数:DispStr()
功能:在数码管上显示字符串
参数:
x:数码管的坐标位置(0~7)
*s:要显示的字符串(字符仅限十进制数字和减号)
*/
void DispStr(unsigned char x, unsigned char *s)
{
unsigned char c;
for (;;)
{
c = *s;
if ( c == '\0' ) break;
s++;
DispChar(x,c);
x++;
}
}
//定义波特率(取值1200、2400、4800、9600、19200等)
#define BaudRate 9600L
/*******************************************************************************
函数:UartInit()
功能:串行口初始化
*******************************************************************************/
void UartInit()
{
SCON = 0x50; //串口方式1(8位UART),允许接收
PCON |= 0x80; //波特率加倍
TMOD &= 0x0F; //设置T1为8位自动重装定时器,用于产生波特率
TMOD |= 0x20;
TH1 = TL1 = 256 - (11059200L / 12) / (16 * BaudRate); //设置T1初值
TR1 = 1; //启动T1
ES = 1;
}
//定义接收标志
bit ReceiveFlag = 0;
//定义接收缓冲区
unsigned char UartBuf[4];
/*******************************************************************************
函数:Uart_ISR()
功能:串行口中断服务函数
*******************************************************************************/
void Uart_ISR() interrupt 4
{
static unsigned char p = 0;
unsigned char c;
if ( RI ) //如果收到数据
{
RI = 0; //清除接收标志
c = SBUF; //读取收到的数据
if ( (c >= '0') && (c <= '9') ) //如果是数字
{
if ( p < 4 ) UartBuf[p++] = c; //保存到缓冲区
}
else if ( c == '\n' ) //如果接收完一行
{
UartBuf[p] = '\0';
p = 0;
ReceiveFlag = 1;
}
else
{
//对其它字符不予理睬
}
}
if ( TI )
{
TI = 0;
}
}
/*******************************************************************************
函数:SysInit()
功能:系统初始化
*******************************************************************************/
void SysInit()
{
LE_DIG = 0;
LE_SEG = 0;
LE_LED = 0;
DispClear(); //清除显示
UartInit();
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = 0xFC; //定时1ms
TL0 = 0x66;
ET0 = 1; //使能T0定时中断
TR0 = 1; //启动定时器T0
EA = 1; //使能总中断
}
//主函数
void main()
{
SysInit();
DispStr(0,"--------");
RS485_RE = 0;
for (;;)
{
PCON |= 0x01;
if ( ReceiveFlag )
{
ReceiveFlag = 0;
DispClear();
DispStr(0,UartBuf);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -