/***********************************************************
程序功能:STC12C5A60S2自带ADC采集电压信号+DS18B20温度传感器+LCD1602液晶显示
MCU型号: STC12C5A60S2
晶振频率:11.0892MHz
整理时间:2013年4月25号
************************************************************/
#include "STC12C5A60S2.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
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)
{
uint t;
t=GetADCResult(Channel);
qian=t/1000;
bai=t%1000/100;
shi=t%1000%100/10;
ge=t%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;
//0x00|0x00|ch|0x08:选择A/D输入通道,开始A/D转换
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR&ADC_FLAG));
ADC_CONTR&=~ADC_FLAG;
return (ADC_RES*4+ADC_RESL);
}
void InitADC()
{
P1M0=0x01;
P1M1=0x01;
P1ASF = 0x01;
ADC_RES =0x00;
ADC_RESL=0x00;
ADC_CONTR = ADC_POWER|ADC_SPEEDLL;
Delay(2);
}
void Delay(WORD t)
{
WORD x;
while(t--)
{
x = 5000;
while(x--);
}
}
|