×
单片机 > 单片机程序设计 > 详情

串行口通信上位机发送0~65536间的数据,数码管上显示

发布时间:2020-08-31 发布时间:
|
一. 硬件设计

二. 软件设计
1. 程序功能
以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态显示出来,波特率自定.
 
2. 程序源码
#include
 
#define uchar unsigned char
#define uint unsigned int
 
#define BUF_LEN 2
 
sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;
 
uint inbuf[BUF_LEN], dData;
uchar flag, count;
uchar wan, qian, bai, shi, ge;
 
//数码管编码表
uchar code table[] = {
    0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71
};
 
void delayms(uint xms);
void display(uchar,uchar,uchar,uchar,uchar);
void init();
 
void main()
{
    init();
    while (1)
    {
        if (flag == 1)
        {
            //flag手动清0,便于下次检测
            flag = 0;
            //关闭串口中断, 防止数据还未显示完成进入新的串口中断
            ES = 0;
            //将两个8位数据组合成16位数据
            dData = (inbuf[1] << 8) | inbuf[0];
            //获取万,千,百,十,个位
            wan = dData / 10000;
            qian = dData % 10000 / 1000;
            bai = dData % 1000 / 100;
            shi = dData % 100 / 10;
            ge = dData % 10;
 
            //发送万位,下同
            SBUF = wan;
            //检测是否发送完毕
            while (!TI);
            //TI手动清0
            TI = 0;
 
            SBUF = qian;
            while (!TI);
            TI = 0;
 
            SBUF = bai;
            while (!TI);
            TI = 0;
 
            SBUF = shi;
            while (!TI);
            TI = 0;
 
            SBUF = ge;
            while (!TI);
            TI = 0;
 
            //将存放两个8位数据的数组清空
            inbuf[0] = 0;
            inbuf[1] = 0;
            //开启串口中断
            ES = 1;
        }
 
        display(wan, qian, bai, shi, ge);
    }
}
 
void init()
{
    //设置定时器1为工作方式2
    TMOD = 0x20;
    //波特率选择9600bps,给计时器1初值
    TH1 = 0xfd;
    TL1 = 0xfd;
    //启动定时器1
    TR1 = 1;
    //ET1 = 1;  这里不需要开启定时器1中断,因为定时器1工作在方式2,为8位自动重装方式,进入中断也无事可做
    //设置串口工作方式1
    //10位异步收发(8位数据)
    SM0 = 0;
    SM1 = 1;
    //容许串口中断
    REN = 1;
    //开启总中断
    EA = 1;
    //开启串口中断
    ES = 1;
}
 
//延时毫秒函数
void delayms(uint xms)
{
    uint i, j;
 
    for (i = xms; i > 0; i--)
        for (j = 110; j > 0; j--)
            ;
}
 
//共阳极数码管显示
void display(uchar wan,uchar qian,uchar bai,uchar shi,uchar ge)
{  
    dula = 1;
    P0=table[wan];
    dula=0;
    P0 = 0xff;
    wela = 1;
    P0=0xfe;
    wela=0;
    delayms(5);
 
    dula=1;
    P0=table[qian];
    dula=0;
    P0 = 0xff;
    wela=1;                                                          
    P0=0xfd;
    wela=0;
    delayms(5);
 
    dula=1;
    P0=table[bai];
    dula=0;
    P0 = 0xff;
    wela=1;
    P0=0xfb;
    wela=0;
    delayms(5);
        
    dula=1;
    P0=table[shi];
    dula=0;
    P0 = 0xff;
    wela=1;
    P0=0xf7;
    wela=0;
    delayms(5);
 
    dula=1;
    P0=table[ge];
    dula=0;
    P0 = 0xff;
    wela=1;
    P0=0xef;
    wela=0;
    delayms(5);
}
 
//串口中断
void ser() interrupt 4
{
    //定义uchar类型数据,便于接受8位数据
    uchar ch;
 
    //查询中断是否发生
    if (RI)
    {
        //RI手动清0
        RI = 0;
        //数组索引递增
        count++;
        //获取串口中8位数据
        ch = SBUF;
        //保存数据到数据中
        inbuf[count - 1] = ch;
        if (count == 2)
        {
            //数据索引清0
            count = 0;
            //将标志位flag置1, 以方便在主程序中查询判断是否已经收到数据
            flag = 1;
       
    }
}
 
3. 程序小结
a. 发送数据时,需要在"多字串发送区"填入你需要发送的字符, 比如填入1: 0(hex),2: 1(hex),则发送00001
  注意,程序要求先发送低位数据,再发送高位数据
b. 如果需要先发送高位数据,再发送低位数据, 则需要将主函数中的 dData = (inbuf[1] << 8) | inbuf[0];
换成 dData = (inbuf[0] << 8) | inbuf[1];

关键字:串行口通信  上位机  数码管

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈msp430f5529入门(2)----时钟配置.例程分析