• 歡迎光臨東莞市飛江電子科技有限公司官網!
    全國咨詢熱線

    13926563901

    18925580829

    飛江淘寶店鋪

    首頁>技術資料>其它單片機

    STC12C5A60S2(ADC查詢法 10位模式)+1602顯示

    發布時間:2018-03-26   瀏覽量:

    道0接單片機電源,通道1接地線。





     

    源程序:一共3個文件:

    LCD1602display.h
    #ifndef _LCD1602DISPLAY_H_
    #define _LCD1602DISPLAY_H_
    #define uchar unsigned char
    #define uint unsigned int
    //************************LCD引腳定義
    sbit LCM_RS=P3^5;
    sbit LCM_RW=P3^6;
    sbit LCM_E=P3^7;
    //**************************延時
    void delay();
    //**************************初始化
    void InitLCM();
    //****************************讀狀態
    uchar ReadStatusLCM();
    //******************************讀數據
    uchar ResdDataLCM();
    //***************************寫指令
    void WriteCommandLCM(uchar WCLCM, Busy);
    //***************************寫數據
    void WriteDataLCM(uchar WDLCM);
    //******************************顯示1個字符
    void DisplayOneChar(uchar X,uchar Y,uchar DData);
    //******************************顯示字符串
    void DisplayListChar(uchar X,uchar Y,uchar code  *DData);
    #endif
     
    STC12(ADC flag).h 
    #ifndef _STC12_ADC_FLAG_H_
    #define _STC12_ADC_FLAG_H_
    #define uchar unsigned char
    #define uint unsigned int
    #define FOSC    11059200L
    #define BAUD    9600
    /********************************************************************
                                 初始化設置
    *********************************************************************/
    sfr ADC_CONTR   =   0xBC;           //ADC 控制寄存器
    sfr ADC_RES     =   0xBD;           //ADC 轉換結果寄存器
    sfr ADC_RESL    =   0xBE;           //ADC 低2位結果寄存器
    sfr P1ASF       =   0x9D;           //P1口模擬功能控制寄存器
    /********************************************************************
                                  ADC 數據轉換函數
    *********************************************************************/
    #define ADC_POWER   0x80            //ADC 電源控制位
    #define ADC_FLAG    0x10            //ADC 轉換結束標志位
    #define ADC_START   0x08            //ADC 開始轉換控制位
    #define ADC_SPEEDLL 0x00            //540 個時鐘周期轉換一次
    #define ADC_SPEEDL  0x20            //360 個時鐘周期轉換一次
    #define ADC_SPEEDH  0x40            //180 個時鐘周期轉換一次
    #define ADC_SPEEDHH 0x60            //90 個時鐘周期轉換一次
    //**********************************延時函數
    void Delay1(uint n);
    //******************************ADC初始化函數
    void Init_ADC();
    //***********************************ADC數據轉換函數
    uint Get_ADC_Result(uchar ch);
    //************************************ADC數據計算函數
    float Count(uchar ch);
    #endif 
     
    LCD1602display.c 
    #include
    #include
    #include "LCD1602display.h"
    //********************延時
    void delay(uchar z)
    {
     uchar i,j;
     for(i=z;i>0;i--)
      for(j=110;j>0;j--);
    }
    //**********************LCM初始化
    void InitLCM()
    {
     WriteCommandLCM(0x38,0);  //三次顯示模式設置,不檢測忙信號
     delay(1);
     WriteCommandLCM(0x38,0);
     delay(1);
     WriteCommandLCM(0x38,0);
     delay(1);
     WriteCommandLCM(0x38,1);  //顯示模式設置:16×2顯示,5×7點陣,8位數據接口
     WriteCommandLCM(0x0c,1);  //顯示模式設置:顯示開,無光標
     WriteCommandLCM(0x06,1);  //顯示模式設置:光標右移,字符不移
     WriteCommandLCM(0x01,1);  //清屏幕指令,將以前的顯示內容清除
    }
    //*********************讀狀態
    uchar ReadStatusLCM()
    {
     P0 = 0x80; 
     LCM_RS = 0;
     LCM_RW = 1;
     LCM_E = 1;
     while (P0 & 0x80); //檢測忙信號
     return(0);
    }
    //***********************讀數據
    /*uchar ResdDataLCM()
    {
     LCM_RS=1;
     LCM_RW=1;
     LCM_E=1;
    } */
    //**********************寫指令
    void WriteCommandLCM(uchar WCLCM, Busy)
    {
     if(Busy) ReadStatusLCM();
     P0=WCLCM;
     LCM_RS=0;
     LCM_RW=0;
     LCM_E=0;
     LCM_E=1;
    }
    //***********************寫數據
    void WriteDataLCM(uchar WDLCM)
    {
     ReadStatusLCM();
     P0=WDLCM;
     LCM_RS=1;
     LCM_RW=0;
     LCM_E=0;
     LCM_E=1;
    }
    //*************************顯示字符
    void DisplayOneChar(uchar X,uchar Y,uchar DData)
    {
     if(Y) X|=0X40;   //Y=1顯示第二行,Y=0顯示第一行
     X|=0X80;
     WriteCommandLCM(X,1); //X用來選擇哪一位,1是用來忙檢測
     WriteDataLCM(DData); //DData用來寫數據
    }
    //**************************顯示字符串
    void DisplayListChar(uchar X,uchar Y,uchar code *DData)
    {
     uchar ListLength;
     ListLength=0;
     while(DData[ListLength]!='\0')
     {
      if(X<=15)
      {
       DisplayOneChar( X,Y,DData[ListLength]);
       ListLength++;
       X++;
      }
     }
    }
     
    STC12(ADC flag).c 
    #include
    #include "intrins.h"
    #include "STC12(ADC flag).h"
    float temp;
                
    //**********************************延時函數(n=1: 1T 8.65ms,12T 59.9ms)
    void Delay1(uint n)
    {
        uint x;
        while (n--)
        {
            x = 5000;
            while (x--);
        }
    }
    //******************************ADC初始化函數
    void Init_ADC()
    {
        P1ASF = 0xff;                      //設置P1口為開漏模式,使用AD功能
        ADC_RES = 0;                       //AD數據寄存器高8位清空
     ADC_RESL= 0;        //AD數據寄存器低2位清空
        ADC_CONTR = ADC_POWER | ADC_SPEEDLL;  //打開AD電源,轉換周期540
        Delay1(2);                        //延時
    }
    //***********************************ADC數據轉換函數
    uint Get_ADC_Result(uchar ch)
    {
        ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch ;//開始轉換
        _nop_();                          //延時一個機器周期
        _nop_();        //延時一個機器周期
        _nop_();        //延時一個機器周期
        _nop_();        //延時一個機器周期
        while (!(ADC_CONTR & ADC_FLAG));  //等待轉換結束(ADC_FLAG=0時一直等待,直到變為1跳出)
        ADC_CONTR &= ~ADC_FLAG;           //關閉AD轉換
        return (ADC_RES*4+ADC_RESL);            //返回數據(10位AD值,ADC_RES高8位+ADC_RESL低2位)
    }
    //************************************ADC數據計算函數
    float Count(uchar ch)
    {
     temp=(float)Get_ADC_Result(ch)*4.60/1024; //4.85為參考電壓,1024個“門”,10位AD
     return temp;
    }
     
    main.c
    //***********************(ma)STC12C5A60S2(ADC查詢法 10位模式)+1602顯示*************************************************************
    //馬熔
    //2012-12-17
    //***************************************************************************************************
    #include
    #include "intrins.h"
    #include "STC12(ADC flag).h"
    #include "LCD1602display.h"
    #define uchar unsigned char
    #define uint unsigned int
    extern float temp;
    uchar code string1[]={"The voltage is :"};
    uchar ge,shifen;
    //*****************************顯示函數
    void show()
    {
     DisplayListChar(0,0,string1);
     DisplayOneChar(1,1,(int)Count(0)+0x30);     //個位
     DisplayOneChar(2,1,'.');
     DisplayOneChar(3,1,(int)(Count(0)*100)0/10+0x30); //十分位
     DisplayOneChar(4,1,(int)(Count(0)*100)0+0x30); //百分位
     DisplayOneChar(5,1,'V');
     DisplayOneChar(8,1,(int)Count(1)+0x30);     //個位
     DisplayOneChar(9,1,'.');
     DisplayOneChar(10,1,(int)(Count(1)*100)0/10+0x30); //十分位
     DisplayOneChar(11,1,(int)(Count(1)*100)0+0x30); //百分位
     DisplayOneChar(12,1,'V'); 
    }
    //*******************************主函數
    void main()
    {
     InitLCM();  //液晶初始化
        Init_ADC();  //AD轉換初始化
        while (1)
        { 
      show();
        }
    }
    黑人粗大无码AV人妻一区