找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3180|回復(fù): 0
收起左側(cè)

單片機(jī)學(xué)習(xí)筆記(十)模數(shù)轉(zhuǎn)換

[復(fù)制鏈接]
ID:108531 發(fā)表于 2016-3-12 16:45 | 顯示全部樓層 |閱讀模式
單片機(jī)模數(shù)轉(zhuǎn)換實(shí)驗(yàn),運(yùn)行程序后,調(diào)節(jié)電位器,數(shù)據(jù)變化。
C語(yǔ)言源程序:
#include <reg52.h> //52單片機(jī)頭文件包含
#include <intrins.h> //_nop()_函數(shù)頭文件包含
#define uchar unsigned char //宏定義uchar 為 unsigned char
sbit SCL2=P1^3;//SCL2定義為P1口的第3位腳,連接ADC0831SCL腳
sbit SDA2=P1^4;//SDA2定義為P1口的第4位腳,連接ADC0831SDA腳
sbit CS2=P2^6;//CS2定義為P1口的第4位腳,連接ADC0831CS腳
sbit RST=P2^5;// DS1302片選,因這兩芯片采用同一數(shù)據(jù)腳(SDA,SCL),所以我們要定義它,將DS1302片選關(guān)掉,否則發(fā)生沖突
sbit wei1=P2^0;//數(shù)碼管第一位
sbit wei2=P2^1;//數(shù)碼管第二位
sbit wei3=P2^2;//數(shù)碼管第三位
sbit wei4=P2^3;//數(shù)碼管第四位
uchar code table[]={0xC0,0xF9,0xA4,0xB0,
                        0x99,0x92,0x82,0xF8,
                        0x80,0x90,0x88,0x83,
                        0xC6,0xA1,0x86,0x8E};//共陽(yáng)數(shù)碼管碼表
uchar l_tmpdate[]={0,0,0};//定義無(wú)符號(hào)字符數(shù)組并賦初值0
void Delay_xuS(unsinged int x);//延時(shí)函數(shù)聲明
void led_display(unsigned char *temp) //數(shù)碼管顯示函數(shù)聲明
uchar ad0831read(void);//讀取ADC0831數(shù)據(jù)函數(shù)聲明
void main(void)//入口函數(shù)
{
    uchar i=254,tmp; //定義無(wú)符號(hào)字符變量i并賦值254和tmp
    RST=0;//關(guān)閉DS1302片選
    while(1){ //主循環(huán)
        i++;//i自加
        if(i==255){
            tmp=ad0831read();//這里為循環(huán)255個(gè)周期讀取一次0831,因CPU運(yùn)行比較快,沒(méi)必要每次循環(huán)都去讀取        i=0;i賦值為0
            l_tempdate[0]=tmp/100;//取百位上的數(shù)
            tmp=tmp % 100;//除100取余 取十位和個(gè)位上的數(shù)
            l_tmpdate[1]=tmp/10;//取十位上的數(shù);
            l_tmpdate[2]=tmp%10;//取個(gè)位上的數(shù)
            //因讀到的數(shù)據(jù)為8位的二進(jìn)制數(shù),即0~255,我們將其分開放入l_tmpdate數(shù)組中
        }
        led_display(l_tmpdate);//輸出顯示
    }
}
void Delay_xuS(unsigned int x) //延時(shí)函數(shù)
{
    unsigned int j,j; //定義無(wú)符號(hào)整型變量i,j   
    for(i=0;i<x;i++)//for循環(huán)循環(huán)x次
    {
        for(j=0;j<50;j++);//for循環(huán)循環(huán)50次
    }
}
void led_display(unsinged char *temp) //數(shù)碼管顯示子程序
{
    wei1=0;//打開數(shù)碼管第1位顯示
    P0=table[temp[0]];//數(shù)組第一位數(shù)據(jù)送P0
    Delay_xuS(5);//延時(shí)500uS
    wei1=1;//關(guān)閉數(shù)碼管第1位顯示
    wei2=0;//打開數(shù)碼管第2位顯示
    P0=table[temp[1]];//數(shù)組第二位數(shù)據(jù)送P0
    Delay_xuS(5);//延時(shí)500uS
    wei2=1;//打開數(shù)碼管第2位顯示
    wei3=0;//打開數(shù)碼管第3位顯示
    P0=table[temp[2]];//數(shù)組第三位數(shù)據(jù)送P0
    Delay_xuS(5));//延時(shí)500uS
    wei3=1;//關(guān)閉數(shù)碼管第3位顯示
}
uchar ad0831read(void) //讀取ADC0831數(shù)據(jù)函數(shù)
{
    uchar i=0,tmp=0;//定義無(wú)符號(hào)字符變量i和tmp
    SDA=1;CS2=0;
    _nop_();_nop_();//延時(shí)
    CSL2=0;
    _nop_();_nop_();//延時(shí)
    CSL2=1;
    _nop_();_nop_();//延時(shí)
    SCL2=0;
    _nop_();_nop_();//延時(shí)
    SCL2=1;
    _nop_();_nop_();//延時(shí)
    SCL2=0;
    _nop_();_nop_();//延時(shí)
    for(i=0;i<8;i++){ //for循環(huán)循環(huán)8次
        tmp<<=1;//tmp左移1位賦值給tmp
        if(SDA2) //如果SDA2為真
            tmp++;//tmp值加1
        SCL2=1;
        _nop_();_nop_();//延時(shí)
        SCL2=0;
        _nop_();_nop_();//延時(shí)
    }
    CS2=1;
return tmp;//返回結(jié)果
}
//實(shí)驗(yàn)現(xiàn)象 調(diào)節(jié)電位器改變電壓數(shù)碼管值隨之變化。

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表