久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機入門經驗分享3-通過流水燈講解for循環語句 取反 與或非運算

  [復制鏈接]
跳轉到指定樓層
樓主
ID:74187 發表于 2018-10-13 08:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
接上一篇帖子,繼續來看,既然我們會點亮一個小燈,并可以讓其閃爍了,那么我們就嘗試著點亮流水燈好了,讓8個小燈,從左到右,從右往左來回流動,還是在上一個程序的基礎上來修改,很簡單依次賦值即可實現。
  1. while(1)
  2.         {
  3.              P2 = 0XFE;//1111_1110;
  4.                  Delay500ms();//500ms延時 11.0592MHZ
  5.                  P2 = 0XFD;//1111_1101;
  6.                  Delay500ms();//500ms延時 11.0592MHZ
  7.                  P2 = 0XFB;//1111_1011;
  8.                  Delay500ms();//500ms延時 11.0592MHZ
  9.                  P2 = 0XF7;//1111_0111;
  10.                  Delay500ms();//500ms延時 11.0592MHZ
  11.                  P2 = 0XEF;//1110_1110;
  12.                  Delay500ms();//500ms延時 11.0592MHZ
  13.                  P2 = 0XDF;//1101_1111;
  14.                  Delay500ms();//500ms延時 11.0592MHZ
  15.                  P2 = 0XBF;   //1011_1110;
  16.                  Delay500ms();//500ms延時 11.0592MHZ
  17.                  P2 = 0X7F;   //0111_1111;
  18.                  Delay500ms();//500ms延時 11.0592MHZ

  19.                  P2 = 0XBF;     //1011_1110;
  20.                  Delay500ms();  //500ms延時 11.0592MHZ
  21.                  P2 = 0XDF;     //1101_1111;
  22.                  Delay500ms();  //500ms延時 11.0592MHZ
  23.                  P2 = 0XEF;     //1110_1110;
  24.                  Delay500ms();  //500ms延時 11.0592MHZ
  25.                  P2 = 0XF7;     //1111_0111;
  26.                  Delay500ms();  //500ms延時 11.0592MHZ
  27.                  P2 = 0XFB;     //1111_0111;
  28.                  Delay500ms();  //500ms延時 11.0592MHZ
  29.                  P2 = 0XFD;     //1111_1101;
  30.                  Delay500ms();  //500ms延時 11.0592MHZ

  31.         }
復制代碼




這樣弄,雖然很好理解,但是代碼顯得太冗長了,我們接觸下for循環語句,先用for語句來實現我們想要的功能。代碼修改如下:
  1.   for(i = 0; i < 8;i++)
  2.                 {
  3.                         P2 = ~(0X01 << i);
  4.                         Delay500ms();//500ms延時 11.0592MHZ
  5.                 }

  6.                 for(i = 0; i < 6;i++)
  7.                 {
  8.                         P2 = ~(0X40 >> i);
  9.                         Delay500ms();//500ms延時 11.0592MHZ
  10.                 }
復制代碼


用了for循環左移和右移的辦法,配合取反實現的,還有一種辦法,更簡單可以實現來回循環,這便是循環左移和循環右移指令
  1. /*******************************************************************
  2. * 文件名 main函數入口
  3. * 描述:        
  4. * 功 能
  5. * 作者:大核桃
  6. * 版本號:V1.00(2018.09.17)
  7. ********************************************************************/
  8. void main(void)
  9. {
  10.     uint8 i = 0;
  11.         uint8 temp;

  12.         MCU_Port_Init();//端口模式初始化函數
  13.         //上電IO默認是0
  14.         LED0 = 1;//輸出1
  15.         LED1 = 0;
  16.         LED2 = 0;
  17.         LED3 = 0;
  18.         LED4 = 0;
  19.         LED5 = 0;
  20.         LED6 = 0;
  21.         LED7 = 0;//

  22.         temp = 0XFE;

  23.         while(1)
  24.         {

  25.            for(i = 0; i < 7;i++)
  26.                 {
  27.                     P2 = temp;
  28.                         temp = _crol_(temp,1);         
  29.                         Delay500ms();//500ms延時 11.0592MHZ
  30.                 }

  31.                 for(i = 0; i < 7;i++)
  32.                 {                              
  33.                     P2 = temp;
  34.                         temp = _cror_(temp,1);
  35.                         Delay500ms();//500ms延時 11.0592MHZ
  36.                 }
  37. }
復制代碼




這一節,用到了for循環這個知識點,for語句的用法在C語言課本的第120頁,詳細的了解可以看C語言這本書,我們只列舉一個實際例子來說明C語言的流程,就拿下面的代碼來說吧。
  1.   for(i = 0; i < 8;i++)
  2.                 {
  3.                         P2 = ~(0X01 << i);
  4.                         Delay500ms();//500ms延時 11.0592MHZ
  5.                 }
復制代碼


首先i = 0;是給變量賦初值,i<8是循環條件,i++是變量累加,先來看看i = 0;的時候,這個時候判斷下語句P2 = 0XFE,然后0 < 8條件成立,i++;
  1. //  i = 0;的時候
  2. for(i = 0; i < 8;i++)
  3. {
  4.         P2 = ~(0X01 << 0);
  5.         Delay500ms();//500ms延時 11.0592MHZ
  6. }
  7. //  i = 1;的時候
  8. for(i = 0; i < 8;i++)
  9. {
  10.         P2 = ~(0X01 << 1);
  11.         Delay500ms();//500ms延時 11.0592MHZ
  12. }
復制代碼



當 i= 1;的時候,P2 = 0XFD,依然1<8成立,然后i++;
當 i= 2;的時候,P2 = 0XFB,依然2<8成立,然后i++;
當 i= 3;的時候,P2 = 0XF7,依然3<8成立,然后i++;
當 i= 4;的時候,P2 = 0XEF,依然4<8成立,然后i++;
當 i= 5;的時候,P2 = 0XDF,依然5<8成立,然后i++;
當 i= 6;的時候,P2 = 0XBF,依然6<8成立,然后i++;

當 i= 7;的時候,P2 = 0X7F,依然7<8成立,然后i++;
當 i= 8;的時候,8<8不成立,跳出循環執行下面的語句;

這樣我們就把for循環的流程給分解了,首先就是賦初值,然后執行循環,循環完之后變量累加,回過頭看條件是否成立,如果條件繼續成立,則繼續循環,累加變量,直到條件不滿足為止。
     關于取反符號
~這個符號,可以讀作取反,注意這不是!(非),數字電路中的 &(按位與) , |  (按位或),!(非)和 &&(邏輯與),||(邏輯或),和~(取反)是不一樣的,按位與顧名思義,是位和位之間運算,他們運算是能夠得出一個具體的結果的,而邏輯與是對左右兩個表達式的真假進行判斷,得出的結果不是真就是假。
    關于與或非的真值表
與或非是數字電路最基本的知識點,必須要掌握這個知識點。
    &, 就好比乘法一樣,如果A和B都為1,那么結果就是1,如果有一個為0,則輸出都是0,。
    |,   就好比加法運算,如果A或者B有一個是1,那么結果就是1,否則就是0;

    !,     輸入為0時,輸出為1,輸入為1時,輸出為0;
   !|,或非門,只有A和B輸入全部位0時,輸出才為1,否則全為0;
   !&,與非門,只有A和B全部輸入為1時,輸出才為0,否則全為1;
   異或門,如果A和B相等時,輸出都是0,否則輸出都是1。


好了,今天就到這里吧,明天繼續。。。代碼奉獻上。。。

001 LED點亮.rar (25.11 KB, 下載次數: 59)

002 LED閃爍.rar (27.56 KB, 下載次數: 51)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏19 分享淘帖 頂5 踩
回復

使用道具 舉報

沙發
ID:371529 發表于 2018-10-13 15:25 | 只看該作者
真好,感謝樓主
回復

使用道具 舉報

板凳
ID:74187 發表于 2018-10-14 14:54 | 只看該作者

謝謝,一起進步
回復

使用道具 舉報

地板
ID:403231 發表于 2018-10-15 14:37 | 只看該作者
有位老師說,盡量不要用延時的習慣。
回復

使用道具 舉報

5#
ID:74187 發表于 2018-10-15 19:37 | 只看該作者
一片到 發表于 2018-10-15 14:37
有位老師說,盡量不要用延時的習慣。

你說的對,后面我們基本都是用定時器了,延時確實不實用
回復

使用道具 舉報

6#
ID:410857 發表于 2018-10-18 16:14 | 只看該作者
收了下
回復

使用道具 舉報

7#
ID:410857 發表于 2018-10-18 16:14 | 只看該作者
真好,感謝樓主
回復

使用道具 舉報

8#
ID:414974 發表于 2018-10-30 12:23 | 只看該作者
延時要的,CPU處理太快了
回復

使用道具 舉報

9#
ID:85743 發表于 2018-11-1 14:17 | 只看該作者

真好,感謝樓主
回復

使用道具 舉報

10#
ID:203000 發表于 2018-11-12 23:29 | 只看該作者
感謝樓主。講的很好!
回復

使用道具 舉報

11#
ID:439493 發表于 2018-12-4 19:27 | 只看該作者

真好,感謝樓主
回復

使用道具 舉報

12#
ID:421232 發表于 2018-12-13 11:39 | 只看該作者
謝謝樓主分享
回復

使用道具 舉報

13#
ID:461889 發表于 2019-1-23 15:04 | 只看該作者
感謝樓主
回復

使用道具 舉報

14#
ID:471375 發表于 2019-2-16 22:26 來自手機 | 只看該作者
不錯不錯,直擊要點
回復

使用道具 舉報

15#
ID:370231 發表于 2019-3-6 11:56 | 只看該作者
感謝樓主
回復

使用道具 舉報

16#
ID:500153 發表于 2019-3-28 20:00 | 只看該作者
感謝  小白學習
回復

使用道具 舉報

17#
ID:507107 發表于 2019-4-8 16:22 | 只看該作者
真好謝謝
回復

使用道具 舉報

18#
ID:580838 發表于 2019-7-9 15:50 | 只看該作者
太棒了,感謝!
回復

使用道具 舉報

19#
ID:524818 發表于 2019-7-24 18:13 | 只看該作者
真好,講的很透徹,受益匪淺啊!
回復

使用道具 舉報

20#
ID:706724 發表于 2020-3-19 21:01 | 只看該作者
感謝分享
回復

使用道具 舉報

21#
ID:815248 發表于 2020-8-21 15:25 | 只看該作者
第二組代碼那,i是要小于6嗎,不應該小于7嗎,左移一共要點亮8個燈,右移的時候點亮7個燈,這里沒看懂,希望樓主能解答一下,謝謝、
回復

使用道具 舉報

22#
ID:825397 發表于 2020-12-13 14:26 | 只看該作者
清晰透徹,初學者的好資料
回復

使用道具 舉報

23#
ID:582255 發表于 2021-2-9 22:49 | 只看該作者
樓主沒有講循環移位啊
回復

使用道具 舉報

24#
ID:17204 發表于 2021-3-13 18:09 | 只看該作者
是STC單片機嗎,謝謝
回復

使用道具 舉報

25#
ID:896253 發表于 2021-3-28 20:38 | 只看該作者
這個直接用循環移位函數就好了 ,直接一個循環
回復

使用道具 舉報

26#
ID:986337 發表于 2021-12-2 16:44 | 只看該作者
雖然現在不是很理解其中意思,但是很謝謝樓主
回復

使用道具 舉報

27#
ID:1007039 發表于 2022-3-4 23:16 | 只看該作者
受益匪淺,感謝樓主
回復

使用道具 舉報

28#
ID:1049825 發表于 2022-10-31 20:15 | 只看該作者
樓主提供的學習資料很有用,可惜我沒那么多下載幣,繼續努力!。。
回復

使用道具 舉報

29#
ID:77589 發表于 2022-11-11 17:05 | 只看該作者
還可以定義數組方式,把所有狀態都存放在數組里,用一個for循環調用就可以了。
這種可擴展性強,把數組定義到程序flash里,擴展狀態數量取決于flash大小。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av特级毛片| 国内精品久久精品 | 暖暖日本在线视频 | 国产精品高潮呻吟久久 | 国产精品国产精品 | 伊人久久国产 | 狠狠操狠狠干 | 免费看a| 自拍偷拍一区二区三区 | 涩涩视频在线观看 | 91久久国产综合久久91精品网站 | 欧美不卡在线 | 国产传媒毛片精品视频第一次 | 久久成人免费视频 | 在线精品亚洲欧美日韩国产 | 国产精品久久久久久久久污网站 | 午夜电影福利 | 亚洲一区不卡在线 | 日韩第1页| 影视先锋av资源噜噜 | 国产成人精品一区二区三区网站观看 | 日本一区二区不卡 | 精品国产一区二区在线 | 免费精品久久久久久中文字幕 | 精产国产伦理一二三区 | 亚洲一区二区三区观看 | 欧美h视频 | 国产高清美女一级a毛片久久w | 午夜免费视频观看 | 91aiai| 韩日一区二区三区 | 国产精品123区 | 精品欧美一区二区三区久久久 | 伊人精品视频 | 欧美最猛黑人xxxⅹ 粉嫩一区二区三区四区公司1 | 天天综合网天天综合色 | 嫩草一区二区三区 | 高清一区二区 | 亚洲精品国产综合区久久久久久久 | 亚洲一区成人 | 有码在线 |