原创 C167 IO口模拟串口程序

2007-8-23 16:16 3036 3 3 分类: MCU/ 嵌入式

   最近写了一个C167的IO口模拟串口程序,说是写,其实是参考了别人写的51程序,然后自己作了一些改动。本来51程序中的用中断置标志位,发现在167中不好用,所以就改用查询方式,效果也一样。


   程序如下:


/**********************************************


C167 IO 口模拟串口异步通讯程序


使用查询方式的C程序 占用定时器T3


**********************************************/
#include"reg167.h"



sbit DP3_8 = DP3^8;
sbit DP4_7 = DP4^7;
sbit BT_SND =P4^7;
sbit BT_REC =P3^8;


void PSendChar(unsigned char inch)
{
unsigned char ii;
ii=0;
T3IR=0;
BT_SND=0; //start bit
T3R=1;//启动
while(!T3IR);


while(ii<8)
{
if(inch&1)
{
BT_SND=1;
}
else
{
BT_SND=0;
}
T3IR=0;
while(!T3IR);
ii++;
inch>>=1;
}
BT_SND=1;
T3IR=0;
while(!T3IR);
T3R=0; //停止
}


//接收一个字符
unsigned char PGetChar()
{
unsigned char rch,ii;
T3R=1;
T3IR=0;
ii=0;
rch=0;
while(!T3IR); //等过起始位


while(ii<8)
{
rch>>=1;
if(BT_REC)
{
rch|=0x80;
}
ii++;
T3IR=0;
while(!T3IR);


}
T3IR=0;
while(!T3IR)
{
if(BT_REC)
{
break;
}


}
T3R=0; //停止timer
return rch;
}
//检查是不是有起始位
bit StartBitOn()
{
return  (BT_REC==0);


}
void main()
{
unsigned char gch;
DP3_8 = 0;
DP4_7 = 1;


T3CON=0x0002; //T3工作在定时方式,输入频率为625KHZ,加计数
T4CON=0x0027;//T4工作在重装载方式
T3R=0; //在发送或接收才开始使用
T3IR=0;
T3=65471;
T4=65471;
T3IE=1;
IEN=1;


PSendChar(0x55);
PSendChar(0xaa);
PSendChar(0x00);
PSendChar(0xff);


while(1)
{
if(StartBitOn())
{
gch=PGetChar();
PSendChar(gch);
}
}


}


附51模拟串口程序---------------------------------------------------------------------------------------------------


51 IO口模拟串口通讯C源程序
[ 2007-8-14 11:58:00 | By: lovesam1983 ]
 
#i nclude
sbit BT_SND =P1^0;
sbit BT_REC =P1^1;
/**********************************************


IO 口模拟232通讯程序


使用两种方式的C程序 占用定时器0


**********************************************/


#define MODE_QUICK


#define F_TM F0


#define TIMER0_ENABLE  TL0=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);
}
}


}
 


   

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条