程序如下:
MOV DPTR, #buf
MOV R2, #50
LOOP:
MOVX A, @DPTR ;取出數字.
JNB ACC.7, NEXT ;為正數,轉移.
CPL A ;取反.
INC A ;加一.
SETB ACC.7 ;重寫負號.
MOVX @DPTR, A ;送回.
NEXT:
INC DPTR
DJNZ R2, LOOP
SJMP $
END
2. 單片機的編程題目
#include
#include
//右移函數需要此頭文件intrins.h
大小寫不限
sbit
t=p3^3
//p3^3是指你單片機實際連接的方式,你根據實際情況改一下
main()
{
int
i=0;
int
a;
while(1)
{
while(t==0);
//若脈沖一直為低電平,程序停在此處,
//每當高電平來臨,跳出此句話,執行下面的語句
i++;
if(i==1000)
{
a<<1;
i=0;
}
}
}
/*推薦郭天祥的《十天學會單片機》視頻教程,
共13集,5.13g大,很清晰。我大二的時候連數電和模電都沒學,也能看懂這個。學了之後就對單片機很了解了。但要買塊單片機來學那個教程。
該教程可在迅雷下載到,我原來是在淘寶網買的dvd光碟,有些書店裡也有這個教程。
學完之後就會用單片機做東西了!
只要你學過c語言,就很容易學會單片機!
*/
3. 單片機程序題
#include<reg52.h> //包含52單片機寄存器定義的頭文件
static unsigned char n;
sbit P17=P1^7;
/*******************************************
函數功能:主函數
******************************************/
void main(void)
{
n=0;
EA=1; //開放總中斷
EX0=1; //允許使用外中斷
IT1=0; //選擇低電平來觸發外中斷
while(1); //無限循環,
}
/**************************************************************
函數功能:外中斷T1的中斷服務程序
**************************************************************/
void int1(void) interrupt 0 using 0 //外中斷1的中斷編號為0
{
n++;
if (n==2)
{P17=~P17; //每產生一次中斷請求,P17取反一次。
n=0;}
}
4. 關於51單片機的一個簡單程序題
POP DPH ;sp-1=51
POP DPL
MOV DPTR,#4000H;sp-1=50
RL A ;a*2=04h
MOV B,A ;保護a
MOVC A,@A+DPTR ;查表a= 【4004h】=30
PUSH A ;a入棧,sp+1=51
MOV A,B ;恢復a
INC A ;a+1=5
MOVC A,@A+DPTR ;查表 a=【4005h】=50
PUSH A ;a入棧 sp+1=52
RET ;程序返回,sp-2=50,並且把52·51里的值出棧給pc pc=5030
ORG 4000H
DB 10H,80H,30H,50H,30H,50H
注意 ret 與reti 的作用 調用子程序時先保護pc即把pc壓入棧,ret用於子程序最後來恢復pc值,所以在子程序里不能亂用棧,必須讓sp指向原pc值的保存處,一般來說,有一個push必須跟一個pop,這兩個指令必須一起成對出,否則就會改變pc值
5. 關於單片機程序題。。。
這個有點太簡單了
#include<REG51.H>
#define uchar unsigned char
#define uint unsigned int
void delayms(uint i) //1ms延時程序
{
uint j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
void main(void)
{
uchar i;
while(1)
{
for(i=0;i<8;i++)
{
P3=0xff>>i;//先亮一個,再2個......
delayms(1000);
}
}
}
如果只亮一個LED,則應改為:
P3=~(0x80>>i);
6. 單片機的題,程序題
如果我沒有猜錯的話,第三行程序是:
ORG 0080H
這是編程者自己定義的,可以在64K范圍內任意地址,當然最好是大於等於0030H,因為這之前一般是中斷向量的入口地址。其餘的就可以任意支配了。
7. 單片機程序分析題
設R0=20H,R1=25H,(20H)=70H,(21H)=80H,(22H)=A0H,(22H)=A0H,(25H)=A0H(26H)=6FH,(27H)=76H,下列程序執行後,
CLR C ;CY=0
MOV R2,#3 ;R2=03H R2=02H R2=01H
LOOP:
MOV A,@R0 ;A=70H A=80H A=A0H
ADDC A,@R1 ;CY=1,A=10H CY=0,A=F0H CY=1,A=16H
MOV @R0,A ;(20H)=10H (21H)=F0H (22H)=16H
INC R0 ;R0=21H R0=22H R0=23H
INC R1 ;R1=26H R1=27H R1=28H
DJNZ R2,LOOP ;
JNC NEXT ;
MOV @R0,#01H ; 23H=01H
SJMP $
NEXT: DEC R0 ;
SJMP $
結果:(20H)=10H ,(21H)=F0H ,(22H)=16H ,(23H)=01H ,(A)=16H ,(CY)=1 .
分析過程參照注釋
8. 求解單片機編程題目
一、將(0~99)的100個連續十進制數,依次存入首地址為2000H的RAM區的存儲單元中去。
MOV DPTR, #2000H
MOV A, #0
MOV R1, #100
LOOP:
MOVX @DPTR, A
INC A
INC DPTR
DJNZ R1, LOOP
SJMP $
二、定時/計數器進行初始化編程。
MOV TMOD, #01010001B
MOV TH1, #(65536-10000)/256
MOV TL1, #(65536-10000)%256
MOV TH0, #(65536-50000)/256
MOV TL0, #(65536-50000)%256
SETB TR1
SETB TR0
SETB ET1
SETB ET0
SETB EA
SETB PT1
CLR PT0
SJMP $
9. 51單片機編程題.
將內部RAM的[91H 90H]單元的值,
和 R1R0相加,
和,存放在內部RAM的[7FH 7EH]單元。
程序如下:
MOVA,R0
MOVR0,#90H
ADDA,@R0
MOV7EH,A
MOVA,R1
INCR0
ADDCA,@R0
MOV7FH,A
END
沒錯的,可以採納了。
10. 一道單片機的編程題
現假定左邊是地址,右邊的是內容
1.它的功能是以50H為首地址,個數為0AH個的RAM全部清零
2.機器碼
7A 0A··········MOV R2,#0AH
mov rn的機器碼是01111xxx,其中xxx由Rn的地址來決定,相應地,R0~R7二進制地址為000~111
那麼R2就是010,後面的數據就跟著mov rn的機器碼後面
7850··········MOV R0,#50H
E4 ···········CLR A;
機器碼固定
F6 ·········LOOP:MOV @R0,A
mov @rn,a機器碼為1111011n
n就是Rn的n
所以間接寄存器定址只能是R1或R0
08 ············INC R0
inc rn機器碼為00001xxx
xxx同理為Rn的物理地址
DA__ ···········DJNZ R2,LOOP
djnz rn機器碼11011xxx
xxx同理為RN的物理地址
loop為8位地址標號
機器碼是以loop為首的第一個指令離loop的單元數
所以djnz r2,loop的loop不能放在此後超過255位元組的程序空間單元
題中loop:後面跟有MOV @R0,A佔1個內部ram單元,INC R0佔1個內部ram單元,DJNZ R2佔1個內部ram單元(由機器碼可得),所以255-3=252=FCH
即機器碼為DAFC
···········DONE:
3.對於第三個問題,樓上的方法有誤
,R0和R2有可能在00H~A0H
而且你只是把0~10放入50H~5AH單元
所以可以這樣
SETB RS1
SETB RS0;R0工作在18H單元
MOV A,#50H
MOV R2,#10
MOV R0,#0
LOOP:
MOV @R0,A
INC A
INC R0
DJNZ R2,LOOP
經模擬無誤