做单片机串口通讯问题时设计的程序应该是利用串口助手给单片机发送一个数据,然后单片机返回一个数据给电脑,但是实验时单片机一电会自动发给串口助手一个数据,不知道程序哪里有问题。
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管wei选
uchar num;//数码管显示的值
void display(uchar i)
{
static uchar wei; //静态变量程序运行阶段都存在,再次调用值不变
P0 = 0XFF;//清除断码
WE = 1;//打开位选锁存器
P0 = SMGwei[wei];
WE = 0;//锁存位选数据
switch(wei)
{
case 0: DU = 1; P0 = SMGduan[i / 100]; DU = 0; break;
case 1: DU = 1; P0 = SMGduan[i % 100 / 10]; DU = 0; break;
case 2: DU = 1; P0 = SMGduan[i % 10]; DU = 0; break;
}
wei++;
if(wei == 3)
wei = 0;
}
//定时器0初始化
void timer0Init()
{
EA = 1; //打开总中断
ET0 = 1;//打开定时器0中断
TR0 = 1; //启动定时器0
//REN = 1;//允许串口接收 //这把ren打开,scon此时是0,串口将被设置为工作方式0因为刚上电scon是0x00 同步移位脉冲就开始发,开始采rxd的电平
TMOD |= 0X01; //定时器工作模式1,16位定时模式
TH0 = 0xED;
TL0 = 0xFF; //定时5ms
}
//串口初始化
void UARTInit()
{
EA = 1; //打开总中断
ES = 1; //打开串口中断
SM0 = 0; SM1 = 1;//串口工作方式1,8位UART波特率可变 方式0的采样已经结束 rxd的引脚始终为1
TR1 = 1;//启动定时器1 // 第一次接受中断的断点 现在sbuf装好了 sbuf是0xff ri=1 第二次也在这跳 sbuff=0x31
TMOD |= 0x20;//定时器1,工作模式2 8位自动重装
REN = 1;//串口允许接收
TH1 = 0xfd;
TL1 = 0xfd;//设置比特率9600
}
void main()//main函数自身会循环
{
timer0Init();//定时器0初始化
UARTInit();//串口初始化
while(1); //等待阶段一直在采样但都没往移位寄存器里放
}
//定时器0中断函数
void timer0() interrupt 1
{
TH0 = 0xED;
TL0 = 0xFF; //定时5ms
display(num); //数码管显示函数
}
//串口中断函数
void UART() interrupt 4
{
uchar temp;
if(RI)//判断接收是否完成
{
num = SBUF;//读SBUF,读出串口接收到的数据 zheshisbuf里是0xff 第二次sbuff变0x31了
RI = 0;//软件清零接收标志位
//num = SBUF;
//temp = num;//为啥写这一步?为了不变化num的值 因为要显示发过来的数据
SBUF = ++num;//写SBUF,把要发送的数据送给发送缓存器
}
if(TI)//判断是否发送完成
TI = 0;//清零发送完成标志位
}
单片机上电后打开后,串口助手会接收到00