STC12C5A60S2ADC查询法10位模式 1602显示.docx
《STC12C5A60S2ADC查询法10位模式 1602显示.docx》由会员分享,可在线阅读,更多相关《STC12C5A60S2ADC查询法10位模式 1602显示.docx(6页珍藏版)》请在冰点文库上搜索。
STC12C5A60S2ADC查询法10位模式1602显示
STC12C5A60S2(ADC查询法10位模式)+1602显示
通道0接单片机电源,通道1接地线。
源程序:
一共3个文件:
LCD1602display.h
#ifndef_LCD1602DISPLAY_H_
#define_LCD1602DISPLAY_H_
#defineucharunsignedchar
#defineuintunsignedint
//************************LCD引脚定义
sbitLCM_RS=P3^5;
sbitLCM_RW=P3^6;
sbitLCM_E=P3^7;
//**************************延时
voiddelay();
//**************************初始化
voidInitLCM();
//****************************读状态
ucharReadStatusLCM();
//******************************读数据
ucharResdDataLCM();
//***************************写指令
voidWriteCommandLCM(ucharWCLCM,Busy);
//***************************写数据
voidWriteDataLCM(ucharWDLCM);
//******************************显示1个字符
voidDisplayOneChar(ucharX,ucharY,ucharDData);
//******************************显示字符串
voidDisplayListChar(ucharX,ucharY,ucharcode*DData);
#endif
STC12(ADCflag).h
#ifndef_STC12_ADC_FLAG_H_
#define_STC12_ADC_FLAG_H_
#defineucharunsignedchar
#defineuintunsignedint
#defineFOSC11059200L
#defineBAUD9600
/********************************************************************
初始化设置
*********************************************************************/
sfrADC_CONTR=0xBC;//ADC控制寄存器
sfrADC_RES=0xBD;//ADC转换结果寄存器
sfrADC_RESL=0xBE;//ADC低2位结果寄存器
sfrP1ASF=0x9D;//P1口模拟功能控制寄存器
/********************************************************************
ADC数据转换函数
*********************************************************************/
#defineADC_POWER0x80//ADC电源控制位
#defineADC_FLAG0x10//ADC转换结束标志位
#defineADC_START0x08//ADC开始转换控制位
#defineADC_SPEEDLL0x00//540个时钟周期转换一次
#defineADC_SPEEDL0x20//360个时钟周期转换一次
#defineADC_SPEEDH0x40//180个时钟周期转换一次
#defineADC_SPEEDHH0x60//90个时钟周期转换一次
//**********************************延时函数
voidDelay1(uintn);
//******************************ADC初始化函数
voidInit_ADC();
//***********************************ADC数据转换函数
uintGet_ADC_Result(ucharch);
//************************************ADC数据计算函数
floatCount(ucharch);
#endif
LCD1602display.c
#include;
#include;
#include"LCD1602display.h"
//********************延时
voiddelay(ucharz)
{
uchari,j;
for(i=z;i>;0;i--)
for(j=110;j>;0;j--);
}
//**********************LCM初始化
voidInitLCM()
{
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);//清屏幕指令,将以前的显示内容清除
}
//*********************读状态
ucharReadStatusLCM()
{
P0=0x80;
LCM_RS=0;
LCM_RW=1;
LCM_E=1;
while(P0&0x80);//检测忙信号
return(0);
}
//***********************读数据
/*ucharResdDataLCM()
{
LCM_RS=1;
LCM_RW=1;
LCM_E=1;
}*/
//**********************写指令
voidWriteCommandLCM(ucharWCLCM,Busy)
{
if(Busy)ReadStatusLCM();
P0=WCLCM;
LCM_RS=0;
LCM_RW=0;
LCM_E=0;
LCM_E=1;
}
//***********************写数据
voidWriteDataLCM(ucharWDLCM)
{
ReadStatusLCM();
P0=WDLCM;
LCM_RS=1;
LCM_RW=0;
LCM_E=0;
LCM_E=1;
}
//*************************显示字符
voidDisplayOneChar(ucharX,ucharY,ucharDData)
{
if(Y)X|=0X40;//Y=1显示第二行,Y=0显示第一行
X|=0X80;
WriteCommandLCM(X,1);//X用来选择哪一位,1是用来忙检测
WriteDataLCM(DData);//DData用来写数据
}
//**************************显示字符串
voidDisplayListChar(ucharX,ucharY,ucharcode*DData)
{
ucharListLength;
ListLength=0;
while(DData[ListLength]!
='\0')
{
if(X;
#include"intrins.h"
#include"STC12(ADCflag).h"
floattemp;
//**********************************延时函数(n=1:
1T8.65ms,12T59.9ms)
voidDelay1(uintn)
{
uintx;
while(n--)
{
x=5000;
while(x--);
}
}
//******************************ADC初始化函数
voidInit_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数据转换函数
uintGet_ADC_Result(ucharch)
{
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数据计算函数
floatCount(ucharch)
{
temp=(float)Get_ADC_Result(ch)*4.60/1024;//4.85为参考电压,1024个“门”,10位AD
returntemp;
}
main.c
//***********************(ma)STC12C5A60S2(ADC查询法10位模式)+1602显示*************************************************************
//马熔
//2012-12-17
//***************************************************************************************************
#include;
#include"intrins.h"
#include"STC12(ADCflag).h"
#include"LCD1602display.h"
#defineucharunsignedchar
#defineuintunsignedint
externfloattemp;
ucharcodestring1[]={"Thevoltageis:
"};
ucharge,shifen;
//*****************************显示函数
voidshow()
{
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');
}
//*******************************主函数
voidmain()
{
InitLCM();//液晶初始化
Init_ADC();//AD转换初始化
while
(1)
{
show();
}
}