扩展adc2
stc89c52上测试
#include<AT89X52.H> #include<stdio.h> #define uchar unsigned char #define uint unsigned int sbit st=P2^4;//A/D转换控制 sbit ale=P2^3;//通道控制 sbit oe=P2^5;//输出控制 sbit eoc=P3^7;//转换结束标志 sbit addr_a=P2^0; sbit addr_b=P2^1; sbit addr_c=P2^2; void delay(uchar x) { uint a,b; for(a=x;a>0;a--) for(b=110;b>0;b--); } void init()//初始化printf环境 { EA=1; //中断总允许 TMOD=0x21; //定时器1模式2,自动重装,为串口提供波特率 TH1=0xfd; //晶振11.0592MHZ,波特率9600 。9600 n 8 1 TL1=0xfd; TR1=1; //开启定时器1 PCON=0X00; //波特率不倍增 SCON=0X50; //串行口方式1 ,10位异步收发 ES=1; //串口中断允许 } void main() { uchar tmp; init();//初始化printf环境 while(1){ addr_a=0; //输出地址信号 addr_b=0; addr_c=0; ale=1; //输出地址锁存信号 delay(1); ale=0; st=1; //输出转换开始信号 st=0; delay(1);//等待转换结束 if(eoc==1)//读取转换结束标志,查询方式 { oe=1; //输出oe信号,读取数据 delay(1); tmp=P0; oe=0; delay(1); } ES=0;//串口中断禁止 TI=1; //发送中断标志 手动置1 printf("tmp=%f\n",(float)(tmp/255.0*5.0)); while(!TI); //如果TI==0则死等 TI=0; ES=1;//串口中断允许 } }