本程序是模拟串口硬件机制写的,对硬件熟悉的人看着会方便些
使用时可设一定时中断,时间间隔为1/4波特率,每中断一次调用一次接收函数,每中断4次调用一次发送函数 。
不过.对单片机来说时钟并须要快.要知道9600的波特率的每个BIT的时间间隔是104us.而单片机中断一次压栈出栈一次的时间是20us左右(标准的51核12M晶体)这样处理时间就要考虑清楚了.呵呵.以下程序是放在定时器中断程序函数内的
//接收部分
sbitJieShou_D=;//定义接收端口
uint8DingShiJiShu,JieShou_h;//定时计数,接收缓冲器
uint16JieShou_T;//接收临时寄存器
bitKaiShi,JieShou_b;//开始接收标准,接收完成标志
voidJieShou(void)//接收函数,每4次调用接收一位
{
if((KaiShi==0)&&(JieShou_D==0))//串行开始位到来
{
DingShiJiShu=0;//开始定时计数
KaiShi=1;
JieShou_T=0xffff;//接收临时寄存器置全1
}
elseif((KaiShi==1)&&(DingShiJiShu==1))//第2次调用,串行数据采样时间到来
{
JieShou_T>>=1;
if(JieShou_D)JieShou_T|=0x8000;
}
elseif(JieShou_T&0x807f==0x803f)//接收完成JieShou_T=1xxx_xxxx_x011_1111
{
KaiShi=0;
DingShiJiShu=0;
JieShou_h=JieShou_T>>7;//右移7位得到串行数据
JieShou_b=1;
}
if(KaiShi)
{
DingShiJiShu++;//只在开始接收时定时计数+1
DingShiJiShu&=0x03;//每4次调用接收一位
}
}
//发送部分
sbitFaSong_D=;//定义发送端口
uint16FaSong_h;//发送缓冲区
bitFaSong_b;//发送完成标志
voidKaiShiFaSong(uint8fs)//设置发送数据,开始发送
{
FaSong_h=fs;
FaSong_h<<=1;
FaSong_h|=0x0200;//FaSong_h=0000_001x_xxxx_xxx_0
FaSong_b=0;//发送标志=0表示正在发送中
}
voidFaSong(void)//发送函数,每调用一次发一位
{
if(FaSong_h)//发送未完成
{
if(FaSong_h&0x0001)
FaSong_D=1;
elseFaSong_D=0;
FaSong_h>>=1;
}
else
FaSong_b=1;//发送完成标志=1表示发送完成
}