网站导航: 首页 > 设计参考 > 正文 文章搜索
单片机串口通讯程序(C51)
 
文章编号:
090106194455
文章分类: 单片机 51系列
点 击:
...
关 键 词: 串口,UART
文章来源:
网络
摘 要:

自己用 C51写的串口通讯程序
 

 
  1. /*定义为中断方式串口处理*/    
  2. #define INTERSENDSTR    
  3. /*不为8032系列芯片 */     
  4. //#define CHIP_8032      
  5.   
  6. #include <absacc.h>    
  7. #include <reg51.h>    
  8. #include <string.h>    
  9. #include "err.h"    
  10.   
  11. #ifdef INTERSENDSTR    
  12. unsigned char xdata sSendComBuf[256],sRecComBuf[256];    
  13. unsigned char data bOut,bIn,bSout,bSin;    
  14. #else    
  15. #define DEFSENDCHAR TI=0;SBUF=ACC;while(!TI);TI=0;    
  16. #endif    
  17. //bps设置 9600 就是 PSetBps(96)(11.0592Mhz)     
  18.   
  19. unsigned char  PSetBps(unsigned int bps) SMALL    
  20. {    
  21.     unsigned int t1;    
  22.     unsigned char t2;    
  23. #ifdef INTERSENDSTR    
  24.     /*如果使用中断方式发送数据,必须等待发送数据完毕才能更换波特率 */    
  25.     while(bSin!=bSout)    
  26.     {    
  27.         ;    
  28.     }    
  29.     ES=0;    
  30. #endif     
  31.        
  32. #ifdef CHIP_8032    
  33.     if(3456%bps)    
  34.     {    
  35.         return ERR_SET_BPS;    
  36.     }    
  37.     t1=3456/bps;    
  38.     t1--;t1=~t1;    
  39.     RCAP2H=t1/256;RCAP2L=t1;    
  40.     T2MOD=0x00;    
  41.     /*使用定时器 2 做波特率发生器 */    
  42.     T2CON=0x34;/*TF2=0;EXF2=0;RCLK=1;TCLK=1;EXEN2=0;TR2=1;C/T2=0;CP/RL2=0   
  43.     */    
  44. #else    
  45.     t1=576/bps;    
  46.     if((576%bps)||((t1==0))||(t1>=2*256))     
  47.     {    
  48.         return ERR_SET_BPS;    
  49.     }    
  50.     if(t1>256)    
  51.     {    
  52.         PCON=00;    
  53.         t2=256-(288/bps);    
  54.     }    
  55.     else    
  56.     {    
  57.         PCON=0x80;    
  58.         t2=256-t1;    
  59.     }    
  60.     TH1=t2;TL1=t2;    
  61.     TR1=1;    
  62. #endif     
  63.     /*模式3*/    
  64.     SM0=0;    
  65.     RI=0;TI=0;    
  66.     REN=1;    
  67.     SM1=1;    
  68.     SM2=1;    
  69. #ifdef INTERSENDSTR      
  70.     bOut=bIn;    
  71.     bSout=bSin;    
  72.     ES=1;    
  73. #endif     
  74.     return OK;    
  75. }    
  76. void PSendChar(unsigned char ch) SMALL    
  77. {    
  78.        
  79. #ifdef INTERSENDSTR    
  80.     unsigned char tch;    
  81.        
  82.     tch=bSin+1;    
  83.     while(tch==bSout)    
  84.     {    
  85.         ;    
  86.     }    
  87.     sSendComBuf[bSin]=ch;    
  88.     ES=0;    
  89.     if((bSout==bSin))    
  90.     {    
  91.         SBUF=sSendComBuf[bSin];    
  92.         bSin++;    
  93.     }    
  94.     else    
  95.     {    
  96.         bSin++;                    
  97.     }    
  98.     ES=1;    
  99. #else     
  100.     ACC=ch;    
  101.     DEFSENDCHAR;    
  102. #endif     
  103. }    
  104. unsigned char PGetChar() SMALL    
  105. {    
  106.     unsigned char ch;    
  107. #ifdef   INTERSENDSTR    
  108.     ch=sRecComBuf[bOut];    
  109.     bOut++;    
  110.     return ch;    
  111. #else    
  112.     ch=SBUF;    
  113.     RI=0;    
  114. #endif     
  115. }    
  116. bit PCharInCom() SMALL    
  117. {    
  118. #ifdef   INTERSENDSTR    
  119.     if(bIn!=bOut)    
  120.     {    
  121.         return 1;    
  122.     }    
  123.     return 0;    
  124. #else    
  125.     return RI;    
  126. #endif    
  127. }    
  128. void PSendString(unsigned char *st) SMALL    
  129. {    
  130.     while(*st)    
  131.     {    
  132.         PSendChar(*st);    
  133.         st++;    
  134.     }    
  135. }    
  136. void PSendArray(unsigned char  *st,unsigned int  len) SMALL    
  137. {    
  138.     unsigned int ii;    
  139.     for(ii=0;ii<len;ii++)    
  140.     {    
  141.         PSendChar(st[ii]);    
  142.     }    
  143. }    
  144. #ifdef   INTERSENDSTR    
  145. void PSerialInt() interrupt 4    
  146. {    
  147.     if(RI)     
  148.     {    
  149.         sRecComBuf[bIn]=SBUF;    
  150.         bIn++;    
  151.         RI=0;    
  152.     }    
  153.     if(TI)    
  154.     {    
  155.         TI=0;    
  156.         if(bSout!=bSin)    
  157.         {    
  158.             bSout++;    
  159.         }    
  160.         if(bSout!=bSin)    
  161.         {    
  162.             SBUF=sSendComBuf[bSout];    
  163.         }    
  164.     }    
  165. }    
  166. #endif   
  167.   
  168.   
  169.   

 

 
相关文章:

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




 
  查看更多...  

 

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