现在大多
单片机都带有ADC模块,对于精度要求不是很高的场合,一般都能够满足的。这里例程重在理解控制过程。
原理图:
代码如下:
//头文件
#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; //读取结束
}
以上,结束。