找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8073|回复: 1
收起左侧

基于普中科技51单片机的简单串口通信例程

[复制链接]
ID:432757 发表于 2019-1-21 20:31 | 显示全部楼层 |阅读模式
实现功能:当PC一次发送带有“123”的字符串,或者依次输入有“1”“2”“3”的字符时,点亮单片机的一个LED小灯,同时PC收到“Hello.x”的字符串,随后LED小灯熄灭。


注意:51单片机的时钟频率若不为11.052MHz,如本例使用的单片机时钟频率为11.938995MHz,只在波特率为4800,波特率加倍的情况下实现通信,其它波特率下无法收到51发送的数据。
  1. /**************************************************************************************
  2. *                              串口通信实验                                                                                                  *
  3. 实现现象:下载程序后打开串口调试助手,将波特率设置为4800,选择发送的数据就可以显示
  4.                         在串口助手上。
  5. 注意事项:无。                                                                                                                                                                  
  6. ***************************************************************************************/

  7. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

  8. typedef unsigned int u16;          //对数据类型进行声明定义
  9. typedef unsigned char u8;

  10. sbit LED=P2^2;
  11. u8 i=0;
  12. u8 m[8]="Hello.x";
  13. u8 k=0;
  14. u8 a;
  15. /*******************************************************************************
  16. * 函数名         :UsartInit()
  17. * 函数功能                   :设置串口
  18. * 输入           : 无
  19. * 输出                  : 无
  20. *******************************************************************************/
  21. void UsartInit()
  22. {
  23.         SCON=0X50;                        //设置为工作方式1
  24.         TMOD=0X20;                        //设置计数器工作方式2
  25.         PCON=0X80;                        //波特率加倍
  26.         TH1=0xf3;                                //计数器初始值设置,注意波特率是4800的
  27.         TL1=0xf3;
  28.         ES=1;                                                //打开接收中断
  29.         EA=1;                                                //打开总中断
  30.         TR1=1;                                        //打开计数器
  31. }

  32. /*******************************************************************************
  33. * 函 数 名       : main
  34. * 函数功能                 : 主函数
  35. * 输    入       : 无
  36. * 输    出             : 无
  37. *******************************************************************************/

  38. void main()
  39. {       
  40.         UsartInit();  //        串口初始化
  41.         while(1);               
  42. }
  43. void Usart_receive()
  44. {
  45. a=SBUF;
  46. RI=0;
  47. }
  48. void Usart_judge()
  49. {
  50. if(i==0)         //判断输入字符是不是‘1’,若为‘1’,令i=1,变为状态1
  51. {
  52.         if(a=='1')
  53.                 {
  54.                 i=1;
  55.                 }
  56.         else
  57.                 {
  58.                 i=0;
  59.                 }
  60. }
  61. else if(i==1)  //判断在上一个字符为‘1’的情况下,输入字符是否为‘2’
  62. {
  63.         if(a=='2')          //若为‘2’,令i=2,变为状态2
  64.                 {
  65.                 i=2;
  66.                 }
  67.         else if(a=='1')        //若为‘1’,回到状态‘1’
  68.                 {
  69.                  i=1;
  70.                 }
  71.         else                        //其它情况,回到状态0
  72.                 {
  73.                 i=0;
  74.                 }
  75. }
  76. else if(i==2)                //判断在上两个字符为‘1’‘2’的情况下,输入字符是否为‘3’
  77. {
  78.         if(a=='3')                        //若为‘3‘,LED点亮,输出“Hello.x”,LED熄灭,随后回到状态0
  79.                 {
  80.                 LED=0;
  81.                 for(k=0;k<8;k++)
  82.                         {
  83.                         SBUF=m[k];
  84.                         while(!TI);
  85.                         TI=0;
  86.                         }
  87.                 LED=1;
  88.                 i=0;
  89.                 }
  90.         else if(a=='1')          //若为’1‘,回到状态1
  91.                 {
  92.                 i=1;
  93.                 }
  94.         else                         //其它情况,回到状态0
  95.                 {
  96.                 i=0;
  97.                 }
  98. }
  99. }
  100. /*******************************************************************************
  101. * 函数名         : Usart() interrupt 4
  102. * 函数功能                  : 串口通信中断函数
  103. * 输入           : 无
  104. * 输出                  : 无
  105. *******************************************************************************/
  106. void Usart() interrupt 4
  107. {
  108.         Usart_receive();
  109.         Usart_judge();
  110. }
复制代码



评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:498471 发表于 2019-4-18 10:28 | 显示全部楼层
不好使
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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