找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2125|回复: 6
收起左侧

关于数码管与单片机串口的问题,已经想了好几天了,求助各位大神分析

[复制链接]
ID:878202 发表于 2021-1-16 19:24 | 显示全部楼层 |阅读模式
目前数码管刚烧入后显示255,输入一个数字后显示最后一个数字的ascll码,想让数码管显示输入的数字,求教。

单片机源程序如下:
#include<reg52.h>//中断法
typedef unsigned int u16;         
typedef unsigned char u8;
u8 a=0;
sbit LSA=P2^2;//控制数码管显示位数
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(u16 i)//延时函数时间不精准
{
        while(i--);        
}
void DigDisplay(u16 num)//数码管显示函数
{
        u16 i;
        if(num<10){
                LSA=1;LSB=1;LSC=1;
          P0=smgduan[num];
                 }
        if(num>9&&num<100){
        for(i=0;i<2;i++)
        {
                switch(i)
                {
                   case(0):
                                LSA=1;LSB=1;LSC=1; break;
                        case(1):
                                LSA=0;LSB=1;LSC=1; break;
                }        if(i==0){
                P0=smgduan[num/10];
                delay(100);        
                P0=0x00;}        
                if(i==1){
                P0=smgduan[num%10];
                delay(100);        
                P0=0x00;}
        }}
        if(num>99&&num<1000)
        for(i=0;i<3;i++)
        {
                switch(i)
                {
                   case(0):
                                LSA=1;LSB=1;LSC=1; break;
                        case(1):
                                LSA=0;LSB=1;LSC=1; break;
                        case(2):
                                LSA=1;LSB=0;LSC=1; break;
                }if(i==0){
                P0=smgduan[num/100];
                delay(100);        
                P0=0x00;}        
                if(i==1){
                P0=smgduan[num/10%10];
                delay(100);        
                P0=0x00;}        
                if(i==2){
                P0=smgduan[num%10];
                delay(100);        
                P0=0x00;}
        }
}


void main()
{
REN=1;//串口允许接受信息;
SCON=0X50;//SM0,SM1同时控制工作方式;
TMOD=0x20;//设置定时器1工作方式为2;
TR1=1;//打开定时器1;
TH1=0xFD;//储存器,控制频率,由传输频率计算,
TL1=0xFD;//与以上共同决定传输频率,信息先进入TH1,溢出的进入TL1;
EA=1;//中断打开,EA总中断,ES串口中断;
ES=1;
while(1)DigDisplay(a);
}


void ser() interrupt 4//中断函数,一共有五个,标号4是第五个中断函数,是串行口中断函数
{ TH0=0xfc;
        TL0=0x18;
        RI=0;//RI串口接收中断申请标志位,数据接收到停止位时RI自动为1;任何标识符初始为0;
a=SBUF;
;


}
回复

使用道具 举报

ID:390416 发表于 2021-1-17 08:24 | 显示全部楼层
串口发送和接收代码分享
第一个:http://www.51hei.com/bbs/dpj-201660-1.html
第二个:http://www.51hei.com/bbs/dpj-200927-1.html
回复

使用道具 举报

ID:235200 发表于 2021-1-17 09:02 | 显示全部楼层
需要改写void DigDisplay(u16 num)//数码管显示函数
具体改写的方法有多种,可以把接收的数据放入缓冲区,显示程序扫描显示缓冲区信息,扫描显示程序最好用定时计数器固定扫描时间
回复

使用道具 举报

ID:213173 发表于 2021-1-17 11:03 | 显示全部楼层
串行口相关寄存器设置不当,显示函数也太啰嗦。给你改了。
  1. #include<reg52.h>//中断法
  2. typedef unsigned int u16;         
  3. typedef unsigned char u8;

  4. sbit LSA=P2^2;//控制数码管显示位数
  5. sbit LSB=P2^3;
  6. sbit LSC=P2^4;

  7. u8 a=0;

  8. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  9.         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  10. //12MHz延时时长 T=i*9+16us
  11. void delay(u16 i)
  12. {
  13.         while(i--);        
  14. }

  15. void DigDisplay(u16 num)//数码管显示函数
  16. {
  17.         static u8 i=0;
  18.         u8 buf[3]={0,0,0};
  19.         if(num>99)
  20.         {
  21.                 buf[0]=smgduan[num/100%10];
  22.                 buf[1]=smgduan[num/10%10];
  23.                 buf[2]=smgduan[num%10];

  24.         }
  25.         else if(num>9)
  26.         {
  27.                 buf[0]=smgduan[num/10];
  28.                 buf[1]=smgduan[num%10];
  29.                 buf[2]=0x00;
  30.         }
  31.         else
  32.         {
  33.                 buf[0]=smgduan[num];
  34.                 buf[1]=0x00;
  35.                 buf[2]=0x00;
  36.         }
  37.         P0=0x00;
  38.         P2&=0xe3;
  39.         P2|=((7-i)<<2);
  40.         P0=buf[i];
  41.         i++;
  42.         i%=3;
  43. }

  44. void main()
  45. {
  46. //        REN=1;//串口允许接受信息;
  47.         SCON=0X50;//SM0,SM1同时控制工作方式;
  48.         TMOD=0x20;//设置定时器1工作方式为2;
  49.         TR1=1;//打开定时器1;
  50.         TH1=0xFD;//储存器,控制频率,由传输频率计算,
  51.         TL1=0xFD;//与以上共同决定传输频率,信息先进入TH1,溢出的进入TL1;
  52.         EA=1;//中断打开,EA总中断,ES串口中断;
  53.         ES=1;
  54.         while(1)
  55.         {               
  56.                 DigDisplay(a);               
  57.                 delay(100);//约1ms
  58.         }
  59. }

  60. void ser() interrupt 4//中断函数,一共有五个,标号4是第五个中断函数,是串行口中断函数
  61. {
  62. //        TH0=0xfc;
  63. //        TL0=0x18;
  64.         RI=0;//RI串口接收中断申请标志位,数据接收到停止位时RI自动为1;任何标识符初始为0;
  65.         a=SBUF;
  66. }

复制代码
回复

使用道具 举报

ID:878202 发表于 2021-1-17 16:38 | 显示全部楼层
csmyldl 发表于 2021-1-17 09:02
需要改写void DigDisplay(u16 num)//数码管显示函数
具体改写的方法有多种,可以把接收的数据放入缓冲区, ...

谢谢大神指导
回复

使用道具 举报

ID:878202 发表于 2021-1-17 16:40 | 显示全部楼层
wulin 发表于 2021-1-17 11:03
串行口相关寄存器设置不当,显示函数也太啰嗦。给你改了。

谢谢大神修改
回复

使用道具 举报

ID:844772 发表于 2021-1-18 10:44 | 显示全部楼层
你在“ void DigDisplay(u16 num)//数码管显示函数 ”这个函数里,加一句就可以显示输入的数字而不是ascii码: num-=48;
因为零的ascii就是48,加在判断之前就行。

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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