源程序:一共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();
}
}