大学计算机课件第10章C51应用实训

上传人:woxinch****an2018 文档编号:56918906 上传时间:2018-10-17 格式:PPT 页数:109 大小:2.79MB
返回 下载 相关 举报
大学计算机课件第10章C51应用实训_第1页
第1页 / 共109页
大学计算机课件第10章C51应用实训_第2页
第2页 / 共109页
大学计算机课件第10章C51应用实训_第3页
第3页 / 共109页
大学计算机课件第10章C51应用实训_第4页
第4页 / 共109页
大学计算机课件第10章C51应用实训_第5页
第5页 / 共109页
点击查看更多>>
资源描述

《大学计算机课件第10章C51应用实训》由会员分享,可在线阅读,更多相关《大学计算机课件第10章C51应用实训(109页珍藏版)》请在金锄头文库上搜索。

1、,第10章 C51应用培训,培训1 初识C51 培训2 单色灯闪烁 培训3 走马灯 培训4 流水灯 培训5 外部中断 培训6 定时器 培训7 双芯灯实验 培训8 P1口输入输出实验 培训9 直流电机实验 培训10 步进马达实验 培训11 串口实验 培训12 单片机扩展实验 培训13 人机接口实验 培训14 A/D、D/A实验,培训1 初识C51 拿到一块89C51的芯片,首先必须要知道怎样连线。 1、 电源:单片机使用的是5V电源,正极接40引脚,负极(地)接20引脚。 2、 振蒎电路:单片机是一种时序电路,必须提供脉冲信号,在单片机内部已集成了振荡器,使用晶体振荡器接18、19脚。买来晶振、

2、电容按图10-1连上就可以了。 3、 复位引脚:按图1中画法连好。 4、 EA引脚:接正电源端。 至此,单片机就接好了,通上电就开始工作了。 第一个任务是要用单片机点亮一只发光二极管LED,显然,这个LED必须要和单片机的某个引脚相连,否则单片机就没法控制它了,那么和哪个引脚相连呢?单片机上除了刚才用掉的5个引脚,还有35个,我们将这个LED和1脚相连。(见图10-1,其中R1是限流电阻)按照这个图的接法,当1脚是高电平时,LED不亮,只有1脚是低电平时,LED才发亮。因此我们要能够控制1引脚按要求变为高或低电平,就能控制灯亮与灭。,图10-1 单色灯电路,有了上面的基本知识之后让我们来开始我

3、们的第一个C51程序吧。如何实现让一个单色灯点亮呢?如果用C语言来写,最好的就是对一个变量赋值0。程序如下: #include “reg51.h“ (1) void main() (2) P1 = 0x00; (3) 这个程序非常类似于的Turbo C,但其中有很多的不同点,我们翻阅本教材4.1。怎么样,这个程序到现在我们是不是已经非常的清楚了,我们把程序录入到C51编译器后,使用单步运行的方式运行一下,看一下运行结果,8只单色灯全部点亮,好,这样我们就完成了我们的第一个培训了!,培训2 单色灯闪烁 实验一、8只单色灯亮,然后8只单色灯灭,实验电路如图10-1所示。 #include “reg

4、51.h“ void main() P1 0x00; (1)P1 0xff; (2) P10xff;是什么呢?0xff对应二进制的数值是11111111,到这里大家明白了吧。对前面说到了送1到对应的引脚是熄灭单色灯,所有这里送8个1,代表的就是熄灭8个单色灯。录入程序后我们通过单步运行程序,就可以看到当程序走过第(1)条语句后单色灯全亮,走过第二条语句后单色灯全灭了。 但是到现在为止,我们为什么只是让程序单步的走呢?为什么不能让他自己走呢?可能有很多同学有这样那样的疑问,对的,我们现在就解决大家的这些疑问,如果按照我们上面的这段程序全速执行的话,只能看到灯灭了。因为单片机执行的速度实在是太快了

5、,我们跟本分辨不出单色灯点亮呢。单色灯就已经被熄灭了,如何能让我们分辨出单色灯的亮和灭呢,解决的办法就是“延时”,如何做延时呢?可以把延时编写成一个子函数,我们叫“延时子函数”,延时子函数例子可以有很多种,我在这里把它归纳为2类。,第1类:无参数传递的延时子程序 形式1: void delay() unsigned int i;for(i=0;i10000;i+) ; 形式2: void delay() unsigned int i=10000;while(i-) ; 形式3: void delay() unsigned int i,j;for(i=0;i100;i+) for(j=0;j20

6、0;j+) ; ,第2类:有参数传递的延时子程序 void delay(unsigned char k) unsigned int i,j;for(i=0;ik;i+) for(j=0;j200;j+) ; 上面的延时的函数名都叫delay,当然这个名称你可以随便去起名,第1类的形式1、2、3都是单层循环,具体的语法在C语言中大家都学过,在这里就不过多的重复了。循环的次数决定了你延时的时间长短。如果感觉延时时间太短,可以采用形式4的双重循环,或多循环均可,循环的种类很多,在这里也不过多的重复举例了,只举一些常用的形式。 第2类更加的方便一些,可能随时改变k的传递值以达到不同的延时。,注意:在这

7、里我使用的变量定义为unsigned int 代表的是无符号整型,其取值范围是065535,循环变量的值不要超过这个数值,否则就会出现死循环,就走不出延时子程序了。这也是大家经常犯的一个错误。 例:下面就是一个错误的实例。 void delay() unsigned int k;for(k=0;k70000;k+) ; 该程序错误的原因是K永远加不到70000,所以无法跳出死循环。 好了,现在有了延时函数了,那么整个程序应该如何去修改呢?,源程序如下: 程序1:延时函数写在调用之前不需要声明。 第一类延时。 #include “reg51.h” void delay() /延时函数体 unsi

8、gned int i;for(i=0;i10000;i+) ; void main() P1 0x00; delay(); /调用延时函数。P1 0xff; delay(); ,第二类延时 #include “reg51.h” void delay(unsigned char k) /延时函数体 unsigned int i,j;for(i=0;ik;i+) for(j=0;j200;j+) ; void main() P1 0x00; delay(100);/调用延时函数。将100传递给延时函数的kP1 0xff; delay(200);/调用延时函数。将200传递给延时函数的,两个延时的/

9、时间不相同 ,程序2:延时函数写在调用之后,需要在前面声明 #include “reg51.h” void delay(); /延时函数体在后面必须提前声明 void main() P1 0x00; delay(); /调用延时函数。P1 0xff; delay(); void delay() /延时函数体 unsigned int i;for(i=0;i10000;i+) ; 将源程序录入到编译器后,全速运行,结果是我们看到单色灯闪了一下,就停下了。这好像还和我们看到的结果有一点点偏差。为什么呢?原因是我们这个程序只将单色灯亮一次灭一次就停下了。那么能否让单色灯一直闪烁呢?我们可将程序改成循

10、环的。可以选择一个无限的循环体。,例程如下: 程序1: #include “reg51.h” void delay() /延时函数体 unsigned int i;for(i=0;i10000;i+) ; void main() for(;) /这里并没有结束的条件,所以是一个无限的循环。P1 0x00; delay(); /调用延时函数。P1 0xff; delay(); ,程序2: #include “reg51.h” void delay() /延时函数体 unsigned int i;for(i=0;i10000;i+) ; void main() while(1) /这里并没有结束的

11、条件,所以是一个无限的循环。P1 0x00; delay(); /调用延时函数。P1 0xff; delay(); ,程序3: #include “reg51.h” void delay() /延时函数体 unsigned int i;for(i=0;i10000;i+) ; void main() do /这里并没有结束的条件,所以是一个无限的循环。P1 0x00; delay(); /调用延时函数。P1 0xff; delay();while(1); 现在在全速运行程序,就可以看到8只发光二极管开始一闪一闪的了,好漂亮啊!是否感觉C51是不是非常的好用呢?,思考题: 修改延时子程序让灯的闪

12、烁间隔变快。 让灯先左四个亮,再右四个亮,间隔闪烁,思考一下?,培训3 走马灯 本次课的培训内容我们选择走马灯实验,先说明一下什么是走马灯,走马灯指的是单色灯一只一只的亮,一只一只的灭,每次亮的灯只有一个,而且是按照一个方向顺序向前或向后走动。 电路如图10-1所示: 思考一下程序如何编写,首先看电路图中的8个单色灯,从上到下分别是L0L7,我们首先应该点亮L0,然后熄灭L0;接着点亮L1,然后熄灭L1,以此类推,最后点亮L7,再熄灭L7,周而复使继续下去。,前面的实验我们都是直接用一个P1口的,那么能不能对P1口的某一个引脚来操作呢?如果能的话,那么程序不是变的很简单了吗?对于P1口的某一个

13、引脚我们可以用sbit来定义,具体的定义如下: (1)sbit 位变量名位地址 sbit P1_1 = 0x91; 这样是把位的绝对地址赋给位变量。同sfr 一样 sbit 的位地址必须位于80H-FFH 之间。 (2)sbit 位变量名特殊功能寄存器名位位置 sbit P1_1 = P1 1; /先定义一个特殊功能寄存器名再指定位变量名所在的位置 当可寻址位位于特殊功能寄存器中时可采用这种方法 (3)sbit 位变量名字节地址位位置 sbit P1_1 = 0x90 1; (0x901相当汇编中的P1.1),我们可以跟据第2种方法来分别定义P1口的8个引脚。具体定义如下: sbit P1_0

14、 = P10; /定义L.0灯连接的引脚命名为变量P1_0,其值可以是0或1 sbit P1_1 = P11; /定义L1灯连接的引脚命名为变量P1_1,其值可以是0或1 sbit P1_2 = P12; /定义L2灯连接的引脚命名为变量P1_2,其值可以是0或1 sbit P1_3 = P13; /定义L3灯连接的引脚命名为变量P1_3,其值可以是0或1 sbit P1_4 = P14; /定义L4灯连接的引脚命名为变量P1_4,其值可以是0或1 sbit P1_5 = P15; /定义L5灯连接的引脚命名为变量P1_5,其值可以是0或1 sbit P1_6 = P16; /定义L6灯连接的

15、引脚命名为变量P1_6,其值可以是0或1 sbit P1_7 = P17; /定义L7灯连接的引脚命名为变量P1_7,其值可以是0或1,具体程序如下: #include “reg51.h” sbit P1_0 = P10; sbit P1_1 = P11; sbit P1_2 = P12; sbit P1_3 = P13; sbit P1_4 = P14; sbit P1_5 = P15; sbit P1_6 = P16; sbit P1_7 = P17; void delay() unsigned int i;for(i=0;i10000;i+) ; ,void main() for(;) P1_0 0; /点亮L0灯delay(); /延时一小段时间,让人的肉眼能够看清P1_0 1; /熄灭L0灯P1_1 0; /点亮L1灯delay(); /延时一小段时间,让人的肉眼能够看清P1_1 1; /熄灭L1灯P1_2 0; /点亮L2灯delay(); /延时一小段时间,让人的肉眼能够看清P1_2 1; /熄灭L2灯P1_3 0; /点亮L3灯delay(); /延时一小段时间,让人的肉眼能够看清P1_3 1; /熄灭L3灯P1_4 0; /点亮L4灯delay(); /延时一小段时间,让人的肉眼能够看清,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号