C51 流水灯的三个实验
作者:互联网
ISIS仿真电路如图
编程环境Keil uv5
1.直接流水灯从D0到D11依次亮起,循环不止。
#include<reg51.h> #define uchar unsigned char void delay() { uchar i,j; for(i=0;i<25;i++) for(j=0;j<255;j++); } void main() { uchar i,temp,temp2; while(1) { P1=0xff; temp=0x01; for(i=0;i<8;i++) { P0=~temp; delay(); temp=temp<<1; } P0=~temp; temp2=0x01; for(i=0;i<4;i++) { P1=~temp2; delay(); temp2=temp2<<1; } } }
2.键控流水灯,按下反向
#include<reg51.h> #define uchar unsigned char void delay()//延时函数 { uchar i,j; for(i=0;i<25;i++) for(j=0;j<255;j++); } void main() { uchar i,temp,temp2,temp3,flag=1;//temp是P0口的反电位,temp2是P1口的反电位,temp3是P2口的输入电位,flag是流水灯方向状态 while(1) { temp=0x01;//第一组第一个灯准备亮起 if(flag==0)//如果逆时针 temp=0x80;//第一组最后一个灯准备亮起 for(i=0;temp!=0x00;i++)//移位到没有灯亮起结束循环 { P0=~temp;//第一组灯亮 delay();//延时 P2=0xff;//要检测的端口先上高电位 temp3=P2&0x0f;//与运算屏蔽低四位带来的影响 if(temp3==0x0e)//第一个建按下的值 {temp=temp>>1;flag=0;} else {temp=temp<<1;flag=1;} } P0=0xff; temp2=0x01;//第二组同上 if(flag==0) temp2=0x08; for(i=0;temp2!=0x00&&temp2!=0x10;i++) { P1=~temp2; delay(); P2=0xff; temp3=P2&0x0f; if(temp3==0x0e) {temp2=temp2>>1;flag=0;} else {temp2=temp2<<1;flag=1;} } P1=0xff; } }
3.键控流水灯
不按不亮,按k1顺时针,按k2逆时针,按k3停止.
这个没有设计完好,按k1k2的时候循环是从头开始的,而且停下来的点不会熄灭.而且还无奈使用了goto函数.
#include<reg51.h> #define uchar unsigned char void delay() { uchar i,j; for(i=0;i<25;i++) for(j=0;j<255;j++); } void main() { uchar i,temp,temp2,temp3,flag=0; while(1) { P2=0xff; temp3=P2&0x0f; loop: if(temp3==0x0e) flag=1; if(temp3==0x0d) flag=2; if(temp3==0x0b) flag=0; switch(flag){ case 1: while(1) { temp=0x01; for(i=0;temp!=0x00;i++) { P0=~temp; P2=0xff; temp3=P2&0x0f; if(temp3==0x0e||temp3==0x0d||temp3==0x0b) goto loop; delay(); P2=0xff; temp3=P2&0x0f; if(temp3==0x0e||temp3==0x0d||temp3==0x0b) goto loop; temp=temp<<1; } P0=0xff; temp2=0x01; for(i=0;temp2!=0x00&&temp2!=0x10;i++) { P1=~temp2; P2=0xff; temp3=P2&0x0f; if(temp3==0x0e||temp3==0x0d||temp3==0x0b) goto loop; delay(); P2=0xff; temp3=P2&0x0f; if(temp3==0x0e||temp3==0x0d||temp3==0x0b) goto loop; temp2=temp2<<1; } P1=0xff; } break; case 2: while(1) { temp2=0x08; for(i=0;temp2!=0x00&&temp2!=0x10;i++) { P1=~temp2; P2=0xff; temp3=P2&0x0f; if(temp3==0x0e||temp3==0x0d||temp3==0x0b) goto loop; delay(); P2=0xff; temp3=P2&0x0f; if(temp3==0x0e||temp3==0x0d||temp3==0x0b) goto loop; temp2=temp2>>1; } P1=0xff; temp=0x80; for(i=0;temp!=0x00;i++) { P0=~temp; P2=0xff; temp3=P2&0x0f; if(temp3==0x0e||temp3==0x0d||temp3==0x0b) goto loop; delay(); P2=0xff; temp3=P2&0x0f; if(temp3==0x0e||temp3==0x0d||temp3==0x0b) goto loop; temp=temp>>1; } P0=0xff; } break; default: break;} } }
标签:P2,delay,C51,temp,uchar,temp3,实验,流水,0xff 来源: https://www.cnblogs.com/halfgong/p/13772659.html