关于51单片机串口通讯中向上位机发送字符的讨论

摘要:
2#包括<标准时间>8voidDisplay(无磁力);26receivedChar=0;29断裂;-----(1) 37}38//如果(secondCount)39//{40//secondCount=0;当低八位已满时,CPU自动为低八位提供65TL1=0xfd;//Timer1启动73//串行端口74SM0=0;

在调试串口通讯过程中搞清楚几个配合问题:

  1. 使用Keil带的C51库函数puts、printf之前必须置TI=1;
  2. 蓝色(一)处可以使用ES=0、ES=1,这时串口中断中(二)处,有无TI=0均可;
  3. 如果(一)处不使用ES=0、ES=1,这是串口中断中(二)处,不能使用TI=0;
  4. puts发送完字符串后自动发换行符' ',printf需要手工加上换行符;
  1 #include<reg52.h>
  2 #include<stdio.h>
  3 
  4 unsigned char recievedFlag, recievedChar, sentFlag, ms50Count, secondCount;
  5 
  6 void Init();
  7 void Delay(unsigned int);
  8 void Display(unsigned int);
  9 
 10 void main()
 11 {
 12     Init();
 13     while(1)
 14     {
 15         if(recievedChar)
 16         {
 17             //ES = 0;-----(一)
 18             switch(recievedChar)
 19             {
 20                 case 0x01:
 21                     recievedChar = 0;
 22                     TI = 1;//puts, printf前必须TI=1 ------(三)
 23                     puts("Turn On Ad!");
 24                     break;
 25                 case 0x02:
 26                     recievedChar = 0;
 27                     TI = 1;    
 28                     printf("Turn off Ad!
");
 29                     break;
 30                 default:
 31                     recievedChar = 0;
 32                     TI = 1;    
 33                     puts("Error!");
 34                     break;
 35             }
 36             //ES = 1;-----(一)
 37         }
 38         //if(secondCount)
 39         //{
 40         //    secondCount = 0;
 41         //}
 42         //Display(4);
 43     }
 44 }
 45 
 46 void Init()
 47 {
 48     //配置定时器/计数器工作方式寄存器TMOD,不能位寻址
 49     //            TMOD结构
 50     //    D7        D6        D5        D4        D3        D2        D1        D0
 51     //    GATE     C/-T    M1        M0       GATE      C/-T       M1        M0
 52     //    --------------------------------       ---------------------------------
 53     //            定时器/计数器1                        定时器/计数器0
 54     //    ------------------------------------------------------------------------
 55     TMOD = 0x21;
 56     //    0          0        1        0        0         0         0         1
 57     //    --------------------------------       ---------------------------------
 58     //方式2:8位初值自动重装的8位定时器    方式1:16位定时器
 59     //----------------------------------------------------------------------------
 60     //定时器0初始化为50ms触发中断 
 61     TH0 = (65536 - 45872)/256;
 62     TL0 = (65536 - 45872)%256;
 63     //定时器1初始化成9600
 64     TH1 = 0xfd;//9600波特率时,计时器高八位为0xfd,低八位满后由CPU自动提供给低八位
 65     TL1 = 0xfd;//
 66     //TCON定时器/计数器控制寄存器,可位寻址,用来控制定时器的启、停,标识溢出和中断情况
 67     //        TCON结构
 68     //    D7        D6        D5        D4        D3        D2        D1        D0
 69     //    TF1       TR1       TF0       TR0       IE1       IT1       IE0       IT0
 70     //-----------------------------------------------------------------------------
 71     TR0 = 1;//Timer0启动
 72     TR1=1;//Timer1启动    
 73     //串口
 74     SM0=0;//SM0=0,SM1=1时,串口工作在方式1,既:10位异步收发(8位数据),波特率可变(由定时器1的溢出率控制)
 75     SM1=1;//
 76     REN=1;//串口接收启动
 77     //SCON = 0x50;
 78     //设置中断允许寄存器IE,可位寻址
 79     //        IE结构
 80     //    D7        D6        D5        D4        D3        D2        D1        D0
 81     //    EA        --        ET2       ES        ET1       EX1       ET0       EX0
 82     //----------------------------------------------------------------------------
 83     //以下几行可用IE = 0x92替代,既:10010010
 84     EA=1;//全局中断允许
 85     ET0 = 1;//开定时器0中断
 86     //ET1 = 1;//Timer1用于串口时钟,置于方式2:8位自动重装模式,不能手工设置ET1=1
 87     ES=1;//打开串口中断;
 88 }
 89 
 90 void timer0() interrupt 1
 91 {
 92     TH0 = (65536 - 45872) / 256;
 93     TL0 = (65536 - 45872) % 256;
 94     ms50Count++;
 95     if(ms50Count==20)
 96     {
 97         ms50Count = 0;
 98         secondCount++;
 99     }
100 }
101 
102 void serial() interrupt 4
103 {
104     if(RI)
105     {
106         RI = 0;
107         recievedFlag = 1;
108         recievedChar = SBUF;
109     }
110     if(TI)
111     {
112         //TI = 0;------(二)
113         sentFlag = 1;
114     }
115 }
 关于51单片机串口通讯中向上位机发送字符的讨论第1张关于51单片机串口通讯中向上位机发送字符的讨论第2张

免责声明:文章转载自《关于51单片机串口通讯中向上位机发送字符的讨论》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JDBC工具类完整版!Android app专项测试之耗电量测试下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Arduino 101/Genuino101使用-第2篇

1. Arduino 101编程只是在ARC的核心上进行,其具体架构为ARCv2EM。、 2. 而Quark核心,从目前可知的信息来看,其应该运行着名为Zephyr的RTOS 3.101并没有EEPROM存储单元,其提供的EEPROM库,实际上是在操纵其上的Flash空间。 4. 跑个定时器例程测试一下 1 #include "CurieTimerOne....

前端动态表单的处理方法

背景: 类似于如下的表单的形式,如果我们提前知道了表单的key,那么我们就可以通过正常的处理表单形式,完成相关数据的获取。 但是,如果我们事先不知道表单的属性key值及对应的输入框还是select框, 那我们就得选择其他方式处理。  步骤一:首先,我们约定,后台返回的格式如下: 其中,code字段的具体值为表单的key,type为到底是输入框还是选择框,...

UI设计教程学习分享:APP布局

一、宫格布局 这种APP信息布局方式也是我们目前最常见的一种方式,也是符合用户习惯和黄金比例的设计方式,最知名的就是锤子手机的界面设计。锤子手机界面设计欣赏知名的APP设计采用的九宫格、六宫格等方式布局有:携程APP、途牛APP、支付宝APP等等。 九宫格是一种比较古老的设计,它最基本的表现其实就像是一个三行三列的表格。 采用宫格布局的优势: 非常方便...

wince 串口调试信息输出

不管在WinCE5.0还是在WinCE6.0中,我们在调试驱动或者应用的时候都会用到打印函数。在驱动里面,我们可能会用DEBUGMSG(..),RETAILMSG(..),还有NKDbgPrintfW(..)。在我们使用这些打印函数调试我们的程序之前,我们需要实现串口打印功能。     在WinCE的BSP中,如果想调用DEBUGMSG(..)或者RETA...

PaaS服务之路漫谈(三)

此文已由作者尧飘海授权网易云社区发布。 欢迎访问网易云社区,了解更多网易技术产品运营经验。 Monolithic架构在产品访问量很大的情况下,有可能常会导致整个产品迭代或升级过程不能按预期进行,或者上线风险的不确定性导致上线时常常信心十足。那么MSA(微服务架构)的模式能在很程度上避免Monolithic架构在规模服务应用下的一些缺陷。 微服务架构这个...

第五节:STM32输入捕获(用CubeMX学习STM32)

输入捕获学习 《用CubeMX学习STM32》 注释 点击上面蓝字进入完整专栏,这个系列所有文章都会整合到这个专栏 5、STM32定时器输入捕获 前言: STM32定时器输入捕获简介 STM32的输入捕获可以用于捕获脉宽, 测量时间 . 例如超声波测距模块就是需要用输入捕获功能, 通过测量输入脉冲的高电平脉宽 , 从而计算出测量物体的...