STC12C5A60S2(ADC查询法 10位模式)+1602显示

发布者:WanderlustSoul最新更新时间:2014-12-11 来源: 51hei关键字:STC12C5A60S2  ADC查询法  1602显示 手机看文章 扫描二维码
随时随地手机看文章

通道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)%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();
    }
}

关键字:STC12C5A60S2  ADC查询法  1602显示 引用地址:STC12C5A60S2(ADC查询法 10位模式)+1602显示

上一篇:LCD12864 液晶显示器 模块化程序
下一篇:51单片机“呼吸灯”程序

推荐阅读最新更新时间:2024-03-16 13:48

DS1302时钟与LCD1602液晶显示
DS1302是一个实时时钟芯片,它在实时显示时间中应用。它可以对年、月、日、周、时、分、秒进行计时。 DS1302的引脚及原理图如下: 它与CPU的连接需要SCLK(7)、I/O(6)和RST(5)三个引脚,VCC2和VCC1分别为主电源和备份电源,X1和X2分别接外部振荡器。在于CPU的通信中I/O用来传输数据,RST作为复位信号,SCLK用来控制数据字节的读写。 DS1302的读写时序如下: 程序中对芯片的操作主要是参考芯片的时序状态,时序中说明只要有对数据的操作RST就需要置1,在读数据的前8个时钟中在SCLK处于高电平的过程中会获取控制字信息,此过程I/O数据不会变化,而在低电平的过程中I/O
[单片机]
DS1302时钟与LCD<font color='red'>1602</font>液晶<font color='red'>显示</font>
LCD1602液晶显示带汉字的万年历程序
#include "reg51.h" #define uint unsigned int #define uchar unsigned char #define port P0 uchar table ="I love you!"; uchar table1 ="Shang Hong Rui!"; uchar table2 ="LI ZHEN WEI!" ; uchar table3 =" "; uchar num; sbit rs=P2^0; sbit rw=P2^1; sbit e=P2^2; /******************************************** 1ms 为基本单
[单片机]
LCD<font color='red'>1602</font>液晶<font color='red'>显示</font>带汉字的万年历程序
1602液晶显示红外遥控解码C语言程序设计
#include at89x52.h #define uchar unsigned char #define uint unsigned int /*----------------------------控制I/O口设置,根据实际而定---------------*/ #define RS P2_0 //RS数据命令选择端,高电平数据,低电平命令 #define RW P2_1 //RW读写选择端,高电平读操作,低电平写操作 #define E P2_2 //E使能控制端,E高电平跳变为低电平时LCD执行命令 #define DATA P0 //数据端口定义 #define D0 P0_
[单片机]
单片机PWM输出控制直流电机(89c51系列、stc12c5a60s2系列)
【pwm是如何控制电机转速】 在本科学习中,学生所做的小车多数为使用lm298n或者tb6612来驱动简单的直流电机,我们需要单片机输出pwm波来控制直流电机转速。 直流电机的PWM调速原理为:通过调节驱动电压脉冲宽度的方式,并与电路中一些相应的储能元件配合,改变了输送到电枢电压的幅值,从而达到改变直流电机转速的目的。 【89C51系列单片机产生pwm波】 89c51单片机没有自带pwm发生器,如果想要使用传统的51单片机产生pwm,只能通过软件模拟的方法来产生pwm。 软件模拟可以分为软件延时和定时器两种方法。 1、软件延时输出pwm 使用延时函数产生频率为1kHz的pwm方波(@12MHz晶振) #in
[单片机]
单片机PWM输出控制直流电机(89c51系列、<font color='red'>stc12c5a60s2</font>系列)
LCD1602液晶显示模版+超声波测距(C51)
LCD1602display.h #ifndef _LCD1602DISPLAY_H_ #define _LCD1602DISPLAY_H_ #include reg52.h #include intrins.h typedef unsigned char uchar; typedef unsigned int uint; typedef unsigned long ulong; //************************LCD引脚定义 sbit LCM_RS=P2^5; sbit LCM_RW=P2^6; sbit LCM_E=P2^7; //**************************延时
[单片机]
LCD<font color='red'>1602</font>液晶<font color='red'>显示</font>模版+超声波测距(C51)
基于STC12C5A60S2的双电源供电智能控制系统设计
摘要:文章介绍了基于STC12C5A60S2单片机的双电源供电智能控制系统,实现对主电源和备用电源的实时监测,保证供电的连续性和可靠性。文中阐述丫系统的整体设计方案、硬件电路设计、软件设计及后台监控的设计。通过理论分析及实践汪明能有效的检测当前主备电路的电压值并实现双电源之间的准确转换,相应状态可以通过GSM模块发送给监控主机和相关操作人员,具有重要的现实意义。 0 引言 随着国民经济的迅速发展,人们对供电连续性、可靠性的要求越来越高,对于不允许断电的重要场合,如医院手术室、高层建筑安全保障系统、热电站、化工企业、银行等,都要求配备至少两路电源来保证供电的连续性。因此,需要一种能在两路电源之间进行自动转换的系统,以保证正在使用
[测试测量]
基于<font color='red'>STC12C5A60S2</font>的双电源供电智能控制系统设计
STC12C5A60S2之串口
STC12C5A60S2单片机的串口从传统的一个扩展到了两个, 而且还增加了一个独立波特率发生器,把定时器1解放了出来,真的不是一般的方便, 还而且能用1T模式,速度大大滴提高了。。。 于是,就写了串口模块,方便以后用 有关STC12C5A60S2串口的寄存器 UART.C /* * 文 件 名:UART.C * 芯 片:STC12C5A60S2 * 晶 振:12MHz * 创 建 者:冷月 * 创建日期:2010.8.16 * 修 改 者: * 修改日期: * 功能描述:STC12C5A系列单片机串口模块,包括串口1和串口2,方式1,使用独立波特率发生器 * 功能:1.
[单片机]
<font color='red'>STC12C5A60S2</font>之串口
1602左右滚动显示
//////////////////左右滚动显示///////////////////// C51 8051 #include reg51.h #include intrins.h typedef unsigned char uchar; typedef unsigned int uint; sbit rs=P2^0; sbit rw=P2^1; sbit e=P2^2; uchar key_val; uchar code dis0 ={ Take time to yell English,it will build your confidence and enhance your personal power. }; void
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved