求单片机串口通信程序(下位机)?
答案:2 悬赏:60
解决时间 2021-10-14 02:01
- 提问者网友:我没有何以琛的痴心不悔
- 2021-10-13 18:17
求单片机串口通信程序(下位机)?
最佳答案
- 二级知识专家网友:独钓一江月
- 2021-10-13 19:32
uchar r_buf[8];
uchar r_buf_bit = 0;
bit r_full = 0;
void Device_Init(void) //系统初始化
{
TMOD = 0x21; //串口使用定时器1,工作在方式2(常数自动装入的8位定时器)
//定时器0工作方式1(16位定时器)
//TH0 = -5000/256;
//TL0 = -5000%256; //12M晶振,设置定时器溢出时间为5ms*/
TH0 = 0xEE; //11.0592M晶振定时器5ms
TL0 = 0x00;
TH1 = 0xFD; //波特率位9600
TL1 = 0xFD;
SCON=0x58; //串口工作在方式1,由定时器控制
PCON=0x00; //不加倍
EA = 1; //开CPU中断
ET0 = 1; //开定时器0中断
TR0 = 1; //定时器0开始计数
TR1 = 1; //定时器1开始计数(串口)
ES = 1; //开串口中断
PS = 1; //设置串口中断等级最高
P3M1 = 0x00;
P3M0 = (1 << 2); //设置p3.2为输入高阻
P1=0xff; //初始化io口状态
P3=0xff;
}
void Send_Char(uchar ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
void UART_Send_Str(uchar *str ,uchar val) //向串口发送字符串
{
uchar i;
for(i = 0;i < val;i++)
{
Send_Char(*str++);
}
}
void UART(void)interrupt 4 using 3
{
if(RI && !r_full) //如果缓存未满,则继续接收,满了则放弃
{
r_buf[r_buf_bit++]=SBUF; //将接收的数据写入缓存中
if(r_buf_bit == 8) //接收8个字节后处理命令
{
r_buf_bit = 0; //置位缓存bit位
r_full = 1; //置位缓存满标志
UART_Send_Str(&r_buf,8); //返回接收的数据
}
}
RI = 0; //清零中断标志
}
后面就是接收缓存区数据和比较了,很简单的。这个是51的
uchar r_buf_bit = 0;
bit r_full = 0;
void Device_Init(void) //系统初始化
{
TMOD = 0x21; //串口使用定时器1,工作在方式2(常数自动装入的8位定时器)
//定时器0工作方式1(16位定时器)
//TH0 = -5000/256;
//TL0 = -5000%256; //12M晶振,设置定时器溢出时间为5ms*/
TH0 = 0xEE; //11.0592M晶振定时器5ms
TL0 = 0x00;
TH1 = 0xFD; //波特率位9600
TL1 = 0xFD;
SCON=0x58; //串口工作在方式1,由定时器控制
PCON=0x00; //不加倍
EA = 1; //开CPU中断
ET0 = 1; //开定时器0中断
TR0 = 1; //定时器0开始计数
TR1 = 1; //定时器1开始计数(串口)
ES = 1; //开串口中断
PS = 1; //设置串口中断等级最高
P3M1 = 0x00;
P3M0 = (1 << 2); //设置p3.2为输入高阻
P1=0xff; //初始化io口状态
P3=0xff;
}
void Send_Char(uchar ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
void UART_Send_Str(uchar *str ,uchar val) //向串口发送字符串
{
uchar i;
for(i = 0;i < val;i++)
{
Send_Char(*str++);
}
}
void UART(void)interrupt 4 using 3
{
if(RI && !r_full) //如果缓存未满,则继续接收,满了则放弃
{
r_buf[r_buf_bit++]=SBUF; //将接收的数据写入缓存中
if(r_buf_bit == 8) //接收8个字节后处理命令
{
r_buf_bit = 0; //置位缓存bit位
r_full = 1; //置位缓存满标志
UART_Send_Str(&r_buf,8); //返回接收的数据
}
}
RI = 0; //清零中断标志
}
后面就是接收缓存区数据和比较了,很简单的。这个是51的
全部回答
- 1楼网友:思契十里
- 2021-10-13 19:55
最简单的程序:
单片机1:
MOV TMOD,#20H
MOV TL1,#0E8H
MOV TH1,#0E8H
SETB TR1
MOV SCON,#0C0H ;3
MOV PCON,#00H
MOV R3,#46H
C1:MOV P1,0FFH
MOV A,P1
MOV A,SBUF
JNB TI,$
CLR TI
LJMP C1
END
单片机2(接收):
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP COMM
MAIN:
SETB EA
SETB EX0
SETB ES
MOV TMOD,#20H
MOV TL1,#0FDH
MOV TH1,#0FDH
SETB TR1
MOV SCON,#0C0H ;3
MOV PCON,#00H ;串口初始化,方式3,9600bps
LJMP $
COMM:MOV A,SBUF
MOV P1,A
RETI
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息