找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 210|回复: 13
打印 上一主题 下一主题
收起左侧

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;
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 2024-4-15 11:50 | 只看该作者
那么请问发送什么可以显示呢?
回复

使用道具 举报

板凳
ID:1116661 发表于 2024-4-15 12:52 | 只看该作者
Hephaestus 发表于 2024-4-15 11:50
那么请问发送什么可以显示呢?

发送什么都不能显示(捂脸)
回复

使用道具 举报

地板
ID:161164 发表于 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. }
复制代码
回复

使用道具 举报

5#
ID:1109793 发表于 2024-4-15 13:20 | 只看该作者
不懂,用电脑的串口吗?接收的电路啥样?
回复

使用道具 举报

6#
ID:1057978 发表于 2024-4-15 17:22 | 只看该作者
你先固定显示个“123456”,正常显示的话说明显示程序没问题,再检查串口收发
回复

使用道具 举报

7#
ID:213173 发表于 2024-4-15 17:41 | 只看该作者
b1325583446 发表于 2024-4-15 12:52
发送什么都不能显示(捂脸)

串口驱动数码管?你这个数码管应该是个模块,这个模块的硬件电路你不提供,大家怎么帮你?
回复

使用道具 举报

8#
ID:1116661 发表于 2024-4-15 19:23 | 只看该作者
不好意思大家,这是开发板,是电脑向单片机发送:

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

烧录界面

烧录界面

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

1.33 MB, 下载次数: 2

回复

使用道具 举报

9#
ID:1116661 发表于 2024-4-15 19:29 | 只看该作者

好的,我去试试
回复

使用道具 举报

10#
ID:1116661 发表于 2024-4-15 19:30 | 只看该作者
wangxiangtan 发表于 2024-4-15 17:22
你先固定显示个“123456”,正常显示的话说明显示程序没问题,再检查串口收发

谢谢,我去试试
回复

使用道具 举报

11#
ID:1116661 发表于 2024-4-15 19:45 | 只看该作者
pdf文件没发起

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

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

使用道具 举报

12#
ID:213173 发表于 2024-4-15 21:47 | 只看该作者

串口收到的文本数字字符需要减0x30转换成十进制数,文本小数点也是一个字节,需要转换成0并插入数码管段码的最高位才能在共阳数码管上显示正确数字。
回复

使用道具 举报

13#
ID:213173 发表于 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];
回复

使用道具 举报

14#
ID:883242 发表于 2024-4-16 10:31 | 只看该作者
b1325583446 发表于 2024-4-15 12:52
发送什么都不能显示(捂脸)

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表