找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3003|回复: 3
打印 上一主题 下一主题
收起左侧

51单片机模拟串口程序源码

[复制链接]
跳转到指定楼层
楼主
51单片机做的模拟串口程序源码


  1. #include "Usart.h"
  2. bit RXD_OK=0;                           //接收完成标志位
  3. bit TXD_OK=0;                        //发送完成标志位
  4. bit Send_State=0;                //发送开始标志位
  5. bit Sending_Flag=0;                //发送中标志位
  6. uchar RXD_Data=0;                //接收数据缓存区
  7. uchar TXD_Data=0;                //发送数据缓存区
  8. sbit led1=P3^6;
  9. sbit led2=P3^5;
  10. sbit led3=P3^4;
  11. /***************************************************************************
  12. *函数名称:Usart_Init(uint Baud)
  13. *功能    :串口初始化                                波特率对应定时器溢出初值(11.0592)
  14. *入口参数:波特率                                        4800        192
  15. *出口参数:无                                                2400        128
  16. *说明    :                                                        1200        0
  17. ***************************************************************************/
  18. void Usart_Init(uint Baud)
  19. {                                                                       
  20.         uchar T0_Low=0;                                       
  21.         T0_Low=(Crystal/(12*Baud))/3;        //求出定时器初值  3倍采样速率
  22.         TMOD|=0x02;                                                //定时器0自动重装模式
  23.         TH0=TL0=256-T0_Low;
  24.         ET0=TR0=1;
  25.         EA=1;
  26. }
  27. /***************************************************************************
  28. *函数名称:Data_RXD()
  29. *功能    :数据接收
  30. *入口参数:无
  31. *出口参数:无
  32. *说明    :
  33. ***************************************************************************/
  34. void Data_RXD()
  35. {
  36.         static uchar RXD_State=0;
  37.         static uchar RXD_Cnt=0;
  38.         static uchar RXD_Count=0;
  39.         switch (RXD_State)
  40.         {
  41.                 case 0:                                                                 //3倍采样速率采起始位
  42.                 {                                                                         
  43.                         if(RXD_IO==0)
  44.                                 RXD_State=1;
  45.                 }break;
  46.                 case 1:                                                                 //采到两次起始位
  47.                 {                                                                         //采样频率校准到1/3与2/3之前
  48.                         if(RXD_IO==0)
  49.                                 RXD_State=2;
  50.                         else RXD_State=0;
  51.                 }break;
  52.                 case 2:                                                                 //以正常波特率采样,取出八位数据位
  53.                 {
  54.                          if(++RXD_Cnt>=3)                                 
  55.                         {
  56.                                 RXD_Cnt=0;
  57.                                 if(RXD_IO==1)
  58.                                         RXD_Data=RXD_Data|(1<<RXD_Count);
  59.                                 if(++RXD_Count>=8)
  60.                                 {
  61.                                         RXD_Count=0;
  62.                                         RXD_State=3;
  63.                                 }
  64.                         }
  65.                 }break;
  66.                 case 3:                                                                  //取出结束位
  67.                 {                                                                          //结束位正常接收完成标志位置1
  68.                         if(++RXD_Cnt>=3)
  69.                         {
  70.                                 RXD_Cnt=0;
  71.                                 if(RXD_IO==1)
  72.                                 {
  73.                                         RXD_OK=1;
  74.                                         RXD_State=0;
  75.                                 }       
  76.                                 else
  77.                                 {
  78.                                         RXD_Data=0;
  79.                                         RXD_State=0;
  80.                                 }
  81.                         }       
  82.                 }break;
  83.         }       
  84. }
  85. /***************************************************************************
  86. *函数名称:Data_TXD_Buff(uchar Data_TXD)
  87. *功能    :数据送入发送缓存器
  88. *入口参数:待发送数据
  89. *出口参数:无
  90. *说明    :
  91. ***************************************************************************/
  92. void Data_TXD_Buff(uchar Data_TXD)
  93. {
  94.        
  95.         TXD_Data=Data_TXD;                                  //数据送入缓存区
  96.         while(Sending_Flag);                          
  97.         Send_State=1;                                          //发送开始标志位
  98. }
  99. /***************************************************************************
  100. *函数名称:Data_TXD()
  101. *功能    :数据发送
  102. *入口参数:待发送数据
  103. *出口参数:无
  104. *说明    :
  105. ***************************************************************************/
  106. void Data_TXD()
  107. {
  108.         static uchar TXD_State=0;
  109.         static uchar TXD_Cnt=0;
  110.         static uchar TXD_i=0;
  111.         if(++TXD_i>=3)
  112.         {
  113.                 TXD_i=0;
  114.                 switch (TXD_State)
  115.                 {
  116.                         case 0:                                                 //检测发送开始标志位
  117.                         {
  118.                                 TXD_IO=1;       
  119.                                  if(Send_State==1)
  120.                                 {       
  121.                                         Send_State=0;
  122.                                         TXD_State=1;
  123.                                         Sending_Flag=1;                 //发送中标志位置1
  124.                                         TXD_Cnt=0;
  125.                                         TXD_IO=0;                         //发送起始位
  126.                                 }
  127.                         }break;
  128.                         case 1:                                                 //发送八位数据
  129.                         {                                                         //八位数据从低到高发送
  130.                                 TXD_IO=TXD_Data&(1<<TXD_Cnt);
  131.                                  if(++TXD_Cnt>=8)
  132.                                 {
  133.                                         TXD_Cnt=0;
  134.                                         TXD_State=2;
  135.                                 }
  136.                         }break;
  137.                         case 2:
  138.                         {
  139.                                 TXD_IO=1;                                 //发送结束位
  140.                                 TXD_State=3;
  141.                         }break;
  142.                         case 3:
  143.                         {
  144.                                 TXD_State=0;
  145.                                 Sending_Flag=0;                     //发送中标志位清0
  146.                                 TXD_Data=0;
  147.                                 TXD_OK=1;       
  148.                         }break;
  149.                 }
  150.         }       
  151. }

  152. /***************************************************************************
  153. *函数名称:TimerT0()
  154. *功能    :定时器T0中断
  155. *入口参数:无
  156. *出口参数:无
  157. *说明    :
  158. ***************************************************************************/
  159. void TimerT0()interrupt 1
  160. {
  161.         Data_RXD();
  162.         Data_TXD();                         
  163. }
复制代码


下载:
模拟串口.zip (41.61 KB, 下载次数: 87)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:250483 发表于 2018-4-16 21:52 | 只看该作者
正在找这个资料呢
回复

使用道具 举报

板凳
ID:561983 发表于 2019-6-26 13:42 | 只看该作者
有硬件原理图吗
回复

使用道具 举报

地板
ID:561983 发表于 2019-6-26 13:43 | 只看该作者
有原理图或者PCB文件吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表