标题:
51单片机模拟串口程序源码
[打印本页]
作者:
promise
时间:
2017-3-14 11:47
标题:
51单片机模拟串口程序源码
51单片机做的模拟串口程序源码
0.png
(47.68 KB, 下载次数: 55)
下载附件
2017-3-15 04:47 上传
#include "Usart.h"
bit RXD_OK=0; //接收完成标志位
bit TXD_OK=0; //发送完成标志位
bit Send_State=0; //发送开始标志位
bit Sending_Flag=0; //发送中标志位
uchar RXD_Data=0; //接收数据缓存区
uchar TXD_Data=0; //发送数据缓存区
sbit led1=P3^6;
sbit led2=P3^5;
sbit led3=P3^4;
/***************************************************************************
*函数名称:Usart_Init(uint Baud)
*功能 :串口初始化 波特率对应定时器溢出初值(11.0592)
*入口参数:波特率 4800 192
*出口参数:无 2400 128
*说明 : 1200 0
***************************************************************************/
void Usart_Init(uint Baud)
{
uchar T0_Low=0;
T0_Low=(Crystal/(12*Baud))/3; //求出定时器初值 3倍采样速率
TMOD|=0x02; //定时器0自动重装模式
TH0=TL0=256-T0_Low;
ET0=TR0=1;
EA=1;
}
/***************************************************************************
*函数名称:Data_RXD()
*功能 :数据接收
*入口参数:无
*出口参数:无
*说明 :
***************************************************************************/
void Data_RXD()
{
static uchar RXD_State=0;
static uchar RXD_Cnt=0;
static uchar RXD_Count=0;
switch (RXD_State)
{
case 0: //3倍采样速率采起始位
{
if(RXD_IO==0)
RXD_State=1;
}break;
case 1: //采到两次起始位
{ //采样频率校准到1/3与2/3之前
if(RXD_IO==0)
RXD_State=2;
else RXD_State=0;
}break;
case 2: //以正常波特率采样,取出八位数据位
{
if(++RXD_Cnt>=3)
{
RXD_Cnt=0;
if(RXD_IO==1)
RXD_Data=RXD_Data|(1<<RXD_Count);
if(++RXD_Count>=8)
{
RXD_Count=0;
RXD_State=3;
}
}
}break;
case 3: //取出结束位
{ //结束位正常接收完成标志位置1
if(++RXD_Cnt>=3)
{
RXD_Cnt=0;
if(RXD_IO==1)
{
RXD_OK=1;
RXD_State=0;
}
else
{
RXD_Data=0;
RXD_State=0;
}
}
}break;
}
}
/***************************************************************************
*函数名称:Data_TXD_Buff(uchar Data_TXD)
*功能 :数据送入发送缓存器
*入口参数:待发送数据
*出口参数:无
*说明 :
***************************************************************************/
void Data_TXD_Buff(uchar Data_TXD)
{
TXD_Data=Data_TXD; //数据送入缓存区
while(Sending_Flag);
Send_State=1; //发送开始标志位
}
/***************************************************************************
*函数名称:Data_TXD()
*功能 :数据发送
*入口参数:待发送数据
*出口参数:无
*说明 :
***************************************************************************/
void Data_TXD()
{
static uchar TXD_State=0;
static uchar TXD_Cnt=0;
static uchar TXD_i=0;
if(++TXD_i>=3)
{
TXD_i=0;
switch (TXD_State)
{
case 0: //检测发送开始标志位
{
TXD_IO=1;
if(Send_State==1)
{
Send_State=0;
TXD_State=1;
Sending_Flag=1; //发送中标志位置1
TXD_Cnt=0;
TXD_IO=0; //发送起始位
}
}break;
case 1: //发送八位数据
{ //八位数据从低到高发送
TXD_IO=TXD_Data&(1<<TXD_Cnt);
if(++TXD_Cnt>=8)
{
TXD_Cnt=0;
TXD_State=2;
}
}break;
case 2:
{
TXD_IO=1; //发送结束位
TXD_State=3;
}break;
case 3:
{
TXD_State=0;
Sending_Flag=0; //发送中标志位清0
TXD_Data=0;
TXD_OK=1;
}break;
}
}
}
/***************************************************************************
*函数名称:TimerT0()
*功能 :定时器T0中断
*入口参数:无
*出口参数:无
*说明 :
***************************************************************************/
void TimerT0()interrupt 1
{
Data_RXD();
Data_TXD();
}
复制代码
0.png
(59.27 KB, 下载次数: 63)
下载附件
2017-3-15 04:48 上传
下载:
模拟串口.zip
(41.61 KB, 下载次数: 88)
2017-3-14 11:47 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
赵会民
时间:
2018-4-16 21:52
正在找这个资料呢
作者:
huoguanglin107
时间:
2019-6-26 13:42
有硬件原理图吗
作者:
huoguanglin107
时间:
2019-6-26 13:43
有原理图或者PCB文件吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1