#include <reg51.h>
sbit BT_SND = P1 ^ 0;
sbit BT_REC = P1 ^ 1;
/**********************************************
IO 口模拟232通讯程序
使用两种方式的C程序 占用定时器0
**********************************************/
#define MODE_QUICK
#define F_TM F0
#define TIMER0_ENABLETL0=TH0; TR0=1;
#define TIMER0_DISABLE TR0=0;
sbit ACC0 = ACC ^ 0;
sbit ACC1 = ACC ^ 1;
sbit ACC2 = ACC ^ 2;
sbit ACC3 = ACC ^ 3;
sbit ACC4 = ACC ^ 4;
sbit ACC5 = ACC ^ 5;
sbit ACC6 = ACC ^ 6;
sbit ACC7 = ACC ^ 7;
void IntTimer0() interrupt 1
{
F_TM = 1;
}
//发送一个字符
void PSendChar(unsigned char inch)
{
#ifdef MODE_QUICK
ACC = inch;
F_TM = 0;
BT_SND = 0; //start bit
TIMER0_ENABLE; //启动
while (!F_TM);
BT_SND = ACC0; //先送出低位
F_TM = 0;
while (!F_TM);
BT_SND = ACC1;
F_TM = 0;
while (!F_TM);
BT_SND = ACC2;
F_TM = 0;
while (!F_TM);
BT_SND = ACC3;
F_TM = 0;
while (!F_TM);
BT_SND = ACC4;
F_TM = 0;
while (!F_TM);
BT_SND = ACC5;
F_TM = 0;
while (!F_TM);
BT_SND = ACC6;
F_TM = 0;
while (!F_TM);
BT_SND = ACC7;
F_TM = 0;
while (!F_TM);
BT_SND = 1;
F_TM = 0;
while (!F_TM);
TIMER0_DISABLE; //停止timer
#else
unsigned char ii;
ii = 0;
F_TM = 0;
BT_SND = 0; //start bit
TIMER0_ENABLE; //启动
while (!F_TM);
while (ii < 8) {
if (inch & 1) {
BT_SND = 1;
}
else {
BT_SND = 0;
}
F_TM = 0;
while (!F_TM);
ii++;
inch >>= 1;
}
BT_SND = 1;
F_TM = 0;
while (!F_TM);
#endif
TIMER0_DISABLE; //停止timer
}
//接收一个字符
unsigned char PGetChar()
{
#ifdef MODE_QUICK
TIMER0_ENABLE;
F_TM = 0;
while (!F_TM); //等过起始位
ACC0 = BT_REC;
TL0 = TH0;
F_TM = 0;
while (!F_TM);
ACC1 = BT_REC;
F_TM = 0;
while (!F_TM);
ACC2 = BT_REC;
F_TM = 0;
while (!F_TM);
ACC3 = BT_REC;
F_TM = 0;
while (!F_TM);
ACC4 = BT_REC;
F_TM = 0;
while (!F_TM);
ACC5 = BT_REC;
F_TM = 0;
while (!F_TM);
ACC6 = BT_REC;
F_TM = 0;
while (!F_TM);
ACC7 = BT_REC;
F_TM = 0;
while (!F_TM) {
if (BT_REC) {
break;
}
}
TIMER0_DISABLE; //停止timer
return ACC;
#else
unsigned char rch, ii;
TIMER0_ENABLE;
F_TM = 0;
ii = 0;
rch = 0;
while (!F_TM); //等过起始位
while (ii < 8) {
rch >>= 1;
if (BT_REC) {
rch |= 0x80;
}
ii++;
F_TM = 0;
while (!F_TM);
}
F_TM = 0;
while (!F_TM) {
if (BT_REC) {
break;
}
}
TIMER0_DISABLE; //停止timer
return rch;
#endif
}
//检查是不是有起始位
bit StartBitOn()
{
return (BT_REC == 0);
}
void main()
{
unsigned char gch;
TMOD = 0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位
自动重装) */
PCON = 00;
TR0 = 0; //在发送或接收才开始使用
TF0 = 0;
TH0 = (256 - 96); //9600bps 就是 1000000/9600=104.167微秒 执行的
timer是
//
104.167 * 11.0592 / 12 = 96
TL0 = TH0;
ET0 = 1;
EA = 1;
PSendChar(0x55);
PSendChar(0xaa);
PSendChar(0x00);
PSendChar(0xff);
while (1) {
if (StartBitOn()) {
gch = PGetChar();
PSendChar(gch);
}
}
}