📄 5_4_5.c
字号:
//串口接收(中断)和发送例程,可以用来测试51单片机的中断接收和查询发送。
#include <reg51.h>
#include <string.h>
#define length 4 //数据长度
unsigned char inbuf[length];
unsigned char checksum,counter;
bit flag = 0; //取数标记
main()
{
init_serial(); //串行口初始化
while (1)
{
if (flag!=0) //如果取数标志已置位,就将读到的数从串口发出
{
flag= 0; //取数标志清0
send_string(inbuf,length); //向串口发送字符串
}
}
}
/* 串行口初始化 */
void init_serial( void )
{
SCON = 0x50; //串行工作方式1, 8位异步通信方式
TMOD |= 0x20; //定时器1, 方式 2, 8位自动重装
PCON |= 0x80; //SMOD=1,表示波特率加倍
TH1 = 0xF4; //波特率:4800 fosc=11.0592MHz
IE |= 0x90; //允许串行中断
TR1 = 1; // 启动定时器1
}
/* 向串口发送一个字符 */
void send_char( unsigned char x)
{
SBUF=x;
while (TI== 0 );
TI= 0;
}
/* 向串口发送一个字符串,string_length为该字符串长度 */
void send_string( unsigned char *s, unsigned int string_length)
{
unsigned int i= 0;
do
{
send_char(*(s + i)); //向串口发送一个字符
i++;
}
while ( i<string_length);
}
/* 串口接收中断函数 */
void serial () interrupt 4 using 3
{
if (RI)
{
unsigned char x;
RI = 0;
x=SBUF; //接收字符
if ( x> 127 )
{
counter= 0;
inbuf[counter]=x;
checksum= x- 128;
}
else
{
counter++;
inbuf[counter]=x;
checksum ^= x;
if ((counter==(length- 1)) && (!checksum))
{
flag= 1; //如果串口接收的数据达到length个,且校验没错,
//就置位取数标志
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -