2011-08-03 11:06 6387人阅读 评论(2) 收藏 举报
本文章已收录于:

 
分类:
深入C语言(20)

作者同类文章X

 #include "reg52.h"
#include "intrins.h"
#include "math.h"
#include "stdio.h"
sbit BT_SND =P1^;
sbit BT_REC =P1^;
sbit LED =P1^;
bit LED_flage=;
//IO 口模拟232通讯程序
//使用两种方式的C程序 占用定时器0
#define MODE_QUICK
#define F_TM F0
#define TIMER0_ENABLE TL0=TH0; TR0=1;
#define TIMER0_DISABLE TR0=0;
sbit ACC0= ACC^;
sbit ACC1= ACC^;
sbit ACC2= ACC^;
sbit ACC3= ACC^;
sbit ACC4= ACC^;
sbit ACC5= ACC^;
sbit ACC6= ACC^;
sbit ACC7= ACC^; void IntTimer0() interrupt
{
F_TM=;
}
//发送一个字符
void PSendChar(unsigned char inch)
{
#ifdef MODE_QUICK
ACC=inch;
F_TM=;
BT_SND=; //start bit
TIMER0_ENABLE; //启动
while(!F_TM);
BT_SND=ACC0; //先送出低位
F_TM=;
while(!F_TM);
BT_SND=ACC1;
F_TM=;
while(!F_TM);
BT_SND=ACC2;
F_TM=;
while(!F_TM);
BT_SND=ACC3;
F_TM=;
while(!F_TM);
BT_SND=ACC4;
F_TM=;
while(!F_TM);
BT_SND=ACC5;
F_TM=;
while(!F_TM);
BT_SND=ACC6;
F_TM=;
while(!F_TM);
BT_SND=ACC7;
F_TM=;
while(!F_TM);
BT_SND=;
F_TM=;
while(!F_TM);
TIMER0_DISABLE; //停止timer
#else
unsigned char ii;
ii=;
F_TM=;
BT_SND=; //start bit
TIMER0_ENABLE; //启动
while(!F_TM);
while(ii<)
{
if(inch&)
{
BT_SND=;
}
else
{
BT_SND=;
}
F_TM=;
while(!F_TM);
ii++;
inch>>=;
}
BT_SND=;
F_TM=;
while(!F_TM);
#endif
TIMER0_DISABLE; //停止timer
}
//接收一个字符
unsigned char PGetChar()
{
#ifdef MODE_QUICK
TIMER0_ENABLE;
F_TM=;
while(!F_TM); //等过起始位
ACC0=BT_REC;
TL0=TH0;
F_TM=;
while(!F_TM);
ACC1=BT_REC;
F_TM=;
while(!F_TM);
ACC2=BT_REC;
F_TM=;
while(!F_TM);
ACC3=BT_REC;
F_TM=;
while(!F_TM);
ACC4=BT_REC;
F_TM=;
while(!F_TM);
ACC5=BT_REC;
F_TM=;
while(!F_TM);
ACC6=BT_REC;
F_TM=;
while(!F_TM);
ACC7=BT_REC;
F_TM=;
while(!F_TM)
{
if(BT_REC)
{
break;
}
}
TIMER0_DISABLE; //停止timer
return ACC;
#else
unsigned char rch,ii;
TIMER0_ENABLE;
F_TM=;
ii=;
rch=;
while(!F_TM); //等过起始位
while(ii<)
{
rch>>=;
if(BT_REC)
{
rch|=0x80;
}
ii++;
F_TM=;
while(!F_TM);
}
F_TM=;
while(!F_TM)
{
if(BT_REC)
{
break;
}
}
TIMER0_DISABLE; //停止timer
return rch;
#endif
}
//检查是不是有起始位
bit StartBitOn()
{
return (BT_REC==);
}
//定时器1初始化
void Time1_Init(void)
{
TMOD=0x22; //定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装)
PCON=;
TR0=; //在发送或接收才开始使用
TF0=;
TH0=(-); //9600bps 就是 1000000/9600=104.167微秒 执行的timer//104.167*11.0592/12= 96
TL0=TH0;
ET0=;
EA=;
}
//发送字符串
void Send_Char(char *byte)
{
int i=;
for(i=;*(byte+i)!='\0';i++)
{
PSendChar(*(byte+i));
}
}
//void delay(int x)
//{
// int a,b;
// for(a=x;a>0;a--)
// for(b=10;b>0;b--);
//}
//void main()
//{
// unsigned char gch;
// Time1_Init();
// LED=0;
// // Send_Char("S00.0C00.0%E00.0C00.0%L00000lx");
// while(1)
// {
//
// PSendChar('1');
// delay(1000);
//// if(StartBitOn())
//// {
//// gch=PGetChar();
//// if(gch=='1')
//// {
//// LED=LED_flage;
//// delay(1000);
//// LED_flage=~LED_flage;
//// }
////
//// }
//
// }
//
//}

版权声明:本文为博主原创文章,未经博主允许不得转载。

        随着单片机的使用日益频繁,用其作前置机进行采集和通信也常见于各种应用,一般是利用前置机采集各种终端数据后进行处理、存储,再主动或被动上报给管理站。这种情况下下,采集会需要一个串口,上报又需要另一个串口,这就要求单片机具有双串口的功能,但我们知道一般的51系列只提供一个串口,那么另一个串口只能靠程序模拟。

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

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

51单片机GPIO口模拟串口通信的更多相关文章

  1. stm32 普通IO口模拟串口通信

    普通IO口模拟串口通信 串口通信协议 串口传输 默认 波特率9600 1起始位 1停止位 其他0 数据位是8位(注意图上的给错了). 传输时,从起始位开始,从一个数据的低位(LSB)开始发送,如图从左 ...

  2. 关于51单片机P0口的结构及上拉问题

    1.P0作为地址数据总线时,V1和V2是一起工作的,构成推挽结构.高电平时,V1打开,V2截止:低电平时,V1截止,V2打开.这种情况下不用外接上拉电阻.而且,当V1打开,V2截止,输出高电平的时候, ...

  3. [51单片机] nRF24L01 无线模块 串口法命令 通过无线控制另一个的灯

    >_<!概述: 这是在上一个的基础上通过按键发送4种不同命令来控制接收端的LED灯亮的改进版(上一个:http://www.cnblogs.com/zjutlitao/p/3840013. ...

  4. 使用linux内核hrtimer高精度定时器实现GPIO口模拟PWM,【原创】

    关键词:Android  linux hrtimer 蜂鸣器  等待队列 信号量 字符设备 平台信息:内核:linux3.4.39 系统:android/android5.1平台:S5P4418  作 ...

  5. 如何检测 51单片机IO口的下降沿

    下降沿检测,说白了就是满足这样一个逻辑,上次检测是1,这次检测是0,就是下降沿. 从这个条件可知,要确保能够正确检测到一个下降沿,负脉冲的宽度,必须大于一个检测周期,当负脉冲宽度小于一个检测周期,就有 ...

  6. Arduino和C51之串口通信

    技术:51单片机.Arduino.串口通信   概述 本文主要讲解串口通信技术的使用方法,并通过串口点灯实验介绍了51单片机和Arduino串口的使用,为初学者学习串口知识提供帮助 详细 代码下载:h ...

  7. STM32GPIO口8种模式细致分析(类比51单片机)

    关于STM32GPIO口的8种工作模式,我们先引出一些问题? STM32GPIO口如果既要输入又要输出怎么办? 1.浮空输入模式 上图红色的表示便是浮空输入的过程,外部输入时0读出的就是0,外部输入时 ...

  8. Linux 虚拟串口及 Qt 串口通信实例

    Linux 虚拟串口及 Qt 串口通信实例 2011-06-22 17:49 佚名 互联网 字号:T | T Linux 虚拟串口及 Qt 串口通信实例是本文所要介绍的内容,在实现过程中,打开了两个伪 ...

  9. STM32之模拟串口设计

    一.设计用途: 公司PCB制成板降成本,选择的MCU比项目需求少一个串口,为满足制成板成本和项目对串口需求,选择模拟一路串口. 二.硬件电路: 三.设计实现: 工具&软件:STM32F030R ...

随机推荐

  1. iOS监听模式系列之IOS中的几中观察监听模式

    本文介绍Objective C中实现观察者模式(也被称为广播者/监听者.发布/注册或者通知)的五种方法以及每种方法的价值所在. 该文章将包括: 1 手动广播者和监听者(Broadcaster and ...

  2. js中获取方法名

    var tmp = arguments.callee.toString(); var re = /function\s*(\w*)/i; var matches = re.exec(tmp);//方法 ...

  3. IE中调试JS的一款很好的工具

    附件是 IE中调试JS的一款很好用的工具,欢迎下载使用.  具体使用方法为:  1.先安装Companion.JS文件(install.exe).  2.安装Microsoft Script Debu ...

  4. HDU-5705

    Clock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Problem De ...

  5. 一个简单的小小记账本程序(java)

    感觉基础知识学了不少,但是一直搞不清一个项目的实际开发流程,所以就借着这个小记账本的程序梳理一下.因为楼主也是出于学习阶段的菜鸟,所以程序可能会有各种玄学的bug,希望一起提升吧. 跟着站长学到了很多 ...

  6. html居中定位

    <!DOCTYPE html PUBLIC "-//W3C//Ddiv XHTML 1.0 divansitional//EN" "http://www.w3.or ...

  7. php坏境安装Xdebug详情步骤

    原创,转载请注明出处! Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况,可以说是程序员必备的一个工具之一.好了,进入正题: 1.下 ...

  8. sudo apt-get 与 yum安装有啥区别

    rpm包和deb包是两种Linux系统下最常见的安装包格式,在安装一些软件或服务的时候免不了要和它们打交道. rpm包主要应用在RedHat系列包括 Fedora等发行版的Linux系统上, deb包 ...

  9. JDK及JRE目录结构

    JDK文件结构及目录: c:\jdk1.7.0: JDK安装根目录,包括版权.许可证和READEME文件,还包含ser.zip记录Java平台档案. c:\jdk1.7.0\bin 包含在Java开发 ...

  10. Java 核心卷学习笔记(一)

    Java基程序设计结构 1.注释 三种注释方式: // 注释单行 /* 内容 */ 注释单行 /** * 内容 */