找回密码
 立即注册

QQ登录

只需一步,快速开始

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

这个单片机程序,数码管显示不全怎么解决啊?

[复制链接]
跳转到指定楼层
楼主

//程序:ex6_1.c
//功能:甲机发送数据程序,采用查询方式实现
#include <reg51.h>  //包含头文件reg51.h,定义51单片机的专用寄存器
void main()                        //主函数
{
  unsigned char i;
unsigned char send[]={9,3,5,4,6,7};  //定义要发送的动态密码数据
        TMOD=0x20;        //定时器T1工作于方式2
        TL1=0xf4;         //波特率为2400bps
        TH1=0xf4;
        TR1=1;        
        SCON=0x40;        //定义串行口工作于方式1
    for (i=0;i<6;i++)
    {
            SBUF=send[ i];     // 发送第i个数据
            while(TI==0);     // 查询等待发送是否完成
            TI=0;                  // 发送完成,TI由软件清0
        }
    while(1);
}

  1. //程序:ex6_2.c
  2. //功能:乙机接收及显示程序,采用查询方式实现,采用中断方式实现的程序参见
  3.       //6.3节中的ex6_5.c程序
  4. #include <reg51.h>     //包含头文件reg51.h,定义51单片机的专用寄存器
  5. code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  6.                                                 //定义0~9共阳极显示字型码
  7. unsigned char buffer[]={0x00,0x00,0x00,0x00,0x00,0x00};//定义接收数据缓冲区
  8. void disp(void);    //显示函数声明
  9. void main()                        //主函数
  10. {
  11.     unsigned char i;
  12.         TMOD=0x20;      //定时器T1工作于方式2
  13.         TL1=0xf4;       //波特率定义
  14.         TH1=0xf4;
  15.         TR1=1;
  16.     SCON=0x40;      //定义串行口工作于方式1
  17.     REN=1;                 //接收允许
  18.     for(i=0;i<6;i++)
  19.     {
  20.              while(RI==0);                           //查询等待,RI为1时,表示接收到数据
  21.              buffer[i]=SBUF;                         //接收数据
  22.              RI=0;                                            //RI由软件清0
  23.     }
  24.     for(;;) disp();                                //显示接收数据
  25. }
  26. //函数名:disp
  27. //函数功能:在6个LED上显示buffer中的6个数
  28. //入口参数:无
  29. //出口参数:无
  30. void disp()
  31. {
  32.    unsigned char w,i,j;
  33.    w=0x01;              //位码赋初值
  34.    for(i=0;i<6;i++)
  35.    {
  36.      P1=tab[buffer[i]]; // 送共阳极显示字型段码,buffer[i]作为数组分量的下标
  37.      P2=~w;             // 送反相后的位码
  38.      for(j=0;j<255;j++);// 显示延时
  39.      w<<=1;         
  40.    }
  41. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:332444 发表于 2021-5-25 22:01 | 只看该作者
P1=~tab[buffer[i]]; 试看
回复

使用道具 举报

板凳
ID:332444 发表于 2021-5-25 22:05 | 只看该作者
for(;;) disp();  无限循环,那其他代码如何执行?
回复

使用道具 举报

地板
ID:927246 发表于 2021-5-25 22:07 | 只看该作者
xianfajushi 发表于 2021-5-25 22:05
for(;;) disp();  无限循环,那其他代码如何执行?

运行时显示的数字不完整 暂停了显示的就是完整的数字
回复

使用道具 举报

5#
ID:927246 发表于 2021-5-25 22:09 | 只看该作者

显示的数字顺序反过来了 但还是不完全
回复

使用道具 举报

6#
ID:927363 发表于 2021-5-25 23:40 | 只看该作者
P1=~tab[buffer[i]]; 试看
回复

使用道具 举报

7#
ID:927363 发表于 2021-5-25 23:40 | 只看该作者
for(;;)  无限循环,那其他代码如何执行?
回复

使用道具 举报

8#
ID:213173 发表于 2021-5-26 06:35 | 只看该作者
曾某人。 发表于 2021-5-25 22:07
运行时显示的数字不完整 暂停了显示的就是完整的数字

这是程序构架问题,接收方不宜使用这种串口查询方式,会与数码管显示方式相互干扰。


  1. //程序:ex6_1.c
  2. //功能:甲机发送数据程序,采用查询方式实现
  3. #include <reg51.h>  //包含头文件reg51.h,定义51单片机的专用寄存器
  4. void main()                        //主函数
  5. {
  6.         unsigned char i;
  7.         unsigned char send[]={9,3,5,4,6,7};  //定义要发送的动态密码数据
  8.         TMOD=0x20;        //定时器T1工作于方式2
  9.         TL1=0xf4;         //波特率为2400bps
  10.         TH1=0xf4;
  11.         TR1=1;        
  12.         SCON=0x40;        //定义串行口工作于方式1
  13.         for(i=0;i<6;i++)
  14.         {
  15.                 SBUF=send[i];     // 发送第i个数据
  16.                 while(TI==0);     // 查询等待发送是否完成
  17.                 TI=0;             // 发送完成,TI由软件清0
  18.         }
  19.         while(1);
  20. }
复制代码
  1. //程序:ex6_2.c
  2. //功能:乙机接收及显示程序,采用查询方式实现,采用中断方式实现的程序参见
  3.       //6.3节中的ex6_5.c程序
  4. #include <reg51.h>     //包含头文件reg51.h,定义51单片机的专用寄存器
  5. code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  6.                                                 //定义0~9共阳极显示字型码
  7. unsigned char buffer[]={0x00,0x00,0x00,0x00,0x00,0x00};//定义接收数据缓冲区
  8. void disp(void);    //显示函数声明
  9. void main()                        //主函数
  10. {
  11.         TMOD=0x20;      //定时器T1工作于方式2
  12.         TL1=0xf4;       //波特率定义
  13.         TH1=0xf4;
  14.         TR1=1;
  15.         SCON=0x40;      //定义串行口工作于方式1
  16.         REN=1;                 //接收允许
  17.         EA=1;        //总中断开
  18.         ES=1;        //串口中断开
  19.         while(1)
  20.         {
  21.                 disp();                                //显示接收数据
  22.         }
  23. }

  24. void ser() interrupt 4
  25. {
  26.         static unsigned char i;
  27.         RI=0;
  28.         buffer[i]=SBUF;
  29.    i++;
  30.         if(i==6)
  31.                 i=0;
  32. }

  33. //函数名:disp
  34. //函数功能:在6个LED上显示buffer中的6个数
  35. //入口参数:无
  36. //出口参数:无
  37. void disp()
  38. {
  39.         static unsigned char i;
  40.         unsigned char j;
  41.         P2|=0xff;                        //消隐
  42.         P1=tab[buffer[i]]; // 送共阳极显示字型段码,buffer[i]作为数组分量的下标
  43.         P2&=~(0x01<<i);      //位码赋值
  44.         for(j=0;j<255;j++);// 显示延时
  45.    i++;
  46.         if(i==6)
  47.                 i=0;
  48. }
复制代码



回复

使用道具 举报

9#
ID:927246 发表于 2021-5-26 22:10 | 只看该作者
wulin 发表于 2021-5-26 06:35
这是程序构架问题,接收方不宜使用这种串口查询方式,会与数码管显示方式相互干扰。

非常感谢
回复

使用道具 举报

10#
ID:927858 发表于 2021-5-26 22:40 | 只看该作者
是不是没有延时的问题,切换太快
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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