这不是软件问题,是硬件条件导致的错误。当_crol_()函数对P0执行循环左移时要先读P0口当前状态。由于51单片机P0为开漏模式,虽然设置P0=0xfe;,但P0端口在没有外部高电平条件下呈现的是低电平0x00。所以对0x00循环左移得不到预想结果。楼主可以改用其它端口测试或在P0加上拉电阻就不会出错。也可以用一个中间变量缓冲解决问题:
- #include <reg51.H>
- #include <intrins.h>
- unsigned char T_count;
- unsigned char num;
- void main()
- {
- num=0xfe;
- P0=num;
- TMOD=0x01;
- TH0=15536/256;
- TL0=15536%256;
- IE=0x82;
- TR0=1;
- while(1);
- }
- void TIME0() interrupt 1
- {
- TH0=15536/256;
- TL0=15536%256;
- if(++T_count==20)
- {
- num=_crol_(num,1);
- P0=num;
- T_count=0;
- }
- }
复制代码 |