找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机串口程序C语言版

[复制链接]
跳转到指定楼层
楼主
这篇文章主要来介绍一下 51单片机的串口,下面先来看一下与串口相关的寄存器。
  
  图1 (该图来自51单片机技术文档)
  下面来逐个介绍个寄存器。
  SCON寄存器的SM1,SM2主要用来设置串行口的工作方式,具体对应关系见图2,REN:串行口接受使能位,当单片机要接受数据时该位应该置一,TB8:发送数据的第九位。在方式2或者方式3中TB8为发送的第九位数据。该位不是很常用,具体介绍请查看51单片机的技术文档,这里不多做介绍。TI:发送中断标志,由硬件在方式0串行发送第8位结束时置位,或在其它方式串行发送停止位的开始时置位,必须由软件清零。RI:接受中断标志,由硬件由硬件在方式0串行发送第8位结束时置位,或在其它方式串行发送停止位的中间时置位,必须由软件清零。
  在这里需要提醒的是,大家在看技术文档是一定要注意那些必须由软件清零的标志位,在写程序时一定要记得清零。
  
  图2(本图来自51单片机技术文档)
  SBUF寄存器:(为了方便就直接截图说明了)
  
  PCON寄存器D7位SMOD是串行波特率倍增位,SMOD为一时,串行口在工作方式1,方式2,方式3中波特率加倍,复位时,SMOD=0.
  寄存器IPH,IPSADEN,SADDR不是很常用,在这里就不做介绍,我下面的程序中也没有用到,感兴趣的可以自己查阅一下技术文档。
  接下来开始调试串口的方法和步骤。
  1.STC—ISP下载软件自带串口调试功能。下面是软件界面
  
  2.在串口调试之前还必须知道自己学习板接的是电脑的哪个端口,查看端口的方法如下:
  右键单击桌面上的:我的电脑—设备管理器,如果学习板通过下载线连接到了电脑会显示如下界面:
  
  从端口选项中可以看到我连接的是COM3.
  3接下来的任务就是不程序下载到单片机中开始调试了(程序我会在下面给出,先把调试步骤介绍完)
  程序下载完毕之后单击STC-ISP下载软件中的:串口助手按钮,就会出现如下界面:
  
  然后在点击打开串口按钮,上图中显示的是:关闭串口,是因为我的串口已经打开了,接下来在单字符串发送区,输入要传送的数据,例如传送:77,选择十六进制发送,观察,学习班上LED的亮灭情况,和数据接区的反应。如下图:
  
  需要注意的是必须要将COM(即端口号),比特率,校验位,数据位,停止位,设置正确否则会显示乱码。
  可以观察到的现象是:led的第八个和第四个点亮了,原因也很简单,因为发送的数据是77,选择的是十六进制发送,即0111 0111,可以看到第8位和第四位是零,所以LED点亮了。接受单口显示data recieve ok,说明单片机数据接受成功。
  最后也是最重要的就是编写程序了:下面是我的调试程序,希望对大家能有帮助。
  
  
  (因为程序粘贴过来的时候注释会显示乱码,没办法只好使用截图,请大家将就着看一下,还有需要提醒的是程序的第57,58和第29行在截图时重复了请大家仔细对着行标号看就很清楚了)
  程序的注释写的很清楚,我在这里就不重复解释了,不懂的请大家仔细看注释。

51单片机的串口通信程序.rar

1.13 KB, 下载次数: 44, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:140725 发表于 2016-10-11 23:10 | 只看该作者
  1. #include <reg52.h>
  2. #include<intrins.h>
  3. #include <stdio.h>
  4. #include <math.h>
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. sbit Key1 = P2^3;
  8. sbit Key2 = P2^2;
  9. sbit Key3 = P2^1;
  10. sbit Key4 = P2^0;
  11. sbit BELL = P3^6;
  12. sbit CONNECT = P3^7;
  13. unsigned int  Key1_flag = 0;
  14. unsigned int  Key2_flag = 0;
  15. unsigned int  Key3_flag = 0;
  16. unsigned int  Key4_flag = 0;
  17. unsigned char b;
  18. unsigned char code Num[21]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
  19.                             0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,
  20.                             0x10,0x89};
  21. unsigned char code Disdigit[4] = {0x7F,0xBF,0xDF,0xEF};
  22. unsigned char Disbuf[4];
  23. void delayms(uint t)
  24. {
  25. uint i;
  26. while(t--)
  27. {
  28.   /* 对于11.0592M时钟,约延时1ms */
  29.   for (i=0;i<125;i++)
  30.   {}
  31. }
  32. }

  33. //-----------------------------------------------------
  34. void SendData(uchar Dat)
  35. {
  36. uchar i=0;
  37. SBUF = Dat;
  38. while (1)
  39.   {
  40.     if(TI)
  41.       {
  42.         TI=0;
  43.         break;
  44.    }
  45.   }
  46. }
  47. void ScanKey()
  48. {
  49.     if(Key1 == 0)
  50.     {
  51.        delayms(100);
  52.     if(Key1 == 0)
  53.     {
  54.        Key1_flag = 1;
  55.        Key2_flag = 0;
  56.     Key3_flag = 0;
  57.     Key4_flag = 0;
  58.        Key1 = 1;
  59.     }
  60.     else;
  61.     }
  62.     if(Key2 == 0)
  63.     {
  64.     delayms(100);
  65.     if(Key2 == 0)
  66.     {
  67.        Key2_flag = 1;
  68.        Key1_flag = 0;
  69.     Key3_flag = 0;
  70.     Key4_flag = 0;
  71.     Key2 = 1;
  72.     }
  73.     else;
  74.     }
  75.    if(Key3 == 0)
  76.     {
  77.     delayms(50);
  78.     if(Key3 == 0)
  79.     {
  80.        Key3_flag = 1;
  81.        Key1_flag = 0;
  82.     Key2_flag = 0;
  83.     Key4_flag = 0;
  84.     Key3 = 1;
  85.     }
  86.     else;
  87.     }
  88. if(Key4 == 0)
  89.     {
  90.     delayms(50);
  91.     if(Key4 == 0)
  92.     {
  93.        Key4_flag = 1;
  94.        Key1_flag = 0;
  95.     Key2_flag = 0;
  96.     Key3_flag = 0;
  97.     Key4 = 1;
  98.     }
  99.     else;
  100.     }
  101. else;  
  102. }
  103. void KeyProc()
  104. {
  105.     if(Key1_flag)
  106.     {
  107.      TR1 = 1;
  108.   SendData(0x55);
  109.      Key1_flag = 0;     
  110. }   
  111. else if(Key2_flag)
  112.     {
  113.      TR1 = 1;
  114.      SendData(0x11);   
  115.      Key2_flag = 0;  
  116.     }
  117.     else if(Key3_flag)
  118.     {
  119.     P1=0xff;
  120.     BELL = 0;
  121. CONNECT = 1;
  122.     Key3_flag = 0;
  123.     }
  124. else if(Key4_flag)
  125. {
  126. CONNECT = 0;
  127. BELL = 1;
  128.     Key4_flag = 0;
  129. }
  130.     else;      
  131. }
  132. void Initdisplay(void)
  133. {
  134. Disbuf[0] = 1;
  135. Disbuf[1] = 2;
  136. Disbuf[2] = 3;
  137. Disbuf[3] = 4;
  138. }
  139. void Display()     //显示
  140. {
  141. unsigned int     i = 0;
  142. unsigned int temp,count;
  143.         temp = Disdigit[count];   
  144.   P2 =temp;
  145.   temp = Disbuf[count];
  146.   temp = Num[temp];
  147.         P0 =temp;
  148.         count++;      
  149.     if  (count==4)
  150.         count=0;        
  151. }   

  152. void time0() interrupt 1  using 2
  153. {  
  154.    Display();   
  155.   TH0 = (65535 - 2000)/256;
  156.   TL0 = (65535 - 2000)%256;
  157. }
  158.   
  159. void main()
  160. {
  161. Initdisplay();
  162. TMOD = 0x21;
  163. TH0 = (65535 - 2000)/256;
  164. TL0 = (65535 - 2000)%256;
  165. TR0 = 1;
  166. ET0 = 1;  
  167. TH1 = 0xFD; //11.0592M
  168. TL1 = 0xFD;
  169. PCON&=0x80;
  170. TR1 = 1;
  171. ET1 = 1;
  172. SCON = 0x40; //串口方式
  173. REN = 1;
  174. PT1 = 0;
  175. PT0 = 1;
  176. EA = 1;
  177.   while(1)
  178.   {
  179.    ScanKey();
  180.    KeyProc();     
  181.    
  182.    if(RI)
  183.    {
  184.    Disbuf[0] = 0;
  185.    Disbuf[1] = 20;
  186.    Disbuf[2] = SBUF>>4;
  187.    Disbuf[3] = SBUF&0x0f;
  188.    RI = 0;
  189.    }
  190.    else;   
  191.   }
  192. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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