51单片机IO口模拟串口通讯4


硬件环境:STC89C52

软件环境:IDE Keil uVision V4.10

                    编译器 C51 V9.0

代码如下:

[cpp]  view plain copy
  1. /********************************************** 
  2. 硬件:11.0592MHz晶振,STC89C52,RXD P1.0 TXD P1.1 
  3. 波特率:9600 
  4. 描述:这是网上《51单片机模拟串口的三种方法》中附的程序 
  5.       占用定时器0 
  6.  
  7. 时间:2012.07.25 于单位 
  8. **********************************************/  
  9.   
  10. #include "reg52.h"  
  11. sbit BT_SND =P1^1;  
  12. sbit BT_REC =P1^0;  
  13. /********************************************** 
  14.  
  15. IO 口模拟232通讯程序 
  16.  
  17. 使用两种方式的C程序 占用定时器0 
  18.  
  19. **********************************************/  
  20.   
  21. #define MODE_QUICK  
  22.   
  23. #define F_TM F0  
  24.   
  25. #define TIMER0_ENABLE   TL0=TH0; TR0=1;  
  26. #define TIMER0_DISABLE TR0=0;  
  27.   
  28. sbit ACC0=    ACC^0;  
  29. sbit ACC1=    ACC^1;  
  30. sbit ACC2=    ACC^2;  
  31. sbit ACC3=    ACC^3;  
  32. sbit ACC4=    ACC^4;  
  33. sbit ACC5=    ACC^5;  
  34. sbit ACC6=    ACC^6;  
  35. sbit ACC7=    ACC^7;  
  36.   
  37. void IntTimer0() interrupt 1  
  38. {  
  39.     F_TM=1;  
  40. }  
  41.   
  42. //发送一个字符  
  43. void PSendChar(unsigned char inch)  
  44. {  
  45.     #ifdef MODE_QUICK  
  46.         ACC=inch;  
  47.           
  48.         F_TM=0;  
  49.         BT_SND=0;           //start bit  
  50.         TIMER0_ENABLE;      //启动  
  51.         while(!F_TM);  
  52.           
  53.         BT_SND=ACC0;        //先送出低位  
  54.         F_TM=0;  
  55.         while(!F_TM);  
  56.           
  57.         BT_SND=ACC1;  
  58.         F_TM=0;  
  59.         while(!F_TM);  
  60.           
  61.         BT_SND=ACC2;  
  62.         F_TM=0;  
  63.         while(!F_TM);  
  64.           
  65.         BT_SND=ACC3;  
  66.         F_TM=0;  
  67.         while(!F_TM);  
  68.           
  69.         BT_SND=ACC4;  
  70.         F_TM=0;  
  71.         while(!F_TM);  
  72.           
  73.         BT_SND=ACC5;  
  74.         F_TM=0;  
  75.         while(!F_TM);  
  76.           
  77.         BT_SND=ACC6;  
  78.         F_TM=0;  
  79.         while(!F_TM);  
  80.           
  81.         BT_SND=ACC7;  
  82.         F_TM=0;  
  83.         while(!F_TM);  
  84.           
  85.         BT_SND=1;  
  86.         F_TM=0;  
  87.         while(!F_TM);  
  88.           
  89.           
  90.         TIMER0_DISABLE;     //停止timer  
  91.     #else  
  92.         unsigned char ii;  
  93.           
  94.         ii=0;  
  95.           
  96.         F_TM=0;  
  97.         BT_SND=0;           //start bit  
  98.         TIMER0_ENABLE;      //启动  
  99.         while(!F_TM);  
  100.           
  101.         while(ii<8)  
  102.         {  
  103.         if(inch&1)  
  104.         {  
  105.         BT_SND=1;  
  106.         }  
  107.         else  
  108.         {  
  109.         BT_SND=0;  
  110.         }  
  111.         F_TM=0;  
  112.         while(!F_TM);  
  113.         ii++;  
  114.         inch>>=1;  
  115.         }  
  116.         BT_SND=1;  
  117.         F_TM=0;  
  118.         while(!F_TM);  
  119.           
  120.     #endif  
  121.   
  122.     TIMER0_DISABLE;         //停止timer  
  123. }  
  124.   
  125. //接收一个字符  
  126. unsigned char PGetChar()  
  127. {  
  128.     #ifdef MODE_QUICK  
  129.       
  130.         TIMER0_ENABLE;  
  131.         F_TM=0;  
  132.         while(!F_TM);       //等过起始位  
  133.         ACC0=BT_REC;  
  134.           
  135.         TL0=TH0;  
  136.           
  137.         F_TM=0;  
  138.         while(!F_TM);  
  139.         ACC1=BT_REC;  
  140.           
  141.         F_TM=0;  
  142.         while(!F_TM);  
  143.         ACC2=BT_REC;  
  144.           
  145.         F_TM=0;  
  146.         while(!F_TM);  
  147.         ACC3=BT_REC;  
  148.           
  149.         F_TM=0;  
  150.         while(!F_TM);  
  151.         ACC4=BT_REC;  
  152.           
  153.         F_TM=0;  
  154.         while(!F_TM);  
  155.         ACC5=BT_REC;  
  156.           
  157.         F_TM=0;  
  158.         while(!F_TM);  
  159.         ACC6=BT_REC;  
  160.           
  161.         F_TM=0;  
  162.         while(!F_TM);  
  163.         ACC7=BT_REC;  
  164.           
  165.         F_TM=0;  
  166.           
  167.         while(!F_TM)  
  168.         {  
  169.         if(BT_REC)  
  170.         {  
  171.         break;  
  172.         }  
  173.         }  
  174.         TIMER0_DISABLE;     //停止timer  
  175.         return ACC;  
  176.     #else  
  177.         unsigned char rch,ii;  
  178.         TIMER0_ENABLE;  
  179.         F_TM=0;  
  180.         ii=0;  
  181.         rch=0;  
  182.         while(!F_TM);       //等过起始位  
  183.           
  184.         while(ii<8)  
  185.         {  
  186.         rch>>=1;  
  187.         if(BT_REC)  
  188.         {  
  189.         rch|=0x80;  
  190.         }  
  191.         ii++;  
  192.         F_TM=0;  
  193.         while(!F_TM);  
  194.           
  195.         }  
  196.         F_TM=0;  
  197.         while(!F_TM)  
  198.         {  
  199.         if(BT_REC)  
  200.         {  
  201.         break;  
  202.         }  
  203.           
  204.         }  
  205.         TIMER0_DISABLE;     //停止timer  
  206.         return rch;       
  207.     #endif   
  208. }  
  209.   
  210. //检查是不是有起始位  
  211. bit StartBitOn()  
  212. {  
  213.     return   (BT_REC==0);   
  214. }  
  215.   
  216. void main()  
  217. {  
  218.     unsigned char gch;  
  219.       
  220.     TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位    自动重装) */  
  221.     PCON=00;  
  222.       
  223.     TR0=0;              //在发送或接收才开始使用  
  224.     TF0=0;  
  225.     TH0=(256-96);       //9600bps 就是 1000000/9600=104.167微秒 执行的timer是104.167*11.0592/12= 96  
  226.     TL0=TH0;  
  227.     ET0=1;  
  228.     EA=1;  
  229.       
  230.     PSendChar(0x55);  
  231.     PSendChar(0xaa);  
  232.     PSendChar(0x00);  
  233.     PSendChar(0xff);  
  234.       
  235.     while(1)  
  236.     {  
  237.         if(StartBitOn())  
  238.         {  
  239.             gch=PGetChar();  
  240.             PSendChar(gch);  
  241.         }  
  242.     }  
  243. }  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值