新闻中心

EEPW首页>嵌入式系统>设计应用> 51单片机 ADC0804控制

51单片机 ADC0804控制

作者: 时间:2016-11-25 来源:网络 收藏
现在大多单片机都带有ADC模块,对于精度要求不是很高的场合,一般都能够满足的。这里例程重在理解控制过程。

原理图:

本文引用地址://m.amcfsurvey.com/article/201611/321312.htm


代码如下:

//头文件
#include
#include//_nop_延时一个机械周期函数所在头文件
//定义宏
#define uint unsigned int
#define uchar unsigned char
//端口声明
sbit duanxuan=P2^6;
sbit weixuan=P2^7;
sbit ADC0804_WR=P3^6;//写信号输入,低电平有效
sbit ADC0804_RD=P3^7;//读信号输入,低电平有效
//变量定义
uint number;//存放模数转换后的数字量
uint baiwei,shiwei,gewei;//存放模数转换后的数字量的百位、十位、各位

//编码定义
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
//数组声明,其内部元素代表的是位选端口选通信号数值,如0xfe代表选通第一个数码管,包括选通ADC0804的CS端
uint weixuan_shuzu[]={
0x7e,0x7d,0x7b,
0x77,0x6f,0x5f};
//函数声明
void delay(uint);//延时函数声明
void quwei(uint);//整数取出每一位函数声明
void display(uint);//显示函数申明
void ADC0804_writting();//ACD0804写入操作函数声明
void ADC0804_reading();//ACD0804读取操作函数声明
//主函数
void main()
{
uint aa;//用于模数转换前得多次显示,确保转换完成
weixuan=1;
P0=0x7f;//首先选择ADC0804的CS端口,选中ACD0804(如果没有这里的,那么接下来的ADC0804写操作函数不能进行)
weixuan=0;
while(1)
{
ADC0804_writting();//启动AD转换
for(aa=10;aa>0;aa--)//10次显示转换结果
{
display(number);//显示转换结果
}
ADC0804_reading();//读取AD转换结果
}
}
//延时函数主体
void delay(uint xs)
{
uint i,j;
for(i=xs;i>0;i--)
{
for(j=110;j>0;j--)
{
}
}
}
//整数取出每一位函数主体
void quwei(uint digital_data0)
{
baiwei=digital_data0/100; //取出百位
shiwei=digital_data00/10;
gewei=digital_data0;
}
//显示函数主体
void display(uint digital_data)
{
quwei(digital_data);//首先取出结果的每一位
//显示第一位
duanxuan=1;
P0=table[baiwei];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=weixuan_shuzu[0];
weixuan=0;
delay(2);
//显示第二位
duanxuan=1;
P0=table[shiwei];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=weixuan_shuzu[1];
weixuan=0;
delay(2);
//显示第三位
duanxuan=1;
P0=table[gewei];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=weixuan_shuzu[2];
weixuan=0;
delay(2);
}
//ACD0804写入操作函数主体
void ADC0804_writting()
{
ADC0804_WR=1;//首先拉高写使能端
_nop_();//延时一个机械周期
ADC0804_WR=0;//写使能端低电平有效,开始转换
_nop_();
ADC0804_WR=1;//转换结束
}
//ACD0804读取操作函数主体
void ADC0804_reading()
{
P1=0xff;//读取结果之前,先拉高P1口一次
ADC0804_RD=1;//读取之前先拉高读取使能端
_nop_();//延时一个机械周期
ADC0804_RD=0;//读取使能端低电平有效,开始读取
_nop_();
number=P1;//读取的结果存放到number中,注意:number不需要转换为十进制,直接当成十进制用就OK
ADC0804_RD=1;//读取结束
}

以上,结束。



关键词:51单片机ADC0804控

评论


技术专区

关闭