想后看开 发表于 2022-10-13 10:34 牛蛙 |
我这里有一个 //adc0808应用 #include<reg51.h> #include<intrins.h> #include<absacc.h> #include<stdlib.h> #include<stdio.h> #define int8u unsigned char #define int16u unsigned int int8u code SEG_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; sbit OE=P1^0; // 输出使能 sbit EOC=P1^1; // 转换结果 sbit ST=P1^2; // 启动转换 sbit CLK=P1^3; // 采样时钟 void delay_ms(int16u ms) {int8u i;while(ms--) for(i=0;i<120;i++); } void Display_Result(int8u AD) { int V; V=AD * 500.0 * 2/511.0;//根据4舍5人法计算电压值(放大100倍以使分解) P2=1<<2;P0=SEG_CODE[V % 10]; delay_ms(5); P2=1<<1;P0=SEG_CODE[V % 100/10]; delay_ms(5); P2=1<<0;P0=SEG_CODE[V / 100]&0x7f; delay_ms(5); } void main() { TMOD=0x02;//定时器TIMER0工作方式 2 (8位自动重装) TL0=-250;// 定时器初值 TH0=-250;// 在TL0溢出时,TH0的值自动重新装入 IE=0x82;// 允许TIMER0溢出中断 TR0=1; // 启动ADC0808(0809)的通道3(0011) P1=0x3f;// 高4位设通道地址为0011(3),低4位为clk,st,eoc,oe/ce while(1) { ST=0;ST=1;ST=0;//启动转换 while(EOC==0); // 等待转换结果 OE=1; // 允许输出 Display_Result(P3);//显示A/D转换结果 OE=0; // 关闭输出 } } void Timer0_INT()interrupt 1 {CLK=!CLK; //adc0808采样时钟 } |