<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

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

        作者:馬先生   來源:本站原創   點擊數:  更新時間:2014年10月21日   【字體:

        通道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 <reg52.h>
        #include <intrins.h>
        #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 <reg52.h>
        #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 <reg52.h>
        #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)%100/10+0x30); //十分位
         DisplayOneChar(4,1,(int)(Count(0)*100)%100%10+0x30); //百分位
         DisplayOneChar(5,1,'V');
         DisplayOneChar(8,1,(int)Count(1)+0x30);     //個位
         DisplayOneChar(9,1,'.');
         DisplayOneChar(10,1,(int)(Count(1)*100)%100/10+0x30); //十分位
         DisplayOneChar(11,1,(int)(Count(1)*100)%100%10+0x30); //百分位
         DisplayOneChar(12,1,'V'); 
        }
        //*******************************主函數
        void main()
        {
         InitLCM();  //液晶初始化
            Init_ADC();  //AD轉換初始化
            while (1)
            { 
          show();
            }
        }
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮