中易网

求单片机串口通信程序(下位机)?

答案: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的
全部回答
  • 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
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息