网站导航: 首页 > 设计参考 > 正文 文章搜索
用普通IO口模拟串口程序例子
 
文章编号:
090107135353
文章分类: 单片机 51系列
点 击:
...
关 键 词: UART,串口
文章来源:
网络
摘 要:

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

 

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4