歡迎您光臨本站 登入註冊首頁

51 IO口模擬串口通訊C源程序

admin @ 2014-03-14 , reply:0

概述

#include<reg51.h> sbitBT_SND=P1^0; sbitBT_REC=P1^1; /**************************……

#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();

[admin via 研發互助社區 ] 51 IO口模擬串口通訊C源程序已經有2147次圍觀

http://cocdig.com/docs/show-post-496.html