stc12c5a单片机c语言adc,stc12c5a60s2单片机用自带ADC采集电压源程序

该程序实现了使用STC12C5A60S2单片机通过ADC采集电压信号,并结合DS18B20温度传感器获取温度数据,最终在LCD1602液晶显示屏上显示。程序中包含了温度转换、ADC初始化、ADC读取以及数据显示等功能。
摘要由CSDN通过智能技术生成

/***********************************************************

程序功能:STC12C5A60S2自带ADC采集电压信号+DS18B20温度传感器+LCD1602液晶显示

MCU型号: STC12C5A60S2

晶振频率:11.0892MHz

整理时间:2012年4月25号

************************************************************/

#include "reg51.h"

#include "intrins.h"

sfr P4        = 0XC0;

sfr ADC_CONTR = 0XBC;

sfr ADC_RES   = 0XBD;

sfr ADC_LOW2  = 0XBE;

sfr P1ASF     = 0X9D;

typedef unsigned char BYTE;

typedef unsigned int WORD;

#include "1602.h"

#include "DS18B20.h"

#define ADC_POWER   0X80

#define ADC_FLAG    0X10

#define ADC_START   0X08

#define ADC_SPEEDLL 0X00

#define ADC_SPEEDL  0X20

#define ADC_SPEEDH  0X40

#define ADC_SPEEDHH 0X60

void InitADC();

void Delay(WORD n);

WORD GetADCResult(BYTE ch);

void DisplayADCResult(BYTE Channel);

void DisplayTemperature();

char qian=0,bai=0,shi=0,ge=0;

BYTE ly_dis[4];//定义显示缓冲区

void main()

{

WORD i=0;

float tt;

int ltemp;

InitADC();

LCDInit();

DisplayListChar(0, 0, "Temp:");

DisplayListChar(0, 1, "Volt:");

while(1)

{

if(i==0)

tmpchange();              //温度转换

if(i==100)

{

tt=tmp()*0.0625;          //得到真实十进制温度值,因为DS18B20

//可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度。

ltemp=tt*10+0.5;           //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。

if(ltemp<0)

{                //判断第一位显示整数还是负号

ly_dis[0]=0xbf;

ltemp=0-ltemp;

}

else

ly_dis[0]=ltemp/1000;//显示百位值

ltemp=ltemp%1000;

ly_dis[1]=ltemp/100;        //显示温度十位值

ltemp=ltemp%100;

ly_dis[2]=ltemp/10;                //显示温度个位值

ly_dis[3]=ltemp%10;                //显示小数点后一位

}

i++;

if(i==3000)

{

DisplayADCResult(0);

i=0;

}

DisplayTemperature();        //调用显示

}

}

void DisplayADCResult(BYTE Channel)

{

qian=GetADCResult(Channel)/1000;

bai=GetADCResult(Channel)%1000/100;

shi=GetADCResult(Channel)%1000%100/10;

ge=GetADCResult(Channel)%10;

if(0==qian)

DisplayOneChar(5,1,' ');

else

DisplayOneChar(5,1,table[qian]);

if(0==bai&&0==qian)

DisplayOneChar(6,1,' ');

else

DisplayOneChar(6,1,table[bai]);

DisplayOneChar(7,1,table[shi]);

DisplayOneChar(8,1,table[ge]);

DisplayOneChar(9, 1, 'v');

}

void DisplayTemperature()

{

if(0==ly_dis[0])

DisplayOneChar(5, 0, ' ');

else

DisplayOneChar(5, 0, table[ly_dis[0]]);

DisplayOneChar(6, 0, table[ly_dis[1]]);

DisplayOneChar(7, 0, table[ly_dis[2]]);

DisplayOneChar(8, 0, '.');

DisplayOneChar(9, 0, table[ly_dis[3]]);

DisplayOneChar(10, 0, 0xdf);

DisplayOneChar(11, 0, 'C');

}

WORD GetADCResult(BYTE ch)

{

ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;

_nop_();

_nop_();

_nop_();

_nop_();

while(!(ADC_CONTR&ADC_FLAG));

ADC_CONTR&=~ADC_FLAG;

return ADC_RES*4+ADC_LOW2;

}

void InitADC()

{

……………………

…………限于本文篇幅 余下代码请从51黑下载附件…………

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值