首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 维修教程知识 > 学习园地
C51 I/O口模拟串口通讯C源程序
来源:本站整理  作者:佚名  2006-07-22 19:09:25



#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_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);
 }
 }

 }

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)

推荐阅读

图文阅读

热门阅读

Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:133,554.70000 毫秒