#include #include”ADC0832.c”code uchar seven_seg[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};//共阳数码管0–9(0时为有效断)
uchar cp, j;uintdat_ad;void timer0_isr(void); //声明中断服务函数
void timer0_init(void); //声明中断初始化函数
void main(void) /**************************主函数**************************/{
timer0_init();//中断初始化函数
adc0832_init(); //adc0832初始化函数
while(1); //表示一个死循环,循环一直运行下去
}/***********************中断服务函数************************/
void timer0_isr(void) interrupt 1{
TH0= 0xf8;
TL0= 0x2f;
cp++;if(cp > 250) //0.5秒·
{
cp= 0;
dat_ad= adc0832_cho();//0.5秒让ADC0832转换一次
dat_ad = dat_ad * 1.96;//模拟信号转化为数字信号
}
P0= 0xff;switch(j)
{case 0: P0 = seven_seg[dat_ad % 10]; P2 = ~0x01;break; //模拟信号
case 1: P0 = seven_seg[dat_ad % 100/10]; P2 = ~0x02;break;// case 2: P0 = seven_seg[dat_ad / 100]& 0x7f; P2 = ~0x04;break;// case 3: P0 = seven_seg[adc0832_cho()% 10]; P2 = ~0x08; break; //、 数字信号
case 4: P0 = seven_seg[adc0832_cho()% 100 / 10]; P2 = ~0x10;break;// case 5: P0 = seven_seg[adc0832_cho() / 100]; P2 = ~0x20; break;//}
j++;if(j >= 6)
j= 0; //共显示六位
}/***********************中断初始化函数**********************/
void timer0_init(void)
{
TMOD= 0x01; //中断方式1
TH0 = 0xf8;
TL0= 0x2f; //对机器脉冲计数,2000个计满溢出引发中断
EA = 1; //开总中断
ET0 = 1; //开T0中断
TR0 = 1; //启动定时器T0
}/****************************************************************************************/
/*************************************ADC0832的驱动程序***********************************/
/*ADC0832模数转换将连续变化的模拟信号转换为离散的数字信号V = 5 / 256 = 0.01953v = 19.53mv*/
/****************************************************************************************/#include
#define nop _nop_()
#define uchar unsigned char //宏定义用uchar 代替 unsigned char
#define uint unsigned int //宏定义用uint 代替 unsigned intsbit CS= P3^0;
sbit CLK= P3^1;
sbit DIDO= P3^2;void adc0832_init(void) /*****ADC0832初始化函数*****/{
CS= 1; //adc0832未工作时,CS端为高电平,此时芯片禁用
nop; //对于延时很短的,要求在us级的,采用“_nop_”函数
CLK = 1;
CS= 0;
}
uchar adc0832_cho(void) //包含11个CLK下降沿 /**对转换CHO通道的模拟信号**/
{
uchar i, dat;
adc0832_init();
DIDO= 1; CLK = 0; nop; CLK = 1; nop; //SCLK第一个下降沿来到时,DI = 1启动ADC0832
DIDO = 1; CLK = 0; nop; CLK = 1; nop; //SCLK第二个下降沿
DIDO = 0; CLK = 0; nop; CLK = 1; nop; //SCLK第三个下降沿,发送1,0选择通道cho
DIDO = 1; //释放总线
for(i = 0; i < 8; i++) //第四个下降沿到第11个下降沿
{
CLK= 0; //clk处于下降沿,每一个下降沿DO端输入下一个
nop; //对于延时很短的,要求在us级的,采用“_nop_”函数
if(DIDO) dat |= 0x01; //dat = dat | 0x01,dat和0x01做“或”的运算,意思是最低位置1,其它位保持不变。
CLK = 1; nop; //clk处于上升沿
dat <<= 1; //数据左移
}return(dat);
CS= 1; //adc0832停止工作
}