基于51单片机的ADC0832数字电压表(仿真+程序)

  • 格式:docx
  • 大小:124.76 KB
  • 文档页数:11

仿真图:
#in elude <reg52.h>
#in elude vintrin s.h>
sbit CS = P3A 5;
sbit Clk =卩3人3;
sbit DATI = P3A4;
sbit DATO = P3A4;
sbit P20=P2A0 ;
un sig ned char dat = 0x00;
un sig ned char count = 0x00;
/**
***************************** ^定义全局变^量 ******************************
/** 斗 XT C £J_1
XTW2 R^T Pd KI W KUW?
PQ pa.&^oo KMW POTror
ip?
rw P2/W
PG£H
芒酒r P2.4m;
fcA. 旳腳威
*2 ma
5 P3.IM 沁
Pi 1 pg.vwt F3.Z/IOO
Fts PH M.:州和 P2-4TD P1 6 P16 •"■S.aUtfk P3 &
■ 14
■和
PV1
******************************* 包含头文^件 ******************************
/**
******************************* ^端■口定^义 ********************************
//AD 值 //定时器计数
U2
xinjjbn
■TBMK ■ & EK ■曲 ■詡 'RP1
■ 12 4 '
unsigned char CH; // 通道变量
unsigned char dis[] = {0x00, 0x00, 0x00}; // 显示数值
/*************************共阳 LED 段码表unsigned char code
tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char code tablewe[]={ 0xfd,0xfb,0xf7,0xef,0xdf,0xfe };
/*************************************************************************** * 函数功能 :AD 转换子程序
入口参数 :CH 出口参数 :dat
**************************************************************************
unsigned char adc0832(unsigned char CH) {
unsigned char i,test,adval;
adval = 0x00;
test = 0x00;
Clk = 0; // 初始化
DATI = 1;
_nop_();
CS = 0;
_nop_();
Clk = 1;
_nop_();
if ( CH == 0x00 ) // 通道选择
{
Clk = 0;
DATI = 1; // 通道 0 的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 0; // 通道 0 的第二位
_nop_();
Clk = 1;
_nop_();
}
else
{
Clk = 0;
DATI = 1; // 通道 1 的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 1; // 通道 1 的第二位
_nop_();
Clk = 1;
_nop_();
}
Clk = 0;
DATI = 1;
for( i = 0;i < 8;i++ ) // 读取前 8 位的值
{
_nop_();
adval <<= 1;
Clk = 1;
_nop_();
Clk = 0;
if (DATO)
adval |= 0x01;
else
adval |= 0x00;
}
for (i = 0; i < 8; i++) // 读取后 8 位的值{
test >>= 1;
if (DATO)
test |= 0x80;
else
test |= 0x00;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
}
if (adval == test) // 比较前 8 位与后 8 位的值,如果不相同舍去。

若一直出现显示为零,请将该行去掉
dat = test;
_nop_();
CS = 1; // 释放 ADC0832
DATO = 1;
Clk = 1;
return dat;
}
/***************************************************************************
* 函数功能 :延时子程序
****************************************************************************
/
void delay(void) {
int k;
for(k=10;k<500;k++);
/****************************************************************************
函数功能 :将 0-255 级换算成 0.00-5.00 的电压数值
****************************************************************************/ void convdata(unsigned char i)
dis[2] = ((i%51)*10%51)*10/51*2;
/***********************************************************
*****************
函数功能 :数码管显示子程序
************************************************************
****************/ void display(void)
P2=0xff;
delay();
P2=0xfd;
P2=0xff; delay(); dis[0] = i/51; // 个位 dis[1] = (i%51)*10/51*2; // 小数点后第一位
// 小数点后第二位 P0=tab[dis[0]] & 0x7f;
// 显示个位和小数点
P0=tab[dis[1]];
// 显示小数点后第一位
P2=0xfb;
P2=0xff;
P0=tab[dis[2]]; // 显示小数点后第二位
delay();
P2=0xf7;
P2=0xff;
P0=0xff; // 显示小数点后第二位
delay();
P2=0xfe;
}
/************************************************************** ************** 函数功能 :主程序
*************************************************************** *************/ void main(void)
{
P2=0xff; // 端口初始化
P0=0xff;
delay();
CH = 0x00; // 在这里选择通道 0x00 或 0x01
TMOD = 0x01; // 设置中断
TH0=(65536-50000)/256;// 定时器 1 初值定时 50ms
TL0=(65536-50000)%256;
IE = 0x82;
TR0 = 1;
while(1) // 主循环
{ dat = adc0832(CH);
convdata(dat); // 数据转换
display(); // 显示数值
}
}
/*************************************************************
*************** 函数功能 :定时器中断延时程序这一段的作用时隔一
否侧显示的最后一位段时间抽样一次
会不稳定
***************************************************************
*************
void timer0(void) interrupt 1
{
TMOD = 0x01;
TH0=(65536-50000)/256;// 定时器 1 初值定时 50ms
TL0=(65536-50000)%256;
IE = 0x82;
TR0 = 1;
count++;
if (count == 0x01)
{
count = 0x00;
dat = adc0832(CH);
}
}。