/***************************************************************
* 在单片机上模拟了一个串口,使用P2.1作为发送端
* 把单片机中存放的数据通过P2.1作为串口TXD发送出去
***************************************************************/
#include <STC12C56.h>
#include <string.h>
typedef unsigned char uchar;
sbit newTXD = P3^1; //模拟串口的发送端设为P3.1
//*****************************************长延时*****************************************
void Delay(unsigned int i)
{
while(--i);
}
void UartInit()
{
SCON = 0x50; // SCON: serail mode 1, 8-bit UART
TMOD |= 0x20; // T1工作在方式2,8位自动重载
PCON |= 0x80; // SMOD=1;
TH1 = 0xFA; // 定时器1初始值,模拟串口的波特率为9600bps fosc=11.0592MHz
TL1 = 0xFA; // 模拟串口的波特率为9600bps fosc=11.0592MHz
TR1 = 1;
}
//查询计数器溢出标志位
void WaitTF1( void )
{
while(!TF0);
TF1=0;
}
void Send_Byte(uchar input)
{
uchar j=8;
TR1=1;
newTXD=(bit)0;
WaitTF1();
while(j--)
{
newTXD=(input&0x01); //先传低位
WaitTF1();
input=input>>1;
}
newTXD=(bit)1; //发送结束位
WaitTF1();
TR1=0;
}
void main()
{
P3=0xff;
UartInit();
while(1)
{
Send_Byte(0x55);
Delay(500);
}
}
/***************************************************************
* 模拟接收程序,这个程序的作用从模拟串口接收数据,然后将这些数据发送到实际串口
* 在单片机上模拟了一个串口,使用P3.2作为发送和接收端
* 以P3.2模拟串口接收端,从模拟串口接收数据发至串口
***************************************************************/
//#include<reg51.h>
//#include<stdio.h>
//#include<string.h>
typedef unsigned char uchar;
//这里用来切换晶振频率,支持11.0592MHz和18.432MHz
//#define F18_432
#define F11_0592
uchar tmpbuf2[64]={0}; //用来作为模拟串口接收数据的缓存
struct
{
uchar recv :6 ; //tmpbuf2数组下标,用来将模拟串口接收到的数据存放到tmpbuf2中
uchar send :6 ; //tmpbuf2数组下标,用来将tmpbuf2中的数据发送到串口
}tmpbuf2_point={0,0};
sbit newRXD=P3^2 ; //模拟串口的接收端设为P3.2
void UartInit()
{
SCON=0x50 ; // SCON: serail mode 1, 8-bit UART
TMOD|=0x21; // TMOD: timer 1, mode 2, 8-bit reload,自动装载预置数(自动将TH1送到TL1);T0工作在方式1,十六位定时
PCON|=0x80; // SMOD=1;
#ifdef F11_0592
TH1=0xE8; // Baud:2400 fosc=11.0592MHz 2400bps为从串口接收数据的速率
TL1=0xE8; // 计数器初始值,fosc=11.0592MHz 因为TH1一直往TL1送,所以这个初值的意义不大
TH0=0xFF; // 定时器0初始值,延时208us,目的是令模拟串口的波特率为9600bps fosc=11.0592MHz
TL0=0xA0; // 定时器0初始值,延时208us,目的是令模拟串口的波特率为9600bps fosc=11.0592MHz
#endif
#ifdef F18_432
TH1=0xD8; // Baud:2400 fosc=18.432MHz 2400bps为从串口接收数据的速率
TL1=0xD8; // 计数器初始值,fosc=18.432MHz 因为TH1一直往TL1送,所以这个初值的意义不大
TH0=0xFF; // 定时器0初始值,延时104us,目的是令模拟串口的波特率为9600bps fosc=18.432MHz
TL0=0x60; // 定时器0初始值,延时104us,目的是令模拟串口的波特率为9600bps fosc=18.432MHz
#endif
IE|=0x81; // 中断允许总控制位EA=1;使能外部中断0
TF0=0;
IT0=1; // 设置外部中断0为边沿触发方式
TR1=1; // 启动TIMER1,用于产生波特率
}
void WaitTF0(void)
{
while(!TF0);
TF0=0 ;
#ifdef F11_0592
TH0=0xFF ; // 定时器重装初值 模拟串口的波特率为9600bps fosc=11.0592MHz
TL0=0xA0 ; // 定时器重装初值 模拟串口的波特率为9600bps fosc=11.0592MHz
#endif
#ifdef F18_432
TH0=0xFF ; // 定时器重装初值 fosc=18.432MHz
TL0=0x60 ; // 定时器重装初值 fosc=18.432MHz
#endif
}
//接收一个字符
uchar RByte()
{
uchar Output=0;
uchar i=8;
TR0=1; //启动Timer0
#ifdef F11_0592
TH0=0xFF; //定时器重装初值 模拟串口的波特率为9600bps fosc=11.0592MHz
TL0=0xA0; //定时器重装初值 模拟串口的波特率为9600bps fosc=11.0592MHz
#endif
#ifdef F18_432
TH0=0xFF ;// 定时器重装初值 fosc=18.432MHz
TL0=0x60 ;// 定时器重装初值 fosc=18.432MHz
#endif
TF0=0 ;
WaitTF0();//等过起始位
//接收8位数据位
while(i--)
{
Output>>=1 ;
if(newRXD)Output|=0x80 ; //先收低位
WaitTF0(); //位间延时
}
TR0=0 ; //停止Timer0
return Output;
}
//向COM1发送一个字符
void SendChar(uchar byteToSend)
{
SBUF=byteToSend;
while(!TI);
TI=0 ;
}
void main()
{
UartInit();
while(1)
{
if(tmpbuf2_point.recv!=tmpbuf2_point.send)//差值表示模拟串口接收数据缓存中还有多少个字节的数据未被处理(发送至串口)
{
SendChar(tmpbuf2[tmpbuf2_point.send++]);
}
}
}
//外部中断0,说明模拟串口的起始位到来了
void Simulated_Serial_Start()interrupt 0
{
EX0=0 ; //屏蔽外部中断0
tmpbuf2[tmpbuf2_point.recv++]=RByte(); //从模拟串口读取数据,存放到tmpbuf2数组中
IE0=0 ; //防止外部中断响应2次,防止外部中断函数执行2次
EX0=1 ; //打开外部中断0
}
普通单片机IO口模拟UART程序
5星 · 超过95%的资源 需积分: 5 72 浏览量
2011-05-05
17:25:29
上传
评论 1
收藏 16KB RAR 举报
sampsonMrLiang
- 粉丝: 116
- 资源: 7
最新资源
- IMG_20240425_190941.jpg
- 基于stm32的pid控制算法附带串口控制台
- 实验项目一:线性表(模板 ).docx
- 基于LM317A设计交流220V输入可调5V-12V直流输出稳压电源电路multisim10仿真源文件.zip
- Screenshot_2024-04-25-17-04-18-55_2332cb9b27b851b548ba47a91682926c.jpg
- -基于AVR单片机的LNG加液机控制器设计.pdf
- ThePowerOfNow-EckhartTolle.mobi
- BLOCK_TYPE_HEARTBEAT_D70A3465D4EE4E9_046141_dump_1st.dmp
- 项目方法测试调用接口工具
- studyupdate
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页