当前位置:文档之家› STC15F104E的软件模拟串口程序文档

STC15F104E的软件模拟串口程序文档

/*

f014 的串口头文件,此文件包含STC15F104E的官方头文件,故需要有STC的官方头文件
此头文件的外部用法是,先调用f104_comminit()初始化,
comm_flag为是否有数据接收到,0为无数据,1为有数据 comm_flag需手动清0;
recv_byte()为接收函数,trans_byte()为发送函数 dat为接收到的数据
以下为典型用法
f104_comminit();
while(1)
{
if(comm_flag==1)
{
tran_byte(dat); //dat为已经接收到的数据
comm_flag=0;
}
}
*/


#include"f104e.h"

#ifndef __F104COM_H_
#define __F104COM_H_

sbit rxd=P3^0;
sbit txd=P3^1;
typedef bit bool;
typedef unsigned char byte;
extern bit comm_flag; //主文件中声明
extern byte dat;

bit flag;

byte r_data,t_data;


void f104_comminit()
{
TMOD=0x00; //定时器0 16位自动重装模式定时器
AUXR=0x80; //1T模式
TL0=(65536-1180)%256; //11.0592M,9600bps
TH0=(65536-1180)/256; //此处为实验值,具体的算法,我也不知道
ET0=1; //定时器0
PT0=1; //定时器0优先级
EA=1;
TF0=0; //开总中断

INT_CLKO|=0x40; //开外部中断4


flag=0;
txd=1;
r_data=0x00;
comm_flag=0;
}

void f104_commdelay()
{
int i;
for(i=0;i<98;i++);
}

bool orstart()
{
return (rxd==0);
}

byte recv_byte()
{
char i;
r_data=0x00;
if(orstart()==1) //此处多余,但是为了有开始位,故意加上
{
// comm_flag=1;
f104_commdelay(); //延时半个周期,如果用TR0会有误码现象
TR0=1;
for(i=0;i<8;i++)
{
if(rxd)
r_data+=(0x01<else
r_data=r_data;

while(!flag);
flag=0;
}
while(!flag)
if(rxd) break;
}
TR0=0;
flag=0;
return r_data;
}


void tran_byte(byte ch)
{
char i;
TR0=1;
INT_CLKO&=0xbf;
txd=0;
while(!flag);
flag=0;
for(i=0;i<=7;i++)
{
txd=(bit)(ch&0x01);
ch>>=1;
while(!flag);
flag=0;
}
txd=1;
while(!flag);
TR0=0;
INT_CLKO|=0x40;
flag=0;
}


void timer() interrupt 1
{
flag=1;
}


void extern_int4() interrupt 16
{
INT_CLKO&=0xbf;
dat=recv_byte();
comm_flag=1;
INT_CLKO|=0x40;
}


#endif

相关主题
文本预览
相关文档 最新文档