找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5929|回复: 12
收起左侧

想通过串口输入数字 在数码管上显示出来,不知道为什么数码管显示的是各种笔画而不...

[复制链接]
ID:399491 发表于 2018-10-21 15:37 | 显示全部楼层 |阅读模式
#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
/*******************************************************************************
* 函数名         :UsartInit()
* 函数功能                   :设置串口
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
void UsartInit()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
        TL1=0XF3;
        ES=1;                                                //打开接收中断
        EA=1;                                                //打开总中断
        TR1=1;                                        //打开计数器
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{       
        UsartInit();  //        串口初始化
        while(1);               
}

/*******************************************************************************
* 函数名         : Usart() interrupt 4
* 函数功能                  : 串口通信中断函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
unsigned char receiveData;
void Usart() interrupt 4
{
        P0=SBUF;//出去接收到的数据
        RI = 0;//清除接收中断标志位
        LSA=0;LSB=0;LSC=0;
    while(!TI);                         //等待发送数据完成
        P0=0x00;//消隐
        TI=0;                                                 //清除发送完成标志位
}

回复

使用道具 举报

ID:94031 发表于 2018-10-21 17:37 | 显示全部楼层
得到要显示的数,还要译码成数码管相应的码值,才能送到段码P0口。

评分

参与人数 1黑币 +5 收起 理由
873119779 + 5 赞一个!

查看全部评分

回复

使用道具 举报

ID:413214 发表于 2018-10-21 18:44 | 显示全部楼层
74LS245
回复

使用道具 举报

ID:213173 发表于 2018-10-21 18:52 | 显示全部楼层
要译码成数码管相应的码值,稍微改动简单示例一下。
#include "reg52.h"  
/*******************************************************************************
* 函数名         :UsartInit()
* 函数功能                   :设置串口
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char receiveData;
unsigned char code table[]={
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71};
void UsartInit()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
        TL1=0XF3;
        ES=1;                                                //打开接收中断
        EA=1;                                                //打开总中断
        TR1=1;                                        //打开计数器
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{        
        UsartInit();  //        串口初始化
        LSA=0;LSB=0;LSC=0;
        P0=0x00;
        while(1);               
}

/*******************************************************************************
* 函数名         : Usart() interrupt 4
* 函数功能                  : 串口通信中断函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void Usart() interrupt 4
{
        RI = 0;//清除接收中断标志位
        receiveData=SBUF;//保存收到的数据
        P0=table[receiveData%10];//显示收到的个位数
        SBUF=receiveData;//发送收到的数据
        while(!TI);   //等待发送数据完成
        TI=0;          //清除发送完成标志位
}

评分

参与人数 1黑币 +8 收起 理由
873119779 + 8 很给力!

查看全部评分

回复

使用道具 举报

ID:413292 发表于 2018-10-21 21:13 | 显示全部楼层
想写点单片机程序不知道怎么写
回复

使用道具 举报

ID:213173 发表于 2018-10-26 07:32 | 显示全部楼层
#include "reg52.h"  //此文件中定义了单片机的一些特殊功能寄存器
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x80};//显示0~F.的值

unsigned char x[17]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','.'};
unsigned char a[5];
unsigned char i,j;
//unsigned int i,m,j,l;
unsigned char SendByte;
bit flag=0;
/*******************************************************************************
* 函数名         :UsartInit()
* 函数功能       :设置串口
* 输入           : 无
* 输出           : 无
*******************************************************************************/
void UsartInit()                //9600bps@11.0592MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        TMOD = 0x20;                //设定定时器1为8位自动重装方式
        TL1  = 0xFD;                //设定定时初值
        TH1  = 0xFD;                //设定定时器重装值
        ET1  = 0;                   //禁止定时器1中断
        TR1  = 1;                   //启动定时器1
        EA=1;                                        //开总中断
        ES=1;                                        //开串口中断
}
void delay(unsigned int u)
{
   while(u--);
}
/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/
void main()
{        
        UsartInit();  //串口初始化
        while(1)
        {
                for(i=0;i<5;i++)
                {
                        switch(i)         //位选,选择点亮的数码管,
                        {
                                case(0):
                                LSA=0;LSB=0;LSC=0; break;//显示第0位
                                case(1):
                                LSA=1;LSB=0;LSC=0; break;//显示第1位
                                case(2):
                                LSA=0;LSB=1;LSC=0; break;//显示第2位
                                case(3):
                                LSA=1;LSB=1;LSC=0; break;//显示第3位
                                case(4):
                                LSA=0;LSB=0;LSC=1; break;//显示第4位
                        }
                        P0=smgduan[a[i]];//送段码显示
                        delay(100); //间隔一段时间扫描        
                        P0=0x00;//消隐
                }               
        }               
}

/*******************************************************************************
* 函数名         : Usart() interrupt 4
* 函数功能       : 串口通信中断函数
* 输入           : 无
* 输出           : 无
*******************************************************************************/
void Usart() interrupt 4
{        
        static unsigned char num=0;        //静态计数变量
        RI=0;                                                //接收中断请求标志位清0
        a[num]=SBUF;                        //接收到的数据串保存在缓存数组
        num++;
        if(num>=5)
        {
                flag=1;                                //接收完成标志置1
                num=0;                                //计数变量清0
        }
        if(flag==1)                //接收完成标志为1
        {
                flag=0;                //接收完成标志清0
                for(j=0;j<5;j++)
                {
                        SBUF=a[j];        //发送数据缓存中保存的数据
                        while(!TI);        //等待发送中断请求标志位为1
                        TI=0;                //发送中断请求标志位清0
                }
        }       
}
回复

使用道具 举报

ID:319023 发表于 2018-10-26 13:59 | 显示全部楼层
数码管显示的数和硬件连接、共阴还是共阳极都有关系,驱动代码不能只简单移植。 可以把7段显示数码管每段单独点亮,再尝试用数码管显示数据,到时只要改变下发送数据缓存中保存的数据就可以正常显示了。
回复

使用道具 举报

ID:213173 发表于 2018-10-29 10:38 | 显示全部楼层
无标题.jpg
IMG_20181029_102830_看图王.jpg

回复

使用道具 举报

ID:399491 发表于 2018-10-29 12:24 | 显示全部楼层

那请问小数点该怎么发送呢? 发送数字可以做得到了
回复

使用道具 举报

ID:213173 发表于 2018-10-29 14:55 | 显示全部楼层
873119779 发表于 2018-10-29 12:24
那请问小数点该怎么发送呢? 发送数字可以做得到了

小数点在这里是文本,不是数字,不能与数字混在一起传输,只能用其代码与数字混在一起传输。 无标题.jpg

IMG_20181029_144600_看图王.jpg

回复

使用道具 举报

ID:213173 发表于 2018-10-29 15:19 | 显示全部楼层
873119779 发表于 2018-10-29 12:24
那请问小数点该怎么发送呢? 发送数字可以做得到了

如果非得用文本方式传输数据并用数码管正确显示就得创建一个二维数组来完成译码。这会导致编程复杂。LCD可以直接输入ASCII码显示是其内置有译码模块。
回复

使用道具 举报

ID:417405 发表于 2018-10-29 17:22 | 显示全部楼层
学习了
回复

使用道具 举报

ID:71883 发表于 2019-8-14 10:13 | 显示全部楼层
大家说的非常有用
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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