查看:
2207
|
回复:
0
|
流水灯
|
|
发表于2018-12-15 17:30:29
|
显示全部楼层
1#
电梯直达
制作流水灯,8个发光二极管LED0~LED7经限流电阻分别接至P1口的P1.0~P1.7引脚上,阳极共同接高电平。编写程序来控制发光二极管由上至下的反复循环流水点亮,每次点亮一个发光二极管。
参考程序: #include <reg51.h> #include <intrins.h> //包含移位函数_crol_( )的头文件 #define uchar unsigned char #define uint unsigned int void delay(uint i) //延时函数 { uchar t; while (i--)
{
for(t=0;t<120;t++); } } void main( ) //主程序 { P1=0xfe; //向P1口送出点亮数据 while (1) { delay( 500 ); //500为延时参数,可根据实际需要调整 P1=_crol_(P1,1) ; // 函数_crol_(P1,1)把P1中的数据循环左移1位 } } (1)数组的字节操作实现 建立1个字符型数组,将控制8个LED显示的8位数据作为数组元素,依次送P1口。参考程序: #include <reg51.h> #define uchar unsigned char uchar tab[ ]={ 0xfe , 0xfd , 0xfb , 0xf7 , 0xef , 0xdf , 0xbf , 0x7f , 0x7f , 0xbf , 0xdf , 0xef , 0xf7 , 0xfb , 0xfd , 0xfe }; /*前8个数据为左移点亮 数据,后8个为右移点亮数据*/ { uchar i,j; for(i=0; i<255; i++) for(j=0; j<255; j++); } void main( ) //主函数 { uchar i; while (1) { for(i=0;i<16; i++) { P1=tab[i]; //向P1口送出点亮数据 delay( ); //延时,即点亮一段时间 } } } 使用移位运算符“>>”、“<<”,把送P1口显示控制数据进行移位,从而实现发光二极管依次点亮。参考程序: #include <reg51.h> #define uchar unsigned char void delay( ) { uchar i,j; for(i=0; i<255; i++) for(j=0; j<255; j++); } void main( ) //主函数 { uchar i,temp; while (1)
{ { temp=0x01; //左移初值赋给temp for(i=0; i<8; i++) { P1=~temp; // temp中的数据取反后送P1口 delay( ); // 延时 temp=temp<<1; // temp 中数据左移一位 } temp=0x80; // 赋右移初值给temp for(i=0; i<8; i++) { P1=~temp; // temp中的数据取反后送P1口 delay( ); // 延时 temp=temp>>1; // temp 中数据右移一位 } } } 使用C51提供的库函数,即循环左移n位函数和循环右移n位函数,控制发光二极管点亮。参考程序: #include <reg51.h> #include <intrins.h> //包含循环左、右移位函数的头文件 #define uchar unsigned char void delay( ) { uchar i,j; for(i=0; i<255; i++) for(j=0; j<255; j++); } void main( ) // 主函数 { uchar i,temp; while (1) { temp=0xfe; // 初值为11111110 for(i=0; i<7; i++) P1=temp; // temp中的点亮数据送P1口,控制点亮显示 delay( ); // 延时 temp=_crol_( temp,1) ; // temp 数据循环左移1位 } for(i=0; i<7; i++) { P1=temp; // temp中的数据送P1口输出 delay( ); // 延时 temp=_cror_( temp,1) ; //temp中数据循环右移1位 } } } |
|