?? adc0831.c
字號(hào):
/*做這個(gè)例子的朋友,先看完這段話,一定要看完再做實(shí)驗(yàn)。
ADC0831模數(shù)轉(zhuǎn)換程序,運(yùn)行程序后,調(diào)節(jié)下電位器,看數(shù)碼管的顯示電壓從0V-5V變化?
本程序?qū)⒛?shù)轉(zhuǎn)換回來(lái)的數(shù)據(jù),我們?cè)俎D(zhuǎn)抽換成相應(yīng)的電壓值輸出數(shù)據(jù)管顯示
調(diào)節(jié)電位器其實(shí)就是分壓板上的JIN插針的輸入電壓,使ADC轉(zhuǎn)換到相應(yīng)電壓值,如果想測(cè)外電壓,就是從
JIN腳輸入,切記,測(cè)量電壓不可超過(guò)直流5V電壓,否則ADC0831將燒毀,切記切記,初學(xué)者一定切記,還有電壓極性
一定不可以搞錯(cuò),板上JIN插針一腳是地,一腳是測(cè)電壓正極,提醒個(gè)位朋友,如果要測(cè)外電壓,就測(cè)自身板上的
IC各腳電壓,因?yàn)榘遄邮?V供電,所以都不會(huì)超出5V,而且我們還可以測(cè)到各IC的各腳工作電壓,特別是單片機(jī),還有
一點(diǎn)注意的是,不要去測(cè)MAX232IC,因?yàn)榇薎C內(nèi)部有升壓電路,有的腳是有12V電壓的,所以切記不要去測(cè)量,
還有一點(diǎn)就是,先將電位器調(diào)節(jié)到電壓顯示為2。5V時(shí)再測(cè)其它腳位,這樣才準(zhǔn)確,*/
#include <reg51.h>
#include <intrins.h>
sbit SCL2=P1^3; //SCL2定義為P1口的第3位腳,連接ADC0831SCL腳
sbit SDA2=P1^4; //SDA2定義為P1口的第4位腳,連接ADC0831SDA腳
sbit CS2=P1^6; //CS2定義為P1口的第4位腳,連接ADC0831CS腳
sbit RST = P1^5;// DS1302片選,因這兩芯片采用同一數(shù)據(jù)腳(SDA,SCL),所以我們要定義它,將DS1302片選關(guān)掉,否則發(fā)生沖突
code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,
0x40,
0x3e,
0x00};
//共陰數(shù)碼管顯示數(shù)的組成是 "0-9""0-9有小數(shù)點(diǎn)的" "-" "U" "空 表"
unsigned char l_tmpdate[]={0,0,0,0};//定義數(shù)組變量
void delay();//延時(shí)子函數(shù),5個(gè)空指令
void display(unsigned char *lp,unsigned char lc);//數(shù)字的顯示函數(shù);lp為指向數(shù)組的地址,lc為顯示的個(gè)數(shù)
unsigned char ad0831read(void); //定義該函數(shù)為讀取ADC0831的數(shù)據(jù)
void main(void) //入口函數(shù)
{
unsigned int i=254,tmp;
RST=0;
while(1){
i++;
if(i==255){ //這里為循環(huán)255個(gè)周期讀取一次0831,因CPU運(yùn)行比較快,沒(méi)必要每次循環(huán)都去讀取
tmp=ad0831read()*100; //這里乘上100的意思是保留兩位小數(shù)
tmp=tmp/51; //這里為什么除以51呢,分析如下:模數(shù)轉(zhuǎn)換IC是8位ADC,轉(zhuǎn)換回來(lái)的數(shù)值是0-255
//0V時(shí)是0,5V時(shí)是255,他相應(yīng)的倍數(shù)就是255/5=51,因此,我們的將轉(zhuǎn)換回來(lái)的
//數(shù)除以51,就得到相應(yīng)的電壓值了,
i=0;
l_tmpdate[0]=tmp/100; //得到百位,其實(shí)是個(gè)位,因?yàn)槲覀儎偛懦松?00了
l_tmpdate[0]+=10; //這里是加上小數(shù)點(diǎn),帶小數(shù)點(diǎn)的數(shù)在表中是后10位
tmp=tmp%100;
l_tmpdate[1]=tmp/10; //十位 即小數(shù)點(diǎn)后第一位
l_tmpdate[2]=tmp%10; //個(gè)位 //即小數(shù)點(diǎn)后第二位
l_tmpdate[3]=21; //加上單位U,伏
}
display(l_tmpdate,4); //輸出顯示
}
}
void display(unsigned char *lp,unsigned char lc)//顯示
{
unsigned char i; //定義變量
P2=0; //端口2為輸出
P1=P1&0xF8; //將P1口的前3位輸出0,對(duì)應(yīng)138譯門(mén)輸入腳,全0為第一位數(shù)碼管
for(i=0;i<lc;i++){ //循環(huán)顯示
P2=table[lp[i]]; //查表法得到要顯示數(shù)字的數(shù)碼段
delay(); //延時(shí)5個(gè)空指令
if(i==7) //檢測(cè)顯示完8位否,完成直接退出,不讓P1口再加1,否則進(jìn)位影響到第四位數(shù)據(jù)
break;
P2=0; //清0端口,準(zhǔn)備顯示下位
P1++; //下一位數(shù)碼管
}
}
void delay(void) //空5個(gè)指令
{
_nop_();_nop_();_nop_();_nop_();_nop_();
}
unsigned char ad0831read(void)//請(qǐng)先了解ADC0831模數(shù)轉(zhuǎn)換器的串口協(xié)議,再來(lái)讀本函數(shù),主要是對(duì)應(yīng)時(shí)序圖來(lái)理解
{ //本函數(shù)是模擬0831的串口協(xié)議進(jìn)行的,當(dāng)你了解用軟件去模擬一個(gè)端口的協(xié)議
//以后,對(duì)于一個(gè)硬件這樣的端口就簡(jiǎn)單多了
unsigned char i=0,tmp=0;
SDA2=1;
CS2=0;
_nop_();
_nop_();
SCL2=0;
_nop_();
_nop_();
SCL2=1;
_nop_();
_nop_();
SCL2=0;
_nop_();
_nop_();
SCL2=1;
_nop_();
_nop_();
SCL2=0;
_nop_();
_nop_();
for(i=0;i<8;i++){
tmp<<=1;
if(SDA2)
tmp++;
SCL2=1;
_nop_();
_nop_();
SCL2=0;
_nop_();
_nop_();
}
CS2=1;
return tmp;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -