📄 adccaijinonidianya.c
字号:
/************************************************************
作者:邱星凌
版本:3.0
描述:主要演示使用ADC0832通道1(CH1)采集模拟电压,并显示在数码管上
由于ADC0832的 Vref=5V,故当外部输入为5V时,转换值实际为255(#0FFH)
当然也可以直接用手按用来模拟0-5V的电压。
硬件:在:"AD输入口"的"CH1"上加0-5V的电压,并调节大小,观查显示变化
*************************************************************/
#include <reg52.h>
#define FOSC (12000000UL)
#define OSC (12)
#define TIMER0 1
typedef unsigned char uchar;
typedef unsigned int uint;
#define T_05ms (65536-(uchar)(FOSC/(12*200)))
code scan[6]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};
code scan1[6]={0x7D,0xBD,0xDD,0xED,0xF5,0xF9};
code v[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar a[6]={0xFF,0xFF,0xFF,0,0,0};
uchar a1=0,c=0; //采集电压转换结果
uchar b=0;
uchar kg=0,n=0,m=0;//标志变量
uchar i=0,j=0,i1=0,i2=0,i3=0,i4=0; //循环与延时变量
sbit ADC_CS=P3^5;
sbit ADC_CLK=P2^1;
sbit ADC_DI=P3^6;
sbit ADC_DO=P3^7;
bit FADC_CLK; //ADC_CLK的标志变量
/*========延时函数============*/
void delay(void)
{
for(i=0;i<5;i++)
{
for(j=0;j<10;j++) ;
}
}
void delay1(void)
{
for(i1=0;i1<3;i1++);
}
void delay2(void)
{
for(i2=0;i2<3;i2++);
}
/*==============自定义脉冲函数================*/
void pulsh(void)
{
FADC_CLK=1;
ADC_CLK=1;
delay1();
ADC_CLK=0;
FADC_CLK=0;
delay1();
}
/*=============二进制到bcd码的转换====================*/
void bin_bcd(void)
{
b=a1/10;
a[5]=a1%10;
a[4]=b%10;
a[3]=b/10;
a1=0;
b=0;
}
/*==========ADC采集函数电压转换============*/
void ADC_CH1(void)
{
ADC_CS=0;
m++; //NOP一下
ADC_CS=1;
m--;
delay2();
ADC_CS=0;
ADC_DI=1;
pulsh();
pulsh();
pulsh();
for(i3=0;i3<8;i3++)
{
pulsh();
a1 |= ADC_DO;
a1=a1<<1;
}
c=a1;
pulsh();
a1=0;
for(i4=0;i4<8;i4++)
{
pulsh();
a1 |=ADC_DO;
a1=a1<<1; //此处a已经清零了,所有可以用同样地方法
}
if(c==a1)
{
n=1;
ADC_CS=1;
ADC_CLK=0;
ADC_DI=1;
ADC_DO=1;
}
}
/*==========此处用CH0是为了用手按起显示灵活=======================*/
void ADC_CH0(void)
{
ADC_CS=0;
m++; //NOP一下
ADC_CS=1;
m--;
delay2();
ADC_CS=0;
ADC_DI=1; //CH0与CH1的区别在这里:CH1是ADC_DI置一后来三个脉冲---
pulsh(); //---而CH0是ADC_DI置一后,先来两个脉冲在将ADC_DI置零--
pulsh(); //---在一个脉冲后,CH0置一
ADC_DI=0;
pulsh();
ADC_DI=1;
for(i3=0;i3<8;i3++)
{
pulsh();
a1 |= ADC_DO;
a1=a1<<1;
}
c=a1;
pulsh();
a1=0;
for(i4=0;i4<8;i4++)
{
pulsh();
a1 |=ADC_DO;
a1=a1<<1; //此处a已经清零了,所有可以用同样地方法
}
if(c==a1)
{
n=1;
ADC_CS=1;
ADC_CLK=0;
ADC_DI=1;
ADC_DO=1;
}
}
/*==================中断服务函数===================*/
static void Timer0_isr(void) interrupt TIMER0
{
TR0=0;
TH0=T_05ms/256;
TL0=T_05ms%256;
TR0=1;
switch (kg)
{
case 0:
if(FADC_CLK==1)
{
P2=scan[kg];
P0=0xFF;
}
else
{
P2=scan1[kg];
P0=0xFF;
}
break;
case 1:
if(FADC_CLK==1)
{
P2=scan[kg];
P0=v[a[kg]];
}
else
{
P2=scan1[kg];
P0=v[a[kg]];
}
break;
case 2:
if(FADC_CLK==1)
{
P2=scan[kg];
P0=v[a[kg]];
}
else
{
P2=scan1[kg];
P0=v[a[kg]];
}
break;
case 3:
if(FADC_CLK==1)
{
P2=scan[kg];
P0=v[a[kg]];
}
else
{
P2=scan1[kg];
P0=v[a[kg]];
}
break;
case 4:
if(FADC_CLK==1)
{
P2=scan[kg];
P0=v[a[kg]];
}
else
{
P2=scan1[kg];
P0=v[a[kg]];
}
break;
case 5:
if(FADC_CLK==1)
{
P2=scan[kg];
P0=v[a[kg]];
}
else
{
P2=scan1[kg];
P0=v[a[kg]];
}
break;
default :
break;
}
kg++;
if(kg==6)
{
kg=0;
}
}
/*====================中断初始函数==========================*/
static void Timer0_initialize(void)
{
EA=0;
TR0=0;
TMOD=0x11;
TH0=T_05ms/256;
TL0=T_05ms%256;
TF0=0;
PT0=1;
ET0=1;
TR0=1;
EA=1;
}
void main (void)
{
P0=0xFF;
P1=0xFF;
P2=0xFF;
P3=0xFF;
Timer0_initialize();
delay();
while(1)
{
while(n!=1)
{
ADC_CH1();
ADC_CH0();
}
bin_bcd();
delay();
delay();
n=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -