久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2373|回復: 0
打印 上一主題 下一主題
收起左側

AT89C51單片機PCF8591AD轉A換應用設計 Proteus仿真程序視頻

[復制鏈接]
跳轉到指定樓層
樓主
一、設計目的
1、學習并掌握IIC總線的工作原理
2、學習并掌握AD轉換器工作原理;
3、學習并掌握AD轉換程序設計方法;
4、學習并掌握串行通信程序設計;
二、實驗設備
1、計算機;
2、單片機開發板;
3、Keil C51編程軟件;
4、Proteus仿真軟件;
三、設計內容
1、功能
(1)檢測通道0電位器的模擬電壓并顯示(X.XX伏),
(2)將電壓值通過串口發送到上位機串口調試助手顯示,
(3)上位機串口調試助手顯示(文本形式顯示):“V:X.XX”回車(X.XX是電壓值,逐行顯示)
(4)上位機可以通過發送不同命令控制采集并顯示哪個通道:通道0、通道1、通道2的模擬電壓;
2、硬件電路原理圖
3、設計程序(5號、宋體、單倍行距、分兩欄,要求程序設計規范化,添加必要的說明和注釋)

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
main.c中
/***************************************************************
* 實 驗 名 :PCF8591AD轉換串口實驗
* 實驗說明 :采用AD轉換器采集模擬電壓、轉換為數字量、顯示數字量。
* 連接方式 :
(1)P0口連接數碼管的段控制:
CN3接CN16,A接P00,B接P01,C接P02,D接P03,E接P04,F接P05,G接P06,DP接P07
(2)P2.4-P2.7連接數碼管的位控制:
CN1接CN17,PUT1接P24,PUT2接P25,PUT3接P26,PUT4接P27
(3)P1口連接矩陣按鍵:
CN16接CN14,KEY1到KEY8分別對應P10到P17
(3)PCF8591的SDA、SCL連接P2.1、P2.0:
PCF8591的IIC數據腳SDA連接P2.1;
PCF8591的IIC時鐘腳SCL連接P2.0;
PCF8591的VCC連接開發板VCC;
PCF8591的GND連接開發板GND。
****************************************************************/
//包含文件
#include <reg51.h>
#include <intrins.h>            
#include <IIC.h>
//宏定義
#define BAUD 9600        //波特率設置,bps
#define FOSC 11059200L //晶振設置,默認使用11.0592M Hz
//#define FOSC 12000000L //晶振設置,使用12M Hz
//#define FOSC 24000000L //晶振設置,使用24M Hz

#define AddWr 0x90   //寫數據地址
#define AddRd 0x91   //讀數據地址

//IO接口定義
#define KEY_PORT P1
#define LED_PORT P0
sbit wela_1 = P2^4;
sbit wela_2 = P2^5;
sbit wela_3 = P2^6;
sbit wela_4 = P2^7;

//全局變量定義
extern bit ack;     //應答標志位
unsigned char key_value;
unsigned char qian,bai,shi,ge;
unsigned char CHX;     //作為通道選擇
unsigned long readadc; //AD轉換結果
unsigned char state;
//LED顯示字模 0-F 共陽模式
unsigned code table[]={0Xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
/*******************************************************************************
* 函 數 名 :Delayms
* 函數功能 :實現 ms級的延時
* 輸   入 :ms
* 輸   出 :無
*******************************************************************************/
void Delayms(unsigned int ms)
{
    unsigned int i,j;
    for(i=0;i<ms;i++)
    #if FOSC == 11059200L
        for(j=0;j<114;j++);
    #elif FOSC == 12000000L
     for(j=0;j<123;j++);
    #elif FOSC == 24000000L
        for(j=0;j<249;j++);
    #else
        for(j=0;j<114;j++);
    #endif
}
/*******************************************************************************
* 函 數 名 :delay
* 函數功能 :延時子函數,短暫延時
* 輸   入 :timer
* 輸   出 :無
*******************************************************************************/
void delay(unsigned int timer)
{      
    while(timer--);
}
/*******************************************************************************
* 函 數 名 :ReadADC
* 函數功能 :讀AD轉值程序 輸入參數 Chl 表示需要轉換的通道,范圍從0-3 返回值范圍0-255
* 輸   入 :Chl
* 輸   出 :Val
*******************************************************************************/
unsigned char ReadADC(unsigned char Chl)
{
    unsignedchar Val;
    IIC_start();               //啟動總線
    IIC_write(AddWr);          //發送器件地址,準備寫
    if(ack==0) return(0);            
    IIC_write(0x40|Chl);       //發送器件子地址,Chl表示需要轉換的通道
    if(ack==0) return(0);      
    IIC_start();      
    IIC_write(AddRd);         //發送器件地址,準備讀
    if(ack==0) return(0);
    Val=IIC_read();             //讀取AD轉換結果
    IIC_ACK(1);                 //發送非應答位  
    IIC_stop();                 //結束總線   
    return(Val);               //返回AD轉換結果
}
/*******************************************************************************
* 函 數 名 :WriteDAC
* 函數功能 :往DAC通道寫數據,進行DA轉換
* 輸   入 :dat
* 輸   出 :
*******************************************************************************/
bit WriteDAC(unsigned char dat)
{
    IIC_start();           //啟動總線
    IIC_write(AddWr);      //發送器件地址,準備寫
    if(ack==0)
        return(0);
    IIC_write(0x40);       //發送器件子地址
    if(ack==0)
        return(0);
    IIC_write(dat);        //發送數據,進行DA轉換
    if(ack==0)
        return(0);
    IIC_stop();  
}
/*******************************************************************************
* 函 數 名 :LEDdisplay
* 函數功能 :循環顯示各個位上的數據
* 輸   入 :num要顯示的數據
* 輸   出 :無
*******************************************************************************/
void LEDdisplay()
{
    wela_1 = 1;   //關閉所有數碼管
    wela_2 = 1;
    wela_3 = 1;
    wela_4 = 1;

    wela_4=0;  //顯示千位
    LED_PORT=table[qian];
    Delayms(1);
    LED_PORT = 0xff;
    wela_4=1;
   
    wela_3=0;  //顯示百位
    LED_PORT=table[bai] & 0x7f;
    Delayms(1);
    LED_PORT = 0xff;
    wela_3=1;
   
    wela_2=0;  //顯示十位
    LED_PORT=table[shi];
    Delayms(1);
    LED_PORT = 0xff;
    wela_2=1;
   
    wela_1=0;  //顯示個位
    LED_PORT=table[ge];
    Delayms(1);
    LED_PORT = 0xff;
}
/*******************************************************************************
* 函 數 名 :KeyScan
* 函數功能 :4*4鍵盤掃描
* 輸   入 :無
* 輸   出 :num 獲取的鍵值,若沒有鍵值則返回0xff
*******************************************************************************/
unsigned char KeyScan()
{
    unsigned char temp,num;
    num = 0xff;
    KEY_PORT=0xfe;
    temp=KEY_PORT;
    temp=temp&0xf0;
    while(temp!=0xf0)
    {
        Delayms(5); //延時消抖
        temp=KEY_PORT;
        temp=temp&0xf0;
        while(temp!=0xf0)
        {
            temp=KEY_PORT;
            switch(temp)
            {
                case 0xee:num=1;
                   break;
                case 0xde:num=2;
                   break;
                case 0xbe:num=3;
                   break;
                case 0x7e:num=4;
                   break;
            }
            while(temp!=0xf0)
            {
                temp=KEY_PORT;
                temp=temp&0xf0;
            }
        }
    }

    KEY_PORT=0xfd;
    temp=KEY_PORT;
    temp=temp&0xf0;
    while(temp!=0xf0)
    {
        Delayms(5); //延時消抖
        temp=KEY_PORT;
        temp=temp&0xf0;
        while(temp!=0xf0)
        {
            temp=KEY_PORT;
            switch(temp)
            {
                case 0xed:num=5;
                   break;
                case 0xdd:num=6;
                   break;
                case 0xbd:num=7;
                   break;
                case 0x7d:num=8;
                   break;
            }
            while(temp!=0xf0)
            {
                temp=KEY_PORT;
                temp=temp&0xf0;
            }
        }
    }

    KEY_PORT=0xfb;
    temp=KEY_PORT;
    temp=temp&0xf0;
    while(temp!=0xf0)
    {
        Delayms(5); //延時消抖
        temp=KEY_PORT;
        temp=temp&0xf0;
        while(temp!=0xf0)
        {
            temp=KEY_PORT;
            switch(temp)
            {
                case 0xeb:num=9;
                   break;
                case 0xdb:num=10;
                   break;
                case 0xbb:num=11;
                   break;
                case 0x7b:num=12;
                   break;
            }
            while(temp!=0xf0)
            {
                temp=KEY_PORT;
                temp=temp&0xf0;
            }
        }
    }

    KEY_PORT=0xf7;
    temp=KEY_PORT;
    temp=temp&0xf0;
    while(temp!=0xf0)
    {
        Delayms(5); //延時消抖
        temp=KEY_PORT;
        temp=temp&0xf0;
        while(temp!=0xf0)
        {
            temp=KEY_PORT;
            switch(temp)
            {
                case 0xe7:num=13;
                   break;
                case 0xd7:num=14;
                   break;
                case 0xb7:num=15;
                   break;
                case 0x77:num=16;
                   break;
            }
            while(temp!=0xf0)
            {
                temp=KEY_PORT;
                temp=temp&0xf0;
            }
        }
    }
    return num;
}

/*******************************************************************************
* 函 數 名 :UsartConfiguration
* 函數功能 :串口設置
* 輸   入 :無
* 輸   出 :無
*******************************************************************************/
void UsartConfiguration()
{
    SCON = 0X50;    //設置為工作方式1:10位異步收發器
    TMOD |= 0x20;   //設置計數器工作方式2:8位自動重裝計數器   
    PCON = 0X80;    //波特率加倍:SMOD =1
    TH1 = 256-(FOSC/12/32/(BAUD/2)); //計算定時器1初值
    TL1 = 256-(FOSC/12/32/(BAUD/2));
    TR1 = 1;//啟動定時器T1
    ES=1;   //開串口中斷
    EA = 1; //開總中斷
}

/*******************************************************************************
* 函 數 名 :UsartSend
* 函數功能 :串口發送電壓
* 輸   入 :無
* 輸   出 :無
*******************************************************************************/
void UsartSend()
{
    //發送 V
        TI = 0;          //清除發送中斷標志位TI
        SBUF='V';       //收到的數據放入到發送SBUF,啟動串口發送
        while(!TI);       //等待發送數據完成   
    //發送 :
        TI = 0;          //清除發送中斷標志位TI
        SBUF=':';       //收到的數據放入到發送SBUF,啟動串口發送
        while(!TI);       //等待發送數據完成
    //發送電壓整數
        TI = 0;          //清除發送中斷標志位TI
        SBUF=readadc%1000/100+'0';//收到的數據放入到發送SBUF,啟動串口發送
        while(!TI);       //等待發送數據完成
        //發送小數點
        TI = 0;          //清除發送中斷標志位TI
        SBUF='.';//收到的數據放入到發送SBUF,啟動串口發送
        while(!TI);     
    //發送電壓十分位
        TI = 0;          //清除發送中斷標志位TI
        SBUF=readadc%100/10+'0';//收到的數據放入到發送SBUF,啟動串口發送
        while(!TI);       //等待發送數據完成
  //等待發送數據完成
   
    //發送電壓百分位
        TI = 0;          //清除發送中斷標志位TI
        SBUF=readadc%10+'0';//收到的數據放入到發送SBUF,啟動串口發送
        while(!TI);       //等待發送數據完成
        
    //發送換行符
        TI = 0;          //清除發送中斷標志位TI
        SBUF='\n'; //收到的數據放入到發送SBUF,啟動串口發送
        while(!TI);       //等待發送數據完成
        TI=0;   
            
}
/*******************************************************************************
* 函 數 名 :main
* 函數功能 :主函數
* 輸   入 :無
* 輸   出 :無
*******************************************************************************/
void main()
{   
    int count = 0;
    state =1;
    UsartConfiguration();
    while(1)
    {
        key_value=KeyScan();
        if(key_value!=0xff)
            state=key_value;
        if(state==1)       //按鍵1按下,選擇通道0,即電位器調節實驗      
            CHX=0;         
        else if(state==2)   //按鍵2按下,選擇通道1,即光敏電阻實驗
            CHX=1;
        else if(state==3)   //按鍵3按下,選擇通道2,即熱敏電阻實驗
            CHX=2;
        else if(state==4)   //按鍵4按下,選擇通道3,接地
            CHX=3;
        if(count >= 200)    //采樣周期1s
        {
            //readadc=ReadADC(CHX)/256*5*100;
            readadc=ReadADC(CHX)*5.0*100/255;   //調用ReadADC函數讀取AD轉換結果      
            UsartSend();//發送電壓到串口
            count = 0;
        }      
        qian=readadc/1000;         //顯示AD轉換結果
        bai=readadc%1000/100;
        shi=readadc%100/10;
        ge=readadc%10;            
        LEDdisplay();      
        count++;
    }
}


/*******************************************************************************
* 函 數 名 :UsartInt
* 函數功能 :串口中斷服務函數
* 輸   入 :無
* 輸   出 :無
*******************************************************************************/
void UsartInt() interrupt 4
{
    char receiveData;   //存放接收的函數
    if(RI == 1)             //RI=1說明是接收到數據產生的中斷
    {
        receiveData=SBUF; //從接收SBUF中取得接收到的數據
    //判斷接受值,改變讀取通道     
        switch (receiveData)
        {
        case '0' :state = 1;break;
        case '1' :state = 2;break;
        case '2' :state = 3;break;
        default :break;
        }           
        RI = 0;           //清除接收中斷標志位RI
    }   
}/***************************************************************
* 實 驗 名 :PCF8591AD轉換串口實驗
* 實驗說明 :采用AD轉換器采集模擬電壓、轉換為數字量、顯示數字量。
* 連接方式 :
(1)P0口連接數碼管的段控制:
CN3接CN16,A接P00,B接P01,C接P02,D接P03,E接P04,F接P05,G接P06,DP接P07
(2)P2.4-P2.7連接數碼管的位控制:
CN1接CN17,PUT1接P24,PUT2接P25,PUT3接P26,PUT4接P27
(3)P1口連接矩陣按鍵:
CN16接CN14,KEY1到KEY8分別對應P10到P17
(3)PCF8591的SDA、SCL連接P2.1、P2.0:
PCF8591的IIC數據腳SDA連接P2.1;
PCF8591的IIC時鐘腳SCL連接P2.0;
PCF8591的VCC連接開發板VCC;
PCF8591的GND連接開發板GND。
****************************************************************/
//包含文件
#include <reg51.h>
#include <intrins.h>            
#include <IIC.h>
//宏定義
#define BAUD 9600        //波特率設置,bps
#define FOSC 11059200L //晶振設置,默認使用11.0592M Hz
//#define FOSC 12000000L //晶振設置,使用12M Hz
//#define FOSC 24000000L //晶振設置,使用24M Hz

#define AddWr 0x90   //寫數據地址
#define AddRd 0x91   //讀數據地址

//IO接口定義
#define KEY_PORT P1
#define LED_PORT P0
sbit wela_1 = P2^4;
sbit wela_2 = P2^5;
sbit wela_3 = P2^6;
sbit wela_4 = P2^7;

//全局變量定義
extern bit ack;     //應答標志位
unsigned char key_value;
unsigned char qian,bai,shi,ge;
unsigned char CHX;     //作為通道選擇
unsigned long readadc; //AD轉換結果
unsigned char state;
//LED顯示字模 0-F 共陽模式
unsigned code table[]={0Xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
/*******************************************************************************
* 函 數 名 :Delayms
* 函數功能 :實現 ms級的延時
* 輸   入 :ms
* 輸   出 :無
*******************************************************************************/
void Delayms(unsigned int ms)
{
    unsigned int i,j;
    for(i=0;i<ms;i++)
    #if FOSC == 11059200L
        for(j=0;j<114;j++);
    #elif FOSC == 12000000L
     for(j=0;j<123;j++);
    #elif FOSC == 24000000L
        for(j=0;j<249;j++);
    #else
        for(j=0;j<114;j++);
    #endif
}
/*******************************************************************************
* 函 數 名 :delay
* 函數功能 :延時子函數,短暫延時
* 輸   入 :timer
* 輸   出 :無
*******************************************************************************/
void delay(unsigned int timer)
{      
    while(timer--);
}
/*******************************************************************************
* 函 數 名 :ReadADC
* 函數功能 :讀AD轉值程序 輸入參數 Chl 表示需要轉換的通道,范圍從0-3 返回值范圍0-255
* 輸   入 :Chl
* 輸   出 :Val
*******************************************************************************/
unsigned char ReadADC(unsigned char Chl)
{
    unsignedchar Val;
    IIC_start();               //啟動總線
    IIC_write(AddWr);          //發送器件地址,準備寫
    if(ack==0) return(0);            
    IIC_write(0x40|Chl);       //發送器件子地址,Chl表示需要轉換的通道
    if(ack==0) return(0);      
    IIC_start();      
    IIC_write(AddRd);         //發送器件地址,準備讀
    if(ack==0) return(0);
    Val=IIC_read();             //讀取AD轉換結果
    IIC_ACK(1);                 //發送非應答位  
    IIC_stop();                 //結束總線   
    return(Val);               //返回AD轉換結果
}
/*******************************************************************************
* 函 數 名 :WriteDAC
* 函數功能 :往DAC通道寫數據,進行DA轉換
* 輸   入 :dat
* 輸   出 :
*******************************************************************************/
bit WriteDAC(unsigned char dat)
{
    IIC_start();           //啟動總線
    IIC_write(AddWr);      //發送器件地址,準備寫
    if(ack==0)
        return(0);
    IIC_write(0x40);       //發送器件子地址
    if(ack==0)
        return(0);
    IIC_write(dat);        //發送數據,進行DA轉換
    if(ack==0)
        return(0);
    IIC_stop();  
}
/*************************************
* 函 數 名 :LEDdisplay
* 函數功能 :循環顯示各個位上的數據
* 輸   入 :num要顯示的數據
* 輸   出 :無
*************************************/
void LEDdisplay()
{
    wela_1 = 1;   //關閉所有數碼管
    wela_2 = 1;
    wela_3 = 1;
    wela_4 = 1;

    wela_4=0;  //顯示千位
    LED_PORT=table[qian];
    Delayms(1);
    LED_PORT = 0xff;
    wela_4=1;
   
    wela_3=0;  //顯示百位
    LED_PORT=table[bai] & 0x7f;
    Delayms(1);
    LED_PORT = 0xff;
    wela_3=1;
   
    wela_2=0;  //顯示十位
    LED_PORT=table[shi];
    Delayms(1);
    LED_PORT = 0xff;
    wela_2=1;
   
    wela_1=0;  //顯示個位
    LED_PORT=table[ge];
    Delayms(1);
    LED_PORT = 0xff;
}
/*************************************
* 函 數 名 :KeyScan
* 函數功能 :4*4鍵盤掃描
* 輸   入 :無
* 輸   出 :num 獲取的鍵值,若沒有鍵值則返回0xff
*************************************/
unsigned char KeyScan()
{
    unsigned char temp,num;
    num = 0xff;
    KEY_PORT=0xfe;
    temp=KEY_PORT;
    temp=temp&0xf0;
    while(temp!=0xf0)
    {
        Delayms(5); //延時消抖
        temp=KEY_PORT;
        temp=temp&0xf0;
        while(temp!=0xf0)
        {
            temp=KEY_PORT;
            switch(temp)
            {
                case 0xee:num=1;
                   break;
                case 0xde:num=2;
                   break;
                case 0xbe:num=3;
                   break;
                case 0x7e:num=4;
                   break;
            }
            while(temp!=0xf0)
            {
                temp=KEY_PORT;
                temp=temp&0xf0;
            }
        }
    }

    KEY_PORT=0xfd;
    temp=KEY_PORT;
    temp=temp&0xf0;
    while(temp!=0xf0)
    {
        Delayms(5); //延時消抖
        temp=KEY_PORT;
        temp=temp&0xf0;
        while(temp!=0xf0)
        {
            temp=KEY_PORT;
            switch(temp)
            {
                case 0xed:num=5;
                   break;
                case 0xdd:num=6;
                   break;
                case 0xbd:num=7;
                   break;
                case 0x7d:num=8;
                   break;
            }
            while(temp!=0xf0)
            {
                temp=KEY_PORT;
                temp=temp&0xf0;
            }
        }
    }

    KEY_PORT=0xfb;
    temp=KEY_PORT;
    temp=temp&0xf0;
    while(temp!=0xf0)
    {
        Delayms(5); //延時消抖
        temp=KEY_PORT;
        temp=temp&0xf0;
        while(temp!=0xf0)
        {
            temp=KEY_PORT;
            switch(temp)
            {
                case 0xeb:num=9;
                   break;
                case 0xdb:num=10;
                   break;
                case 0xbb:num=11;
                   break;
                case 0x7b:num=12;
                   break;
            }
            while(temp!=0xf0)
            {
                temp=KEY_PORT;
                temp=temp&0xf0;
            }
        }
    }

    KEY_PORT=0xf7;
    temp=KEY_PORT;
    temp=temp&0xf0;
    while(temp!=0xf0)
    {
        Delayms(5); //延時消抖
        temp=KEY_PORT;
        temp=temp&0xf0;
        while(temp!=0xf0)
        {
            temp=KEY_PORT;
            switch(temp)
            {
                case 0xe7:num=13;
                   break;
                case 0xd7:num=14;
                   break;
                case 0xb7:num=15;
                   break;
                case 0x77:num=16;
                   break;
            }
            while(temp!=0xf0)
            {
                temp=KEY_PORT;
                temp=temp&0xf0;
            }
        }
    }
    return num;
}

/*************************************
* 函 數 名 :UsartConfiguration
* 函數功能 :串口設置
* 輸   入 :無
* 輸   出 :無
*************************************/
void UsartConfiguration()
{
    SCON = 0X50;    //設置為工作方式1:10位異步收發器
    TMOD |= 0x20;   //設置計數器工作方式2:8位自動重裝計數器   
    PCON = 0X80;    //波特率加倍:SMOD =1
    TH1 = 256-(FOSC/12/32/(BAUD/2)); //計算定時器1初值
    TL1 = 256-(FOSC/12/32/(BAUD/2));
    TR1 = 1;//啟動定時器T1
    ES=1;   //開串口中斷
    EA = 1; //開總中斷
}

/*************************************
* 函 數 名 :UsartSend
* 函數功能 :串口發送電壓
* 輸    入 :無
* 輸   出 :無
*************************************/
void UsartSend()
{
    //發送 V
        TI = 0;          //清除發送中斷標志位TI
        SBUF='V';       //收到的數據放入到發送SBUF,啟動串口發送
        while(!TI);       //等待發送數據完成   
    //發送 :
        TI = 0;          //清除發送中斷標志位TI
        SBUF=':';       //收到的數據放入到發送SBUF,啟動串口發送
        while(!TI);       //等待發送數據完成
    //發送電壓整數
        TI = 0;          //清除發送中斷標志位TI
        SBUF=readadc%1000/100+'0';//收到的數據放入到發送SBUF,啟動串口發送
        while(!TI);       //等待發送數據完成
        //發送小數點
        TI = 0;          //清除發送中斷標志位TI
        SBUF='.';//收到的數據放入到發送SBUF,啟動串口發送
        while(!TI);     
    //發送電壓十分位
        TI = 0;           //清除發送中斷標志位TI
        SBUF=readadc%100/10+'0';//收到的數據放入到發送SBUF,啟動串口發送
        while(!TI);       //等待發送數據完成
  //等待發送數據完成
   
    //發送電壓百分位
        TI = 0;          //清除發送中斷標志位TI
        SBUF=readadc%10+'0';//收到的數據放入到發送SBUF,啟動串口發送
        while(!TI);       //等待發送數據完成
        
    //發送換行符
        TI = 0;          //清除發送中斷標志位TI
        SBUF='\n'; //收到的數據放入到發送SBUF,啟動串口發送
        while(!TI);       //等待發送數據完成
        TI=0;   
            
}
/*************************************
* 函 數 名 :main
* 函數功能 :主函數
* 輸   入 :無
* 輸   出 :無
*************************************/
void main()
{   
    int count = 0;
    state =1;
    UsartConfiguration();
    while(1)
    {
        key_value=KeyScan();
        if(key_value!=0xff)
            state=key_value;
        if(state==1)       //按鍵1按下,選擇通道0,即電位器調節實驗      
            CHX=0;         
        else if(state==2)   //按鍵2按下,選擇通道1,即光敏電阻實驗
            CHX=1;
        else if(state==3)   //按鍵3按下,選擇通道2,即熱敏電阻實驗
            CHX=2;
        else if(state==4)   //按鍵4按下,選擇通道3,接地
            CHX=3;
        if(count >= 200)    //采樣周期1s
        {
            //readadc=ReadADC(CHX)/256*5*100;
            readadc=ReadADC(CHX)*5.0*100/255;   //調用ReadADC函數讀取AD轉換結果      
            UsartSend();//發送電壓到串口
            count = 0;
        }      
        qian=readadc/1000;         //顯示AD轉換結果
        bai=readadc%1000/100;
        shi=readadc%100/10;
        ge=readadc%10;            
        LEDdisplay();      
        count++;
    }
}


/*************************************
* 函 數 名 :UsartInt
* 函數功能 :串口中斷服務函數
* 輸   入 :無
* 輸   出 :無
*************************************/
void UsartInt() interrupt 4
{
    char receiveData;   //存放接收的函數
    if(RI == 1)             //RI=1說明是接收到數據產生的中斷
    {
        receiveData=SBUF; //從接收SBUF中取得接收到的數據
    //判斷接受值,改變讀取通道     
        switch (receiveData)
        {
        case '0' :state = 1;break;
        case '1' :state = 2;break;
        case '2' :state = 3;break;
        default :break;
        }           
        RI = 0;           //清除接收中斷標志位RI
    }   
}



四、本任務中的幾個功能如何實現?(說明設計思路)
設計思路:
1.       首先借助例程,實驗采集電壓,但例程所給為八個二進制位,不代表電壓值,需要經過公式轉化,小數位的顯示,可以采用電壓值擴大100倍,給第二位數碼管后加小數點,實現了顯示2個電壓。
2.       串口發送電壓值,移植上次課例程,實現相應ASCII的轉化。
3.       用上位機發送數據來實現控制檢測通道,采用中斷法接受串口數據,用switch來判斷接收值,并改變state狀態,實現通道的切換。


全部資料51hei下載地址:
PCF8591AD轉換應用設計.rar (10.27 MB, 下載次數: 27)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久二区 | 一区二区三区国产精品 | 成人精品一区二区三区中文字幕 | 久久99视频精品 | 一级全黄少妇性色生活免费看 | 成人av免费播放 | 国产一区二区在线播放 | 久热国产精品视频 | 69热视频在线观看 | 亚洲成人久久久 | 国产人成精品一区二区三 | 久久久精品影院 | 婷婷久久网| 日韩一级 | 欧美久久久久久久 | 99热精品在线 | 国产成人精品久久 | 国产男女猛烈无遮掩视频免费网站 | 国产一区二区三区久久久久久久久 | 夜久久 | 亚洲精品9999 | 欧美aaaaaaaa| 国产精品免费看 | 国产亚洲日本精品 | 亚洲精品一区在线观看 | 成人日韩| 美女视频h| 国产男人的天堂 | 亚洲午夜精品 | 国产精品一区二区视频 | 人人干视频在线 | 日本不卡免费新一二三区 | 人人干人人干人人 | 国产精品久久久久久久久久 | 亚洲成人一区 | 日本黄色大片免费 | 久久精品色欧美aⅴ一区二区 | 日日夜精品视频 | www.99精品 | 91免费看片 | 精品视频久久久 |