欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: C語言_crol_()函數(shù)不能實現(xiàn)循環(huán)移位 [打印本頁]

作者: mjalk    時間: 2021-4-7 18:16
標題: C語言_crol_()函數(shù)不能實現(xiàn)循環(huán)移位
總程序

問題

在每次執(zhí)行后P0的值變化:0xFE 0xFD 0xF9 0xF1 0xE1 0xC1 0x81 0x01 0x00 之后就一直是0x00
求解。

作者: 人人學會單片機    時間: 2021-4-7 19:08
循環(huán)之前是先讀一次IO口狀態(tài),然后再移位的。假設你外圍拉低或者拉高了 結果就變了。
這個細節(jié)問題,只有人人學會單片機 這個視頻教程講過。其他老師錄制的都沒講
作者: 707794433    時間: 2021-4-7 19:10
程序中斷都沒開
作者: jjkk11    時間: 2021-4-8 00:17
都移為0了,再移不也是0嗎?加上if(P0==0){P0=0xfe;} 或者加一個移位計數(shù),移到8次后重新賦值P0=0xfe
作者: mjalk    時間: 2021-4-8 10:13
707794433 發(fā)表于 2021-4-7 19:10
程序中斷都沒開

我配置了IE呀
作者: mjalk    時間: 2021-4-8 10:15
jjkk11 發(fā)表于 2021-4-8 00:17
都移為0了,再移不也是0嗎?加上if(P0==0){P0=0xfe;} 或者加一個移位計數(shù),移到8次后重新賦值P0=0xfe

關鍵他每次移位后的值不對呀,0xfd(11111101)之后應該是fb(11111011)呀
作者: mjalk    時間: 2021-4-8 10:38
人人學會單片機 發(fā)表于 2021-4-7 19:08
循環(huán)之前是先讀一次IO口狀態(tài),然后再移位的。假設你外圍拉低或者拉高了 結果就變了。
這個細節(jié)問題,只有 ...

啥意思
作者: ANT1987    時間: 2021-4-8 13:52
if(P0==0X00)
{P0=0Xff;}
作者: mjalk    時間: 2021-4-8 17:45
ANT1987 發(fā)表于 2021-4-8 13:52
if(P0==0X00)
{P0=0Xff;}

關鍵他每次移位后的值不對呀,0xfd(11111101)之后應該是fb(11111011)呀
作者: 張?zhí)鞄?nbsp;   時間: 2021-4-8 18:51
貌似P0.1口被外部拉低或損壞了造成的
作者: jjkk11    時間: 2021-4-9 00:39
mjalk 發(fā)表于 2021-4-8 10:15
關鍵他每次移位后的值不對呀,0xfd(11111101)之后應該是fb(11111011)呀

在c++中,移位運算符有雙目移位運算符:<<(左移)和>>(右移)。移位運算符組成的表達式也屬于算術表達式,其值為算術值。左移運算是將一個二進制位的操作數(shù)按指定移動的位數(shù)向左移位,移出位被丟棄,右邊的空位一律補0。右移運算是將一個二進制位的操作數(shù)按指定移動的位數(shù)向右移動,移出位被丟棄,左邊移出的空位或者一律補0,或者補符號位,這由不同的機器而定。在使用補碼作為機器數(shù)的機器中,正數(shù)的符號位為0,負數(shù)的符號位為1。
作者: wulin    時間: 2021-4-9 07:37
mjalk 發(fā)表于 2021-4-8 10:38
啥意思

這不是軟件問題,是硬件條件導致的錯誤。當_crol_()函數(shù)對P0執(zhí)行循環(huán)左移時要先讀P0口當前狀態(tài)。由于51單片機P0為開漏模式,雖然設置P0=0xfe;,但P0端口在沒有外部高電平條件下呈現(xiàn)的是低電平0x00。所以對0x00循環(huán)左移得不到預想結果。樓主可以改用其它端口測試或在P0加上拉電阻就不會出錯。也可以用一個中間變量緩沖解決問題:
  1. #include <reg51.H>
  2. #include <intrins.h>

  3. unsigned char T_count;
  4. unsigned char num;

  5. void main()       
  6. {                                                                       
  7.         num=0xfe;
  8.         P0=num;
  9.         TMOD=0x01;
  10.         TH0=15536/256;
  11.         TL0=15536%256;
  12.         IE=0x82;
  13.         TR0=1;
  14.         while(1);
  15. }
  16. void TIME0() interrupt 1
  17. {
  18.         TH0=15536/256;
  19.         TL0=15536%256;
  20.         if(++T_count==20)
  21.         {
  22.                 num=_crol_(num,1);
  23.                 P0=num;
  24.                 T_count=0;
  25.         }
  26. }
復制代碼

作者: a4732710    時間: 2021-4-9 08:06
地板樓層和11樓都是答非所問。
變量=_crol_(變量名,移動位數(shù)),例如:P0=_crol_(P0,1); 這是循環(huán)左移,而_cror_則是循環(huán)右移,與_crol_用法相同。
<<是左移,最高位移出去了就丟棄,最低位補0,而 _crol_則是循環(huán)左移,最高位移出去后不丟棄,而是補到最低位,也就是說,最低位不補0
樓主問的就是_crol_問題。程序延時沒問題的話,應該是P0口上拉電阻或電壓被干擾問題
作者: jjkk11    時間: 2021-4-9 10:17
a4732710 發(fā)表于 2021-4-9 08:06
地板樓層和11樓都是答非所問。
變量=_crol_(變量名,移動位數(shù)),例如:P0=_crol_(P0,1); 這是循環(huán)左移, ...

學習了,以為樓主是<<,
作者: mjalk    時間: 2021-4-10 12:10
wulin 發(fā)表于 2021-4-9 07:37
這不是軟件問題,是硬件條件導致的錯誤。當_crol_()函數(shù)對P0執(zhí)行循環(huán)左移時要先讀P0口當前狀態(tài)。由于51單 ...

解決了,感謝。
作者: mjalk    時間: 2021-4-10 12:11
a4732710 發(fā)表于 2021-4-9 08:06
地板樓層和11樓都是答非所問。
變量=_crol_(變量名,移動位數(shù)),例如:P0=_crol_(P0,1); 這是循環(huán)左移, ...

了解了,感謝。
作者: Secret丶    時間: 2021-4-10 18:31
我看半天就納悶,沒啥問題啊,他們答得都是啥。。循環(huán)移動用的沒有問題,問題原來出在沒有上拉P0.。。。




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1