51单片机串口通信(电脑发送数字到单片机数码管显示)

需要准备 51单片机、138译码器、串口小板(某宝有售)

chr转hex

/*
*pc端使用串口调试工具发送
*usb转232串口小板连接51单片机
*/
#include<reg51.h>
#include<intrins.h>

//--定义使用的IO--//
#define GPIO_DIG P0
//使用138译码器接八个数码管
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
typedef unsigned int u16;
typedef unsigned char u8;


//--定义全局变量--//
unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned char DisplayData[8];
//用来存放要显示的8位数的值

//--声明全局函数--//
void DigDisplay();         //动态显示函数           
void UsartConfiguration();

//将1个16进制数字转换为字符  
//hex:16进制数字,0~15;  
//返回值:字符  
u8 chr2hex(u8 chr)  
{  
    if(chr>='0'&&chr<='9')  
        return (chr-'0');  
    if(chr>='A'&&chr<='F')  
        return (chr-'A'+10);  
    if(chr>='a'&&chr<='f')  
        return (chr-'a'+10);   
    return 0;  
}  

/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void main()
{
        u8 receiveData;

        UsartConfiguration();
        while(1)
        {
                if(RI == 1)                                //查看是否接收到数据
                {
                        receiveData = SBUF;        //读取数据
                        RI = 0;                                //清除标志位

												SBUF=receiveData; //出去接收到的数据
												while(!TI);			 //清楚接受中断标志位
                        //--因为一次接受只能接收到8位数据,最大为255,所以只用显示百位之后--//

												receiveData = chr2hex(receiveData);
                        DisplayData[0] = 0x00;
                        DisplayData[1] = DIG_CODE[receiveData / 100];      // 百位
                        DisplayData[2] = DIG_CODE[receiveData % 100 / 10]; // 十位
                        DisplayData[3] = DIG_CODE[receiveData % 10];           // 个位
                        DisplayData[4] = 0x00;
                        DisplayData[5] = 0x00; //DIG_CODE[receiveData / 100];      // 百位
                        DisplayData[6] = 0x00; //DIG_CODE[receiveData % 100 / 10]; // 十位
                        DisplayData[7] = 0x00; //DIG_CODE[receiveData % 10];
                }
                DigDisplay();
        }
}
/*******************************************************************************
* 函 数 名         :UsartConfiguration()
* 函数功能                   :设置串口
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void UsartConfiguration()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF3;                    //计数器初始值设置,注意波特率是4800的
        TL1=0XF3;
        TR1=1;                                            //打开计数器
}
/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能                   : 使用数码管显示
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void DigDisplay()
{
        unsigned char i;
        unsigned int j;
        for(i=0;i<8;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位
                        case(5):
                                LSA=1;LSB=0;LSC=1; break;//显示第5位
                        case(6):
                                LSA=0;LSB=1;LSC=1; break;//显示第6位
                        case(7):
                                LSA=1;LSB=1;LSC=1; break;//显示第7位        
                }
                GPIO_DIG=DisplayData[i];//发送段码
                j=10;                                                 //扫描间隔时间设定
                while(j--);        
                GPIO_DIG=0x00;//消隐
        }
}

  • 15
    点赞
  • 147
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值