串行口通信 发送0~255数据,单片机再将数据发送回上位机

发布者:WanderlustGaze最新更新时间:2016-03-08 来源: eefocus关键字:串行口通信  单片机再  上位机 手机看文章 扫描二维码
随时随地手机看文章
一. 程序功能
上位机以波特率2400bps发送0~255的数据(十六进制发送),单片机先将数据发送到数码管, 
再将数据加上序号发送回上位机,当序号超过255时归零.
 
二. 程序源码
#include
#include
#define uchar unsigned char
#define uint unsigned int
 
sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;
 
uchar flag, a, num, num1;
uchar bai = 0, shi = 0, ge = 0, dData = 0;
 
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);
void init();
 
void main()
{
    init();
 
    while(1)
    {     
        if (flag == 1)
        {   
            //flag手动清0,便于下次检测
            flag = 0;
            
            //关闭串口中断
            ES = 0;
            //将8位数据分解成百,十,个位
            dData = a;
            bai = dData / 100;
            shi = dData % 100 / 10;
            ge = dData % 10;
            
            //num1计数,达到满255清0
            num1++;
            if (num1 == 255)
                num1 = 0;
            //发送字符(序号)
            SBUF = num1;
            //检测是否发送完毕
            while(!TI);
            //TI手动清0
            TI = 0;
            
            //发送字符(上位机发送过来的数据)
            SBUF = a;
            //检测是否发送完毕
            while(!TI);
            //TI手动清0
            TI = 0;
            
            //重新开启串口中断
 
            ES = 1;
        }
        
        display(bai, shi, ge);        
    }
}
 
void init()
{
    //设置定时器1为工作方式2
    TMOD = 0x20;
    //波特率为2400bps,给计时器1初值
    TH1 = 0xf4;
    TL1 = 0xf4;
    //启动定时器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 bai, uchar shi, uchar ge)
{
    dula = 1;
    P0 = table[bai];
    dula = 0;
    P0 = 0xff;
    wela = 1;
    P0 = 0xfe;      
    wela = 0;
    delayms(5);
 
    dula = 1;
    P0 = table[shi];
    dula = 0;
    P0 = 0xff;
    wela = 1;
    P0 = 0xfd;
    wela = 0;
    delayms(5);
 
    dula = 1;
    P0 = table[ge];
    dula = 0;
    P0 = 0xff;
    wela = 1;
    P0 = 0xfb;
    wela = 0;
    delayms(5);
}
 
void ser() interrupt 4
{
 
    //RI为接收中断标志位, 在方式0时, 当串行接收第8位数据结束时, 或在其他方式, 串行接收停止位的
    //中间时, 由内部硬件使RI置1, 向CPU发出中断申请, 也必须在中断服务程序中, 用软件将其清0,取消
    //此中断申请, 以方便下一次中断申请检测, 即这样才能产生下一次中断.
    //这里RI清0, 因为程序既然产生了串口中断, 肯定是收到或发送了数据, 在开始时没有发送任何数据
    //那必然是收到了数据, 此时RI会被硬件置1, 所以进入串口中断服务程序后必须由软件清0, 这样才能
    //产生下一次中断.
    if (RI)
    {
        RI = 0;
        //将SBUF中的数据读走给a, 这是此中断服务程序最重要的目的
        a = SBUF;
        //将标志位flag置1, 以方便在主程序中查询判断是否已经收到数据
        flag = 1;
    }    
}
 
三. 程序小结
1. 因为SBUF中每次只能存储8位字节数据, 所以该程序每次只能发送8位字节数据.
2. 当以十六进制发送FF时, 单片机接收上位机发送的数据后, 会将FF当成一个8位字节数据发送给上位机,
   如果以字符格式发送FF时, 单片机接收数据后, 会把FF分成0F 0F当成两个8位字节数据发送给上位机.
 
3. 程序缺陷
1)程序下载到单片机后, 一上电数码管就显示为255, 怎么也想不通,没有发生串口中断的情况下, bai, shi, ge怎么能由0,0,0
变成2, 5, 5
2)如果将主函数中的display放入到if判断中,发送数据后数码管只会显示最后一位数据, 不知道为什么
有哪位前辈可以指点一下, 在下先谢过了.

关键字:串行口通信  单片机再  上位机 引用地址:串行口通信 发送0~255数据,单片机再将数据发送回上位机

上一篇:串行口通信上位机发送0~65536间的数据,数码管上显示
下一篇:串行口通信单片机根据上位机发送的数字控制蜂鸣器发声

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

上位机与PLC的通信与监控设计
   1 引 言   PLC是专为工业控制而设计的专用计算机,其体积小,具有高可靠性和很强的抗干扰能力,因而在工业控制中得到了广泛的使用。   随着工业的自动化程度的提高,对PLC的应用提出了更高的要求:更快的处理速度,更高的可靠性,控制与管理功能一体化。控制与管理一体化也就是将计算机信息处理技术,网络通信技术应用于PLC,使PLC用于下位分散控制,用计算机提供图形显示界面,同时对下位机进行监控。本文讨论的是上位计算机与欧姆龙CPM2A型PLC的通信与监控设计。    2 通信协议   2.1 CPM2A 的通信链接方式   CPM2A有三种通信联系方式:上位链接系统、同位链接系统、ComPoBus通信系统。工
[嵌入式]
MSP430串行写入BOOTSTRAP与加密熔断功能
      摘要 BOOTSTRAP用于在MSP430设计开发及系统更新时对Flash存储器的编程。它可以用经串口协议的命令来激活,使得用户可以通过PC控制MSP430,并实现数据交换。烧断Flash的熔丝是用来保护用户在Flash中的程序代码。本文主要介绍我们制作的BOOTSTRAP这一开发工具的功能、软硬件结构以及熔断工具的制作方法。    关键词 MSP430 BOOTSTRAP 熔断    引言   对于MSP430单片机的开发调试有多种技术方案,例如EPROM方式、OTP方式、仿真开发系统方式、JTAG和BOOTSTRAP方式。BOOTSTRAP(又名BootStrap Loader,简称BSL)可与另一种Fla
[嵌入式]
MSP430串行写入BOOTSTRAP与加密熔断功能
红外线冰面温度测控装置
  概述   冰上运动是一项集体育、健身、娱乐于一体的全民参与活动。近年来随着人们生活水平的提高和该项运动的普及,越来越多的大型冰场在国内各地兴建,仅去年全国就已建造了数十座大型冰场。   冰上项目如速滑、花样、冰球及其他群众娱乐要求的冰面温度各有不同,同时要求整块冰温度均匀,目前国内所建造的冰场基本做法是:采用Pt100温度传感器,检测冰层下面的制冷管道温度,对压缩机进行控制,而环境条件下诸多影响冰面温度的因素无法考虑进去,使得冰层与冰面的实际温度差别很大,如受灯光、观众、溜冰人数,冰面保养影响,都会使得冰面出现严重的质量问题。过高的控制温度会使冰面出现水雾,冰面过软不能进行冰球之类项目;过低的控制温度又会使制冷机处于长期运行
[测试测量]
通信机房温度检测系统设计
  通信机房设备分密集、安全性要求高,要保证通信网络安全、稳定运行,需实时监测机房温度。所以,设计了一款智能化、性价比高的通信机房温度的检测系统。由于传统的温度检测系统测温点少、兼容性和扩展性差的缺点。文中设计主要运用主从分布式通信思想,设计了应用于测量通信机房温度的检测系统。该系统具有结构简单、成本低、可靠性高、测温精确等优点,可以广泛应用于通信机房、蔬菜大棚的温度控制、仓库测温等领域。   温度检测控制系统在工业生产、科学研究和日常生活领域中,得到了广泛应用。直接受测量温度控制的影响,生产安全、产品质量等一系列问题,准确的测量和机房温度控制,对于获得正确的科研数据和保证产品质量都具有重要的意义。温度检测控制系统可以对生产环境
[测试测量]
<font color='red'>通信</font>机房温度检测系统设计
上位机控制单片机LED
整了一天程序,写了个上位机程序和单片机程序。总结下。。。 上位机部分: 相关参考资料:http://wenku.baidu.com/view/5ea8670403d8ce2f00662322.html 1.先添加各控件,添加后的对话框如下图: 2.再添加对应的成员变量。 3.最后添加函数(事件处理函数)。 3.1初始化,设置串口各参数。 BOOL CLedControlDlg::OnInitDialog() { CDialog::OnInitDialog(); // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE);
[单片机]
<font color='red'>上位机</font>控制<font color='red'>单片机</font>LED
基于单片机DHT22温湿度LabView上位机监控系统设计
一、系统方案 本设计采用AT89C52单片机作为主控制器,液晶1602显示温湿度,LabView上位机通信,上位机显示温度,同时上位机可以设置温度上下限,当测量温度低于或高于上限,温度报警,上位机可以控制下位机加热设备启动与关闭,实现上位机和下位机的交换数据。 二、硬件设计 原理图如下: 三、单片机软件设计 1、单片机代码主要是串口初始化、串口中断服务程序。首先是串口初始化: void uart_init() { TMOD |= 0x20;//定时器1,工作模式2 8位自动重装 TH1 = 0xfd; TL1 = 0xfd;//设置比特率9600 SM0 = 0; SM1 = 1;//串口工作方式1,8位UART波特率可变
[单片机]
基于<font color='red'>单片机</font>DHT22温湿度LabView<font color='red'>上位机</font>监控系统设计
基于51单片机的光驱激光雕刻机源程序电路图+上位机
根据他人DIY 激光雕刻机 手绘原理图 画得不好勿怪,实验操中 电路原理图如下: 单片机源程序如下: /*z地址定义 50 1=x+,2=x-,3=y+,4=y- 51 前进后退步数高 52 前进后退步数低 53 54/55 字宽 56 57 弱光开关 58/59 激光强度 60 x轴速度 61 y轴速度 62 开始打印0,57 63 暂停 64 停止标志 65 66 左右标记 100开始时灰度图数据 */ #include reg52.h #define uint unsigned int #define uchar unsigned char #define N z //X速度 #define
[单片机]
基于51<font color='red'>单片机</font>的光驱激光雕刻机源程序电路图+<font color='red'>上位机</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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