51单片机GPIO口模拟串口通信

发布者:素心轻语最新更新时间:2016-05-31 来源: eefocus关键字:51单片机  GPIO口  模拟串口通信 手机看文章 扫描二维码
随时随地手机看文章
随着单片机的使用日益频繁,用其作前置机进行采集和通信也常见于各种应用,一般是利用前置机采集各种终端数据后进行处理、存储,再主动或被动上报给管理站。这种情况下下,采集会需要一个串口,上报又需要另一个串口,这就要求单片机具有双串口的功能,但我们知道一般的51系列只提供一个串口,那么另一个串口只能靠程序模拟。

        本文所说的模拟串口, 就是利用51的两个输入输出引脚P1.0和P1.1,置1或0分别代表高低电平,也就是串口通信中所说的位,如起始位用低电平,则将其置0,停止位为高电平,则将其置1,各种数据位和校验位则根据情况置1或置0。

        以11.0592MHz的晶振为例,通过定时计数器0产生中断信号来模拟串口电平,下面附上具体源代码。

[cpp] view plaincopy
 
  1. /* 
  2.  
  3. Fuction:使用51单片机GPIO口模拟串口通信,通过定时计数器0来产生中断信号 
  4. Software Designer:Jason 
  5.  
  6. */  
  7. #include   
  8. sbit P1_0 = P1^0;  
  9. sbit P1_1 = P1^1;  
  10. #define RXD P1_0  
  11. #define TXD P1_1  
  12. unsigned char flag;  
  13. void init();  
  14. void send_byte(unsigned char);  
  15. unsigned char rec_byte();  
  16. void wait_int();  
  17. //将从PC机串口接收到的数据原封不动回传给PC机  
  18. void main()  
  19. {  
  20.     unsigned char temp;  
  21.     init();  
  22.     while(1)  
  23.     {  
  24.         if(RI == 1)  
  25.         {  
  26.             RI = 0;  
  27.             temp = rec_byte();  
  28.             send_byte(temp);  
  29.             while(!TI);  
  30.             TI = 0;  
  31.         }  
  32.     }  
  33. }  
  34. //端口及中断初始化  
  35. void init()  
  36. {  
  37.     TMOD = 0x02;    //定时器0,方式2  
  38.     TH0 = 0xfd;     //波特率9600  
  39.     TL0 = TH0;  
  40.     TR0 = 0;        //在发送或接收时打开  
  41.     ET0 = 1;        //允许定时器0中断  
  42.     EA =1;          //允许所有中断  
  43. }  
  44. //通过串口发送一个字节数据  
  45. void send_byte(unsigned char dat)  
  46. {  
  47.     unsigned char i=8;  
  48.     TR0 = 1;        //开启T0中断  
  49.     TXD = 0;        //发送起始位0  
  50.     wait_int();  
  51.     while(i--)      //发送8位数据  
  52.     {  
  53.         TXD = (bit)(dat & 0x01);  
  54.         wait_int();  
  55.         dat = dat>>1;  
  56.     }  
  57.     TXD = 1;    //发送停止位1  
  58.     wait_int();  
  59.     TR0 = 0;        //关闭T0中断  
  60. }  
  61. //通过串口接收一个字节数据  
  62. unsigned char rec_byte()  
  63. {  
  64.     unsigned char dat=0;  
  65.     unsigned char i=8;  
  66.     TR0 = 1;        //开启T0中断  
  67.     wait_int();     //等过起始位电平  
  68.     while(i--)      //接收8位数据  
  69.     {  
  70.         dat = dat<<1;  
  71.         if(RXD)  
  72.             dat |= 0x80;  
  73.         wait_int();  
  74.     }  
  75.     wait_int();     //等过停止位电平  
  76.     TR0 = 0;        //关闭T0中断  
  77.     return dat;  
  78. }  
  79. //等待中断到来  
  80. void wait_int()  
  81. {  
  82.     while(!flag);  
  83.     flag = 0;  
  84. }  
  85. //中断服务程序  
  86. void timer0() interrupt 1  
  87. {  
  88.     flag = 1;  
  89. }  

关键字:51单片机  GPIO口  模拟串口通信 引用地址:51单片机GPIO口模拟串口通信

上一篇:51单片机 EEPROM AT24c02 存储\读取一个字节
下一篇:51单片机普通IO口模拟IIC总线的程序实现

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

51单片机对SAA7113初始化和控制的程序
  用51单片机对7113初始化和控制   SAA7113的初始化就是对寄存器配置合适的参数,使其能够有符合要求的输出。寄存器配置通过I2C总线来进行,很多可以控制I2C总线的器件都可以作为主器件对7113进行初始化,这里介绍用51单片机初始化7113的例子。   51单片机和7113的硬件连接非常简单,只要把单片机的两个I/O口(如P1.0、P1.0)直接和7113的SCL、SDA管脚相连,再加上上拉电阻即可。   用单片机初始化7113的主要任务是程序的编写,首先要熟悉I2C总线协议,根据I2C总线的原理写出启动、停止、应答信号等的子程序,由子程序再写出发送、接收1个字节的程序,然后根据7113的寄存器操作格式写出
[单片机]
51单片机之IIC&EEPROM的驱动程序
#include #include ./delay/delay.h sbit SCL = P2^0; sbit SDA = P2^1; bit ack = 0; unsigned char flag = 1; #define LCDPORT P0 #define LCD_WRITE_DATA 1 #define LCD_WRITE_COM 0 sbit RS = P2^4; sbit RW = P2^5; sbit E = P2^6; #define SUCC 0 #define ERR 1 void iic_start() { SDA = 1; //先操作SDA,在操作SCL SCL = 1; dela
[单片机]
51单片机RS485通讯程序仿真与MODBUS RTU静止时间详解
仿真原理图如下 由于MODBUS-RTU 要求每帧信息中的数据间隔时间不得超过1.5字符的静止时间。 因此: (1)、当串口产生接收中断后,立即重装“超时定时器”的初始值。(注:超时定时器的初始值和波特率有关) 问题如下:  (a)、由于要求在串口接收中断中重装超时定时器初始值,那么,该超时定时器就只能采用“溢出模式”,而不能采用“CTC模式” (b)、超时定时器必须在程序初始化时就一直开启。 我的理解对吗? (2)两帧之间的3.5字符的静止时间该如何实现呢? 接收到每个字节的时候,初始化定时器就行,最后一个字节后,定时器就溢出了 利用单独的软件定时器,来判断一帧接收报文结束,可以防止若报文接收不完整,该帧通信任务无
[单片机]
<font color='red'>51单片机</font>RS485通讯程序仿真与MODBUS RTU静止时间详解
51单片机入门—蜂鸣器和继电器
我们具体以题目来介绍蜂鸣器和继电器:(在LED灯基本控制的基础上实现的) ULN2003达林顿晶体管和74HC573锁存器 达林顿晶体管的内部构造图: 里面是一个非门,输入1,就会输出0,输入0就会输出1 138译码器可以控制Y0到Y7的锁存器输出低电平,通过编码输出低电平(能输出高电平??) 或非门 从Y5端输入低电平,Y5C输出高电平,使锁存器工作 蜂鸣器和继电器 :记住GND是低电平,VCC是高电平(这就很容易能看懂了) 代码如下: #include reg52.h sbit HC138_C=P2^7; sbit HC138_B=P2^6; sbit HC138_A=P2^5; void
[单片机]
<font color='red'>51单片机</font>入门—蜂鸣器和继电器
基于C51单片机的校园自助导览仪设计
  本文采取硬件解码方案,在单片机上实现了MP3的解码,并加入无线功能,使其向产品靠拢,设计成为一种电子产品“校园自助导览仪”。它的功能和导游一样,具备自助和电子的要素。   本文还对 MP3编码 进行优化,除了算法优化和高级语言的优化之外,还进行了汇编级优化,大大降低了算法的复杂性。   1 系统总体设计   本设计是基于校园的一种电子产品,将旅游景点的解说以MP3格式存储,通过无线形式实现智能控制。该系统能根据观众的位置和需要自动确定解说的语言和内容,使得每个观众不但可以得到每个展位、景点的完整信息,而且能够感受到高清晰、低噪声的音响效果。同时,本设计产品还配有键盘,可以对播放的音频文件进行控制,满足人性化的要求。系统总
[单片机]
基于C<font color='red'>51单片机</font>的校园自助导览仪设计
51单片机查表指令的说明和应用举例
与ROM之间的数据传送。 MOVC A,@A + DPTR MOVC A, @A + PC 执行后会使/PSEN有效。 以DPTR 为基地址的 指令 ,可在ROM 的64KB范围内查表;而以PC为基地址的指令只能在(PC)+ 1为中心上、下256B范围内查表。 例、设(A)= 一个BCD码常数,试用查表法获得其相应的ASCII码。 解法I: MOV DPTR,#TAB MOVC A,@.A+DPTR ••• TAB:DB 30H DB 31H DB 32H,33H,34H,35H 解法II: MOVC A,@A+PC TAB;
[单片机]
51单片机不能正常起振的原因
如何确定晶振正常起振? 1、判断方法很多,用示波器看波形是最直接的,用数字万用表的电压档测电压也行,因晶振波形的占空比为50%,所以测得的平均电压为1/2Vcc左右,对于51单片机,在使用外置程序存储器的时候还可以测PSEN引脚或P0口引脚的电压或波形,只有晶振电路正常工作,那些引脚才会有信号输出,但现在很少采用片外扩展存储器,所以测晶体两端的电压或波形即可,只是晶振电路设计不良时,测试设备的引入有可能导致停振。 2、晶体两端的电压差不是平均电压差,虽然事实上因外电路的影响,晶体两端的电压可能会有差别,但这不是判断晶振是否起振的依据,也不是晶振电路正常工作的条件。至于一高一低没有工作是指一端为Vcc或接近Vcc,另一端为0或接
[单片机]
<font color='red'>51单片机</font>不能正常起振的原因
基于STC12C2051单片机的智能太阳能路灯设计
简介:太阳能路灯的应用具有重要的现实意义,尤其是靠小规模火力发电或季节性水力发电的地区,更应大力发展太阳能电力。太阳能路灯以其先进、稳定、智能、成熟的控制技术及显著的节能特性、简便的维护方式等特点得到推广。随着太阳能照明灯具产品的普及,很多应用项目存在质量和售后服务问题。 太阳能路灯的应用具有重要的现实意义,尤其是靠小规模火力发电或季节性水力发电的地区,更应大力发展太阳能电力。太阳能路灯以其先进、稳定、智能、成熟的控制技术及显著的节能特性、简便的维护方式等特点得到推广。随着太阳能照明灯具产品的普及,很多应用项目存在质量和售后服务问题。因此,需及时分析原因、规范市场,使太阳能路灯市场健康有序地发展。太阳能是地球上最为直接、普遍、
[单片机]
基于STC12C20<font color='red'>51单片机</font>的智能太阳能路灯设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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