先上AD574功能表:
硬件电路图:
程序流程图:
c程序:
/************************************************************************************************ A/D实验程序选择的晶振是3MHz,选用地址Q0,Q1,用定时器1在1s后重新启动AD转换(important) 程序是copy seataes的,感谢ing,我只是把注释补全,自己能更快的理解罢了 ************************************************************************************************/ #include <reg51.h> #include <absacc.h> /**************************************“A0,A1选择”七者选其一*************************************/ #define AD_START PBYTE[0xF9] // Q1 Q2 11111001 启动AD转换的地址 #define AD_HIGH PBYTE[0xFD] // 11111101 读AD转换高8位数据的地址 #define AD_LOW PBYTE[0xFF] //读AD转换低4位数据的地址 /* #define AD_START PBYTE[0xFC] // Q0 Q1 11111100 #define AD_HIGH PBYTE[0xFE] // 11111110 #define AD_LOW PBYTE[0xFF] #define AD_START PBYTE[0xF3] // Q2 Q3 11110011 #define AD_HIGH PBYTE[0xFB] // 11111011 #define AD_LOW PBYTE[0xFF] #define AD_START PBYTE[0xE7] // Q3 Q4 11100111 #define AD_HIGH PBYTE[0xF7] // 11110111 #define AD_LOW PBYTE[0xFF] #define AD_START PBYTE[0xCF] // Q4 Q5 11001111 #define AD_HIGH PBYTE[0xEF] // 11101111 #define AD_LOW PBYTE[0xFF] #define AD_START PBYTE[0x9F] // Q5 Q6 10011111 #define AD_HIGH PBYTE[0xDF] // 11011111 #define AD_LOW PBYTE[0xFF] #define AD_START PBYTE[0x3F] // Q6 Q7 00111111 #define AD_HIGH PBYTE[0xBF] // 10111111 #define AD_LOW PBYTE[0xFF] */ /************************************************************************************************/ unsigned char code tab[] = {0xC0,0xF9,0xA4,0xB0, 0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83, 0xC6,0xA1,0x86,0x8E,}; //共阳数码管码表 unsigned char code tab1[] ={0x3F,0x06,0x5B,0x4F, 0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x77,0x7C, 0x39,0x5E,0x79,0x71,}; //共阴数码管码表 unsigned char data byhigh,bylow; sbit P2_0 = P2^0; //数码管的位选信号 sbit P2_1 = P2^1; //数码管的位选信号 sbit P2_2 = P2^2; //数码管的位选信号 void delay(void); void display(void); //主程序 void main() { /*************************************关闭数码显示二者选其一*************************************/ // P1 = 0xFF; // P2 = 0x00; // 关闭共阳数码管 P1 = 0x00; // 关闭共阴数码管段选 P2 = 0xFF; // 关闭共阴数码管位选 /************************************************************************************************/ /***************************************外部中断二者选其一***************************************/ // IT0 = 1; // EX0 = 1; // 外部中断0 IT1 = 1; //外部中断采用下降沿触发 EX1 = 1; //允许外部中断中断 /************************************************************************************************/ TH0 = (65536 - 50000)/256; //赋初值50*4 = 200ms TL0 = (65536 - 50000)%256; TMOD = 0x01; //选择定时器方式1 ET0 = 1; //允许定时器0中断 TR0 = 1; //启动定时器0 EA = 1; //中断总允许 AD_START = 0; //启动AD转换 for(;;) { display(); } } /***************************************外部中断二者选其一***************************************/ /* void Int0(void) interrupt 0 // 外部中断0 { byhigh = AD_HIGH; bylow = AD_LOW; } */ //外部中断服务子程序,用于读取AD的高8位和低四位 void Int1(void) interrupt 2 { byhigh = AD_HIGH; //读AD转换的高8位 bylow = AD_LOW; //读AD转换的低4位 } /************************************************************************************************/ //定时器中断1服务子程序上 void Timer0(void) interrupt 1 { static unsigned char data bycounter = 0; //将byCounter设置为静态变量 TL0 = (65536 - 50000)%256; TH0 = (65536 - 50000)/256; bycounter ++; if(bycounter == 5) { bycounter = 0; AD_START = 0; // 启动AD转换 } } //数码管显示程序 void display(void) { /************************************************************************************************/ P2_0 = 1; P1 = tab[byhigh >> 4]; //显示最高4位 delay(); P2_0 = 0; P2_1 = 1; P1 = tab[byhigh & 0x0F]; //显示中间4位 delay(); P2_1 = 0; P2_2 = 1; P1 = tab[bylow >> 4]; //显示最低4位,怎么要左移4为呢?(高)xxxx-xxxx-xxxx-****(低)星号表示没用到的 delay(); P2_2 = 0; //共阳数码管显示 /************************************************************************************************/ P2_0 = 0; P1 = tab1[byhigh >> 4]; delay(); P2_0 = 1; P2_1 = 0; P1 = tab1[byhigh & 0x0F]; delay(); P2_2 = 0; P2_1 = 1; P1 = tab1[bylow >> 4]; delay(); P2_2 = 1; //共阴数码管显示 /************************************************************************************************/ } //延时子程序1ms void delay(void) { unsigned char a,b,c; for(c=1;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); }
注意了:P2口是当做IO口用,而不是地址总线,另外要注意D0-D7在AD1674怎么接单片机的IO口的,P0口地址总线,数据总线复用