[KF8F] KF8F半双工同步通信主机模式,主机模式数据发送与接收例程

[复制链接]
125|1
 楼主 | 2018-9-25 22:30 | 显示全部楼层 |阅读模式
  1. /****************************************************************************************
  2. *
  3. * 文  件  名: main.c
  4. * 项  目  名: 11_Usart-Half Duplex Synchronous-Master
  5. * 版         本: v1.0
  6. * 日         期: 2016年05月16日 11时38分22秒
  7. * 作         者: Administrator
  8. * 程序说明:通用全双工/半双工收发器例程
  9. *                         ——半双工同步通信主机模式,主机模式数据发送与接收例程
  10. * 适用芯片:KF8FXXX系列——KF8F212、KF8F214、KF8F212、KF8F222、KF8F232、KF8F233、KF8F304、
  11. *                                                  KF8F312、KF8F321、KF8F323、KF8F324、KF8F334、KF8F335、KF8F336
  12. *                         KF8FXXXX系列——KF8F2156、KF8F3156、KF8F4156、KF8F3155、KF8F4155
  13. *                         KF8SXXXX系列——KF8S1005、KF8S1006、KF8S1010、KF8S1011
  14. *                         KF8TS27XX系列——KF8TS2702、KF8TS2708、KF8TS2710、KF8TS2714、KF8TS2716
  15. *                         KF8VXXX系列——KF8V427、KF8V429
  16. ****************************************************************************************/
  17. #include<KF8S1011.h>
  18. #define uchar unsigned char
  19. #define uint  unsigned int

  20. #define Sent_Vaule_To_UART(key_buf)   {TXSDR=key_buf; while(TXSRS==0);}// 调试时串口输出

  21. unsigned char Timer_Count;
  22. unsigned char Send_Date;
  23. unsigned char Send_Flag;

  24. unsigned char Rev_Temp = 0;
  25. unsigned char Rev_Flag;

  26. /****************************************************************************************
  27. * 函数名     :Delay_ms
  28. * 函数功能:长时间延时
  29. * 入口参数:延时基数 uchar ms_data
  30. * 返回          :无
  31. ****************************************************************************************/
  32. void Delay_ms(uint ms_data)
  33. {
  34.         uchar i;
  35.         while(ms_data--)
  36.         {
  37.                 i = 124;
  38.                 while(i--);
  39.         }
  40. }

  41. /****************************************************************************************
  42. * 函数名     :init_mcu
  43. * 函数功能:mcu初始化函数
  44. * 入口参数:无
  45. * 返回          :无
  46. ****************************************************************************************/
  47. void init_mcu()
  48. {
  49.         /***时钟初始化****/
  50.         OSCCTL = 0x60;          //设置为8M

  51.         /***端口初始化****/
  52.         TR0 = 0x0B;                                //设置P03端口为输入,P0其他I/O口为输出
  53.         TR1 = 0x00;                                //设置P1端口为输出
  54.         TR2 = 0x00;                                //设置P2端口为输出
  55.         TR3 = 0x00;                                //设置P3端口为输出
  56.         TR4 = 0x00;                                //设置P4端口为输出

  57.         P0  = 0;                                //P0口输出低电平
  58.         P1  = 0;                                //P1口输出低电平
  59.         P2  = 0;                                //P2口输出低电平
  60.         P3  = 0;                                //P3口输出低电平
  61.         P4  = 0;                                //P4口输出低电平

  62.         OPTR = 0x05;        //定时器0,定时发送数据到端口 计时64分频
  63.         T0 = 0x64;                // 可计时156个周期,结合分频64和时钟8M实现时间间隔定时 约  5ms
  64. }

  65. /****************************************************************************************
  66. * 函数名     :init_usart
  67. * 函数功能:Usart初始化函数
  68. * 入口参数:无
  69. * 返回          :无
  70. ****************************************************************************************/
  71. void init_usart()
  72. {
  73.         /***Usart相关寄存器初始化****/
  74.         BRCTL=0x00;                //         接收空闲  使用8位计数器,不考虑唤醒是使能和自动波特率检测

  75.         EUBRGH=0x00;        // 波特率公式=SCLK/(m*y+1),其中SCLK系统时钟,如这里8M,m为倍频数,见手册,y为8位或16位波特率计数值
  76.         EUBRGL=0x0C;         // SYNC=0(全双工异步模式),BRG16=0(使用8位波特率发生器),HBRG=0(低速),Baud=8000000/(64*(12+1))=9615

  77.         SYNC=1;                        //半双工同步模式
  78.         CSRS=1;                        //主模式
  79.         SPEN=1;                        //使能串行口

  80.         SRXEN=0;        //禁止单字节接收
  81.         CRXEN=0;        //禁止连续接收
  82.         TXEN=1;                //使能发送模式

  83.         TXIF=0;
  84.         TXIE=0;
  85.         RXIF=0;
  86.         RXIE=0;

  87.         INTCTL = 0XE0;     // 使能外部中断 PUIE 使能总中断 AIE  T0IE

  88. }

  89. /****************************************************************************************
  90. * 函数名     :usart_function
  91. * 函数功能:Usart功能函数
  92. * 入口参数:无
  93. * 返回          :无
  94. ****************************************************************************************/
  95. void usart_function()
  96. {
  97.         if(Send_Flag)
  98.         {
  99.                 Send_Flag=0;

  100.                 SRXEN=0;        //禁止单字节接收
  101.                 CRXEN=0;        //禁止连续接收
  102.                 TXEN=1;                //使能发送模式

  103.                 Sent_Vaule_To_UART(Send_Date);

  104.                 Delay_ms(1);        //延时很重要

  105.                 TXEN=0;                        //禁止发送模式
  106.                 RXIF=0;
  107. //                RXIE=1;                        //采用中断接收
  108.                 SRXEN=1;                //使能单字节接收
  109.                 CRXEN=0;                //禁止连续接收

  110. //                while(!Rev_Flag);        //采用中断接收
  111. //                Rev_Flag=0;

  112.                 while(!RXIF);                //等待接收
  113.                 Rev_Temp=RXSDR;
  114.                 RXIF=0;

  115.                 switch(Rev_Temp)
  116.                 {
  117.                 case 1:P37=!P37;break;
  118.                 case 2:P36=!P36;break;
  119.                 case 3:P35=!P35;break;
  120.                 case 4:P34=!P34;break;
  121.                 case 5:P33=!P33;break;
  122.                 case 6:P30=!P30;break;
  123.                 default:P37=1;P36=1;P35=1;P34=1;P33=1;P30=1;break;
  124.                 }
  125.         }
  126. }

  127. /****************************************************************************************
  128. * 函数名     :main
  129. * 函数功能:程序入口主函数
  130. * 入口参数:无
  131. * 返回          :无
  132. ****************************************************************************************/
  133. void main()
  134. {
  135.         init_mcu();
  136.         init_usart();
  137.         Delay_ms(10);
  138.         while(1)
  139.         {
  140.                 usart_function();
  141.         }
  142. }

  143. //中断函数
  144. void int_fun() __interrupt
  145. {
  146. //        if(RXIF)
  147. //        {
  148. //                if(OVFER || FRER)
  149. //                {
  150. //                        Rev_Flag=0;
  151. //                }
  152. //                else
  153. //                {
  154. //                        Rev_Flag=1;
  155. //                }
  156. //
  157. //                Rev_Temp=RXSDR;  // 清零 RXIF
  158. //        }

  159.         if(T0IF)
  160.         {
  161.                 T0IF = 0;
  162.                 T0 = 0x64;
  163.                 Timer_Count++;

  164.                 if(Timer_Count>100)
  165.                 {
  166.                         Timer_Count=0;
  167.                         Send_Date++;
  168.                         if(Send_Date>7)Send_Date=1;
  169.                         Send_Flag=1;
  170.                 }
  171.         }
  172. }
复制代码


| 2018-9-30 13:11 | 显示全部楼层
谢谢分享,
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

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