单片机stc12c5a60s2 想要用串口助手来控制led亮灭,其中led由P0口控制,高电平点亮;但是后四位显示异常

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void yu()
{
TMOD = 0X20; //选择计数器1,工作模式3
TR1 = 1;
TH1 = 0Xfd; //波特率为9600,PCOM为0X00
TL1 = 0Xfd;
SM0=0;
SM1=1;
REN=1;
}
void main()
{
P0=0X00;
yu();
while(1)
{
while(!RI);
P0=SBUF;
RI = 0;
SBUF=0X00;
}
}
我试了下,后四位led(P0^4——P0^7)当我分别从0按到f时,led亮的情况对应的二进制为0,3,4,7,8,11,12,15,0,3,4,8,11,12,15
而且烧录时还没打开串口时,P0^5,P0^6亮起
是哪里出了问题

这里有一个关键问题,用串口助手发送数据时,是发送十六进制数(也是二进制数)?还是字符?看你的程序应该是发送十六进制数。还有,串口助手的波特率是否为9600?
串口初始化程序要写一行,如下,原写法初始有误。


还有,串口接收后,不要返回,删掉SBUF=0X00;这没有什么用,但串口还要发送,又没while语句等待发送结束。

追答

还有,P0.4~P0.7是高四位,是在前的,而不是后回位。至于烧录程序时,P0的两个灯亮,与串口无关。烧录程序时,单片机处于复位状态,P0口全输出为高电平,应该是全亮的。但是,P0输出高电平时的输出电流较小,点亮LED灯是有问题的,会出现几个亮(LED亮度高的),而多数都是不亮的。

解决方法,一是改用低电平点亮LED,低电平时输出电流大。二是设置P0为强推挽输出模式。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-02-22
1.P0口当IO需要上拉电阻。
2.串口要另外用个子函数写(别把P0=SBUF放在子函数内)
3.可以用单步执行来调试看看哪里还有问题
第2个回答  2019-02-22
修改如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void yu()
{
TMOD = 0x20; //选择计数器1,工作模式3
TR1 = 1;
TH1 = 0Xfd; //波特率为9600,PCOM为0X00
TL1 = 0Xfd;
SCON = 0x50;
}
void main()
{
P0=0x00;
yu();
while(1)
{
    if(RI)
    {    
        P0=SBUF;
        RI = 0;
        SBUF=0x00;
    }
}

第3个回答  2019-02-17
AD转换后存在单片机中,肯定是用16进制表示的,而LED显示(是数码管吧),用的段码,根据共阴、共阳是不同的,所以,我想:1、可能是你的数码管是共阴的还是共阳的没看清楚,说不定段码用错了,那就乱码了;2、段码只是针对一位来说的,对于多位的数码管,是要先分离个十百千万一个个分离之后才能译码给数码管显示的。而AD转换后,显然很定是多位数,我想你可能没有进行数据分离。 同时,分离的时候要注意,单片机中是16进制,而要显示的是10进制,因为要先16-;10进制转换,然后分离数据位,最后在一位位的译码送往数码管显示。3、建议你用C语言来编写,方便,也容易查错。追问

我这个只是控制led亮灭而已,并没有用到数码管;而且我用的是c语言啊