找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求大神指导如何将PC端输入的数字通过单片机串口令其在数码管显示?

[复制链接]
跳转到指定楼层
楼主
请问各位大神我该如何修改?

单片机源程序如下:
  1. #include "reg52.h"
  2. #include "intrins.h "
  3. typedef unsigned char u8;
  4. typedef unsigned int u16;
  5. sbit SRCLK=P3^6;        //串行输入时钟
  6. sbit RCLK=P3^5;           // 存储寄存器时钟
  7. sbit SER=P3^6;                //        控制串行数据输入
  8. u8 smgduan[]={0x00,0x02,0x04,0x08,0x10,0x20,0x40,0x80};           //选择哪一位smg亮
  9. code smgwei[]={0x80,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  10.                       0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  11. void UsartInit()
  12. {
  13.          TMOD=0x20;//0010 0000 T1选择工作方式2(八位自动重装定时/计数器)
  14.          TH1=0xF3;         //计算TH1 TL1的波特率;打开常用辅助开发软件的51波特率初值计算 选择方式12 12Mhz 波特率4800 SMOD选择1(令其加倍) 得到F3H
  15.          TL1=0xF3;//跟TH1一样 因为是八位的重装载
  16.          PCON=0x80;//1000 0000          //smod=1时波特率调高一倍
  17.          TR1=1;
  18.          SCON=0x50;        //0101 0000         SCON采用方式1;        SM2(多机控制位)不使用,令其为0
  19.          ES=1;
  20.          EA=1;
  21. }
  22. void main()
  23. {
  24.   UsartInit();//调用此函数 才能令其初始化
  25.   while(1);
  26. }
  27. void delay(unsigned int i)
  28. {
  29. while(i--);
  30. }

  31. void Usart() interrupt 4//编中断函数
  32. {
  33.      unsigned int receiveData;
  34.          unsigned int j;
  35.          receiveData=SBUF;
  36.          RI=0;//串行接收停止位的中间时,由内部硬件使RI置1,向CPU发出中断申请。因此需要软件清0来取消中断申请等待下一次的接收
  37.          SBUF=receiveData;
  38.          while(!TI); //判断TI是否发送完成 假设发送完成后TI由硬件置1  则!TI则变为0 就会跳出while循环 ;假设还在发送中,则为0,!TI就是1,就不会跳出循环
  39.          TI=0;//串行接收停止位的中间时,由内部硬件使TI置1,向CPU发出中断申请。因此需要软件清0来取消中断申请等待下一次的发送
  40.          SBUF=P0;
  41.      P0=smgwei[j];
  42.          delay(100);
  43.          P0=0x00;   //消影
  44. }
复制代码


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

使用道具 举报

沙发
ID:164602 发表于 2018-9-21 08:19 | 只看该作者
这个我搞过,由于不知道你的数码管的电路,所以给个简单的——控制LED灯
#include <STC89C5xRC.H>

#define LED P1

sbit FMQ=P2^3;//有源蜂鸣器


unsigned char date;

void UartInit(void)                //9600bps@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
        AUXR &= 0xBF;                //定时器1时钟为Fosc/12,即12T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //清除定时器1模式位
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0xFD;                //设定定时初值
        TH1 = 0xFD;                //设定定时器重装值
        ET1 = 0;                //禁止定时器1中断
        ES=1;//打开接收中断
        EA=1;//打开总中断
        TR1 = 1;                //启动定时器1
}

void main()
{
        UartInit();
        while(1)
        {
                LED=~date;
        }
}

void Usart() interrupt 4
{
        date=SBUF;//保存接收到的数据
        RI = 0;//清除接收中断标志位
}
串口调试程序是用的STC-ISP中的串口调试项目。PC输出HEX模式,接收也是HEX模式。
回复

使用道具 举报

板凳
ID:7485 发表于 2018-9-21 08:46 | 只看该作者
接收到的数据送显示就可以了。

但是你的程序里面没有“显示”方面的函数。什么都不能显示。

你需要根据你所使用的“显示器件”编写相应的函数。

建议你还是从头学起,打好基础。
回复

使用道具 举报

地板
ID:399491 发表于 2018-9-21 09:15 | 只看该作者
ahshmj 发表于 2018-9-21 08:46
接收到的数据送显示就可以了。

但是你的程序里面没有“显示”方面的函数。什么都不能显示。

41行的P0就是控制八个数码管的,SBUF是接收到的数据
回复

使用道具 举报

5#
ID:303383 发表于 2018-9-21 09:31 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

6#
ID:164602 发表于 2018-9-21 09:38 | 只看该作者
873119779 发表于 2018-9-21 09:15
41行的P0就是控制八个数码管的,SBUF是接收到的数据

你对程序的理解可能有问题哦。
这是你的程序
  • void Usart() interrupt 4//编中断函数
  • {
  •      unsigned int receiveData;
  •          unsigned int j;
  •          receiveData=SBUF;
  •          RI=0;//串行接收停止位的中间时,由内部硬件使RI置1,向CPU发出中断申请。因此需要软件清0来取消中断申请等待下一次的接收
  •          SBUF=receiveData;
  •          while(!TI); //判断TI是否发送完成 假设发送完成后TI由硬件置1  则!TI则变为0 就会跳出while循环 ;假设还在发送中,则为0,!TI就是1,就不会跳出循环
  •          TI=0;//串行接收停止位的中间时,由内部硬件使TI置1,向CPU发出中断申请。因此需要软件清0来取消中断申请等待下一次的发送
  •          SBUF=P0;
  •      P0=smgwei[j];
  •          delay(100);
  •          P0=0x00;   //消影
  • }

05行就已经将串口来的数据取出来了,如果你是要将串口来的数据显示到数码管,那么07、08、09、10都是没有用处的、别人用有的语句。
而11语句要改为P0=smgwei[receiveData],而你的程序中变量j根本就没用嘛——04语句也多余。
另外,03语句,不要用int型,char足够了,只有8位。
回复

使用道具 举报

7#
ID:388197 发表于 2018-9-21 09:40 | 只看该作者
看你发的是什么数据,如果是8位的,直接接收,16位整形数据或者32位浮点数据则最好建立个共用体,共用体里一个是一个INT 或者 FLOAT类型的变量,和与之对应字节长度的8位类型数组.
回复

使用道具 举报

8#
ID:135253 发表于 2018-9-22 09:16 | 只看该作者
没看明白你的硬件设置,但是我想你的想法与这个差不多,计算机通过串口向单片机发送数据,单片机接收并通过数码管显示!

1.png (32.97 KB, 下载次数: 47)

1.png

新建文件夹.rar

22.67 KB, 下载次数: 30

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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