新聞中心

51單片機 ADC0804控制

作者: 時間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
現(xiàn)在大多單片機都帶有ADC模塊,對于精度要求不是很高的場合,一般都能夠滿足的。這里例程重在理解控制過程。

原理圖:

本文引用地址:http://m.butianyuan.cn/article/201611/321312.htm


代碼如下:

//頭文件
#include
#include //_nop_延時一個機械周期函數(shù)所在頭文件
//定義宏
#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; //存放模數(shù)轉(zhuǎn)換后的數(shù)字量
uint baiwei,shiwei,gewei; //存放模數(shù)轉(zhuǎn)換后的數(shù)字量的百位、十位、各位

//編碼定義
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
//數(shù)組聲明,其內(nèi)部元素代表的是位選端口選通信號數(shù)值,如0xfe代表選通第一個數(shù)碼管,包括選通ADC0804的CS端
uint weixuan_shuzu[]={
0x7e,0x7d,0x7b,
0x77,0x6f,0x5f};
//函數(shù)聲明
void delay(uint); //延時函數(shù)聲明
void quwei(uint); //整數(shù)取出每一位函數(shù)聲明
void display(uint); //顯示函數(shù)申明
void ADC0804_writting(); //ACD0804寫入操作函數(shù)聲明
void ADC0804_reading(); //ACD0804讀取操作函數(shù)聲明
//主函數(shù)
void main()
{
uint aa; //用于模數(shù)轉(zhuǎn)換前得多次顯示,確保轉(zhuǎn)換完成
weixuan=1;
P0=0x7f; //首先選擇ADC0804的CS端口,選中ACD0804(如果沒有這里的,那么接下來的ADC0804寫操作函數(shù)不能進行)
weixuan=0;
while(1)
{
ADC0804_writting(); //啟動AD轉(zhuǎn)換
for(aa=10;aa>0;aa--) //10次顯示轉(zhuǎn)換結(jié)果
{
display(number); //顯示轉(zhuǎn)換結(jié)果
}
ADC0804_reading(); //讀取AD轉(zhuǎn)換結(jié)果
}
}
//延時函數(shù)主體
void delay(uint xs)
{
uint i,j;
for(i=xs;i>0;i--)
{
for(j=110;j>0;j--)
{
}
}
}
//整數(shù)取出每一位函數(shù)主體
void quwei(uint digital_data0)
{
baiwei=digital_data0/100; //取出百位
shiwei=digital_data00/10;
gewei=digital_data0;
}
//顯示函數(shù)主體
void display(uint digital_data)
{
quwei(digital_data); //首先取出結(jié)果的每一位
//顯示第一位
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寫入操作函數(shù)主體
void ADC0804_writting()
{
ADC0804_WR=1; //首先拉高寫使能端
_nop_(); //延時一個機械周期
ADC0804_WR=0; //寫使能端低電平有效,開始轉(zhuǎn)換
_nop_();
ADC0804_WR=1; //轉(zhuǎn)換結(jié)束
}
//ACD0804讀取操作函數(shù)主體
void ADC0804_reading()
{
P1=0xff; //讀取結(jié)果之前,先拉高P1口一次
ADC0804_RD=1; //讀取之前先拉高讀取使能端
_nop_(); //延時一個機械周期
ADC0804_RD=0; //讀取使能端低電平有效,開始讀取
_nop_();
number=P1; //讀取的結(jié)果存放到number中,注意:number不需要轉(zhuǎn)換為十進制,直接當成十進制用就OK
ADC0804_RD=1; //讀取結(jié)束
}

以上,結(jié)束。



關(guān)鍵詞: 51單片機ADC0804控

評論


技術(shù)專區(qū)

關(guān)閉