導航:首頁 > 編程語言 > 單片機ad匯編程序

單片機ad匯編程序

發布時間:2022-08-17 16:24:16

A. 想要一個80C51單片機控制ad9850的匯編程序,能用按鍵調節的·最好能加顯示

我用過AD9850 是8根數據線,3根控制線(不是地址線),程序如下

#define AD9850 P1OUT //數據
#define W_CLK_H P6OUT|=BIT4 //時鍾線
#define W_CLK_L P6OUT&=~BIT4
#define FQ_UP_H P6OUT|=BIT5
#define FQ_UP_L P6OUT&=~BIT5
#define RSET_H P6OUT|=BIT6 //復位線
#define RSET_L P6OUT&=~BIT6
long unsigned int f=1000,A9850temp=0;
uchar sendon=1;
uchar Mdata[5]=;

void Deal()
{
double pinlv;
uchar i;
pinlv=f;
pinlv*=107.3742; //系數要根據實際的外接晶振頻率而定 本設計有源晶振40M
A9850temp=(long unsigned)pinlv;

Mdata[4]=A9850temp&0x000000ff;
Mdata[3]=(A9850temp>>8)&0x000000ff;
Mdata[2]=(A9850temp>>16)&0x000000ff;
Mdata[1]=(A9850temp>>24)&0x000000ff;
FQ_UP_L;
_NOP();
FQ_UP_H;
_NOP();
FQ_UP_L;
_NOP();
W_CLK_L;

for(i=0;i<5;i++)
{

AD9850=Mdata[i];
W_CLK_H;
delay(200);
W_CLK_L;

}
delay(200);
FQ_UP_H;

}

void AD9850Init()
{ W_CLK_L;
delay(200);
FQ_UP_L;
delay(200);
RSET_H;
delay(200);
RSET_L;
f=100000;
}

void AD9850fun()

}

B. 求AD轉換單片機實驗的匯編程序

接線:p3.6接srd
p3.7接swr
p3.0接pin
p3.1接clk
ad0809的clk接脈沖
cs接8000h的解碼電路程序:ad0809 xdata 8000h
org 0000h
ajmp main
org 0030h
main:mov dptr,#8000h
mov a,#01h
movx @dptr,a
call delay
movx a,@dptr
mov r0,a
call disp
call delay
call delay
call delay
ajmp maindisp:mov a,r0
anl a,#00001111b
acall dsend
mov a,r0
swap a
anl a,#00001111b
acall dsend
ret
dsend:mov dptr,#tab
movc a,@a+dptr
mov sbuf,a
jnb ti,$
clr ti
ret delay:mov r4,#250
delay1:mov r5,#250
djnz r5,$
djnz r4,delay1
ret
tab:db 03h ;0
db 9fh ;1
db 25h ;2
db 0dh ;3
db 99h ;4
db 49h ;5
db 41h ;6
db 1fh ;7
db 01h ;8
db 09h ;9
db 11h ;滅
db 11h
db 0c1h
db 63h
db 85h
db 61h
db 71h
db 00h
end

C. 求51單片機AD程序

如下程序是在
STC
官方網站
提供的。應該很有用。
////
//本示例在Keil開發環境下請選擇Intel的8058晶元型號進行編譯
//假定測試晶元的工作頻率為18.432MHz
#include
"reg51.h"
#include
"intrins.h"
#define
FOSC
18432000L
#define
BAUD
9600
typedef
unsigned
char
BYTE;
typedef
unsigned
int
WORD;
#define
URMD
0
//0:使用定時器2作為波特率發生器
//1:使用定時器1的模式0(16位自動重載模式)作為波特率發生器
//2:使用定時器1的模式2(8位自動重載模式)作為波特率發生器
sfr
T2H
=
0xd6;
//定時器2高8位
sfr
T2L
=
0xd7;
//定時器2低8位
sfr
AUXR
=
0x8e;
//輔助寄存器
sfr
ADC_CONTR
=
0xBC;
//ADC控制寄存器
sfr
ADC_RES
=
0xBD;
//ADC高8位結果
sfr
ADC_LOW2
=
0xBE;
//ADC低2位結果
sfr
P1ASF
=
0x9D;
//P1口第2功能控制寄存器
#define
ADC_POWER
0x80
//ADC電源控制位
#define
ADC_FLAG
0x10
//ADC完成標志
#define
ADC_START
0x08
//ADC起始控制位
#define
ADC_SPEEDLL
0x00
//540個時鍾
#define
ADC_SPEEDL
0x20
//360個時鍾
#define
ADC_SPEEDH
0x40
//180個時鍾
#define
ADC_SPEEDHH
0x60
//90個時鍾
void
InitUart();
void
InitADC();
void
SendData(BYTE
dat);
BYTE
GetADCResult(BYTE
ch);
void
Delay(WORD
n);
void
ShowResult(BYTE
ch);
void
main()
{
InitUart();
//初始化串口
InitADC();
//初始化ADC
while
(1)
{
ShowResult(0);
//顯示通道0
ShowResult(1);
//顯示通道1
ShowResult(2);
//顯示通道2
ShowResult(3);
//顯示通道3
ShowResult(4);
//顯示通道4
ShowResult(5);
//顯示通道5
ShowResult(6);
//顯示通道6
ShowResult(7);
//顯示通道7
}
}
/*----------------------------
發送ADC結果到PC
----------------------------*/
void
ShowResult(BYTE
ch)
{
SendData(ch);
//顯示通道號
SendData(GetADCResult(ch));
//顯示ADC高8位結果
//
SendData(ADC_LOW2);
//顯示低2位結果
}
/*----------------------------
讀取ADC結果
----------------------------*/
BYTE
GetADCResult(BYTE
ch)
{
ADC_CONTR
=
ADC_POWER
|
ADC_SPEEDLL
|
ch
|
ADC_START;
_nop_();
//等待4個NOP
_nop_();
_nop_();
_nop_();
while
(!(ADC_CONTR
&
ADC_FLAG));//等待ADC轉換完成
ADC_CONTR
&=
~ADC_FLAG;
//Close
ADC
return
ADC_RES;
//返回ADC結果
}
/*----------------------------
初始化串口
----------------------------*/
void
InitUart()
{
SCON
=
0x5a;
//設置串口為8位可變波特率
#if
URMD
==
0
T2L
=
0xd8;
//設置波特率重裝值
T2H
=
0xff;
//115200
bps(65536-18432000/4/115200)
AUXR
=
0x14;
//T2為1T模式,
並啟動定時器2
AUXR
|=
0x01;
//選擇定時器2為串口1的波特率發生器
#elif
URMD
==
1
AUXR
=
0x40;
//定時器1為1T模式
TMOD
=
0x00;
//定時器1為模式0(16位自動重載)
TL1
=
0xd8;
//設置波特率重裝值
TH1
=
0xff;
//115200
bps(65536-18432000/4/115200)
TR1
=
1;
//定時器1開始啟動
#else
TMOD
=
0x20;
//設置定時器1為8位自動重裝載模式
AUXR
=
0x40;
//定時器1為1T模式
TH1
=
TL1
=
0xfb;
//115200
bps(256
-
18432000/32/115200)
TR1
=
1;
#endif
}
/*----------------------------
初始化ADC
----------------------------*/
void
InitADC()
{
P1ASF
=
0xff;
//設置P1口為AD口
ADC_RES
=
0;
//清除結果寄存器
ADC_CONTR
=
ADC_POWER
|
ADC_SPEEDLL;
Delay(2);
//ADC上電並延時
}
/*----------------------------
發送串口數據
----------------------------*/
void
SendData(BYTE
dat)
{
while
(!TI);
//等待前一個數據發送完成
TI
=
0;
//清除發送標志
SBUF
=
dat;
//發送當前數據
}
/*----------------------------
軟體延時
----------------------------*/
void
Delay(WORD
n)
{
WORD
x;
while
(n--)
{
x
=
5000;
while
(x--);
}
}

D. 請給一個STC12C5A08AD單片機AD轉換的匯編程序

LED_MCU_START EQU P3.7

ADC_CONTR EQU 0BCH ;A/D轉換寄存器
ADC_RES EQU 0BDH ;8位A/D轉換結果寄存器
P1ASF EQU 9DH ;P1口中的相應位作為模擬功能使用時的控制寄存器,如做A/D用,相應位要置1

ADC_Power_On_Speed_Channel_0 EQU 11100000B ;P1.0作為A/D輸入
ADC_Power_On_Speed_Channel_1 EQU 11100001B ;P1.1作為A/D輸入
ADC_Power_On_Speed_Channel_2 EQU 11100010B ;P1.2作為A/D輸入
ADC_Power_On_Speed_Channel_3 EQU 11100011B ;P1.3作為A/D輸入
ADC_Power_On_Speed_Channel_4 EQU 11100100B ;P1.4作為A/D輸入
ADC_Power_On_Speed_Channel_5 EQU 11100101B ;P1.5作為A/D輸入
ADC_Power_On_Speed_Channel_6 EQU 11100110B ;P1.6作為A/D輸入
ADC_Power_On_Speed_Channel_7 EQU 11100111B ;P1.7作為A/D輸入
;-------------------------------------------------
;定義變數
ADC_Channel_0_Result EQU 30H ;0通道A/D轉換結果
ADC_Channel_1_Result EQU 31H ;1通道A/D轉換結果
ADC_Channel_2_Result EQU 32H ;2通道A/D轉換結果
ADC_Channel_3_Result EQU 33H ;3通道A/D轉換結果
ADC_Channel_4_Result EQU 34H ;4通道A/D轉換結果
ADC_Channel_5_Result EQU 35H ;5通道A/D轉換結果
ADC_Channel_6_Result EQU 36H ;6通道A/D轉換結果
ADC_Channel_7_Result EQU 37H ;7通道A/D轉換結果
;--------------------------------------------------
ORG 0000H
LJMP MAIN

ORG 0050H
MAIN:
CLR LED_MCU_START ;MCU工作指示燈 LED_MCU_START EQU P3.7
MOV SP, #7FH ;設置堆棧

ACALL Initiate_RS232 ;初始化串口

ACALL ADC_Power_On ;開ADC電源, 第一次使用時要打開內部模擬電源
;開ADC電源, 可適當加延時,1mS以內就足夠了
ACALL Set_P12_ASF ;設置 P1.2 為模擬功能口
ACALL Set_ADC_Channel_2 ;設置 P1.2 作為A/D轉換通道

ACALL Get_AD_Result ;測量電壓並且取A/D轉換結果
ACALL Send_AD_Result ;發送轉換結果到 PC 機

ACALL Set_P12_Normal_IO ;設置 P1.2 為普通IO
MOV A, ADC_Channel_2_Result ;用 P1 口顯示A/D轉換結果
CPL A
MOV P1, A

Wait_Loop:
SJMP Wait_Loop ;停機

;-------------------------------------------------------------
;-------------------------------------------------------------
;-------------------------------------------------------------
;-------------------------------------------------------------
Initiate_RS232: ;串口初始化
CLR ES ;禁止串口中斷
MOV TMOD, #20H ;設置 T1 為波特率發生器
MOV SCON, #50H ;0101,0000 8位數據位, 無奇偶校驗
MOV TH1, #0FBH ;18.432MHz 晶振, 波特率 = 9600
MOV TL1, #0FBH

SETB TR1 ;啟動 T1
RET
;--------------------------------------------------------------
Send_Byte:
CLR TI
MOV SBUF, A
Send_Byte_Wait_Finish:
JNB TI, Send_Byte_Wait_Finish
CLR TI
RET
;--------------------------------------------------------------
ADC_Power_On:
PUSH ACC
ORL ADC_CONTR, #80H ;開A/D轉換電源
MOV A, #20H
ACALL Delay ;開A/D轉換電源後要加延時,1mS以內就足夠了
POP ACC
RET

;-------------------------------------------------------------
;設置P1.2為模擬功能
Set_P12_ASF:
PUSH ACC
MOV A, #00000100B
ORL P1ASF, A
POP ACC
RET

;-------------------------------------------------------------
;設置 P1.2 為普通IO
Set_P12_Normal_IO:
PUSH ACC
MOV A, #11111011B
ANL P1ASF, A
POP ACC
RET

;-------------------------------------------------------------
Set_ADC_Channel_2:
MOV ADC_CONTR, #ADC_Power_On_Speed_Channel_2
;選擇P1.2作為A/D轉換通道
MOV A, #05H ;更換 A/D 轉換通道後要適當延時, 使輸入電壓穩定
;以後如果不更換 A/D 轉換通道的話, 不需要加延時
ACALL Delay ;切換 A/D 轉換通道,加延時20uS~200uS就可以了,與輸入電壓源的內阻有關
;如果輸入電壓信號源的內阻在10K以下,可不加延時
RET

;-------------------------------------------------------------

Send_AD_Result:
PUSH ACC
MOV A, ADC_Channel_2_Result ;取 AD 轉換結果
ACALL Send_Byte ;發送轉換結果到 PC 機
POP ACC
RET

;----------------------------------------------------------
Get_AD_Result:
PUSH ACC ;入棧保護
MOV ADC_RES, #0
ORL ADC_CONTR, #00001000B ;啟動 AD 轉換
NOP ;在對ADC_CONTR寄存器進行寫操作後,要加4個空操作延時,才能夠正確讀到ADC_CONTR的值
NOP ;在對ADC_CONTR寄存器進行寫操作後,要加4個空操作延時,才能夠正確讀到ADC_CONTR的值
NOP ;在對ADC_CONTR寄存器進行寫操作後,要加4個空操作延時,才能夠正確讀到ADC_CONTR的值
NOP ;在對ADC_CONTR寄存器進行寫操作後,要加4個空操作延時,才能夠正確讀到ADC_CONTR的值
Wait_AD_Finishe:
MOV A, #00010000B ;判斷 AD 轉換是否完成
ANL A, ADC_CONTR
JZ Wait_AD_Finishe ;AD 轉換尚未完成, 繼續等待

ANL ADC_CONTR, #11100111B ;清0 ADC_FLAG, ADC_START 位, 停止A/D轉換

MOV A, ADC_RES
MOV ADC_Channel_2_Result, A ;保存 AD 轉換結果
POP ACC
RET
;---------------------------------------------------------------
Delay:
PUSH 02 ;將寄存器組0 的 R2 入棧
PUSH 03 ;將寄存器組0 的 R3 入棧
PUSH 04 ;將寄存器組0 的 R4 入棧
MOV R4, A
Delay_Loop0:
MOV R3, #200 ;2 CLOCK ---------------------+
Delay_Loop1: ; |
MOV R2, #249 ;2 CLOCK ------+ |
Delay_Loop: ; | 1002 CLOCK |200406 CLOCK
DJNZ R2, Delay_Loop ;4 CLOCK | |
DJNZ R3, Delay_Loop1 ;4 CLOCK ------+ |
DJNZ R4, Delay_Loop0 ;4 CLOCK ---------------------+

POP 04
POP 03
POP 02
RET
;----------------------------------------------------------------
END

E. 關於10位AD轉換的匯編程序—12C5410AD單片機

用十位的二進制,除以10,余數就是個位;
商,繼續除以10,余數就是十位;
依次類推,可得出百位、千位。

十位的二進制,除以10,可以使用二位元組除以一位元組的除法子程序,這個子程序可見我前幾天寫出的答案:
http://..com/question/130203351.html
---------------------
一個高8位和一個低2位(******xx)這兩者如何結合?
呵呵,這應該另外提出一個新問題。

F. 單片機AD轉換,匯編語言,求助大佬!!!

匯編來做這個題,花費時間很長的,沒人願意白白浪費好幾個小時來做。

閱讀全文

與單片機ad匯編程序相關的資料

熱點內容
雲點播電影網php源碼 瀏覽:93
pythonclass使用方法 瀏覽:222
移動加密軟體去哪下載 瀏覽:281
php彈出alert 瀏覽:207
吉林文檔課件加密費用 瀏覽:131
感測器pdf下載 瀏覽:284
隨車拍app綁定什麼設備 瀏覽:898
方維團購系統源碼 瀏覽:991
linux反彈shell 瀏覽:159
列印機介面加密狗還能用嗎 瀏覽:301
二板股票源碼 瀏覽:448
度人經pdf 瀏覽:902
怎麼配置android遠程伺服器地址 瀏覽:960
java程序員看哪些書 瀏覽:943
什麼app可以免費和外國人聊天 瀏覽:797
pdf手寫筆 瀏覽:182
別永遠傷在童年pdf 瀏覽:990
愛上北斗星男友在哪個app上看 瀏覽:421
主力散戶派發源碼 瀏覽:671
linux如何修復伺服器時間 瀏覽:61