第2讲流水灯的实现.docx

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

第2讲(二)流水灯的实现

2009-11-2417:20:18阅读239评论0字号:大中小

第2讲(二)流水灯的实现

前面我们已经完成了流水灯的电路设计,现在我们开始根据电路图实现流水灯的程序设计。在程序的开头我们将根据第1讲的点亮一个LED灯的程序进行扩展,用最容易想到的方法实现流水灯效果。然后我们将利用其他方法改写这个程序,一步一步实现最优化的程序。

步骤一:让一个LED灯闪烁起来。

如上图,我们知道如果让P0口的第0位(下面我们用led1表示)赋值0即低电平,那么LED小灯点亮,而给它赋值1即高电平,那么它便会熄灭。所以我们的程序改成这样:

#includesbitled1=P0^0;

voidmain()

{

led1=0;//小灯亮led1=1;//小灯灭

}

但是当我们将该程序编译并运行后,发现结果并不是我们想要的那样LED灯有规律的一亮一灭,而是很无

2

以知道只需同时让需要亮的LED灯的P0口的相应位赋值0即可。下面的程序我们将让第1,3,5,7个

LED灯点亮。

#includesbitled1=P0^0;sbitled2=P0^1;sbitled3=P0^2;sbitled4=P0^3;sbitled5=P0^4;sbitled6=P0^5;sbitled7=P0^6;sbitled8=P0^7;

voidmain()

{

led1=0;//点亮第1个LED灯led3=0;//点亮第3个LED灯led5=0;//点亮第5个LED灯led7=0;//点亮第7个LED灯

}

运行效果如下:

可以看出,P0口没有赋值的其他位默认为高电平,其实单片机初始化后所有端口均为高电平。

到这里你是不是觉得上面那么多位定义很麻烦,其实还有一种对P0口整体赋值的方法,被称为总线方法。例如上面的程序可以改写为:

#includevoidmain()

{

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就表示10101010,这八位数从右到左分别对应P0口的0

到7位,如下图:

所以执行完语句“P0=0xaa”后,便能点亮第1,3,5,7个小灯。可以看出利用总线的方法能大大的简化程序。

步骤三:实现流水灯。

1

2

3

4

5

6

7

8

0 0

1 11111110 0xfe

#include//循环移位函数定义在该头文件中,要想使用该函数必须先包含此头文件voiddelay();

voidmain()

{

unsignedchartemp;//定义无符号字符型变量temptemp=0xfe;//temp赋初值0xfe

while(1)//循环执行下面的语句

{

P0=temp;//将temp的值赋给P0口

delay();

temp=_crol_(temp,1);//temp的值每次向左循环移动1位

}

}

voiddelay()

{

inti,j;for(i=1000;i0;i--)

for(j=100;j0;j--);

}

其中,unsignedchar类型的变量是8位的,给temp赋值0xfe,即11111110。而_crol_函数是循环左移函数,它有两个参数,第一个参数是要进行循环的变量,第二个参数是每次循环的位数。

“temp=_crol_(temp,1)”的意思是让temp的值向左环移一位,即temp由11111110变为了11111101,最高位移动到了最末位,其他位依次向左移动一位。示意图如下:

这样小灯便挨着被点亮,“wehile(1)”一直循环执行那三条语句,所以就出现了流水灯效果。

与其对应的还有循环右移函数_cror_(),其用法与_crol_()一样。其实我们也可以不用这个环移函数,直接利用位运算符也能实现流水灯效果。程序如下:

#includevoiddelay();voidmain()

{

inti;while(1)

{

for(i=0;i8;i++)

{

P0=~(1

delay();

}

}

}

voiddelay()

{

inti,j;for(i=

文档评论(0)

hao187 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体武汉豪锦宏商务信息咨询服务有限公司
IP属地上海
统一社会信用代码/组织机构代码
91420100MA4F3KHG8Q

1亿VIP精品文档

相关文档