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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4046|回復: 16
打印 上一主題 下一主題
收起左側

C語言_crol_()函數不能實現循環移位

[復制鏈接]
跳轉到指定樓層
樓主
ID:901999 發表于 2021-4-7 18:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
總程序

問題

在每次執行后P0的值變化:0xFE 0xFD 0xF9 0xF1 0xE1 0xC1 0x81 0x01 0x00 之后就一直是0x00
求解。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:390416 發表于 2021-4-7 19:08 | 只看該作者
循環之前是先讀一次IO口狀態,然后再移位的。假設你外圍拉低或者拉高了 結果就變了。
這個細節問題,只有人人學會單片機 這個視頻教程講過。其他老師錄制的都沒講
回復

使用道具 舉報

板凳
ID:675856 發表于 2021-4-7 19:10 | 只看該作者
程序中斷都沒開
回復

使用道具 舉報

地板
ID:384475 發表于 2021-4-8 00:17 | 只看該作者
都移為0了,再移不也是0嗎?加上if(P0==0){P0=0xfe;} 或者加一個移位計數,移到8次后重新賦值P0=0xfe

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

5#
ID:901999 發表于 2021-4-8 10:13 來自觸屏版 | 只看該作者
707794433 發表于 2021-4-7 19:10
程序中斷都沒開

我配置了IE呀
回復

使用道具 舉報

6#
ID:901999 發表于 2021-4-8 10:15 來自觸屏版 | 只看該作者
jjkk11 發表于 2021-4-8 00:17
都移為0了,再移不也是0嗎?加上if(P0==0){P0=0xfe;} 或者加一個移位計數,移到8次后重新賦值P0=0xfe

關鍵他每次移位后的值不對呀,0xfd(11111101)之后應該是fb(11111011)呀
回復

使用道具 舉報

7#
無效樓層,該帖已經被刪除
8#
ID:901999 發表于 2021-4-8 10:38 來自觸屏版 | 只看該作者
人人學會單片機 發表于 2021-4-7 19:08
循環之前是先讀一次IO口狀態,然后再移位的。假設你外圍拉低或者拉高了 結果就變了。
這個細節問題,只有 ...

啥意思
回復

使用道具 舉報

9#
ID:894154 發表于 2021-4-8 13:52 | 只看該作者
if(P0==0X00)
{P0=0Xff;}
回復

使用道具 舉報

10#
ID:901999 發表于 2021-4-8 17:45 | 只看該作者
ANT1987 發表于 2021-4-8 13:52
if(P0==0X00)
{P0=0Xff;}

關鍵他每次移位后的值不對呀,0xfd(11111101)之后應該是fb(11111011)呀
回復

使用道具 舉報

11#
ID:814525 發表于 2021-4-8 18:51 | 只看該作者
貌似P0.1口被外部拉低或損壞了造成的
回復

使用道具 舉報

12#
ID:384475 發表于 2021-4-9 00:39 | 只看該作者
mjalk 發表于 2021-4-8 10:15
關鍵他每次移位后的值不對呀,0xfd(11111101)之后應該是fb(11111011)呀

在c++中,移位運算符有雙目移位運算符:<<(左移)和>>(右移)。移位運算符組成的表達式也屬于算術表達式,其值為算術值。左移運算是將一個二進制位的操作數按指定移動的位數向左移位,移出位被丟棄,右邊的空位一律補0。右移運算是將一個二進制位的操作數按指定移動的位數向右移動,移出位被丟棄,左邊移出的空位或者一律補0,或者補符號位,這由不同的機器而定。在使用補碼作為機器數的機器中,正數的符號位為0,負數的符號位為1。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

13#
ID:213173 發表于 2021-4-9 07:37 | 只看該作者

這不是軟件問題,是硬件條件導致的錯誤。當_crol_()函數對P0執行循環左移時要先讀P0口當前狀態。由于51單片機P0為開漏模式,雖然設置P0=0xfe;,但P0端口在沒有外部高電平條件下呈現的是低電平0x00。所以對0x00循環左移得不到預想結果。樓主可以改用其它端口測試或在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. }
復制代碼
回復

使用道具 舉報

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

使用道具 舉報

15#
ID:384475 發表于 2021-4-9 10:17 | 只看該作者
a4732710 發表于 2021-4-9 08:06
地板樓層和11樓都是答非所問。
變量=_crol_(變量名,移動位數),例如:P0=_crol_(P0,1); 這是循環左移, ...

學習了,以為樓主是<<,
回復

使用道具 舉報

16#
ID:901999 發表于 2021-4-10 12:10 | 只看該作者
wulin 發表于 2021-4-9 07:37
這不是軟件問題,是硬件條件導致的錯誤。當_crol_()函數對P0執行循環左移時要先讀P0口當前狀態。由于51單 ...

解決了,感謝。
回復

使用道具 舉報

17#
ID:901999 發表于 2021-4-10 12:11 | 只看該作者
a4732710 發表于 2021-4-9 08:06
地板樓層和11樓都是答非所問。
變量=_crol_(變量名,移動位數),例如:P0=_crol_(P0,1); 這是循環左移, ...

了解了,感謝。
回復

使用道具 舉報

18#
ID:808223 發表于 2021-4-10 18:31 | 只看該作者
我看半天就納悶,沒啥問題啊,他們答得都是啥。。循環移動用的沒有問題,問題原來出在沒有上拉P0.。。。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表