基本C51单片机的A/D转换实验
1.实验目的
掌握A/D转换芯片ADC0809与单片机的接口方法及ADC0809芯片性能;了解单片机实现数据采集的方法。
2.实验设备及器件
PC机 一台
单片机综合创新实验箱 一台
8孔排线 一根
杜邦线 3根
3.实验内容
编写一段程序,通过ADC0809实现单片机对模拟输入通道电压的采集,使采集到的数据显示在数码管上。
4.实验步骤
① 用1根杜邦线将J200的左针与D3区J44的CH0相接,或者不连,因为印刷板上已连通。连接一下只是增加学生的感性认识(注意:标CH0的实际是ADC0809的IN7);
② 将D4区的J2用杜邦线与B7区J100相连(注意:B7区此时必须将拨码开关向下拨,B8区J58短路帽断开,拨码开关向下拨,否则显示有问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
);
③ 用两根杜邦线将D4区的J4中的P34、P35与B7区J102的BIT0、BIT1相连;
④ 运行编写好的软件程序,调节电位器,仿真观察显示的是否变化。
5.参考程序
/*位码分别接P34和P35 ,段码P1口,其它接线同以前*/
AD EQU 30H
BAI EQU 31H
SHI EQU 32H
GEW EQU 33H
AD1 EQU 34H
ORG 0000H
LJMP MAIN
MAIN: MOV A,#00H
MOV DPTR,#7F07H
MOVX @DPTR,A
MOV R6,#0aH
DELAY: NOP
NOP
NOP
DJNZ R6,DELAY
MOVX A,@DPTR
MOV AD,A
ACALL DISP
JMP MAIN
DISP: MOV A,AD
MOV B,#5
DIV AB
MOV B,#10
DIV AB
MOV BAI,A
MOV A,B
MOV SHI,A
D0: MOV R0,#100
D1:
MOV A,BAI
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV P1,A
CLR P3.4
ACALL D1MS
SETB P3.4
MOV A,SHI
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
CLR P3.5
ACALL D1MS
SETB P3.5
DJNZ R0,D1
RET
D1MS: MOV R6,#2
DSS: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DSS
RET
TAB1: DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH,80H
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H
END
C51例程:
#include "reg51.h"
#define THCO 0xee
#define TLCO 0x0
unsigned char code Duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
//共阴极数码管-9段码表
unsigned char Data_Buffer[4]={10,0,0,0};
float AdValue;
sbit P34=P3^4; //四个数码管的位码口定义
sbit P35=P3^5;
sbit P36=P3^6;
sbit P37=P3^7;
/**************************************************/
sbit ADWR=P1^0;
sbit RS=P1^1;
sbit CS=P1^2;
sbit Add1=P1^3;
sbit Add2=P1^4;
sbit Add3=P1^5;
sbit EOC=P1^6;
sbit LED=P1^7;
/**************************************************/
void Sysinit();
void AD_Start(void);
void LED_Fresh();
void delay_ms(unsigned int x);
void main()
{ unsigned int i;
Sysinit();
Add1=0;
Add2=0; //模拟量通道输入选择
Add3=0;
while(1)
{
AD_Start();
while(!EOC);
LED=!LED;
RS=0;
AdValue=P0;
LED_Fresh();
RS=1;
for(i=0;i<40000;i++);
}
}
void Timer0_ISR() interrupt 1
{
static unsigned char Bit=0;
TH0=THCO;
TL0=TLCO;
Bit++;
if(Bit>=4)Bit=0;
P34=0;P35=0;P36=0;P37=0;//关位码
P2=Duan[Data_Buffer[Bit]];
switch(Bit)
{
case 0: P34=0;break;
case 1: P35=0;break;
case 2: P36=0;break;
case 3: P37=0;break;
}
}
void LED_Fresh()
{unsigned int temp;
temp=AdValue;
Data_Buffer[1]=temp/100;
Data_Buffer[2]=temp/10%10;
Data_Buffer[3]=temp%10;
}
void Sysinit()
{
TMOD=0x11; //定时器0初始化
TH0=THCO;
TL0=TLCO;
TR0=1;
ET0=1;
EA=1;
}
void AD_Start(void)
{
ADWR=1;
CS=0;
delay_ms(1);
ADWR=0;
delay_ms(1);
ADWR=1;
}
void delay_ms(unsigned int x)
{
unsigned char y;
for(x;x>0;x--)
for(y=110;y>0;y--);
}