资源预览内容
第1页 / 共109页
第2页 / 共109页
第3页 / 共109页
第4页 / 共109页
第5页 / 共109页
第6页 / 共109页
第7页 / 共109页
第8页 / 共109页
第9页 / 共109页
第10页 / 共109页
亲,该文档总共109页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
,第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脚。买来晶振、电容按图10-1连上就可以了。 3、 复位引脚:按图1中画法连好。 4、 EA引脚:接正电源端。 至此,单片机就接好了,通上电就开始工作了。 第一个任务是要用单片机点亮一只发光二极管LED,显然,这个LED必须要和单片机的某个引脚相连,否则单片机就没法控制它了,那么和哪个引脚相连呢?单片机上除了刚才用掉的5个引脚,还有35个,我们将这个LED和1脚相连。(见图10-1,其中R1是限流电阻)按照这个图的接法,当1脚是高电平时,LED不亮,只有1脚是低电平时,LED才发亮。因此我们要能够控制1引脚按要求变为高或低电平,就能控制灯亮与灭。,图10-1 单色灯电路,有了上面的基本知识之后让我们来开始我们的第一个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 “reg51.h“ void main() P1 0x00; (1) P1 0xff; (2) P10xff;是什么呢?0xff对应二进制的数值是11111111,到这里大家明白了吧。对前面说到了送1到对应的引脚是熄灭单色灯,所有这里送8个1,代表的就是熄灭8个单色灯。录入程序后我们通过单步运行程序,就可以看到当程序走过第(1)条语句后单色灯全亮,走过第二条语句后单色灯全灭了。 但是到现在为止,我们为什么只是让程序单步的走呢?为什么不能让他自己走呢?可能有很多同学有这样那样的疑问,对的,我们现在就解决大家的这些疑问,如果按照我们上面的这段程序全速执行的话,只能看到灯灭了。因为单片机执行的速度实在是太快了,我们跟本分辨不出单色灯点亮呢。单色灯就已经被熄灭了,如何能让我们分辨出单色灯的亮和灭呢,解决的办法就是“延时”,如何做延时呢?可以把延时编写成一个子函数,我们叫“延时子函数”,延时子函数例子可以有很多种,我在这里把它归纳为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;j200;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的传递值以达到不同的延时。,注意:在这里我使用的变量定义为unsigned int 代表的是无符号整型,其取值范围是065535,循环变量的值不要超过这个数值,否则就会出现死循环,就走不出延时子程序了。这也是大家经常犯的一个错误。 例:下面就是一个错误的实例。 void delay() unsigned int k; for(k=0;k70000;k+) ; 该程序错误的原因是K永远加不到70000,所以无法跳出死循环。 好了,现在有了延时函数了,那么整个程序应该如何去修改呢?,源程序如下: 程序1:延时函数写在调用之前不需要声明。 第一类延时。 #include “reg51.h” void delay() /延时函数体 unsigned 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传递给延时函数的k P1 0xff; delay(200); /调用延时函数。将200传递给延时函数的,两个延时的 /时间不相同 ,程序2:延时函数写在调用之后,需要在前面声明 #include “reg51.h” void delay(); /延时函数体在后面必须提前声明 void main() P1 0x00; delay(); /调用延时函数。 P1 0xff; delay(); void delay() /延时函数体 unsigned int i; for(i=0;i10000;i+) ; 将源程序录入到编译器后,全速运行,结果是我们看到单色灯闪了一下,就停下了。这好像还和我们看到的结果有一点点偏差。为什么呢?原因是我们这个程序只将单色灯亮一次灭一次就停下了。那么能否让单色灯一直闪烁呢?我们可将程序改成循环的。可以选择一个无限的循环体。,例程如下: 程序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) /这里并没有结束的条件,所以是一个无限的循环。 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是不是非常的好用呢?,思考题: 修改延时子程序让灯的闪烁间隔变快。 让灯先左四个亮,再右四个亮,间隔闪烁,思考一下?,培训3 走马灯 本次课的培训内容我们选择走马灯实验,先说明一下什么是走马灯,走马灯指的是单色灯一只一只的亮,一只一只的灭,每次亮的灯只有一个,而且是按照一个方向顺序向前或向后走动。 电路如图10-1所示: 思考一下程序如何编写,首先看电路图中的8个单色灯,从上到下分别是L0L7,我们首先应该点亮L0,然后熄灭L0;接着点亮L1,然后熄灭L1,以此类推,最后点亮L7,再熄灭L7,周而复使继续下去。,前面的实验我们都是直接用一个P1口的,那么能不能对P1口的某一个引脚来操作呢?如果能的话,那么程序不是变的很简单了吗?对于P1口的某一个引脚我们可以用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 = 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灯连接的引脚命名为变量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
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号