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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機學習實驗筆記:移位操作程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:815459 發表于 2022-10-8 00:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機源程序如下:
  1. #include<reg52.h>  //52系列單片機頭文件
  2. #include<intrins.h>  //包含 _crol_   _cror_(函數所在的頭文件 )
  3. #define uint unsigned int  //宏定義
  4. #define uchar unsigned char  //宏定義
  5. uchar a; //定義a變量, 用來給P1賦值

  6. //********延時程序***********
  7. void delayms(uint xms)
  8. {
  9. uint i,j;
  10.    for(i=xms;i>0;i--)        //i=xms 即延時約xms亳秒
  11.       for(j=110;j>0;j--);
  12. }
  13. //***************************
  14. void main() //主函數
  15. {
  16. a=0xfe;            //二進制: 1111 1110
  17. while(1)  //大循環
  18. {
  19. P1=a; //點亮發光管
  20. delayms(500);  //延時500毫秒
  21. a=_cror_(a,1);        //將a循環右移1位后再賦給a
  22. }
  23. }
  24. //循環右移,被移出的放在最高位,來回循環,所以P1中0和1的位數不變,只
  25. //是改變了0 1的位置,因此在右移過程中亮燈的數量不變,只是改變了亮燈的位置.



  26. /***********************************************************************************************************************
  27. 知識點:移位操作
  28. (1)        左移:C52中操作符為“<<”,每執行一次左移指令,被操作的數將最高位移入單片機PSW寄存器的
  29. CY位,CY位中原來的數丟棄,最低位 補0,其他位依次向左移動一位,如實例一所示:

  30. //***** 實例一 ****   8位單片機一次就只能處理8位二進制 , 如果是16位單片機,一次能處理16位。
  31. void main() //主函數
  32. {
  33. a=0xcc;         //二進制:移位前 CY  1100 1100    從CY位,最高位到最低位         , 十六進制為:0xcc
  34. while(1)  //大循環
  35. {
  36. P1=a<<1; //二進制:左移后為:0001 1001 1000  十六進制為:0x198
  37.     //(利用前面所學的實驗板8燈來認證,P1:剛好有8個燈顯示后8位,從低位至高位顯示,0為燈亮。 a的變量,左移1位。)
  38. }
  39. }

  40. ***********************************************************************************************************************
  41. (2)右移:C52中操作符為“>>”,每執行一次右移指令,被操作的數將最低位移入單片機PSW寄存器的
  42. CY位,CY位中原來的數丟棄,最高位 補0,其他位依次向右移動一位,如實例二所示:

  43. //***** 實例二 ****
  44. void main()    //主函數
  45. {
  46.     a=0xcc;         //二進制:移位前 1100 1100  CY    ; 最高位到最低位 CY位 ; 十六進制為:0xcc
  47. while(1)   //大循環
  48.     {
  49.     P1=a>>1; //二進制:右移后為:0110 0110 0      十六進制為:0x66
  50. //P1=0x66; //(利用前面所學的實驗板8燈來認證,P1:因為只有8個燈顯示前8位,從低位至高位顯示,0為燈亮。 a的變量,右移1位。)
  51.     }
  52. }

  53. *************************************************************************************************************************
  54. (3)循環左移:最高位移入最低位,其他位依次向左移一位。C語言中沒有專門的指令,通過移位指令與簡單邏輯運算可以
  55. 實現循環左移,或直接利用C52庫中自帶的函數  _cril_  實現; 如實例三所示:

  56. //***** 實例三 ****
  57. void main() //主函數
  58. {
  59. a=0xfe;            //二進制: 1111 1110
  60. while(1)  //大循環
  61. {
  62. P1=a; //點亮發光管
  63. delayms(500);  //延時500毫秒
  64. a=_crol_(a,1);        //將a循環左移1位后再賦給a
  65. }
  66. }
  67. /*
  68. a=_crol_(a,1);        語句;因為_crol_是一個帶返回值的函數,本句在執行時,先執行等號右邊的表達式,即a這個變量循環左移
  69. 一位,然后將結果再重新賦給a變量,如a初值為0xfe,二進制為1111 1110,執行此函數時,將它循環左移一位后為1111 1101,即
  70. 0xfd,然后再將0xfd重新賦值給a變量,等while(1)中的最后一條語句執行完后,將返回到while(1)中的第一語句重新執行,此
  71. 時a的值變成了0xfd.
  72. ***************************************************************************************************************************/      
  73. /*
  74. (4)循環右移:最低位移入最高位,其他位依次向右移一個位。C語言中沒有專門的指令,通過移位指令與簡單邏輯運算可以
  75. 實現循環右移,或直接利用C52庫中自帶的函數  _crir_  實現; 如實例四所示:

  76. //***** 實例四 ****
  77. void main() //主函數
  78. {
  79. a=0xfe;            //二進制: 1111 1110
  80. while(1)  //大循環
  81. {
  82. P1=a; //點亮發光管
  83. delayms(500);  //延時500毫秒
  84. a=_cror_(a,1);        //將a循環右移1位后再賦給a
  85. }
  86. }
  87. //循環右移,被移出的放在最高位,來回循環,所以P1中0和1的位數不變,只
  88. //是改變了0 1的位置,因此在右移過程中亮燈的數量不變,只是改變了亮燈的位置.
  89. *************************************************************************************************************************/
  90. /*************************************************************************************************************************
  91. 知識點:PSW寄存器.
  92.    PSW (Program Status Word)全稱為程序狀態字標志寄存器,是一個8位寄存器,位于單片機內的特殊功能寄存器區,字節地址D0H,用
  93. 來存放運算結果的一此特征,如有無進位,借位等,使用匯編編程時PSW寄存器很有用,但在利用C語言編程時,編繹器會自動控制該寄存器,
  94. 很少人為操作它,只需要簡單了解即可,其每位的具體含義如下:
  95.      
  96.          _D7___D6___D5___D4____D3____D2___D1___D0__
  97. PSW        | CY | AC |        F0 | RS1 | RS0 | OV        | …  | P   |  D0H
  98.          ——————————————————————————————————————————

  99.   ① CY 進位標志位,它表示運算是否有進位(或借位)。如果操作結果在最高位有進位(加法)或者借位(減法),則該位為1,否則為0。
  100.   ② AC 輔助進位標志,又稱半進位標志,它指兩個8位數運算低四位是否有半進位,即低四位相加(或相減)是否進位(或借位),如
  101. 有AC為1,否則為0。
  102.   ③ F0  由用戶使用的一個狀態標志位,可用軟件來使它置1或清0,也可由軟件來測試它,以控制程序的流向。
  103.   ④ RS1、RS0  4組工作寄存器區選擇控制位,在匯編語言中這兩位用來選擇4組工作寄存器區中的哪一組為當前工作寄存區。
  104.   ⑤ OV  溢出標志位,反映帶符號數的運算結果是否有溢出。有溢出時,此位為1,否則為0。
  105.   ⑥ P 奇偶標志位,反映累加器ACC內容的奇偶性,如果ACC中的運算結果有偶數個1(如11001100B,其中有4個1),則P為0,否則P為1。  

  106. *************************************************************************************************************************/

復制代碼

您可以直接復制以上代碼到Keil或者下載創建好的Keil工程文件: 以上代碼.7z (14.04 KB, 下載次數: 18)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:1047308 發表于 2022-10-11 20:08 | 只看該作者
學習使人進步
回復

使用道具 舉報

板凳
ID:260656 發表于 2022-10-19 10:22 | 只看該作者
請問這個延時的時間誤差大嗎?
回復

使用道具 舉報

地板
ID:815459 發表于 2022-10-21 00:18 | 只看該作者
zzzzz8840 發表于 2022-10-19 10:22
請問這個延時的時間誤差大嗎?

延時的時間誤差沒計算過,好像是用的晶振和下載到單片機的設置有關。
回復

使用道具 舉報

5#
ID:911522 發表于 2023-1-3 08:22 | 只看該作者
zzzzz8840 發表于 2022-10-19 10:22
請問這個延時的時間誤差大嗎?

采用定時器或計數器中斷,時間精準點
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人永久免费 | 国产九九九 | 久久久久国产精品 | 毛片网站在线观看视频 | 精品乱子伦一区二区三区 | 国产成人在线视频免费观看 | 亚洲成人中文字幕 | 我要看黄色录像一级片 | 免费看黄色视屏 | 羞羞视频免费观看入口 | 亚洲视频免费在线观看 | 欧洲精品在线观看 | 免费在线观看一区二区 | 国产精品日韩高清伦字幕搜索 | 国产日韩久久久久69影院 | 在线国产小视频 | 欧美日韩在线观看一区 | 欧美日韩专区 | 欧美成人二区 | 日本天天色 | 国产日韩精品一区 | 国产精品乱码一区二区三区 | 亚洲成人二区 | 国产精品久久久久久久久久久久久 | 久久久久久久国产 | 欧美一级免费看 | 免费精品在线视频 | 国产又色又爽又黄又免费 | 国产乱码精品一区二区三区忘忧草 | 欧美成视频| 在线一区二区国产 | h视频亚洲| 欧美成人二区 | 在线观看日韩精品视频 | 美女久久视频 | 国产高清免费视频 | 一区二区视频在线 | 黄色毛片在线观看 | 亚洲精品中文字幕中文字幕 | 精品欧美乱码久久久久久 | 中文字幕成人 |