找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3864|回复: 1
收起左侧

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

[复制链接]
ID:97529 发表于 2015-11-29 12:15 | 显示全部楼层 |阅读模式

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

    }

}


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的积分奖励!

查看全部评分

回复

使用道具 举报

ID:306141 发表于 2018-4-19 17:28 | 显示全部楼层
谢谢分享,正在做这个,程序写得很清晰,赞
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表