需要实现的功能为:开机后通过P0口控制8个LED中最低位的LED亮,其它LED熄灭;通过电脑向单片机发送数据,单片机接收到数据后通过P0口控制8个LED显示。
实验现象:开机后,8个LED显示不正常,为全亮;串口发送数据后,低4位LED显示正常,高4位LED显示不正常。
#include<reg52.h>
sbit LE=P3^1;
void Set_seri();
void main()
{
LE=1;
P0=0x10;
LE=0;
P2=0xff;
Set_seri();
while(1)
{
if(RI==1)
{
RI=0;
LE=1;//锁存器控制
P0=SBUF;
LE=0;
}
}
}
void Set_seri()
{
TMOD=0x20;//设置定时器1为工作方式2(8位自动重装)
TH1=0xFD;//设置波特率为9600,计算出初值为0xFD
TL1=0xFD;//设置波特率为9600,计算出初值为0xFD
REN=1;
SM0=0;
SM1=1;
TR1=1;
}
你好,我这是实物开发板,P0接了一片74HC573锁存器,用LE来控制。按您指导修改程序后,单片机上电后LED显示正常,但发送数据后高4位显示不正常,我查了下单片机原理图,可能是晶振频率的影响,单片机上外接的12M晶振,但是软件中是按照11.0592M计算的初值。另外请教下,SCON分开赋值后,开机LED就全亮,显示不正常,SCON为什么不能分开赋值呢?谢谢!
追答晶振是12M的,应该按12M计算初始值,但都有误差。
波特率只能选2400或1200,误差最小,可以保证正常串行通信。
关于SCON=0x50,分开赋值,因其中的RI未置0,可能是1,就误以为收到数据了,执行了P0=SBUF,但是错误的。
如能解决问题,请及时采纳。
这个问题你得自己解决啊我也不是特别饿清楚的你说怎么办那把。