專(zhuān)注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

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

作者:馬先生   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年10月21日   【字體:

通道0接單片機(jī)電源,通道1接地線(xiàn)。





 

源程序:一共3個(gè)文件:

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;
//**************************延時(shí)
void delay();
//**************************初始化
void InitLCM();
//****************************讀狀態(tài)
uchar ReadStatusLCM();
//******************************讀數(shù)據(jù)
uchar ResdDataLCM();
//***************************寫(xiě)指令
void WriteCommandLCM(uchar WCLCM, Busy);
//***************************寫(xiě)數(shù)據(jù)
void WriteDataLCM(uchar WDLCM);
//******************************顯示1個(gè)字符
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
/********************************************************************
                             初始化設(shè)置
*********************************************************************/
sfr ADC_CONTR   =   0xBC;           //ADC 控制寄存器
sfr ADC_RES     =   0xBD;           //ADC 轉(zhuǎn)換結(jié)果寄存器
sfr ADC_RESL    =   0xBE;           //ADC 低2位結(jié)果寄存器
sfr P1ASF       =   0x9D;           //P1口模擬功能控制寄存器
/********************************************************************
                              ADC 數(shù)據(jù)轉(zhuǎn)換函數(shù)
*********************************************************************/
#define ADC_POWER   0x80            //ADC 電源控制位
#define ADC_FLAG    0x10            //ADC 轉(zhuǎn)換結(jié)束標(biāo)志位
#define ADC_START   0x08            //ADC 開(kāi)始轉(zhuǎn)換控制位
#define ADC_SPEEDLL 0x00            //540 個(gè)時(shí)鐘周期轉(zhuǎn)換一次
#define ADC_SPEEDL  0x20            //360 個(gè)時(shí)鐘周期轉(zhuǎn)換一次
#define ADC_SPEEDH  0x40            //180 個(gè)時(shí)鐘周期轉(zhuǎn)換一次
#define ADC_SPEEDHH 0x60            //90 個(gè)時(shí)鐘周期轉(zhuǎn)換一次
//**********************************延時(shí)函數(shù)
void Delay1(uint n);
//******************************ADC初始化函數(shù)
void Init_ADC();
//***********************************ADC數(shù)據(jù)轉(zhuǎn)換函數(shù)
uint Get_ADC_Result(uchar ch);
//************************************ADC數(shù)據(jù)計(jì)算函數(shù)
float Count(uchar ch);
#endif 
 
LCD1602display.c 
#include <reg52.h>
#include <intrins.h>
#include "LCD1602display.h"
//********************延時(shí)
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);  //三次顯示模式設(shè)置,不檢測(cè)忙信號(hào)
 delay(1);
 WriteCommandLCM(0x38,0);
 delay(1);
 WriteCommandLCM(0x38,0);
 delay(1);
 WriteCommandLCM(0x38,1);  //顯示模式設(shè)置:16×2顯示,5×7點(diǎn)陣,8位數(shù)據(jù)接口
 WriteCommandLCM(0x0c,1);  //顯示模式設(shè)置:顯示開(kāi),無(wú)光標(biāo)
 WriteCommandLCM(0x06,1);  //顯示模式設(shè)置:光標(biāo)右移,字符不移
 WriteCommandLCM(0x01,1);  //清屏幕指令,將以前的顯示內(nèi)容清除
}
//*********************讀狀態(tài)
uchar ReadStatusLCM()
{
 P0 = 0x80; 
 LCM_RS = 0;
 LCM_RW = 1;
 LCM_E = 1;
 while (P0 & 0x80); //檢測(cè)忙信號(hào)
 return(0);
}
//***********************讀數(shù)據(jù)
/*uchar ResdDataLCM()
{
 LCM_RS=1;
 LCM_RW=1;
 LCM_E=1;
} */
//**********************寫(xiě)指令
void WriteCommandLCM(uchar WCLCM, Busy)
{
 if(Busy) ReadStatusLCM();
 P0=WCLCM;
 LCM_RS=0;
 LCM_RW=0;
 LCM_E=0;
 LCM_E=1;
}
//***********************寫(xiě)數(shù)據(jù)
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用來(lái)選擇哪一位,1是用來(lái)忙檢測(cè)
 WriteDataLCM(DData); //DData用來(lái)寫(xiě)數(shù)據(jù)
}
//**************************顯示字符串
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;
            
//**********************************延時(shí)函數(shù)(n=1: 1T 8.65ms,12T 59.9ms)
void Delay1(uint n)
{
    uint x;
    while (n--)
    {
        x = 5000;
        while (x--);
    }
}
//******************************ADC初始化函數(shù)
void Init_ADC()
{
    P1ASF = 0xff;                      //設(shè)置P1口為開(kāi)漏模式,使用AD功能
    ADC_RES = 0;                       //AD數(shù)據(jù)寄存器高8位清空
 ADC_RESL= 0;        //AD數(shù)據(jù)寄存器低2位清空
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;  //打開(kāi)AD電源,轉(zhuǎn)換周期540
    Delay1(2);                        //延時(shí)
}
//***********************************ADC數(shù)據(jù)轉(zhuǎn)換函數(shù)
uint Get_ADC_Result(uchar ch)
{
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch ;//開(kāi)始轉(zhuǎn)換
    _nop_();                          //延時(shí)一個(gè)機(jī)器周期
    _nop_();        //延時(shí)一個(gè)機(jī)器周期
    _nop_();        //延時(shí)一個(gè)機(jī)器周期
    _nop_();        //延時(shí)一個(gè)機(jī)器周期
    while (!(ADC_CONTR & ADC_FLAG));  //等待轉(zhuǎn)換結(jié)束(ADC_FLAG=0時(shí)一直等待,直到變?yōu)?跳出)
    ADC_CONTR &= ~ADC_FLAG;           //關(guān)閉AD轉(zhuǎn)換
    return (ADC_RES*4+ADC_RESL);            //返回?cái)?shù)據(jù)(10位AD值,ADC_RES高8位+ADC_RESL低2位)
}
//************************************ADC數(shù)據(jù)計(jì)算函數(shù)
float Count(uchar ch)
{
 temp=(float)Get_ADC_Result(ch)*4.60/1024; //4.85為參考電壓,1024個(gè)“門(mén)”,10位AD
 return temp;
}
 
main.c
//***********************(ma)STC12C5A60S2(ADC查詢(xún)法 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;
//*****************************顯示函數(shù)
void show()
{
 DisplayListChar(0,0,string1);
 DisplayOneChar(1,1,(int)Count(0)+0x30);     //個(gè)位
 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);     //個(gè)位
 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'); 
}
//*******************************主函數(shù)
void main()
{
 InitLCM();  //液晶初始化
    Init_ADC();  //AD轉(zhuǎn)換初始化
    while (1)
    { 
  show();
    }
}
關(guān)閉窗口

相關(guān)文章