我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 754|回复: 1

STC12C5A60S2 (10位模式)1602显示 源程序3个文件

[复制链接]

该用户从未签到

77

主题

359

回帖

0

积分

二级逆天

积分
0

社区居民终身成就奖金点子奖

QQ
发表于 2021-6-28 15:36:04 | 显示全部楼层 |阅读模式
[/free][paragraph]

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







源程序:一共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)0/10+0x30); //十分位
DisplayOneChar(4,1,(int)(Count(0)*100)0+0x30); //百分位
DisplayOneChar(5,1,'V');
DisplayOneChar(8,1,(int)Count(1)+0x30);     //个位
DisplayOneChar(9,1,'.');
DisplayOneChar(10,1,(int)(Count(1)*100)0/10+0x30); //十分位
DisplayOneChar(11,1,(int)(Count(1)*100)0+0x30); //百分位
DisplayOneChar(12,1,'V');
}
//*******************************主函数
void main()
{
InitLCM();  //液晶初始化
    Init_ADC();  //AD转换初始化
    while (1)
    {
  show();
    }
}



来源网络仅供个人学习
[free]
购买主题 本主题需向作者支付 9 枚金币 才能浏览
回复

使用道具 举报

该用户从未签到

77

主题

359

回帖

0

积分

二级逆天

积分
0

社区居民终身成就奖金点子奖

QQ
 楼主| 发表于 2021-7-8 01:32:59 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

论坛开启做任务可以
额外奖励金币快速赚
积分升级了


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

平平安安
TOP
快速回复 返回顶部 返回列表