标题: 51单片机用串口向6位数码管发送文本18.46.23,数码管显示不了,求大佬们指点 [打印本页]

作者: b1325583446    时间: 2024-4-15 09:45
标题: 51单片机用串口向6位数码管发送文本18.46.23,数码管显示不了,求大佬们指点
#include <REGX52.H>

unsigned char Nixie_Buffer[9];
unsigned char count, count1;

void UART_Init(void)                //4800bps@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率,与串口发送的区别是这里打开了接收控制位REN
        TMOD &= 0x0F;                //清除定时器1模式位
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0xFA;                //设定定时初值
        TH1 = 0xFA;                //设定定时器重装值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
        EA = 1;
        ES = 1;
}

unsigned char NixieTable[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f};//0~F,还有小数点

sbit DP1 = P0^0;
sbit DP2 = P0^1;
sbit DP3 = P0^2;
sbit DP4 = P0^3;
sbit DP5 = P0^4;
sbit DP6 = P0^5;

void Delay(unsigned int xms)
{
        unsigned char i, j;
        while(xms)
        {
                i = 2;
                j = 199;
                do
                {
                while (--j);
                } while (--i);
                xms--;
        }
}

void Nixie(unsigned char Location,Number)
{
        switch(Location)
        {
                case 1:DP1 = 0;break;
                case 2:DP2 = 0;break;
                case 3:DP3 = 0;break;
                case 4:DP4 = 0;break;
                case 5:DP5 = 0;break;
                case 6:DP6 = 0;break;
        }
        P1 = NixieTable[Number];
        Delay(1);//先延时1毫米,为避免过早清零让数码管太暗
        //P1 = 0x00;//将上一位段选清零,避免上一位段选的数据进入下一位的位选,且让清零的数据进入位选,就没影响,不过这里好像没啥用
        //计算机进行:位选 段选 位选 段选.......
        P0 = 0xff;
}

void Nixie_showentitle(unsigned char *str)
{
        while(*str != '\0')
        {
                        if (*str >= '0' && *str <= '9')
                        {
                                Nixie(count1, *str++ - 48);//显示数字
                                count1++;
                        }
                        else if(*str == '.')
                        {
                                Nixie(count1 - 1, 16);//显示小数点
                                *str++;
                        }
        }
}//数码管为6位共阳极

void main()
{
        UART_Init();
        while(1)
        {
                Nixie_showentitle(Nixie_Buffer);
        }
}

void UART_Routine() interrupt 4
{
        if(RI)
        {
                Nixie_Buffer[count] = SBUF;//从发送缓冲区发送文本,例如18.46.23
                RI = 0;
                count++;
                count %= 9;
        }
        else
        {
                TI = 0;
        }
}

作者: Hephaestus    时间: 2024-4-15 11:50
那么请问发送什么可以显示呢?
作者: b1325583446    时间: 2024-4-15 12:52
Hephaestus 发表于 2024-4-15 11:50
那么请问发送什么可以显示呢?

发送什么都不能显示(捂脸)
作者: lkc8210    时间: 2024-4-15 13:18
  1. void Nixie(unsigned char Location,Number)
  2. {
  3.         P1 = NixieTable[Number];
  4.         switch(Location)
  5.         {
  6.                 case 1:DP1 = 0;break;
  7.                 case 2:DP2 = 0;break;
  8.                 case 3:DP3 = 0;break;
  9.                 case 4:DP4 = 0;break;
  10.                 case 5:DP5 = 0;break;
  11.                 case 6:DP6 = 0;break;
  12.         }
  13.         Delay(1);//先延时1毫米,为避免过早清零让数码管太暗
  14.         P0 = 0xff;
  15. }
复制代码

作者: xiaobendan001    时间: 2024-4-15 13:20
不懂,用电脑的串口吗?接收的电路啥样?
作者: wangxiangtan    时间: 2024-4-15 17:22
你先固定显示个“123456”,正常显示的话说明显示程序没问题,再检查串口收发
作者: wulin    时间: 2024-4-15 17:41
b1325583446 发表于 2024-4-15 12:52
发送什么都不能显示(捂脸)

串口驱动数码管?你这个数码管应该是个模块,这个模块的硬件电路你不提供,大家怎么帮你?
作者: b1325583446    时间: 2024-4-15 19:23
不好意思大家,这是开发板,是电脑向单片机发送:

屏幕截图 2024-04-15 192119.png (94.65 KB, 下载次数: 63)

烧录界面

烧录界面

通信工程学院2023级开发板.pdf

1.33 MB, 下载次数: 2


作者: b1325583446    时间: 2024-4-15 19:29
lkc8210 发表于 2024-4-15 13:18

好的,我去试试
作者: b1325583446    时间: 2024-4-15 19:30
wangxiangtan 发表于 2024-4-15 17:22
你先固定显示个“123456”,正常显示的话说明显示程序没问题,再检查串口收发

谢谢,我去试试
作者: b1325583446    时间: 2024-4-15 19:45
pdf文件没发起

屏幕截图 2024-04-15 194248.png (519.01 KB, 下载次数: 63)

屏幕截图 2024-04-15 194248.png

作者: wulin    时间: 2024-4-15 21:47
b1325583446 发表于 2024-4-15 19:45
pdf文件没发起

串口收到的文本数字字符需要减0x30转换成十进制数,文本小数点也是一个字节,需要转换成0并插入数码管段码的最高位才能在共阳数码管上显示正确数字。
作者: wulin    时间: 2024-4-15 22:14
uchar data dis_buf[8];
uchar data dis_buf1[6];
串口收到的8个字节文本保存在缓存
dis_buf[0]='1';
dis_buf[1]='8';
dis_buf[2]='.';
dis_buf[3]='4';
dis_buf[4]='6';
dis_buf[5]='.';
dis_buf[6]='2';
dis_buf[7]='3';

转换成6位数码管段码
dis_buf1[0]=NixieTable[dis_buf[0]-0x30];
dis_buf1[1]=NixieTable[(dis_buf[1]-0x30)]&0x7f;//加小数点
dis_buf1[2]=NixieTable[dis_buf[3]-0x30];
dis_buf1[3]=NixieTable[(dis_buf[4]-0x30)]&0x7f;//加小数点
dis_buf1[4]=NixieTable[dis_buf[6]-0x30];
dis_buf1[5]=NixieTable[dis_buf[7]-0x30];
作者: Hephaestus    时间: 2024-4-16 10:31
b1325583446 发表于 2024-4-15 12:52
发送什么都不能显示(捂脸)

那么显示部分做到什么程度了?能显示什么?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1