<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)IO口模擬rs232串口通訊C51程序

          單片機(jī)IO口模擬rs232串口通訊C51程序

          作者: 時(shí)間:2016-11-30 來(lái)源:網(wǎng)絡(luò) 收藏
          此程序已經(jīng)應(yīng)用在本人的一個(gè)項(xiàng)目中非常穩(wěn)定,編寫(xiě)過(guò)程中參考了51hei網(wǎng)站里面的http://www.51hei.com/mcu/1541.html 這篇文章.部分子程序節(jié)選于此.

          #include "reg52.h"
          #include "intrins.h"
          #include "math.h"
          #include "stdio.h"
          sbit BT_SND =P1^5;
          sbit BT_REC =P1^6;
          sbit LED =P1^7;
          bit LED_flage=1;
          //單片機(jī)IO 口模擬232串口通訊程序
          //使用兩種方式的C程序 占用定時(shí)器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;

          本文引用地址:http://www.ex-cimer.com/article/201611/323695.htm

          void IntTimer0() interrupt 1
          {
          F_TM=1;
          }
          //發(fā)送一個(gè)字符
          void PSendChar(unsigned char inch)
          {
          #ifdef MODE_QUICK
          ACC=inch;
          F_TM=0;
          BT_SND=0; //start bit
          TIMER0_ENABLE; //啟動(dòng)
          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; //啟動(dòng)
          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
          }
          //接收一個(gè)字符
          unsigned char PGetChar()
          {
          #ifdef MODE_QUICK
          TIMER0_ENABLE;
          F_TM=0;
          while(!F_TM); //等過(guò)起始位
          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); //等過(guò)起始位
          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);
          }
          //定時(shí)器1初始化
          void Time1_Init(void)
          {
          TMOD=0x22; //定時(shí)器1為工作模式2(8位自動(dòng)重裝),0為模式2(8位自動(dòng)重裝)
          PCON=00;
          TR0=0; //在發(fā)送或接收才開(kāi)始使用
          TF0=0;
          TH0=(256-96); //9600bps 就是 1000000/9600=104.167微秒 執(zhí)行的timer//104.167*11.0592/12= 96
          TL0=TH0;
          ET0=1;
          EA=1;
          }
          //發(fā)送字符串
          void Send_Char(char *byte)
          {
          int i=0;
          for(i=0;*(byte+i)!=看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();