?? adc0832.c
字號(hào):
/********************************************************************/
/* */
/* ME300B單片機(jī)開(kāi)發(fā)系統(tǒng)演示程序 - ADC0832電壓表 */
/* */
/* 采用三位數(shù)碼管顯示 */
/* 參考電壓接至5V電源 */
/* 最小輸出電壓:0.00V 最大輸出電壓:5.00V 分辨率:0.02V */
/* */
/* 郵箱: gguoqing@willar.com */
/* 網(wǎng)站: http://www.willar.com */
/* 作者: gguoqing */
/* 時(shí)間: 2006/01/20 */
/* */
/* */
/*【版權(quán)】Copyright(C)偉納電子 www.willar.com All Rights Reserved */
/*【聲明】此程序僅用于學(xué)習(xí)與參考,引用請(qǐng)注明版權(quán)和作者信息! */
/* */
/********************************************************************/
#include"reg51.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define disdata P0 //顯示數(shù)據(jù)段碼輸出口
#define channel_0 0x02 //單通道0輸入選擇
#define channel_1 0x03 //單通道1輸入選擇
sbit ADC_CS = P3^4; //片選端
sbit ADC_CLK= P1^0; //時(shí)鐘端
sbit ADC_DI = P1^1; //數(shù)據(jù)輸入輸出復(fù)用
sbit ADC_DO = P1^1; //DI和DO端都接在P1.1
sbit ACC0=ACC^0; //通道與輸入方式控制字
sbit ACC1=ACC^1; //通道與輸入方式控制字
sbit DISX=P0^7; //LED小數(shù)點(diǎn)
uchar code disply[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
// 0 1 2 3 4 5 6 7 8 9 關(guān)閉
uchar code dis_scan[3]={0x7f,0xbf,0xdf}; //列掃描控制字
uint data dis[4]={0x00,0x00,0x00,0x00}; //定義3個(gè)顯示數(shù)據(jù)單元和一個(gè)數(shù)據(jù)存儲(chǔ)單元
/********************************************************************/
/* */
/* 延時(shí)函數(shù) */
/* */
/********************************************************************/
delay(int ms)
{
int i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/********************************************************************/
/* */
/* 啟動(dòng)ADC轉(zhuǎn)換 */
/* */
/********************************************************************/
ADC_start()
{
ADC_CS=1; //一個(gè)轉(zhuǎn)換周期開(kāi)始
_nop_();
ADC_CLK=0;
_nop_();
ADC_CS=0; //CS置0,片選有效
_nop_();
ADC_DI=1; //DI置1,起始位
_nop_();
ADC_CLK=1; //第一個(gè)脈沖
_nop_();
ADC_DI=0; //在負(fù)跳變之前加一個(gè)DI反轉(zhuǎn)操作
_nop_();
ADC_CLK=0;
_nop_();
}
/********************************************************************/
/* */
/*AD轉(zhuǎn)換函數(shù) */
/*選擇輸入通道,輸入信號(hào)的模式《單端輸入,或差分輸入》 */
/* */
/********************************************************************/
ADC_read(uchar mode)
{
uchar i;
ADC_start(); //啟動(dòng)轉(zhuǎn)換開(kāi)始
ACC=mode;
ADC_DI=ACC1; //輸出控制位1,DI=1,單通道輸入,DI=0,差分輸入。
ADC_CLK=1; //第二個(gè)脈沖
_nop_();
ADC_DI=0;
ADC_CLK=0;
_nop_();
ADC_DI=ACC0; //輸出控制位0,DI=0,通道0輸入,DI=1,通道1輸入。
ADC_CLK=1; //第三個(gè)脈沖
_nop_();
ADC_DI=1;
ADC_CLK=0; //輸入模式和通道號(hào)已經(jīng)選擇完。
ADC_CLK=1; //第四個(gè)脈沖
ACC=0;
for(i=8;i>0;i--) //讀取8位數(shù)據(jù)
{
ADC_CLK=0; //脈沖下降沿
ACC=ACC<<1;
ACC0=ADC_DO; //讀取DO端數(shù)據(jù)
_nop_();
_nop_();
ADC_CLK=1;
}
ADC_CS=1; //CS=1,片選無(wú)效。
return(ACC);
}
/********************************************************************/
/* */
/* 數(shù)據(jù)處理與顯示函數(shù) */
/* 將采集到的數(shù)據(jù)進(jìn)行16進(jìn)制轉(zhuǎn)換為10進(jìn)制的處理,然后送顯示。 */
/* */
/********************************************************************/
show_value(uchar ad_data)
{
uchar k;
dis[2]=ad_data/51; //AD值轉(zhuǎn)換為3為BCD碼,最大為5.00V。
dis[3]=ad_data%51; //余數(shù)暫存
dis[3]=dis[3]*10; //計(jì)算小數(shù)第一位
dis[1]=dis[3]/51;
dis[3]=dis[3]%51;
dis[3]=dis[3]*10; //計(jì)算小數(shù)第二位
dis[0]=dis[3]/51; //
for(k=0;k<3;k++)
{
disdata=disply[dis[k]];
if(k==2){DISX=0;}
P2=dis_scan[k];
delay(1);
P2=0xff;
}
}
/********************************************************************/
/* */
/* 主函數(shù) */
/* */
/********************************************************************/
main()
{
uchar i,j;
while(1)
{
i=ADC_read(channel_0);
for(j=0;j<20;j++)
{
show_value(i);
}
}
}
/********************************************************************/
/* */
/*將i=ADC_read(channel_0)改為i=ADC_read(channel_1)即可使用JP6輸入 */
/* */
/********************************************************************/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -