单片机串口通信编程
时间:10-02
整理:3721RD
点击:
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#define uint unsigned int
unsigned char flag_uart,flag_time,flag_on,a,i,t0_num,ad_val,a,s;
float ad_vo;
void init()
{
TMOD|= 0x20; //定时器1工作方式2
PCON|= 0x80;
TH1 = 0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1 = 0xF3;
TR1 = 1;
ET0=1;
SM0=0;
SM1=1;
REN=1;
EA = 1; // 开总中断
ES = 1; //开串口中断
}
void main()
{
while(1)
{
init();
if(flag_uart==1)
{
flag_uart=0;
ES=0;
TI=1;
switch(flag_on)
{
case 2: puts("Turn on ad!\n");
//TR0=1;
break;
case 0: printf("Turn off ad!\n");
//TR0=0;
break;
case 1: puts("Error!\n");
break;
}
while(!TI);
TI=0;
ES=1;
}
}
}
void ser() interrupt 4
{
if(RI==1)
{ RI=0; //先是收到电脑发送过来的数据,数据放在在SBUF中
a=SBUF; }
s=a;
flag_uart=1;
if(s==1)
flag_on=0;
else
flag_on=1;
}
//为什么中断服务程序中的s 与a始终为0,导致始终执行的是 case 0中的语句?
#include <intrins.h>
#include <stdio.h>
#define uint unsigned int
unsigned char flag_uart,flag_time,flag_on,a,i,t0_num,ad_val,a,s;
float ad_vo;
void init()
{
TMOD|= 0x20; //定时器1工作方式2
PCON|= 0x80;
TH1 = 0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1 = 0xF3;
TR1 = 1;
ET0=1;
SM0=0;
SM1=1;
REN=1;
EA = 1; // 开总中断
ES = 1; //开串口中断
}
void main()
{
while(1)
{
init();
if(flag_uart==1)
{
flag_uart=0;
ES=0;
TI=1;
switch(flag_on)
{
case 2: puts("Turn on ad!\n");
//TR0=1;
break;
case 0: printf("Turn off ad!\n");
//TR0=0;
break;
case 1: puts("Error!\n");
break;
}
while(!TI);
TI=0;
ES=1;
}
}
}
void ser() interrupt 4
{
if(RI==1)
{ RI=0; //先是收到电脑发送过来的数据,数据放在在SBUF中
a=SBUF; }
s=a;
flag_uart=1;
if(s==1)
flag_on=0;
else
flag_on=1;
}
//为什么中断服务程序中的s 与a始终为0,导致始终执行的是 case 0中的语句?
因为串口始终收到0或者根本就没有接收到串口数据,解决方法:先看是否能进入串口中断服务程序,若能进入,则看波特率设置是否正确
我学这个学了很久!
谢谢了!我的问题已经解决!能进入中断服务程序波特率设置也没错,是串口调试助手设置的问题SBUF中的数据应为十六进制,发送数据故应以十六进制发送
顶,不错不错,值得学习
