找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单总线通讯接口的单片机源码

[复制链接]
跳转到指定楼层
楼主
ID:299361 发表于 2018-3-30 12:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /*********单总线通信脉冲时间定义**********/      
  2. #define H_LVL        5      
  3. #define L_LVL_0        5      
  4. #define L_LVL_1        10      

  5. #define S_H                10        //起始位高电平,起始位用于将期间从休眠中唤醒并做好接收数据的准备,暂没使用
  6. #define S_L                5        //起始位低电平

  7. #define START_T0()        {TMR0=158;T0IF=0;T0IE=1;}
  8. #define STOP_T0()        {T0IE=0;}

  9. /*
  10. 函数功能:数据位发送,数据位0或1都包括固定宽度的高电平脉冲和不同宽度的低电平
  11. 说明:
  12. */
  13. void SendBit(uchar databit)
  14. {
  15.         timeout=H_LVL;
  16.         START_T0();
  17.         ORDER=1;        //信号线高电平
  18.         while(timeout);
  19.         STOP_T0();        //禁止T0中断
  20.                
  21.         if(databit)
  22.                 timeout=L_LVL_1;        //数据位1
  23.         else
  24.                 timeout=L_LVL_0;        //数据位0
  25.         START_T0();      
  26.         ORDER=0;        //信号线低电平
  27.         while(timeout);
  28.         STOP_T0();
  29. }
  30. /*发送结束脉冲,用于标记最后一个数据位的脉冲宽度,*/
  31. void SendEnd()
  32. {
  33.         timeout=5;
  34.         START_T0();
  35.         ORDER=1;        //信号线高电平
  36.         while(timeout);
  37.         STOP_T0();        //禁止T0中断
  38.         timeout=20;
  39.         START_T0();
  40.         ORDER=0;
  41.         while(timeout);      
  42.         STOP_T0();      
  43. }
  44. void SendStart()
  45. {
  46.         timeout=S_H;
  47.         START_T0();
  48.         ORDER=1;        //信号线高电平
  49.         while(timeout);
  50.         STOP_T0();        //禁止T0中断
  51.         timeout=S_L;
  52.         START_T0();
  53.         ORDER=0;
  54.         while(timeout);      
  55.         STOP_T0();      
  56. }      
  57. /*
  58. 函数功能:数据字节发送,低位在前
  59. 参数说明:dat 要发送的数据字节
  60. */
  61. void SendData(uchar dat)
  62. {
  63.         uchar i,j;
  64.       
  65.         CCP1IE=0;        //关闭捕捉中断
  66.         se_ccp1_int++;
  67.         TMR2IE=0;
  68.       
  69. //        SendStart();        //起始位高电平,起始位用于将期间从休眠中唤醒并做好接收数据的准备      
  70.         for(i=0;i<8;i++)
  71.         {
  72.                 j=(dat>>i)&0x01;
  73.                 SendBit(j);                       
  74.         }
  75.         SendEnd();
  76.       
  77.         CTR_LED=1;
  78.         delay(200);
  79.         CTR_LED=0;
  80.         se_ccp1_int--;
  81.         if(se_ccp1_int==0)
  82.         {
  83.                 CCP1IF=0;
  84.                 CCP1IE=1;        //开捕捉中断
  85.         }
  86.         TMR2IE=1;
  87.                
  88. }                        
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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