程序说明:adc0809接到51单片机的P1口,P1口接有8个LED,每次转换结束都可以通过LED观察到转换结果(低电平亮),ADC参考电压与单片机的电源要一致
通过验证:输入5v则LED全灭
输入0v则LED全亮
通过电位器控制输入0~5v则1602显示输出从0~255逐次增加
------------------------------------------------------------------------------------------------------*/
#include #include #include"1602.c" #define uchar unsigned char #define uint unsigned int sbit ADC_START=P2^0; sbit ADC_ALE =P2^1; sbit ADC_OE =P2^2; sbit ADC_EOC =P2^3; sbit D0=P1^0; sbit D1=P1^1; sbit D2=P1^2; sbit D3=P1^3; sbit D4=P1^4; sbit D5=P1^5; sbit D6=P1^6; sbit D7=P1^7; uchar ad_dat; /*--------------------------------- 函数名:delayus(i) 功 能:延时t=(12*i+14)us 参 数:i 返回值:无 备 注: 晶振12MHz -----------------------------------*/ /*void delayus(i) { for(i;i>0;i--); } */ /*--------------------------------- dac0809初始化 ----------------------------------*/ void init0809() { ADC_START=0; ADC_OE =0; _nop_(); ADC_ALE=0; _nop_(); _nop_(); _nop_(); ADC_ALE=1; //ALE=1时地址进入锁存器 _nop_(); _nop_(); _nop_(); ADC_ALE=0; //ALE=0时地址被锁存住 _nop_(); _nop_(); _nop_(); } /*--------------------------------- dac0809模数转换 ----------------------------------*/ void ADC_0809() { ADC_START=1; //上升沿复位 _nop_(); _nop_(); _nop_(); ADC_START=0; //下降沿开始 _nop_(); _nop_(); _nop_(); while(!ADC_EOC); //等待转换结束 ADC_OE =1; w_dat_1602(0x30+(uchar)D0); w_dat_1602(0x30+(uchar)D1); w_dat_1602(0x30+(uchar)D2); w_dat_1602(0x30+(uchar)D3); w_dat_1602(0x30+(uchar)D4); w_dat_1602(0x30+(uchar)D5); w_dat_1602(0x30+(uchar)D6); w_dat_1602(0x30+(uchar)D7); delayus(5); ADC_OE =0; } void main() { init0809(); init_1602(); delayus(10); while(1) { w_com_1602(0x80); ADC_0809(); } } #include #define uchar unsigned char #define uint unsigned int sbit rs=P2^4; //1602io引脚 sbit rw=P2^5; //1602io引脚 sbit e=P2^6; //1602io引脚 /*--------------------------------- 函数名:delayusus(i) 功 能:延时t=(12*i+14)us 参 数:i 返回值:无 备 注: 晶振12MHz -----------------------------------*/ void delayus(i) { for(i;i>0;i--); } /*--------------------------------- 函数名:w_com_1602(uchar com) 功 能:写命令 参 数:uchar com 返回值:无 -----------------------------------*/ void w_com_1602(uchar com) { e=0; rs=0; rw=0; delayus(2); P0=com; e=1; delayus(2); e=0; delayus(2); } /*--------------------------------- 函数名:w_dat_1602(uchar dat) 功 能:写数据 参 数:uchar dat 返回值:无 -----------------------------------*/ void w_dat_1602(uchar dat) { e=0; rs=1; rw=0; delayus(2); P0=dat; e=1; delayus(2); e=0; delayus(2); } /*--------------------------------- 函数名:init_1602() 功 能:1602初始化 参 数:无 返回值:无 -----------------------------------*/ void init_1602() { P0=0xff; //端口初始化 w_com_1602(0x38); //功能设置 w_com_1602(0x0f); //开光标但不闪烁 w_com_1602(0x06); //设置输入方式 w_com_1602(0x01); //清屏 delayus(5); }