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

发布者:EtherealEssence最新更新时间:2016-03-08 来源: eefocus关键字:串行口通信  上位机  数码管 手机看文章 扫描二维码
随时随地手机看文章
一. 硬件设计
串行口通信(STC89C52+MAX232): <wbr>上位机发送0~65536间的数据,数码管上显示
二. 软件设计
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];

关键字:串行口通信  上位机  数码管 引用地址:串行口通信上位机发送0~65536间的数据,数码管上显示

上一篇:串行口通信 AD采集信号,显示在数码管,发送给上位机
下一篇:串行口通信 发送0~255数据,单片机再将数据发送回上位机

推荐阅读最新更新时间:2024-03-16 14:46

用单片机数码管和矩阵按键实现密码锁功能
用数码管和矩阵按键实现密码锁功能,我的理解是实现输入数据并判断数据是否和密码一致,并且更改密码。矩阵按键是4×4的,图在下面。先说功能,初始密码值4321。第一部分:当数码管未进行闪烁的时候,按下S11是进行数据和密码的比较,当正确时数码管显示1111,错误显示2222。按下S12进行数据移位(口误了,应该是 数据选择 而不是数据移位,但意思大家一定要理解,因为下面的我都口误了),这时数码管闪烁,你按下S1到S10可以进行设定,当按四次S12的时候 或者按下S13 可以不闪烁了,这时按下S11才能进行数据比较(意思是只有不闪烁才能进行数据比较)。这是数据和密码的比较。第二部分:当数码管不进行闪烁的时候才能进行密码的更改,按下
[单片机]
用单片机<font color='red'>数码管</font>和矩阵按键实现密码锁功能
单只数码管循环显示0~F
51单片机源代码如下 /* 单只数码管循环显示0~F */ #include reg51.h typedef unsigned char uint8; typedef unsigned int uint16; code uint8 LED_CODE = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8E}; void delay(uint16 x) { uint16 i,j; for(i = x; i 0; i --) for(j = 114; j 0; j --); } void main() {
[单片机]
单只<font color='red'>数码管</font>循环显示0~F
ADC0804+LED数码管显示模拟值0~255
#include reg52.h #define uint unsigned int #define uchar unsigned char sbit rd=P3^7; sbit wr=P3^6; sbit cs0=P3^5; sbit hc=P3^4; void delay(uint ); void format0804(); void display(uchar aa ); unsigned char code table1 = //共阳段码控制 {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; unsigned char code dispbit
[单片机]
ADC0804+LED<font color='red'>数码管</font>显示模拟值0~255
基于FPGA的数字闭环光纤陀螺仪模拟表头设计
   摘 要 :光纤陀螺仪是一种用来测量角速度的传感器。为了检测调制解调电路是否符合设计要求,并提高陀螺的实际应用精度,本文设计了一种基于FPGA的光纤陀螺仪模拟表头及其测试系统,能有效地检测调制解调电路的性能。   光纤陀螺是激光陀螺的一种,是惯性技术和光电子技术紧密结合的产物。它利用Sagnac干涉效应,用光纤构成环形光路,并检测出随光纤环的转动而产生的两路超辐射光束之间的相位差,由此计算出光纤环旋转的角速度。光纤陀螺仪主要由两个部分组成。伺服于表头的调制解调电路根据输入的电信号,经过相应的变换后形成反馈信号送至表头的相位调制器中。在实际的应用过程中,相应的调制解调电路应该根据温度、振动等情况做出相应的改变,才能最大限度
[工业控制]
C#实现上位机与PLC通信技术
1、三菱 MX COMPONENT下载及安装测试 2、通讯测试及数据监控 打开PLC监控程序: 可以看到之前设置的通讯配置,也可以重新设置: 点击OK 在右侧可以输入地址可以对PLC数据进行监控 PS:1:plc地址,2:开始结束监控,3:更改监控方式 buffer memory监控 也可以根据输入地址进行自定义监控 往PLC写入数据及设置PLC时间 可以按位写,也可以一次写入多位 3、好多人一开始就在找通讯的源码,我一开始也找了好久,可恶的是有些人知道源码不仅不提供还收金币下载,这里先画个圈圈;一般这种软件都带源码的啊,我就不信MX COMPONENT没有,终于让我在某个角落里找到了,感慨一番
[嵌入式]
C#实现<font color='red'>上位机</font>与PLC<font color='red'>通信</font>技术
用单片机AT89C51驱动两位数码管显示00--99依次循环程序代码
;两位数码管显示00--99依次循环 org 0000h a_bit equ 20h ;数码管个位数存放内存位置 b_bit equ 21h ;数码管十位数存放内存位置 temp equ 22h ;计数器数值存放内存位置 star: mov temp,#0 ;初始化计数器,从0开始 stlop: acall display;调用显示子程序 inc temp;对计数器加1 mov a,temp cjne a,#100,next ;判断计数器是否满100? mov temp,#0;满100就清零重新开始 next: ljmp stlop;不满就循环执行 ;显示子程序 display: mov a,temp ;将temp中的十六
[单片机]
筋膜枪语音芯片,可驱动4位数码管显示的语音IC,WT2003H
筋膜枪功能多样,而它的使用就是希望用户能完全放松,并且拥有语音操作导航提示,让用户在操作上更加简单,再加入数码管显示功能,不仅能让产品与用户语音交互,还能更直观的在视觉上了解当前的工作状态; 深圳唯创知音研发了一款,单芯片可以驱动4位数码管显示+350秒语音播放的扩展芯片:WT2003H-16S,可省去一颗LED/数码管驱动芯片; WT2003H具有低成本、低功耗、高可靠性、通用性强等特点,控制方式灵活:支持标准的异步串口通讯(UART)驱动标准的 4 位数码管并输出 32 个按键。单芯片可内置 100 秒/350 秒语音容量。带有文件索引播放、插播、单曲循环、所有曲目循环、随机播放等功能,32 级音量可调。 语音内容
[嵌入式]
单片机静态办法点亮数码管电路图解
  电路只驱动一个数码管,该数码管为共阴管,公共端接地,段管直连到单片机的P2口,所用单片机为AT89C52,电路图如下所示:   经过昨日对数码管的阐明,咱们知道假定要害亮一个共阴型的数码管,只需求把公共端连到低电平,段管给高电平就能够,如下图所示。   所以看程序:   第4行:共阴数码管的字段表;   第17行:for循环,循环10次,操控数码管的闪现内容;   第19行:将所要闪现的内容送给数码管;
[单片机]
单片机静态办法点亮<font color='red'>数码管</font>电路图解
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved