查看: 317|回复: 4
收起左侧

[应用] Kungfu串口例程

[复制链接]

29

主题

218

帖子

648

积分

高级技术员

 楼主| 发表于 2017-6-19 09:19 | 显示全部楼层 |返回版面|阅读模式
  1. /****************************************************************************************
  2. *
  3. * 文  件  名: main.c
  4. * 项  目  名: 11_Usart
  5. * 版         本: v1.0
  6. * 日         期: 11_Usart-Full Duplex Asynchronous
  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 = 0x08;                                //设置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=0x40;                //         接收空闲  使用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.         TSCTL=0x22;          // 8位 发送,使能发送,全双工异步模式SYNC=0,低速模式HBRG=0,发送移位空,不发送同步间隔符
  78.         RSCTL=0x90;          // 串口使能(配置引脚为串行口引脚),8位接收,接收使能,无帧错误,溢出错误,不考虑地址识别和第9位

  79.         TXIF=0;
  80.         TXIE=0;
  81.         RXIF=0;
  82.         RXIE=1;                // 开启接收中断,发送不中断

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

  84. }

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

  101.                 switch(Rev_Temp)
  102.                 {
  103.                 case 1:P37=!P37;break;
  104.                 case 2:P36=!P36;break;
  105.                 case 3:P35=!P35;break;
  106.                 case 4:P34=!P34;break;
  107.                 case 5:P33=!P33;break;
  108.                 case 6:P30=!P30;break;
  109.                 default:P37=1;P36=1;P35=1;P34=1;P33=1;P30=1;break;
  110.                 }
  111.         }
  112. }

  113. /****************************************************************************************
  114. * 函数名     :main
  115. * 函数功能:程序入口主函数
  116. * 入口参数:无
  117. * 返回          :无
  118. ****************************************************************************************/
  119. void main()
  120. {
  121.         init_mcu();
  122.         init_usart();
  123.         Delay_ms(10);

  124.         while(1)
  125.         {
  126.                 usart_function();
  127.         }
  128. }

  129. //中断函数
  130. void int_fun() __interrupt
  131. {
  132.         if(RXIF)
  133.         {
  134.                 if(OVFER || FRER)
  135.                 {
  136.                         Rev_Flag=0;
  137.                 }
  138.                 else
  139.                 {
  140.                         Rev_Flag=1;
  141.                 }

  142.                 Rev_Temp=RXSDR;  // 清零 RXIF
  143.         }

  144.         if(T0IF)
  145.         {
  146.                 T0IF = 0;
  147.                 T0 = 0x64;
  148.                 Timer_Count++;

  149.                 if(Timer_Count>100)
  150.                 {
  151.                         Timer_Count=0;
  152.                         Send_Date++;
  153.                         Send_Flag=1;
  154.                 }
  155.         }
  156. }
复制代码


16

主题

220

帖子

660

积分

高级技术员

发表于 2017-6-20 22:01 | 显示全部楼层 |返回版面
看上去和标准51的没什么区别,寄存器名字不一样而已。

16

主题

170

帖子

510

积分

高级技术员

发表于 2017-6-23 19:07 | 显示全部楼层 |返回版面
ahhsyf 发表于 2017-6-20 22:01
看上去和标准51的没什么区别,寄存器名字不一样而已。

中断看上去还是有点不一样的。

16

主题

160

帖子

480

积分

资深技术员

发表于 2017-6-29 18:53 | 显示全部楼层 |返回版面
接收完毕需要清标志,发送完不需要清除标志吗?

16

主题

160

帖子

480

积分

资深技术员

发表于 2017-6-29 18:54 | 显示全部楼层 |返回版面
dongbaohui 发表于 2017-6-23 19:07
中断看上去还是有点不一样的。

是的,发送完毕没有清中断标志
您需要登录后才可以回帖 登录 | 注册 手机登录

本版积分规则

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