打印

51单片机串口通信

[复制链接]
1191|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
grhr|  楼主 | 2017-9-21 22:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个困扰我好几天的问题,最近我想利用一个51单片机完成串口通信,并在数码管上显示下发数据的试验。由于数码管只有8个,就想显示最低的8位数据,结果无论如何也调试不出来。
我将代码粘贴如下,望各位大侠看看,能付给一些建议。
#include <reg52.h>
#include <intrins.h>
void ConfigureUART(unsigned int baud);

#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
int j=0,k=0;
unsigned char code LedChar[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsigned char LedBuffer[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};

unsigned char index=0;
unsigned char RxdByte[8];
unsigned char shiftwela=0xFE;

void LedScan()
{
        static unsigned char i=0;
        if(i<7)
        {
                i++;
               
        }
        else i=0;
        switch(i)
        {
                case 0: P0=LedBuffer[0]; dula=1; dula=0;P0=0x7f;wela=1;wela=0;break;
                case 1: P0=LedBuffer[1]; dula=1; dula=0;P0=0xbf;wela=1;wela=0;break;
                case 2: P0=LedBuffer[2]; dula=1; dula=0;P0=0xdf;wela=1;wela=0;break;
                case 3: P0=LedBuffer[3]; dula=1; dula=0;P0=0xef;wela=1;wela=0;break;
                case 4: P0=LedBuffer[4]; dula=1; dula=0;P0=0xf7;wela=1;wela=0;break;
                case 5: P0=LedBuffer[5]; dula=1; dula=0;P0=0xfb;wela=1;wela=0;break;
                case 6: P0=LedBuffer[6]; dula=1; dula=0;P0=0xfd;wela=1;wela=0;break;
                case 7: P0=LedBuffer[7]; dula=1; dula=0;P0=0xfe;wela=1;wela=0;break;
        }
}


void main()
{
        ConfigureUART(9600);
        EA=1;
        TH0=(65536-46080)/256;//5ms???,
        TL0=(65536-46080)%256;//4608,5000*11.0592/12
        ET0=1;
        TR0=1;
        TMOD |=0x01;
        while(1)
        {
               
        }
       
}

void ConfigureUART(unsigned int baud)
{
        SCON=0x50;//SM1=1£¬REN=1
        TMOD &=0x0F;
        TMOD |=0x20;
        ES=1;//Enable UART interrupt
        TH1=256-(11059200/12/32/baud);
        TL1=TH1;
        TR1=1;//Enable T1
        ET1=0;//T1 close interrupt
}

void InterruptUART() interrupt 4
{
        if(RI)
        {
                RI=0;
                for(j=0;j<=3;j++)
                {
                        RxdByte[j]=SBUF;
                        SBUF=RxdByte[j]+1;

                        LedBuffer[2*j]=LedChar[RxdByte[2*j]&0x0F];
                        LedBuffer[2*j+1]=LedChar[(RxdByte[2*j]>>4)&0x0F];
                }
                       
        }
        if(TI)
        {
                TI=0;
        }
}

void Timer0Isr() interrupt 1
{
        TH0=(65536-2000)/256;//50ms???,
        TL0=(65536-2000)%256;//46080,50000*11.0592/12
        LedScan();
}

上述最主要的问题就是SBUF的处理,我这样处理逻辑上是不对的,但是显示的效果却是可以显示低4位的数据,太神奇了。

相关帖子

沙发
airwill| | 2017-9-22 08:33 | 只看该作者
还是新人, 来支持一下.
看你的程序, 还得搞明白硬件才行.
什么有效的注释都没有
P0=LedBuffer[0]; dula=1; dula=0;P0=0x7f;wela=1;wela=0;
先得说明白这端口是怎么回事

使用特权

评论回复
板凳
ningling_21| | 2017-9-22 10:41 | 只看该作者
波特率多少?

建议改为:
TH1=TL1=0XFD; //11.0592M晶振9600波特率

使用特权

评论回复
地板
czdpj| | 2017-9-25 06:58 | 只看该作者
不是很简单的东西么,测试么8位数码管显示也是够了。

使用特权

评论回复
5
xuyaqi| | 2017-9-25 08:29 | 只看该作者
void Timer0Isr() interrupt 1
{
        TH0=(65536-2000)/256;//50ms???,
        TL0=(65536-2000)%256;//46080,50000*11.0592/12
        LedScan();
}
数码管刷新太快,看不清。

使用特权

评论回复
6
grhr|  楼主 | 2017-9-25 22:36 | 只看该作者
airwill 发表于 2017-9-22 08:33
还是新人, 来支持一下.
看你的程序, 还得搞明白硬件才行.
什么有效的注释都没有

为了更新数码管的,数码管有个锁存器,需要这样做

使用特权

评论回复
7
grhr|  楼主 | 2017-9-25 22:37 | 只看该作者
ningling_21 发表于 2017-9-22 10:41
波特率多少?

建议改为:

波特率9600,我设置的是没问题的。

使用特权

评论回复
8
grhr|  楼主 | 2017-9-25 22:38 | 只看该作者
czdpj 发表于 2017-9-25 06:58
不是很简单的东西么,测试么8位数码管显示也是够了。

没那么简单,想要把下发到串口的数据显示出来,你要是有资源可以给我看看,谢谢

使用特权

评论回复
9
grhr|  楼主 | 2017-9-25 22:39 | 只看该作者
xuyaqi 发表于 2017-9-25 08:29
void Timer0Isr() interrupt 1
{
        TH0=(65536-2000)/256;//50ms???,

我的蒂姆就是要刷新很快,那样数码管才不会明显闪烁。这样做的好处是每个数码管显示的亮度是一样的

使用特权

评论回复
10
dscx05| | 2017-9-25 23:00 | 只看该作者
波特率多少?

使用特权

评论回复
11
grhr|  楼主 | 2017-9-26 22:32 | 只看该作者

9600

使用特权

评论回复
12
baochen123456| | 2017-9-29 15:39 | 只看该作者
看看你的晶振是多少的,把波特率确认无误了。

使用特权

评论回复
13
舍恩| | 2017-9-29 15:54 | 只看该作者
分步调,确认通讯成功, 能动态显示, 两个程序合并下就可以了;

使用特权

评论回复
14
grhr|  楼主 | 2017-10-16 07:58 | 只看该作者
ahui1105 发表于 2017-9-29 16:11
需要找带串口UART的MCU芯片,可以联系我们,原厂芯片,提供技术支持!

销售真的无处不在啊……

使用特权

评论回复
15
IICeeprom| | 2017-10-18 22:25 | 只看该作者
51单片机的波特率只适合9600,其他的波特率,由于晶振的原因,偏差会非常的大

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

274

帖子

4

粉丝