單片機源程序如下:- #include<reg52.h> //52系列單片機頭文件
- #include<intrins.h> //包含 _crol_ _cror_(函數所在的頭文件 )
- #define uint unsigned int //宏定義
- #define uchar unsigned char //宏定義
- uchar a; //定義a變量, 用來給P1賦值
- //********延時程序***********
- void delayms(uint xms)
- {
- uint i,j;
- for(i=xms;i>0;i--) //i=xms 即延時約xms亳秒
- for(j=110;j>0;j--);
- }
- //***************************
- void main() //主函數
- {
- a=0xfe; //二進制: 1111 1110
- while(1) //大循環
- {
- P1=a; //點亮發光管
- delayms(500); //延時500毫秒
- a=_cror_(a,1); //將a循環右移1位后再賦給a
- }
- }
- //循環右移,被移出的放在最高位,來回循環,所以P1中0和1的位數不變,只
- //是改變了0 1的位置,因此在右移過程中亮燈的數量不變,只是改變了亮燈的位置.
- /***********************************************************************************************************************
- 知識點:移位操作
- (1) 左移:C52中操作符為“<<”,每執行一次左移指令,被操作的數將最高位移入單片機PSW寄存器的
- CY位,CY位中原來的數丟棄,最低位 補0,其他位依次向左移動一位,如實例一所示:
- //***** 實例一 **** 8位單片機一次就只能處理8位二進制 , 如果是16位單片機,一次能處理16位。
- void main() //主函數
- {
- a=0xcc; //二進制:移位前 CY 1100 1100 從CY位,最高位到最低位 , 十六進制為:0xcc
- while(1) //大循環
- {
- P1=a<<1; //二進制:左移后為:0001 1001 1000 十六進制為:0x198
- //(利用前面所學的實驗板8燈來認證,P1:剛好有8個燈顯示后8位,從低位至高位顯示,0為燈亮。 a的變量,左移1位。)
- }
- }
- ***********************************************************************************************************************
- (2)右移:C52中操作符為“>>”,每執行一次右移指令,被操作的數將最低位移入單片機PSW寄存器的
- CY位,CY位中原來的數丟棄,最高位 補0,其他位依次向右移動一位,如實例二所示:
- //***** 實例二 ****
- void main() //主函數
- {
- a=0xcc; //二進制:移位前 1100 1100 CY ; 最高位到最低位 CY位 ; 十六進制為:0xcc
- while(1) //大循環
- {
- P1=a>>1; //二進制:右移后為:0110 0110 0 十六進制為:0x66
- //P1=0x66; //(利用前面所學的實驗板8燈來認證,P1:因為只有8個燈顯示前8位,從低位至高位顯示,0為燈亮。 a的變量,右移1位。)
- }
- }
- *************************************************************************************************************************
- (3)循環左移:最高位移入最低位,其他位依次向左移一位。C語言中沒有專門的指令,通過移位指令與簡單邏輯運算可以
- 實現循環左移,或直接利用C52庫中自帶的函數 _cril_ 實現; 如實例三所示:
- //***** 實例三 ****
- void main() //主函數
- {
- a=0xfe; //二進制: 1111 1110
- while(1) //大循環
- {
- P1=a; //點亮發光管
- delayms(500); //延時500毫秒
- a=_crol_(a,1); //將a循環左移1位后再賦給a
- }
- }
- /*
- a=_crol_(a,1); 語句;因為_crol_是一個帶返回值的函數,本句在執行時,先執行等號右邊的表達式,即a這個變量循環左移
- 一位,然后將結果再重新賦給a變量,如a初值為0xfe,二進制為1111 1110,執行此函數時,將它循環左移一位后為1111 1101,即
- 0xfd,然后再將0xfd重新賦值給a變量,等while(1)中的最后一條語句執行完后,將返回到while(1)中的第一語句重新執行,此
- 時a的值變成了0xfd.
- ***************************************************************************************************************************/
- /*
- (4)循環右移:最低位移入最高位,其他位依次向右移一個位。C語言中沒有專門的指令,通過移位指令與簡單邏輯運算可以
- 實現循環右移,或直接利用C52庫中自帶的函數 _crir_ 實現; 如實例四所示:
- //***** 實例四 ****
- void main() //主函數
- {
- a=0xfe; //二進制: 1111 1110
- while(1) //大循環
- {
- P1=a; //點亮發光管
- delayms(500); //延時500毫秒
- a=_cror_(a,1); //將a循環右移1位后再賦給a
- }
- }
- //循環右移,被移出的放在最高位,來回循環,所以P1中0和1的位數不變,只
- //是改變了0 1的位置,因此在右移過程中亮燈的數量不變,只是改變了亮燈的位置.
- *************************************************************************************************************************/
- /*************************************************************************************************************************
- 知識點:PSW寄存器.
- PSW (Program Status Word)全稱為程序狀態字標志寄存器,是一個8位寄存器,位于單片機內的特殊功能寄存器區,字節地址D0H,用
- 來存放運算結果的一此特征,如有無進位,借位等,使用匯編編程時PSW寄存器很有用,但在利用C語言編程時,編繹器會自動控制該寄存器,
- 很少人為操作它,只需要簡單了解即可,其每位的具體含義如下:
-
- _D7___D6___D5___D4____D3____D2___D1___D0__
- PSW | CY | AC | F0 | RS1 | RS0 | OV | … | P | D0H
- ——————————————————————————————————————————
- ① CY 進位標志位,它表示運算是否有進位(或借位)。如果操作結果在最高位有進位(加法)或者借位(減法),則該位為1,否則為0。
- ② AC 輔助進位標志,又稱半進位標志,它指兩個8位數運算低四位是否有半進位,即低四位相加(或相減)是否進位(或借位),如
- 有AC為1,否則為0。
- ③ F0 由用戶使用的一個狀態標志位,可用軟件來使它置1或清0,也可由軟件來測試它,以控制程序的流向。
- ④ RS1、RS0 4組工作寄存器區選擇控制位,在匯編語言中這兩位用來選擇4組工作寄存器區中的哪一組為當前工作寄存區。
- ⑤ OV 溢出標志位,反映帶符號數的運算結果是否有溢出。有溢出時,此位為1,否則為0。
- ⑥ P 奇偶標志位,反映累加器ACC內容的奇偶性,如果ACC中的運算結果有偶數個1(如11001100B,其中有4個1),則P為0,否則P為1。
- *************************************************************************************************************************/
復制代碼
您可以直接復制以上代碼到Keil或者下載創建好的Keil工程文件:
以上代碼.7z
(14.04 KB, 下載次數: 18)
2022-10-8 00:47 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|