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