楼主,程序有错,这个程序如果是低电平点亮,你的P2口全高电平,不管怎么移都是高电平的 应该是P2=(P2<<1|0x01) |
是不是你在仿真图里面连错了线,接线不正确导致的 |
程序好像没问题,估计是硬件的问题 |
taotie 发表于 2019-9-26 13:12 谢谢你,一开始用的排阻,然后改成普通的电阻就行! |
wulin 发表于 2019-9-26 19:16 可能我记错了,好久没写过单片机的程序了,最近才开始折腾 |
这个应该可以 |
#include <reg52.h> #include "intrins.h" void Delay_ms(int Cnt) { while(Cnt--) { int t=100; while(--t); } } void main() { char i; while(1) { P2 = 0xfe; Delay_ms(200); for(i=8;i>0;i--) { P2=_crol_(P2,1); Delay_ms(200); } } } |
![]() |
|
bai_yun_123 发表于 2019-9-26 16:57 左移后最低位补0 |
其实我想问0xff的二进制不是1111 1111嘛,左移怎么都是1,为什么灯会亮? |
楼主这个程序是从1~8个灯逐渐全亮,如果想1个灯流水改为如下 #include <reg52.h> void Delay_ms(int Cnt) { while(Cnt--) { int t=100; while(--t); } } void main() { while(1) { if(P2==0xff) P2<<=1; else P2=(P2<<1)|0x01; Delay_ms(200); } } |
Proteus 8 仿真可以循环点亮流水灯led,程序没问题 ~~。怀疑led的限流电阻没对!![]() |
开发板能实现,一般仿真是没有问题的,除非仿真电路与开发板电路不一致,所以这样的问题应该一同把仿真图贴出,如果是延时时间的问题,可以把 Delay_ms(200);修改为 Delay_ms(1000);试试 |
你说的不是很清楚,如果是用proteus仿真的话,你的延时函数就有问题 |
稍微修改一下代码
|
开发板可以的话就是仿真软件的问题了 |
你这个是IO的输入输出搞反了吧,全0才是输出 |