導航:首頁 > 操作系統 > mcs51單片機求十個數平均數的程序

mcs51單片機求十個數平均數的程序

發布時間:2022-07-02 04:04:36

1. mcs 51 單片機匯編語言編程

TEMP EQU 50H ;臨時變數
SGM_H EQU 51H ;求和的高8位,以及平均值
SGM_L EQU 52H ;求和的低8位,以及平均值的余數

ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
LCALL MM ;排序子程序
LCALL AVG ;平均值子程序
SJMP $

MM:
MOV R0,#40H
LP_1:
MOV A,R0
MOV R1,A
MOV TEMP,@R0
LP_2:
INC R1
MOV A,@R1
CJNE A,TEMP,NEXT1
NEXT1:
JNC NEXT2
MOV @R0,A
MOV @R1,TEMP
MOV TEMP,@R0
NEXT2:
CJNE R1,#4FH,LP_2
INC R0
CJNE R0,#4FH,LP_1
RET

AVG:
MOV R0,#41H
MOV A,@R0
MOV SGM_H,#00H
LP_3:
CLR C
INC R0
ADD A,@R0
JNC NEXT3
INC SGM_H
NEXT3:
CJNE R0,#4EH,LP_3
MOV SGM_L,A

;以上部分是求和
SWAP A
ANL A,#0FH
MOV R1,A
MOV A,SGM_H
SWAP A
ADD A,R1
MOV B,#14D
DIV AB
SWAP A
MOV SGM_H,A
MOV A,B
SWAP A
MOV R1,A
MOV A,SGM_L
ANL A,#0FH
ADD A,R1
MOV B,#14D
DIV AB
ADD A,SGM_H
MOV SGM_H,A
MOV SGM_L,B
;以上部分是16位除以8位的除法
RET

解題思路是先排序,得到最大值與最小值,然後求平均值。
以上供參考。

2. 請大家幫忙寫下單片機mcs51程序 (所有的分全給)

你的題目太模糊了,好像兩個程序的電路圖還不一樣吧。沒有電路圖是作不了程序的,至少也要給出外圍器件與單片機是怎麼連接的。

3. 51單片機中12位雙位元組數(低12位)求平均數

;
MOV R0, #40H ;四個數據的起始地址
MOV R2, #4
MOV R3, #0 ;四個數據的和
MOV R4, #0
A_LOOP:
MOV A, R3
ADD A, @R0 ;加數據低位元組
MOV R3, A
INC R0
MOV A, R4
ADDC A, @R0 ;加數據高位元組
MOV R4, A
INC R0
DJNZ R2, A_LOOP ;
;-------------------------下面除以4,右移兩位即可
CLR C
MOV A, R4
RRC A ;先移高八位
MOV R4, A
MOV A, R3
RRC A ;後移低八位
MOV R3, A

CLR C ;再移動一次
MOV A, R4
RRC A
MOV R4, A
MOV A, R3
RRC A
MOV R3, A

;結果在 R4R3。
END

找出最大、最小,要比較雙位元組的數據。
全部循環一遍,所花費的時間,就太多了。
特別是多位元組的數據,特費時間。

不如,利用這些時間,多采樣幾個數據,累加後,取平均值。
用向右移位,代替除法,特別方便。
那麼,采樣數據的個數,宜取:4、8、16。
個數再多,好像也沒有必要了。

4. 用MCS-51單片機匯編語言實現下列的程序:

;1--片內RAM30H位元組單元的存儲內容傳送到片內RAM20H位元組單元
MOV 20H,30H

;2--片內RAM30H位元組單元的存儲內容傳送到片外RAM2000H位元組單元
MOV A,30H
MOV DPH,#20H
MOV DPL,#00H
MOVX @DPTR,A

;3--片外ROM30H位元組單元的存儲內容傳送到片內RAM30H位元組單元
MOV DPH,#00H
MOV DPL,#30H
CLR A
MOVC A,@A+DPTR
MOV 30H,A

;4--片外ROM3000H位元組單元的存儲內容傳送到片外RAM2000H位元組單元
MOV DPH,#30H
MOV DPL,#00H
CLR A
MOVC A,@A+DPTR
MOV DPH,#20H
MOV DPL,#00H
MOVX @DPTR,A

;5--片外ROM3000H位元組單元的存儲內容傳送到片外ROM2000H位元組單元
;這道題目是錯誤的,ROM不可修改,所以無法將任何數據傳送到ROM里
;所以,「內容傳送到片外ROM2000H位元組單元」是無法實現的。

5. MCS-51單片機程序設計

周期2ms,占空比1:2,,也就是說高電平667us,低電平1333us,你的定時器參數分別為:
TGH=(65536-667)/256;
TGL=(65536-667)%256;
TDH=(65536-1333)/256;
TDL=(65536-1333)%256;
在中斷服務程序里交替用這兩個參數給TH0和TL0賦值,對P1.0取反就可以了。
#include<reg51.h>
#define uchar unsigned char
uchar tgh,tgl,tdh,tdl;
bit flag;
sbit p10=P1^0;
void t0isr() interrupt 1
{
if(flag)
{
TH0=tgh;
TL0=tgl;
p10=0;
flag=~flag;
}
if(!flag)
{
TH0=tdh;
TL0=tdl;
p10=1;
flag=~flag;
}
}
main()
{
TMOD=0x01;
tgh=(65536-667)/256;
tgl=(65536-667)%256;
tdh=(65536-1333)/256;
tdl=(65536-1333)%256;
TH0=tdh;
TL0=tdl;
TR0=1;
ET0=1;
EA=1;
while(1);
}

6. 用匯編語言編寫80c51單片機程序,求內部RAM中50H~59H十個單元內容的平均值,並存放在5AH單元。

結合1,2,3樓,考慮了溢出問題。花了好多時間才想出來了。
希望對你有幫助。
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV R0,#50H
MOV R7,#10
MOV R2,#00H
MOV A,#00H
LOOP:CLR C
ADD A,@R0
JNC BBB
INC R2
CLR C
BBB: INC R0
DJNZ R7,LOOP
MOV 5CH,A ;把和放5CH,不用管溢出的,和為s1
MOV 5BH,R2 ;把溢出的次數放地址5BH
MOV B,5BH ;溢出的次數給B
MOV A,#19H ;溢出一次相當於 100H=(FAH+10H)=19*BH+ 6*BH /A
MUL AB ;A=溢出部分的平均值,肯定小於0FF
MOV 5AH,A ;第一部分的平均值p1給5AH
MOV A,#6H
MOV B,5BH
MUL AB ;值給5BH,最大值是3CH,所以不用考慮溢出。
ADD A,5CH ;
MOV B,#10
DIV AB ;6B+s1的平均值p2
ADD A,5AH
MOV 5AH,A ;p1+p2
MOV 5BH,B
SJMP $
END

7. MCS—51單片機定時/計數器實驗 編程 求程序

按照圖示,應該用P1.7向T1送入計數脈沖
送去4000個,即達到了1s
下列程序,在PROTEUS中模擬通過
;---------------------------------
ORG
0000H
JMP
START
ORG
000BH
JMP
T0_INT
ORG
001BH
JMP
T1_INT
ORG
0030H
START:MOV
SP,#60H
MOV
TMOD,#52H
;T1計數方式1;
T0定時方式2
MOV
TH0,
#(256-250)
;T0定時250us@12MHz
MOV
TL0,
#(256-250)
;
SETB
TR0;
MOV
TH1,
#(65536-4000)
/
256
;T1計數4000
MOV
TL1,
#(65536-4000)
MOD
256
;即1s
SETB
TR1;
SETB
ET0;
SETB
ET1;
SETB
EA;
MOV
R2,
#3
WAIT:
SJMP
WAIT
;等待中斷
;----------------------------------
T0_INT:
;T0方式2,不用重新送初始值.
CLR
P1.7
;向T1送計數脈沖.
NOP
SETB
P1.7
RETI
;----------------------------------
T1_INT:
;每當收到4000個脈沖,即1s中斷一次.
MOV
TL1,
#(65536-4000)
MOD
256
;重新送入初始值.
MOV
TH1,
#(65536-4000)/256
;T1計數4000
CLR
P1.0
DJNZ
R2,
T1_END
SETB
P1.0
MOV
R2,
#3
T1_END:
RETI
;----------------------------------
END

8. MCS-51單片機求平均值的源程序

加法除法不會嗎?
假設有8個數
uchar tempdata[8];
uint sum=0;
uchar av;
for(i=0;i<8;i++)
{
sum+=tempdata[i];
}
av=(uint)sum/8;

9. 求 單片機 十分復用 使用例子,C 匯編都行,那種單片都行,51最好,多謝謝!

MCS-51 的定址方式:
1 、立即定址 如: MOV A , #40H
2 、直接定址 如: MOV A , 3AH
3 、寄存器定址 如: MOV A , Rn
4 、寄存器間接定址 如: MOV A , @Rn
5 、基址加變址定址 如: MOVC A , @A+DPTR
6 、相對定址 如: SJMP 08H
7 、位定址 MOV 20H , C
以下是詳細介紹:
一、立即定址:操作數就寫在指令中,和操作碼一起放在程序存貯器中。把「#」號放在立即數前面,以表示該定址方式為立即定址,如#20H。
二、寄存器定址:操作數放在寄存器中,在指令中直接以寄存器的名字來表示操作數的地址。例如MOV A,R0就屬於寄存器定址,即將R0寄存器的內容送到累加器A中。
三、直接定址:操作數放在單片機的內部RAM某單元中,在指令中直接寫出該單元的地址。如前例的ADD A,70H中的70H。
四、寄存器間接定址:操作數放在RAM某個單元中,該單元的地址又放在寄存器R0或R1中。
如果RAM的地址大於256,則該地址存放在16位寄存器DPTR(數據指針)中,此時在寄存器名前加@符號來表示這種間接定址。如MOV A,@R0。其它還有變址定址、相對定址、位定址等,待以後再詳細介紹。可能有人會問,在指令中直接給出實際操作數,不是簡單、明了嗎?為什麼還要用其它幾種定址方式呢?這是因為在編製程序時很難一下子就給出操作數。如用單片機控制溫度時,時時需要將給定的控制溫度(如20℃)減去環境溫度,而環境溫度時時有變化,顯然無法在程序指令中給出,只有通過一定方式,將其送入某個輸入/輸出口,再存放在某個寄存器中,這就必須用到寄存器定址。又如要進行算術運算,要計算每班學員各科成績的平均值,如果把每個學員的各科都編一個程序,在程序中直接給出該學員各科成績,再求平均值,顯然太麻煩。這里可以編一個求平均成績的通用程序,把每位學員的成績送入存貯器的各個單元中,這時可採取直接定址,一個程序可供每個學員用,不是更方便嗎?所以,定址方式越多,編製程序就越方便、靈活,適用范圍就越廣。定址有如找人,如被找的人有手機、BP機、座機電話等多種聯系方式則就容易找到他,單片機也是如此,定址方式越多,找操作數越方便,單片機的功能就越強。前面介紹51系列單片機的定址方式時,常遇到單片機內部的一些寄存器、累加器A、通用寄存器R0~R7、數據指針DPTR和存貯器等。在以後介紹指令時,數據就要在這些寄存器、存貯器之間傳送,或者進行運算。因此,編製程序就需熟悉單片機的內部結構。
8051單片機的內部總體結構其基本特性如下:
8位CPU、片內振盪器
4k位元組ROM、128位元組RAM
21個特殊功能寄存器
32根I/O線
可定址的64k位元組外部數據、程序存貯空間
2個16位定時器、計數器
中斷結構:具有二個優先順序、五個中斷源
一個全雙口串列口
位定址(即可尋找某位的內容)功能,適於按位進行邏輯運算的位處理器。除128位元組RAM、4k位元組ROM和中斷、串列口及定時器模塊外,還有4組I/O口P0~P3,餘下的就是CPU的全部組成。把4kROM換為EPROM就是8751的結構,如去掉ROM/EPROM部分即為8031的框圖,如果將ROM置換為Flash存貯器或EEPROM,或再省去某些I/O,即可得到51系列的派生品種,如89C51、AT89C2051等單片機的框圖。

10. 由鍵盤輸入10個數,求出其中的最大值、最小值及平均值的C程序

c程序如下:

#include <stdio.h>

int main()
{
double max=0,min=0,a,s=0;
int i;
for(i=1;i<=10;i++)
{
printf("請輸入第%d個數:",i);
scanf("%f",&a);
if (max<a) then max=a;
if (min>a) then min=a;
s+=a;
}
printf("最大值:%f,最小值:%f,平均值:%f」,max,min,s/10);
return 0;
}

C++程序:

#include<iostream>
using namespace std;
int max(int *p);
int min(int *p);
double avg(int *p);
void main()
{
int a[10];
for(int i=0;i<10;++i)
cin>>a[i];
cout<<"最大數"<<max(a);
cout<<"最小數"<<min(a);
cout<<"平均數"<<avg(a);

}
int max(int*p)
{
int max;
max=p[0];
for(int i=1;i<10;++i)
if(max<p[i])
{
max=p[i];
}
return max;
}
int min(int*p)
{
int min;
min=p[0];
for(int i=1;i<10;++i)
if(min>p[i])
{
min=p[i];
}
return min;
}
double avg(int *p)
{
double sum=0;
for(int i=0;i<10;++i)
{
sum+=p[i];
}
return sum/10;
}

閱讀全文

與mcs51單片機求十個數平均數的程序相關的資料

熱點內容
android杜比音效 瀏覽:339
殺手47為什麼連接不了伺服器 瀏覽:106
靜態路徑命令 瀏覽:531
一直編譯不過怎麼辦 瀏覽:827
汽車串聯並聯演算法 瀏覽:458
助眠解壓的聲音音頻小哥哥 瀏覽:275
pythoncmd換行 瀏覽:374
linux取消行號 瀏覽:353
安卓原生系統官網是什麼 瀏覽:444
底部主圖源碼 瀏覽:878
伺服器崩了有什麼提示 瀏覽:780
遠程海康伺服器用什麼瀏覽器 瀏覽:232
解壓報紙圖片 瀏覽:956
python微信公眾號開發平台 瀏覽:895
知識付費網站java源碼 瀏覽:255
方舟怎麼做命令管理 瀏覽:849
linux流量異常 瀏覽:675
單片機如何給電腦加密碼 瀏覽:519
如何刪掉多餘的伺服器 瀏覽:220
c編程演算法 瀏覽:833