/*
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