日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c51adc0809c语言程序,用汇编语言写一个51单片机adc0809的程序

發(fā)布時間:2024/1/1 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c51adc0809c语言程序,用汇编语言写一个51单片机adc0809的程序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

匿名用戶

1級

2011-08-15 回答

正好做過,就給你吧!

*************************************

;* *

;* 主程序和中斷程序入口 *

;* *

;*************************************

ORG 0000H

LJMP START

ORG 0003H

RETI

ORG 000BH

RETI

ORG 0013H

RETI

ORG 001BH

RETI

ORG 0023H

RETI

ORG 002BH

RETI

;

;*************************************

;* *

;* 初始化程序中的各變量 *

;* *

;*************************************

CLEARMEMIO: CLR A

MOV P2,A

MOV R0,#70H

MOV R2,#0DH

LOOPMEM: MOV @R0,A

INC R0

DJNZ R2,LOOPMEM

MOV 20H,#00H

MOV A,#0FFH

MOV P0,A

MOV P1,A

MOV P3,A

RET

;

;*************************************

;* *

;* 主 程 序 *

;* *

;*************************************

START: LCALL CLEARMEMIO ;初始化

MAIN: LCALL TEST ;測量一次

LCALL DISPLAY ;顯示數(shù)據(jù)一次

AJMPMAIN

NOP;PC值出錯處理

NOP

NOP

LJMPSTART

;

;*************************************

;* 顯 示 控 制 程 序 *

;*************************************

;

DISPLAY: JB 00H,DISP11 ;

MOV R3,#04H ;4路信號循環(huán)顯示控制

MOV R0,#70H ;顯示數(shù)據(jù)初址70H~73H

MOV 77H,#00H ;顯示通道路數(shù)初值

DISLOOP1: LCALL TUNBCD ;顯示數(shù)據(jù)轉為三位BCD碼存入76H、75H、74H(最大5.00v)

MOV R2,#0FFH ;每路顯示時間控制 4MS*255

DISLOOP2: LCALL DISP ;調(diào)四位顯示程序

LCALL KEYWORK1 ;

DJNZ R2,DISLOOP2 ;

INC R0 ;顯示下一路

INC 77H ;通道顯示數(shù)加一

DJNZ R3,DISLOOP1

RET

;

DISP11: MOV A,77H ;

SUBB A,#01H ;

MOV 77H,A ;

ADD A,#70H ;

MOV R0,A ;

DISLOOP11: LCALL TUNBCD ;顯示數(shù)據(jù)轉為三位BCD碼存入7AH、79H、78H(最大5.00v)

MOV R2,#0FFH ;每路顯示時間控制 4MS*25

DISLOOP22: LCALL DISP ;調(diào)四位顯示程序

LCALL KEYWORK2 ;

DJNZ R2,DISLOOP22

INC 77H ;通道顯示數(shù)加一

RET

;

;*************************************

;* 顯示數(shù)據(jù)轉為三位BCD碼程序 *

;*************************************

;顯示數(shù)據(jù)轉為三位BCD碼存入76H、75H、74H(最大值5.00v)

;

TUNBCD: MOV A,@R0 ;255/51=5.00V運算

MOV B,#51 ;

DIV AB ;

MOV 76H,A ;個位數(shù)放入76H

MOV A,B ;余數(shù)大于19H,F0為1,乘法溢出,結果加5

CLR F0

SUBB A,#1AH

MOV F0,C

MOV A,#10 ;

MUL AB ;

MOV B,#51 ;

DIV AB

JB F0,LOOP2 ;

ADD A,#5

LOOP2: MOV 75H,A ;小數(shù)后第一位放入75H

MOV A,B

CLR F0

SUBB A,#1AH

MOV F0,C

MOV A,#10 ;

MUL AB ;

MOV B,#51 ;

DIV AB

JB F0,LOOP3 ;

ADD A,#5

LOOP3: MOV 74H,A ;小數(shù)后第二位放入74H

RET

;

;*************************************

;* ? 顯?示 程 序 *

;*************************************

;共陽顯示子程序,顯示內(nèi)容在74H—77H

;

DISP: MOV R1,#74H ;共陽顯示子程序,顯示內(nèi)容在74H—77H

MOV R5,#0FEH ;數(shù)據(jù)在P1輸出,列掃描在P3.0-P3.3

PLAY: MOV P1,#0FFH

MOV A,R5

ANL P3,A

MOV A,@R1

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV P1,A

JB P3.2,PLAY1 ;小數(shù)點處理

CLR P1.7 ;小數(shù)點顯示(顯示格式為XX.XX)

PLAY1: LCALL DL1MS

INC R1

MOV A,P3

JNB ACC.3,ENDOUT

RL A

MOV R5,A

MOV P3,#0FFH

AJMP PLAY

ENDOUT: MOV P3,#0FFH

MOV P1,#0FFH

RET

TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH

;

;*************************************

;* ? ? 延時程序 *

;*************************************

;

DL10MS: MOV R6,#0D0H ;10MS延時子程序

DL1: MOV R7,#19H

DL2: DJNZ R7,DL2

DJNZ R6,DL1

RET

;

DL1MS: MOV R4,#0FFH ;513+513=1MS

LOOP11: DJNZ R4,LOOP11

MOV R4,#0FFH

LOOP22: DJNZ R4,LOOP22

RET

;

;*************************************

;* ? 電壓測量(A/D)子程序 *

;*************************************

; 一次測量數(shù)據(jù)4個,依次放入70H-73H單元中

;

TEST: CLR A ;模數(shù)轉換子程序

MOV P2,A

MOV R0,#70H ;轉換值存放首址

MOV R7,#04H ;轉換4次控制

LCALL TESTART ;啟動測試

WAIT: JB P3.7,MOVD ;等A/D轉換結束信號

AJMP WAIT

;

TESTART: SETB P2.3 ;測試啟動

NOP

NOP

CLR P2.3

SETB P2.4

NOP

NOP

CLR P2.4

NOP

NOP

NOP

NOP

RET

;

MOVD: SETB P2.5 ;取A/D轉換數(shù)據(jù)

MOV A,P0

MOV @R0,A

CLR P2.5

INC R0

MOV A,P2 ;通道地址加1

INC A

MOV P2,A

CJNE A,#04H,TESTEND ;等8路A/D轉換結束

TESTEND: JC TESTCON

CLR A ;結束恢復端口

MOV P2,A

MOV A,#0FFH

MOV P0,A

MOV P1,A

MOV P3,A

RET

;

TESTCON: LCALL TESTART

LJMP WAIT

;

;*************************************

;* ? 按鍵檢測子程序 *

;*************************************

;

KEYWORK1: JNB P3.5,KEY1

KEYOUT: RET

;

KEY1: LCALL DISP ;延時消抖

JB P3.5,KEYOUT

WAIT11: JNB P3.5,WAIT12

CPL 00H

MOV R2,#01H

MOV R3,#01H

RET

;

WAIT12: LCALL DISP ;鍵釋放等待時顯示用

AJMP WAIT11

;

KEYWORK2: JNB P3.5,KEY1

JNB P3.6,KEY2

RET

;

KEY2: LCALL DISP ;延時消抖用

JB P3.6,KEYOUT

WAIT22: JNB P3.6,WAIT21

INC 77H

MOV A,77H

CJNE A,#04H,KEYOUT11

KEYOUT11: JC KEYOUT1

MOV 77H,#00H

KEYOUT1: RET

;

WAIT21: LCALL DISP ;鍵釋放等待時顯示用

AJMP WAIT22

;

END

附錄3:

單片機C源程序清單

/*********************************************************************/

// 四路電壓表C程序

// 使用keil C51 ver7.09

/*********************************************************************/

/*使用AT89C52單片機,12MHZ晶振,P0口讀入AD值,P2口作AD控制,用共陽LED數(shù)碼管

P1口輸出段碼,P3口掃描,最高位指示通道(0-7)。*/

#include "reg52.h" //52系列單片機定義文件

#include "intrins.h" //調(diào)用_nop_();延時函數(shù)用

#define ad_con P2 //AD控制口

#define addata P0 //AD數(shù)據(jù)計入讀入口

#define Disdata P1 //顯示數(shù)據(jù)段碼輸出口

#define uchar unsigned char//無符號字符(8位)

#define uint unsigned int //無符號整數(shù)(16位)

sbit ALE=P2^3; //鎖存地址控制位

sbit START=P2^4; //啟動一次轉換位

sbit OE=P2^5; //0809輸出數(shù)據(jù)控制位

sbit EOC=P3^7; //轉換結束標志位

sbit DISX=Disdata^7; //LED小數(shù)點

//

//

uchar code dis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};

/* 共陽七段LED段碼表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" */

uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; //四位列掃描控制字

uchar data ad_data[8]={0x00,0x00,0x00,0x00};//定義4個數(shù)據(jù)內(nèi)存單元

uint data dis[5]={0x00,0x00,0x00,0x00,0x00}; //定義4個顯示數(shù)據(jù)單元、1個數(shù)據(jù)暫存單元

//

//

/********1毫秒延時子函數(shù)**********/

delay1ms(uint t)

{

uint i,j;

for(i=0;i

for(j=0;j<120;j++)

;

}

//

//

/***********顯示掃描子函數(shù)**********/

scan()

{

uchar k,n;

int h;

dis[3]=0x00; //通道初值為0

for(n=0;n<4;n++) //每次顯示4個數(shù)據(jù)

{

dis[2]=ad_data[n]/51; //測得值轉換為三位BCD碼,最大為5.00V

dis[4]=ad_data[n]%51; // 余數(shù)暫存

dis[4]=dis[4]*10; //計算小數(shù)第一位

dis[1]=dis[4]/51; //

dis[4]=dis[4]%51; //

dis[4]=dis[4]*10; //計算小數(shù)第二位

dis[0]=dis[4]/51; //

for(h=0;h<500;h++) //每個通道值顯示時間控制(約1秒)

{

for(k=0;k<4;k++) //四位LED掃描控制

{

Disdata=dis_7[dis[k]];

if(k==2){DISX=0;}

P3=scan_con[k];delay1ms(1);P3=0xff;

}

}

dis[3]++; //通道值加1

}

}

//

//

/*******0809AD轉換子函數(shù)***********/

test()

{

uchar m;

uchar s=0x00;

ad_con=s;

for(m=0;m<4;m++)

{

ALE=1;_nop_();_nop_();ALE=0; //轉換通道地址鎖存

START=1;_nop_();_nop_();START=0; //開始轉換命令

_nop_();_nop_();_nop_();_nop_(); //延時4微秒

while(EOC==0); //等待轉換結束

OE=1;ad_data[m]=addata;OE=0;s++;ad_con=s;//取AD值,地址加1

}

ad_con=0x00; //控制復位

}

//

//

/**************主函數(shù)****************/

main()

{

P0=0xff; //初始化端口

P2=0x00;

P1=0xff;

P3=0xff;

while(1)

{

scan(); //依次顯示4個通道值一次

test(); //測量轉換一次

}

}

//

//

//*********************結束**************************//

追問:

你能附上電路圖嗎?

總結

以上是生活随笔為你收集整理的c51adc0809c语言程序,用汇编语言写一个51单片机adc0809的程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。