为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

单片机实例--通过实例学习单片机

2010-11-24 10页 doc 182KB 42阅读

用户头像

is_981864

暂无简介

举报
单片机实例--通过实例学习单片机实例B 通信测试 本章先介绍简单的发送、接收程序,再介绍由发送和接收两部分组合在一起的发送与接收测试程序,从而讲解单片机串行口通信原理及编程方法。 B.1 发送一个字符 功能说明:由单片机向计算机不断地发送一个字符“A”,在计算机超级终端窗口上显示出来。计算机中也可以安装串口调试工具如SSCOM等(到网站上免费下载),既能接收也能发送,使用很方便。 B.1.1 硬件设计 单片机与计算机通信连接的示意图如图B.1所示。 图B.1 单片机与计算机通信连接示意图 单片机与计算机通信时,要用随机带的串口连线将单片机实验板与计算机连接。...
单片机实例--通过实例学习单片机
实例B 通信测试 本章先介绍简单的发送、接收程序,再介绍由发送和接收两部分组合在一起的发送与接收测试程序,从而讲解单片机串行口通信原理及编程方法。 B.1 发送一个字符 功能说明:由单片机向计算机不断地发送一个字符“A”,在计算机超级终端窗口上显示出来。计算机中也可以安装串口调试工具如SSCOM等(到网站上免费下载),既能接收也能发送,使用很方便。 B.1.1 硬件设计 单片机与计算机通信连接的示意图如图B.1所示。 图B.1 单片机与计算机通信连接示意图 单片机与计算机通信时,要用随机带的串口连线将单片机实验板与计算机连接。计算机中使用COM1还是使用COM2,可在串行口调试工具软件上设置;“数据传输率”一项的设置要与程序中设定的数据传输率相一致。 B.1.2 程序设计 1.工作原理 (1)设定串行口工作方式。 SCON是串行口控制寄存器,主要功能是设定串行口的工作方式、接收和发送控制以及设置状态标志,其格式如下: 98H SM0 SM1 SM2 REN TB8 RB8 TI RI 设定串行口工作方式1。 SM0 = 0; SM1 = 1; SM2 = 0 设定由软件来驱动串行口的发射与接收。 REN = 1; 由以上得知: SCON = 01010000B = 0x50 (2)数据传输率的设定。 数据传输率是指发送或接收的数据速率,串行口工作于方式1时由定时器T1的溢出率控制。当设置数据传输率为9 600时: TMOD = 0x20; TH1 = 0xfd; (3)激活定时器T1。 TR1 = 1; (4)发送一字符“A”。 SBUF = ‘A’ 2.程序 C51语言编写的发送一个字符源程序TX22-1.c代码如下: 01 #include /* 头文件 */ 02 main( ) /* 主函数 */ 03 { 04 unsigned int i; /* 声明无符号整数变量i */ 05 SCON = 0x50; /* 设定串行口工作方式1 */ 06 TMOD = 0x20; /* 定时器1工作于8位自动重载模式 */ 07 TH1 = 0xfd; /* 设定数据传输率为9600 */ 08 TR1 = 1; /* 启动定时器1 */ 09 loop: 10 for (i = 0;i<50000;i + +); /* 延时 */ 11 SBUF = 'A'; /* 传送字符 */ 12 goto loop; /* 跳转到loop处 */ 13 } B.1.3 代码详解 01:头文件。 02:主函数。 03:主函数开始。 04:声明i为无符号整数变量。 05:设定串行口工作方式1。串行口有4种工作方式:方式0~方式3。通过对串行口控制寄存器SCON的设置来进行选择,不同的工作方式适应不同的要求。方式0用于扩展I/O口;方式1适合于点对点的异步通信;方式2、方式3适用多机通信。 06:设定定时器1工作于方式2,作数据传输率发生器,该工作方式为8位自动重载模式。 07:设定数据传输率为9 600,收发双方必须设置相同的数据传输率。 08:启动定时器1开始工作。 09:loop为程序标号,也是本程序的循环进入点。 10:延时大约0.5s。 11:发送字符。SBUF为串行口数据缓冲寄存器,要发送的数据首先写入SBUF中,然后才能发送。 12:转移到loop处不断循环,屏幕不断显示字符“A”。 13:程序结束。 B.1.4 经验 这是由单片机向计算机不断发送一个字符的简单程序。设计该程序时,先对串行口工作模式及数据传输率进行设置,再将要发送的字符送入缓冲寄存器SBUF中,该字符就会被发送出去。 B.2 发送一个字符串 功能说明:每按一次K1键,单片机向计算机发送一个字符串“Hello!”,并在计算机的接收软件窗口上显示出来。本节硬件设计与上节基本相同,但在单片机的P3.2端口要接一个按钮开关K1,作为字符串发送按钮。本节硬件设计与B.1节相同。 B.2.1 程序设计 1.工作原理 (1)设定串行口工作方式1。 SCON = 0x50 (2)设定数据传输率为9 600。 TMOD = 0x20; TH1 = 0xfd; (3)激活定时器T1。 TR1 = 1; (4)发送字符串“Hello!”。 SBUF = str[i]; 2.程序 C51语言编写的发送一个字符串源程序TX22-2.c代码如下: 01 #include /* 头文件 */ 02 char code str[] = "Hello! \0"; /* 声明字符数组str[] */ 03 void send_str(); /* 发送字符串函数 */ 04 sbit K1 = P3^2; /* 定义按键 */ 05 unsigned char temp; /* 声明无符号字符变量temp */ 06 main() /* 主函数 */ 07 { 08 SCON = 0x50; /* 设定串行口工作方式1 */ 09 TMOD = 0x20; /* 定时器1,自动重载,产生数据传输率 */ 10 TH1 = 0xfd; /* 数据传输率为9600 */ 11 TR1 = 1; /* 启动定时器1 */ 12 13 while(1) /* 无限循环 */ 14 { 15 unsigned int j; /* 声明无符号整数变量j */ 16 if (K1 = =0) /* 如果按K1键,则执行{ } */ 17 { 18 for(j = 0;j<20000;j + +); /* 延时一段时间,消除抖动 */ 19 while(!K1); /* 等待按键放开 */ 20 send_str(); /* 调用发送字符串函数 */ 21 } 22 } 23 } 24 25 void send_str() /* 发送字符串函数 */ 26 { 27 unsigned char i = 0; /* 声明无符号字符变量i */ 28 while(str[i] != '\0') /* 遇到‘\0’,则停止发送 */ 29 { 30 SBUF = str[i]; /* 发送字符 */ 31 while(!TI); /* 等待数据传送 */ 32 TI = 0; /* 清除数据传送标志 */ 33 34 i + +; /* 下一个字符 */ 35 } 36 } B.2.2 代码详解 01:头文件。 02:声明字符数组str[],字符串中的‘\0’为字符串结束标志符。 03:声明发送字符串函数。 04:定义按键K1由P3.2控制。 05:声明temp无符号字符变量。 06:主函数。 07:主函数开始。 08:设定串行口工作方式1。 09:设置定时器1,工作于8位自动重载模式,用于产生数据传输率。 10:设定数据传输率为9 600。 11:启动定时器1开始工作。 13:无限循环语句。 14:while循环开始。 15:声明无符号整数变量j。 16:判断K1键是否按下,如果按下,程序执行下边大括号{ }内的语句。 17:if语句开始。 18:延时一段时间,消除按键的抖动 。 19:等待按键K1释放。 20:调用发送字符串函数。 21:if语句结束。 22:while循环结束。 23:主函数结束。 25:发送字符串函数。 26:发送字符串函数开始。 27:声明无符号字符变量i。 28:遇到结束标志符号‘\0’,说明字符串已经发送完成,则停止发送。 29:while循环语句,开始执行发送字符串。 30:发送字符“Hello!”。 31:等待数据传送。 32:TI为发送中断标志位,当第8位结束时,硬件会将其设置为1;之后,必须由软件清除为0。 34:i加1,发送下一个字符。 35:while循环发送字符结束。 36:发送字符串函数结束。 B.2.3 经验总结 本节是简单的发送字符串程序。设计该程序时,先设置串行口工作模式及数据传输率,再将要发送的字符串送入缓冲寄存器SBUF中,该字符串就会被发送出去。 上述过程基本与上节相同,区别是C语言中没有字符串变量,需要用字符数组来处理字符串,例如,发送语句应写为SBUF = str[i]。 为了测定字符串的实际长度和使用系统提供的各种字符串函数,C语言规定一个字符串结束标志位‘\0’。在一个字符串数组中,一旦遇到字符‘\0’就表示字符串结束,如执行语句while(str[i] != '\0')后,‘\0’后的字符忽略不计。 B.3 接收指令 功能说明:由计算机向单片机发送“00”指令,单片机接收到指令后,P1端口8个LED全部亮起。之后,计算机发送1~9数字,单片机P1端口8个LED将模拟显示二进制数,如表B.1所示。本节硬件设计与B.1节相同。 表B.1 P1口显示二进制数 计算机发送 1 2 3 4 5 6 7 8 9 P1显示 00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000 00001001 B.3.1 程序设计 1.工作原理 (1)设定串行口工作方式1。 SCON = 0x50 (2)设定数据传输率为9 600。 TMOD = 0x20; TH1 = 0xfd; (3)激活定时器T1。 TR1 = 1; (4)接收数据。 temp = SBUF; 2.程序 C51语言编写的接收指令源程序TX22-3.c代码如下: 01 #include /* 头文件 */ 02 unsigned char temp; /* 声明无符号字符变量i */ 03 main() /* 主函数 */ 04 { 05 SCON = 0x50; /* 设定串行口工作方式1 */ 06 TMOD = 0x20; /* 定时器1,自动重载,产生数据传输率 */ 07 TH1 = 0xfd; /* 数据传输率为9600 */ 08 TR1 = 1; /* 启动定时器1 */ 09 10 while(1) /* 无限循环 */ 11 { 12 while(!RI); /* 等待数据接收 */ 13 RI = 0; /* 清除数据传送标志 */ 14 temp = SBUF; /* 暂存接收到的数据 */ 15 P1 = temp&0x0f; /* 数据传送到P0口 */ 16 } 17 } B.3.2 代码详解 01、02:头文件和变量声明。 03:主函数。 05~08:对串行通信口初始设置。 10~16:接收数据。其中,第14行语句将串行口缓存寄存器SBUF中所接收到的数据存入temp中,第15行语句将接收到的数据送到P1输出。 17:程序结束。 B.3.3 经验总结 本节是单片机接收计算机发送信息的简单程序。设计该程序时,先设置串行口工作模式及数据传输率,再将接收到的信息从串行口接收数据缓冲寄存器SBUF中读出,即为接收。单片机按照接收到的指令去控制P1端口输出。 B.4 发送接收测试程序 功能说明:将单片机实验板与计算机连接,参考B.1节和B.2节说明。首先,由单片机向计算机发送信息(按K1键),如果发送工作正常,计算机调试软件窗口将显示:“PC已接收到信息,OK!等待主机发送00指令!”,如图B.2所示。接着,由计算机向单片机发送“00”指令,如果单片机接收正常,P1端口接的8只LED全部亮起,同时还将该指令返回到计算机屏幕上。 图B.2 串口通信调试窗口 B.4.1 程序设计 1.工作原理 本节程序是前边介绍的发送与接收程序的综合应用。程序由主函数、发送函数send_str()和回传函数send_char()所组成。 其中在主函数中对串口进行初始化设置,并不断对按键K1进行扫描,一旦检测到有键按下时,程序将调用发送函数进行发送,同时程序也不断检测是否收到主机发来的数据,如果收到数据,一方面送入P1端口输出;同时还将该数据返回到主机显示。 2.程序 C51语言编写的发送接收测试程序源程序TX22-4.c代码如下: 01 #include /* 头文件 */ 02 char code str[] = "PC已接收到信息,OK!等待主机发送00指令!\0"; 03 void send_str(); /* 发送函数 */ 04 void send_char( ); /* 回传函数 */ 05 sbit K1 = P3^2; /* 定义按键 */ 06 unsigned char temp; /* 声明无符号字符变量temp */ 07 main() /* 主函数 */ 08 { 09 SCON = 0x50; /* 设定串行口工作方式1 */ 10 TMOD = 0x20; /* 定时器1,自动重载,产生数据传输率 */ 11 TH1 = 0xFD; /* 数据传输率为9600 */ 12 TR1 = 1; /* 启动定时器1 */ 13 14 while(1) /* 无限循环 */ 15 { 16 unsigned int j; /* 声明无符号整数变量j */ 17 if (K1 = =0) /* 如果按K1键,则执行{ } */ 18 { 19 for(j = 0;j<20000;j + +); /* 延时消除抖动 */ 20 while(!K1); /* 等待按键放开 */ 21 send_str(); /* 调用发送字符串函数 */ 22 } 23 if(RI) /* 是否有数据到来 */ 24 { 25 RI = 0; /* 清除数据传送标志 */ 26 temp = SBUF; /* 将接收到的数据暂存 temp中 */ 27 P1 = temp&0x0f; /* 数据传送到P1口输出 */ 28 send_char(); /* 调用回传函数 */ 29 } 30 } 31 } 32 33 void send_char( ) /* 回传函数 */ 34 { 35 SBUF = temp; /* 回传发送接收到的数据 */ 36 while(!TI); /* 等待数据传送 */ 37 TI = 0; /* 清除数据传送标志 */ 38 } 39 40 void send_str() /* 发送字符串函数 */ 41 { 42 unsigned char i = 0; /* 声明无符号字符变量i,初始值i = 0 */ 43 while(str[i] != '\0') /* 遇到‘\0’则停止发送 */ 44 { 45 SBUF = str[i]; /* 发送字符串 */ 46 while(!TI); /* 等待数据传送 */ 47 TI = 0; /* 清除数据传送标志 */ 48 i + +; /* i加1,发送下一个字符 */ 49 } 50 } B.4.2 代码详解 01~06:头文件和函数及变量声明。 07~32:主函数。 09~12:串口通信初始化设置,包括选择工作方式、产生数据传输率和启动定时器。 14~30:while无限循环部分。 扫描K1按键,一旦检测到有按键时,程序将调用发送函数发送数据。 检测是否收到主机发来的数据,如果收到数据,送入P1端口输出,同时调用回传函数将该数据返回到主机显示。 31:主函数结束。 33~38:回传函数,功能也是发送,它是将接收到的数据再返回给主机。 40~50:发送字符串函数。 B.4.3 经验总结 本节程序是单片机发送与接收的简单测试程序。在单片机与计算机连接通信时,可使用该程序检测单片机发送和接收信息的工作是否正常。 发送程序与接收程序的语句大部分相同,两个程序的主要区别是:发送时需要先将数据写入数据缓冲寄存器SBUF中,例如,语句“SBUF = temp”;而接收时是从数据缓冲寄存器SBUF中将数据读出,例如,语句“temp = SBUF”。发送与接收语句是通信程序中两条重要语句,掌握这两条语句的特征,对编写与分析串行口通信程序非常有用。
/
本文档为【单片机实例--通过实例学习单片机】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索