久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機學習實驗筆記:移位操作程序
[打印本頁]
作者:
ralap2020
時間:
2022-10-8 00:27
標題:
單片機學習實驗筆記:移位操作程序
單片機源程序如下:
#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
作者:
zzya1985
時間:
2022-10-11 20:08
學習使人進步
作者:
zzzzz8840
時間:
2022-10-19 10:22
請問這個延時的時間誤差大嗎?
作者:
ralap2020
時間:
2022-10-21 00:18
zzzzz8840 發表于 2022-10-19 10:22
請問這個延時的時間誤差大嗎?
延時的時間誤差沒計算過,好像是用的晶振和下載到單片機的設置有關。
作者:
ynhjc2021
時間:
2023-1-3 08:22
zzzzz8840 發表于 2022-10-19 10:22
請問這個延時的時間誤差大嗎?
采用定時器或計數器中斷,時間精準點
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日韩精品三级
|
日日干夜夜干
|
不卡av网站
|
91一区二区三区
|
日本亚洲精品
|
久久在线免费观看
|
又色又爽又黄18网站
|
a视频在线免费观看
|
视频一区二区在线播放
|
黄色录像免费看
|
日皮视频免费看
|
欧美狠狠干
|
午夜免费影院
|
国产不卡在线
|
天天干b
|
亚洲国产黄色
|
日韩一级在线
|
麻豆做爰免费观看
|
欧美激情视频一区二区三区
|
久久久天堂国产精品女人
|
国产美女视频
|
色哟哟一区二区三区
|
欧美在线播放视频
|
中文有码在线
|
国产美女福利
|
国产午夜精品福利
|
免费性网站
|
大色av
|
国产网站在线
|
成人亚洲精品
|
亚洲砖区区免费
|
黄色免费视频网站
|
国产精品久久午夜夜伦鲁鲁
|
中文字幕中文字幕
|
国产一级黄
|
青青草伊人网
|
91中文在线
|
成人黄色av
|
青青草网址
|
亚洲成人动漫在线观看
|
xxxxx黄色
|