大学计算机 第2讲(二)流水灯的实现

上传人:woxinch****an2018 文档编号:38982979 上传时间:2018-05-10 格式:DOC 页数:7 大小:170.50KB
返回 下载 相关 举报
大学计算机  第2讲(二)流水灯的实现_第1页
第1页 / 共7页
大学计算机  第2讲(二)流水灯的实现_第2页
第2页 / 共7页
大学计算机  第2讲(二)流水灯的实现_第3页
第3页 / 共7页
大学计算机  第2讲(二)流水灯的实现_第4页
第4页 / 共7页
大学计算机  第2讲(二)流水灯的实现_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《大学计算机 第2讲(二)流水灯的实现》由会员分享,可在线阅读,更多相关《大学计算机 第2讲(二)流水灯的实现(7页珍藏版)》请在金锄头文库上搜索。

1、第第 2 讲(二)流水灯的实现讲(二)流水灯的实现keil proteus 2009-11-24 17:20:18 阅读 239 评论 0 字号:大中小 第 2 讲(二)流水灯的实现 前面我们已经完成了流水灯的电路设计,现在我们开始根据电路图实现流水灯的程序设计。在程序的开头我们将根据第 1 讲的点亮一个 LED 灯的程序进行扩展,用最容易想到的方法实现流水灯效果。然后我们将利用其他方法改写这个程序,一步一步实现最优化的程序。步骤一:让一个 LED 灯闪烁起来。如上图,我们知道如果让 P0 口的第 0 位(下面我们用 led1 表示)赋值 0 即低电平,那么 LED 小灯点亮,而给它赋值 1

2、即高电平,那么它便会熄灭。所以我们的程序改成这样:#includesbit led1 = P00;void main()led1 = 0; /小灯亮led1 = 1; /小灯灭但是当我们将该程序编译并运行后,发现结果并不是我们想要的那样 LED 灯有规律的一亮一灭,而是很无规律的乱闪。这是为什么呢?原因是单片机 CPU 执行程序语句的速度非常快,而 LED 灯的反应却没那么灵敏,所以当执行“led1 = 0;”语句 LED 灯亮后,又执行“led1 = 1;”时可能 LED 灯还没有来得及熄灭,又开始执行“led1 = 0;”语句了,所以 LED 灯长时间亮着。相反的,LED 灯可能长时间熄灭

3、。这就造成了程序的混乱。为了解决上面的问题,我们可以让 CPU 执行完“led1 = 0;”语句后,不直接执行“led1 = 1;”而是去执行一些其他无关的操作,那么 LED 灯就会亮一段时间。此后再执行“led1 = 1;”让 LED 灯熄灭,再去执行一些其他无关的操作,那么 LED 灯就会熄灭一段时间,然后再循环到程序开始,这样 LED 灯便可以稳定的一亮一灭闪烁起来了。我们只更改主函数:void main()int i,j; /加入两个临时变量led1 = 0;for(i=1000;i0;i-) /双重循环,循环体为空,就是说这个循环什么也不做,只是for(j=100;j0;j-); /

4、进行空循环,来消耗 CPU 周期,达到延时的效果led1 = 1;for(i=1000;i0;i-)for(j=100;j0;j-);可以看出,是我们加入了循环函数来让 CPU 进行其他操作的,这样便实现了一个 LED 灯的闪烁效果。但是同样的双重 for 循环语句我们却写了两遍,显得很臃肿,我们可以将 for 循环写到一个函数里,然后用到延时的地方只需要调用这个函数名即可。程序修改如下:#includesbit led1 = P00;void delay(); /加入子函数的声明void main() /主函数led1 = 0;delay(); /子函数的调用led1 = 1;delay()

5、; /子函数的调用void delay() /子函数的定义int i,j;for(i=1000;i0;i-)for(j=100;j0;j-);在程序中除了 main()函数外其他函数都称为子函数,而子函数一般定义在主函数的后面。这样在程序的开头必须先对子函数进行声明,说明我下面要用到这样一个函数。声明与定义的区别就是定义需将函数的具体实现语句写出来,而声明不用。到此,一个 LED 灯闪烁的程序便完成了。步骤二:让多个 LED 灯同时点亮。学会了点亮一个 LED 灯,那么点亮多了 LED 灯也就很容易了。下面是第 2 讲(一)中画好的电路图,可以知道只需同时让需要亮的 LED 灯的 P0 口的相

6、应位赋值 0 即可。下面的程序我们将让第 1,3,5,7个 LED 灯点亮。#includesbit led1 = P00;sbit led2 = P01;sbit led3 = P02;sbit led4 = P03;sbit led5 = P04;sbit led6 = P05;sbit led7 = P06;sbit led8 = P07;void main()led1 = 0; /点亮第 1 个 LED 灯led3 = 0; /点亮第 3 个 LED 灯led5 = 0; /点亮第 5 个 LED 灯led7 = 0; /点亮第 7 个 LED 灯运行效果如下:可以看出,P0 口没有赋

7、值的其他位默认为高电平,其实单片机初始化后所有端口均为高电平。到这里你是不是觉得上面那么多位定义很麻烦,其实还有一种对 P0 口整体赋值的方法,被称为总线方法。例如上面的程序可以改写为:#includevoid main()P0 = 0xaa; /利用总线方法给端口赋值其中,语句“P0 = 0xaa;”中的 0xaa 是十六进制数,C 语言中十六进制数都以 0x 开头。十六进制中用0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f 来表示十进制中的 0 到 15,其中 a 表示 10,即二进制的 1010,那么 0xaa 就表示 1010 1010,这八位数从右到左分别对应 P0

8、口的0 到 7 位,如下图:所以执行完语句“P0 = 0xaa;”后,便能点亮第 1,3,5,7 个小灯。可以看出利用总线的方法能大大的简化程序。步骤三:实现流水灯。会让一个小灯亮灭了,会点亮多个小灯了,那么也许你已经想到了怎样去实现流水灯效果。还用上面的电路图,程序如下:#includevoid delay();void main()P0 = 0xfe; /点亮第 1 个小灯delay();P0 = 0xff; /熄灭小灯P0 = 0xfd; /点亮第 2 个小灯delay();P0 = 0xff;P0 = 0xfb; /点亮第 3 个小灯delay();P0 = 0xff;P0 = 0xf

9、7; /点亮第 4 个小灯delay();P0 = 0xff;P0 = 0xef; /点亮第 5 个小灯delay();P0 = 0xff;P0 = 0xdf; /点亮第 6 个小灯delay();P0 = 0xff;P0 = 0xbf; /点亮第 7 个小灯delay();P0 = 0xff;P0 = 0x7f; /点亮第 8 个小灯delay();P0 = 0xff;void delay() /延时函数的定义int i,j;for(i=1000;i0;i-)for(j=100;j0;j-);有了上面的十六进制的知识,第一条语句“P0 = 0xfe;”应该知道是什么意思了,就是 P0 口的第

10、 0 为赋值0,其他位赋值 1,即 1111 1110,也就是 0xfe 了。它实现了点亮第一个 LED 灯。上面的方法虽然容易想到,但是程序也太长了吧,有没有好一点的方法呢?有的,下面我们用 C51 即单片机 C 语言提供的一个函数来实现流水灯。步骤四:其他方法实现流水灯。我们先直接改写程序,然后再进行解释。#include#include /循环移位函数定义在该头文件中,要想使用该函数必须先包含此头文件void delay();void main()unsigned char temp; /定义无符号字符型变量 temptemp = 0xfe; /temp 赋初值 0xfe while(1

11、) /循环执行下面的语句P0 = temp; /将 temp 的值赋给 P0 口delay();temp = _crol_(temp,1); /temp 的值每次向左循环移动 1 位void delay()int i,j;for(i=1000;i0;i-)for(j=100;j0;j-);其中,unsigned char 类型的变量是 8 位的,给 temp 赋值 0xfe,即 1111 1110。而_crol_函数是循环左移函数,它有两个参数,第一个参数是要进行循环的变量,第二个参数是每次循环的位数。“temp = _crol_(temp,1)”的意思是让 temp 的值向左环移一位,即 t

12、emp 由 1111 1110 变为了 1111 1101,最高位移动到了最末位,其他位依次向左移动一位。示意图如下:这样小灯便挨着被点亮,“wehile(1)”一直循环执行那三条语句,所以就出现了流水灯效果。与其对应的还有循环右移函数_cror_(),其用法与_crol_()一样。其实我们也可以不用这个环移函数,直接利用位运算符也能实现流水灯效果。程序如下:#includevoid delay();void main()int i;while(1)for(i=0;i0;i-)for(j=100;j0;j-);下面先介绍一下“”右移符号,它将数值的最低位移到 CY 中,最高位补 0。至此,流水灯的程序编写便全部介绍完了。本文来自 CSDN 博客,转载请标明出处:http:/

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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

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