成果展示----流水灯 代码展示 #include void Delay1ms(unsigned int xms) //@12.000MHz { unsigned char i, j; while(xms) { i = 2; j = 239; do { while (--j); } while (--i); xms--; } } void main() { while(1) { P1=0xFE; Delay1ms(500); P1=0xFD; Delay1ms(500); P1=0xFB; Delay1ms(500); P1=0xF7; Delay1ms(500); P1=0xEF; Delay1ms(500); P1=0xDF; Delay1ms(500); P1=0xBF; Delay1ms(500); P1=0x7F; Delay1ms(500); } } 硬件解析 我们可以看到8颗LED灯分别接在了 P1-P1.7 引脚上面,并且都出串联了限流电阻(起保护作用) P1-P1.7全部都在P1总线上面,所以在代码部分只需要控制P1的"开关"即可控制全部LED灯 并且可以看到,电路采用的是"灌电流"输出,意味着io口相当于接地的作用 所以 LED灯低电平点亮,高电平熄灭 代码解析----点亮一个LED 首先我们需要搞清楚,LED灯在什么时候才能点亮,由上面的硬件解析可以得出,LED灯在P1处于低电平时点亮,处于高电平的时候是熄灭状态 所以p1-p1.7在熄灭时候对应的二进制为 1111 1111 (1为高电平,0为低电平) p1-p1.7全部都位于1高电平,所以全部熄灭 若二进制为 1111 1110 第一位p1为0,其余p1.1-p1.7为1,则p1对应的LED灯亮,因为p1此时为0低电平,其余都为1高电平 所以在代码部分,我们应该写 P1=11111110,但是软件是基于c语言编程的,所以c语言不能识别二进制,所以我们需要把 二进制转换成十六进制 11111110转十六进制就是 FE 所以我们在代码上就应该写FE 因为 是便于解释器的识别, 是十六进制的标志 所以FE前面我们应该把十六进制的前缀加上,则 0xFE 此时上传代码应该可以看到,LED的第一个灯被点亮了 代码解析----循环函数 首先,我们可以在stc-isp里面生成一个1ms的循环函数 然后我们可以自己定义一个函数(xms) 这样我们输入多少,就会循环多少次1ms达到这样一个效果 假如,我xms输入一个500 首先会进行500次循环 每循环一次,函数会自己减去1 则,我输入500,循环一次完成后,就自动变成499次循环 这个函数是软件给我们生成的1ms的循环 如果500次1ms,那就是500ms,相当于0.5秒的循环 所以,我们在main函数里面引用这个延迟函数,然后在延迟函数里面给他定义一个500次 相当于延迟了0.5秒然后跳转到下一步 代码解析----流水灯的循环 我们在知道灯的原理,同时也知道循环的原理之后,就可以做一个相关的流水灯 现在的代码就非常好理解了,在第一个LED灯亮了之后,然后延迟500ms,自动跳到下一个灯,以此类推,一直循环下去 这里再细细讲解一下 第一个灯,对应的二进制为1111 1110 【FE】 第二个灯,对应的二进制为1111 1101 【FD】 第三个灯,对应的二进制为1111 1011 【FB】 。。。以此类推 所以到最后一个灯就应该是 0111 1111 【7E】 总结 51单片机对于新手来说还是比较友好的,基本上懂了LED点亮的原理,以及二进制转换十六进制的方法之后,这个项目就非常容易做了! 而且要理解一下循环函数的原理。简单来说如果我要定时500ms,其实相当于是把1ms循环了500遍这样 最后,祝大家学有所用!