/*---------------------------------------------------------------------------------------------------
程序说明: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);
}