电子说
流水灯是学习51单片机的一个基本项目,是我们对单片机IO口输出认识的基本项目。当然学会了花样流水灯也很好玩。
下面就分享一种51单片机流水灯制作的方法。
一、流水灯原理图
二、相关知识
1、while语句
书写格式:while(表达式) { 语句; //循环体 。。。 }
备注:当while语句中的()里的值为非零值是,while所带的语句就会执行,为0时程序不执行(只有为0值时不执行),括号里可以是常量,可以是变量,也可以是一个公式。
我们常用写法:
(1)while(1){ 语句; } //这样写代表了这是一个死循环,{ }中的程序会一直循环执行
(2)while(a--){ 语句; } //这样写就是当a每执行一次循环会自减一个数,当a的值减到0了,就不执行了。
2、for循环语句
除了while语句语句之外,c语言还有一个for循环语句。
书写格式:for(初始化表达式;条件表达式;增量表达式) { 语句; 。。。 }
常用写法:
for(i=0;i<8;i++) { 语句:。。。 }
//这样写代表了,for语句的{}中的程序循环执行,循环的次数由()的内容决定,()中的意思是i变量从0开始,到8结束(不含8),i每次自加1,加到8 了跳出循环。
3、左移右移指令
运算符 | 意义 | 示 例 (设j = 0x10) | |
<< | 左移(各位同时左移若干位,高位舍弃,低位补零) | k = j<<1;//k=0x20 | |
>> | 右移(各位同时右移若干位,低位舍弃,高位补零) | k = j>>1;//k=0x08 |
4、位取反指令
运算符 | 意义 | 示 例 (设a = 0x25) | |
~ | 按位取反 | c= ~ a; //c=0xda |
5、延时函数
/*--------微秒延时--------*/
void delay_us(uint z)
{
uint x;
for(x=z;x>0;x--);
}
第一个延时函数是微秒级延时,程序原理是for语句每循环一次,单片机执行一次空语句,51单片机(接12M晶振)执行每次空语句实际不止1us,一般会是几微秒。
/*--------毫秒延时--------*/
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
第二个延时函数是毫秒级延时,其中的两个for语句成为嵌套训话语句,下面的for嵌套在上面的for里面执行。下面的for代表了循环执行110次空语句,得到一个1ms延时,此时上面的for循环多少次就延时多少毫秒,而延时多少毫秒由,变量z决定。
三、例程
/*--------------------------- 流水灯接口:P1 ------------------------------*/ #include< reg52.h > #define uint unsigned int #define uchar unsigned char /*--------微妙延时--------*/ void delay_us(uint z) { uint x; for(x=z;x >0;x--); } /*--------毫秒延时--------*/ void delay_ms(uint z) { uint x,y; for(x=z;x >0;x--) for(y=110;y >0;y--); } /*----------主函数-----------*/ void main() { P0=0x00;P1=0xff;P2=0x00;P3=0x00;//端口初始化,熄灭所有LED灯 uchar i,j; while(1) { j=0x01; for(i=0;i< 8;i++) //for循环8次 { P1=~j; //P1等于j位取反 j=j< <1; //j左移1位 delay_ms(1000); //等待1秒 } } }
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !