【单片机】A/D转换实验

一、操作目的

  • (1)了解A/D转换与单片机的接口方法;
  • (2)了解A/D转换芯片0809的性能及编程方法;
  • (3)通过实验了解单片机如何进行数据采集;

二、操作内容

利用实验系统上的0809做A/D转换器,实验系统上的电位器提供模拟量输入,编制程序,将模拟量转换成数字,通过数码管显示出来。

三、接线图

在这里插入图片描述

四、程序清单

	ORG 0000H
	LJMP SE11
	ORG 0590H
SE11:
	MOV SP,#53H
	mov p2,#0ffh
	MOV A,#81H
	MOV DPTR,#0FF23H
	MOVX @DPTR,A
	MOV 7EH,#00H
	MOV 7DH,#08H
	MOV 7CH,#00H
	MOV 7BH,#09H
	MOV 7AH,#10H
	MOV 79H,#10H                ;显示缓冲区初值
LO18:
	LCALL SSEE                  ;显示
	MOV A,#00H
	MOV DPTR,#0FF80H
	MOVX @DPTR,A                ;0809的0通道采样
	MOV R7,#0FFH                ;延时
LO17:
	DJNZ R7,LO17
	MOVX A,@DPTR                ;取出采样值
	MOV R0,#79H
	LCALL PTDS
	SJMP LO18                   ;采样值送显示缓冲区
	ORG 05D0H
PTDS:
		MOV R1,A                    ;拆送显示缓冲区
		ACALL PTDS1
		MOV A,R1	
		SWAP A
PTDS1: 	
		ANL A,#0FH
		MOV @R0,A
		INC R0
		RET
		ORG 0D50H
SSEE:
		SETB RS1                     ;换工作区
		MOV R5,#05H
SSE2:
		MOV 30H,#20H
		MOV 31H,#7EH
		MOV R7,#06H
SSE1:
	MOV R1,#20H
	MOV A,30H
	CPL A
	MOVX @R1,A                    ;字位送入
	MOV R0,31H
	MOV A,@R0
	MOV DPTR,#DDFF
	MOVC A,@A+DPTR                ;取字形代码
	MOV R1,#21H
	MOVX @R1,A                    ;字形送入
	MOV A,30H
	RR A                          ;右移
	MOV 30H,A
	DEC 31H
	MOV A,#0FFH
	MOVX @R1,A                    ;关显示
	DJNZ R7,SSE1                  ;六位显示完了吗?
	DJNZ R5,SSE2                  ;5次显示完了吗?
	CLR RS1
	RET
DDFF:
		DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
		DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH
		END

五、代码详解

#include <absacc.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define AD XBYTE[0xFF80]
#define com8255 XBYTE[0xff23] //宏定义口地址
#define pa8255 XBYTE[0xff20]
#define pb8255 XBYTE[0xff21]

uchar code table[20] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E, 0xFF, 0x0C, 0x89, 0xDE};
uchar code wei[] = {0x20, 0x10, 0x08, 0x04, 0x02, 0x01};

uint i, temp, digit;

void delay(int x)
{
	while(x--);	
}
void show(uint num)
{
    temp = num;
    digit = 0;
	if(temp == 0)
	{
	    pb8255 = table[temp % 10];
        pa8255 = ~wei[5 - digit];
	}
	else
	{
		while (temp)
        {
            pb8255 = table[temp % 10];
            pa8255 = ~wei[5 - digit];
            temp /= 10;
            digit++;
            delay(100);
        }

	}
}
void main()
{
    com8255 = 0x80; //控制口赋值
    pa8255 = 0x00;  //PA初始化
    pb8255 = 0x00;  //PB口初始化
	while(1)
	{
		AD = 0X00;
		//delay(1000);
		show(AD);
	}
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码两年半的练习生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值