找回密码
 立即注册

QQ登录

只需一步,快速开始

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

在单片机串口上发数用数码管上接收 求帮助

[复制链接]
跳转到指定楼层
楼主
ID:433804 发表于 2018-11-26 22:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新手一枚,这个程序调试了很久了,一直达不到想要的效果,求救

  1. #include <reg52.h>    //此文件中定义了单片机的一些特殊功能寄存器
  2. #include <intrins.h>
  3. #include <stdio.h>
  4. typedef unsigned int u16;   //对数据类型进行声明定义
  5. typedef unsigned char u8;
  6. sbit LSA=P2^2;
  7. sbit LSB=P2^3;
  8. sbit LSC=P2^4;
  9. u16 s,c;
  10. u8 disp[4];
  11. u8 temp[3]={0};
  12. u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  13. /*******************************************************************************
  14. * 函数名         :UsartInit()
  15. * 函数功能     :设置串口
  16. * 输入           : 无
  17. * 输出           : 无
  18. *******************************************************************************/
  19. void UsartInit()
  20. {
  21. SCON=0X50;   //设置为工作方式1
  22. TMOD=0X20;   //设置计数器工作方式2
  23. PCON=0X80;   //波特率加倍
  24. TH1=0XF3;    //计数器初始值设置,注意波特率是4800的
  25. TL1=0XF3;
  26. ES=1;      //打开接收中断
  27. EA=1;      //打开总中断
  28. TR1=1;     //打开计数器
  29. }
  30. /*******************************************************************************
  31. * 函 数 名         : delay
  32. * 函数功能     : 延时函数,i=1时,大约延时10us
  33. *******************************************************************************/
  34. void delay(u16 i)
  35. {
  36. while(i--);
  37. }
  38. /*******************************************************************************
  39. * 函数名         :datapros()
  40. * 函数功能   :数据处理函数
  41. * 输入           : 无
  42. * 输出           : 无
  43. *******************************************************************************/
  44. void datapros()
  45. {
  46. disp[0]=smgduan[0];//千位
  47. disp[1]=smgduan[temp[0]];//百位
  48. disp[2]=smgduan[temp[1]];//十位
  49. disp[3]=smgduan[temp[2]];//个位
  50. }

  51. /*******************************************************************************
  52. * 函数名         :DigDisplay()
  53. * 函数功能   :数码管显示函数
  54. * 输入           : 无
  55. * 输出           : 无
  56. *******************************************************************************/
  57. void DigDisplay()
  58. {
  59. u8 i;
  60. for(i=0;i<4;i++)
  61. {
  62.   switch(i)  //位选,选择点亮的数码管,
  63.   {
  64.    case(0):
  65.     LSA=0;LSB=0;LSC=0; break;//显示第0位
  66.    case(1):
  67.     LSA=1;LSB=0;LSC=0; break;//显示第1位
  68.    case(2):
  69.     LSA=0;LSB=1;LSC=0; break;//显示第2位
  70.    case(3):
  71.     LSA=1;LSB=1;LSC=0; break;//显示第3位
  72.   }
  73.   P0=disp[3-i];//发送数据
  74.   delay(100); //间隔一段时间扫描
  75.   P0=0x00;//消隐
  76. }  
  77. }
  78. /*******************************************************************************
  79. * 函 数 名       : main
  80. * 函数功能   : 主函数
  81. * 输    入       : 无
  82. * 输    出      : 无
  83. *******************************************************************************/
  84. void main()
  85. {
  86. UsartInit();
  87. while(1)
  88. {
  89.   datapros();  //数据处理函数
  90.   DigDisplay();//数码管显示函数  

  91. }  
  92. }
  93. /*******************************************************************************
  94. * 函数名         : Usart() interrupt 4
  95. * 函数功能    : 串口通信中断函数
  96. * 输入           : 无
  97. * 输出           : 无
  98. *******************************************************************************/
  99. void Usart() interrupt 4
  100. {temp[c]=s;
  101. SBUF=temp[c];//将接收到的数据放入到发送寄存器
  102. while(!TI);    //等待发送数据完成
  103. TI=0;       //清除发送完成标志位
  104. s=SBUF;//出去接收到的数据
  105. RI = 0;//清除接收中断标志位
  106. c++;
  107. temp[c]=s;

  108. }
复制代码




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

使用道具 举报

沙发
ID:94031 发表于 2018-11-27 13:16 | 只看该作者
你得把想要的效果写出来。
回复

使用道具 举报

板凳
ID:433804 发表于 2018-11-27 19:06 | 只看该作者
xuyaqi 发表于 2018-11-27 13:16
你得把想要的效果写出来。

就是在串口上发一个0到255之间的数,然后数码管能准确的显示出这个数。
回复

使用道具 举报

地板
ID:433804 发表于 2018-11-28 22:11 | 只看该作者
自问自答
给后人一点帮助
#include <reg52.h>                         //此文件中定义了单片机的一些特殊功能寄存器
#include <intrins.h>
#include <stdio.h>

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u16 s,c=0;
u8 disp[4],temp[2];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*******************************************************************************
* 函数名         :UsartInit()
* 函数功能                   :设置串口
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void UsartInit()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
        TL1=0XF3;
        ES=1;                                                //打开接收中断
        EA=1;                                                //打开总中断
        TR1=1;                                        //打开计数器
}

/*******************************************************************************
* 函 数 名         : delay
* 函数功能                   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
        while(i--);       
}

/*******************************************************************************
* 函数名         :DigDisplay()
* 函数功能                 :数码管显示函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void DigDisplay()
{
       
        u8 i;
        for(i=0;i<3;i++)
        {
                switch(i)         //位选,选择点亮的数码管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0;P0=smgduan[temp[2-i]]; break;//显示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0;P0=smgduan[temp[2-i]]; break;//显示第1位
                        case(2):
                        LSA=0;LSB=1;LSC=0;P0=smgduan[temp[2-i]]; break;//显示第2位
                }
                delay(100); //间隔一段时间扫描       
                P0=0x00;//消隐
        }               
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{
        UsartInit();
        while(1)
        {
                DigDisplay();//数码管显示函数                 
        }               
}
/*******************************************************************************
* 函数名         : Usart() interrupt 4
* 函数功能                  : 串口通信中断函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void Usart() interrupt 4
{
        if(c>=3)
        c=0;
        s=SBUF;
        while(!RI); //串口接收
        RI=0;
        SBUF=s;
        while(!TI);         //串口发送
        TI=0;
        temp[c]=s-'0';
        c++;       
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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