STC12C5406AD 1602液晶显示+LM35DZ 温度计

2018-01-14 20:23:18编辑:什么鱼 关键字:STC12C5406AD  1602液晶显示  LM35DZ  温度计

STC12C5406AD 晶振频率为12MHz  

本程序已调试完成: 

功能说明:STC12C5406AD+74HC164+1602液晶显示+LM35DZ+DS18B20温度计设计。 
测量电压:采用8位AD测量,LM35DZ,DS18B20读出的温度值都非常准确。 
#include "stc12c5410ad.h"//头文件 

 

#include "intrins.h" 
#define uchar unsigned char//宏定义 
#define uint unsigned int//宏定义 

sbit RS=P3^4;//定义I/O的硬件接口 
sbit E=P3^7; 

sbit A_B=P3^2; 
sbit CP=P3^3; 

sbit Simulation=P1^7;//模拟电压输入 

sbit DQ=P3^5;////定义I/O的硬件接口--温度 

uint Temperature;//温度暂存单元 
uint Negative_Temperature;//负温度暂存单元 
bit Negative_sign=1;//负温度标志 
unsigned long TEMP_1;//长整形单元 

uint temp; 


uchar code DispTab_1[]={’0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’ ’,’-’};//1602:0-9 数字 
uchar code DispTab_2[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//温度符号 
uchar DispBuf[6]; //6字节的显示缓冲区 

void delay(uint z)//1ms延时 
{  
uchar x,x1; 
for(;z>0;z--) 

for(x=0;x<114;x++) 

for(x1=0;x1<1;x1++); 




void delay1(uchar x2)//经精准计算,该段程序1次延时时间为 19.53us;多次调用需要重新计算。 

while(x2>0) 

x2--; 




void write_Directive(uchar a)//写指令 
{  
uchar i,temp; 
for(i=0;i<8;i++) 

temp=a; 
temp&=0x80; 
if(temp==0x80) 
A_B=1;  
else  
A_B=0; 
a=a<<1; 
delay1(1); 
CP=0; 
delay1(1); 
CP=1; 
delay1(1); 
CP=0; 


RS=0; 
delay(3); 
E=0; 
delay(3); 
E=1; 
delay(3); 
E=0; 
delay(3); 


void write_Data(uchar a)//写数据 
{  
uchar i,temp; 
for(i=0;i<8;i++) 

temp=a; 
temp&=0x80; 
if(temp==0x80) 
A_B=1;  
else  
A_B=0; 
a=a<<1; 
delay1(1); 
CP=0; 
delay1(1); 
CP=1; 
delay1(1); 


RS=1; 
delay(3); 
E=0; 
delay(3); 
E=1; 
delay(3); 
E=0; 
delay(3); 



void init()//初始化 

//CP=1; 
//A_B=1; 
delay(15); 
write_Directive(0x38); 
delay(5); 
write_Directive(0x38); 
delay(5); 
write_Directive(0x38); 
write_Directive(0x01); 
write_Directive(0x02);///初始化后数据地址为0x80;即第一行,第一个位置 
write_Directive(0x0c); 


void Temperature_symbol()//温度符号 

uchar i; 
for(i=0;i<8;i++) 

write_Directive(0x40+i);//写入温度符号 
write_Data(DispTab_2[i]); 



void write_Data_String()//显示时间函数 
{  
uchar i; 
uint mm; 
DispBuf[0]=temp/10000;//显示百位 
mm=temp%10000; 

DispBuf[1]=mm/1000;//显示十位 
mm=mm%1000; 

DispBuf[2]=mm/100;//显示个位 
mm=mm%100; 

DispBuf[3]=mm/10;//显示小数点:0.001 
DispBuf[4]=mm%10;//显示小数点:0.0001 

i=DispBuf[0];//百位判断,如果为0,则消隐 
if(i==0) 
i=10; 

DispBuf[0]=DispTab_1[i];//查表,取字符 
i=DispBuf[1]; 
DispBuf[1]=DispTab_1[i]; 
i=DispBuf[2]; 
DispBuf[2]=DispTab_1[i]; 
i=DispBuf[3]; 
DispBuf[3]=DispTab_1[i]; 
i=DispBuf[4]; 
DispBuf[4]=DispTab_1[i]; 

write_Directive(0x80+0x00);//第一行,第五个位置地址 
write_Data(’L’); 
write_Data(’M’); 
write_Data(’3’); 
write_Data(’5’); 
write_Data(’D’); 
write_Data(’Z’); 
write_Data(’ ’); 
write_Data(’:’); 

write_Data(DispBuf[0]);//第一行,第五个位置 


write_Data(DispBuf[1]);//第一行,第七个位置  


write_Data(DispBuf[2]);//第一行,第八个位置 

write_Data(’.’);//第一行,第六个位置 

write_Data(DispBuf[3]);//第一行,第九个位置 

write_Data(DispBuf[4]);//第一行,第十个位置 

write_Data(0x00);//第一行,第十三个位置显示温度符号 



void I_O_init() 

P1M1=0x80; 
P1M0=0x80; 



void ADC_Conversion()//ADC开始转 

ADC_CONTR=0x87; 
delay(1); 
ADC_CONTR=0x8f; 
delay(1); 
//while((ADC_CONTR==0x8f)); 
ADC_CONTR=0x87; 
delay(1); 


void ADC_Calculated()//ADC计算 

float temp1; 
//float temp2; 
//uint teMP3; 

temp1=ADC_DATA;//高8位 
//temp2=ADC_LOW2;//低2位 
//temp1=temp; 
temp=temp1/256*5*10000;//高8位计算 
temp=temp/2; 

//temp2=ADC_LOW2;//低2位 
//temp2=temp3; 
//temp3=temp2/256*5*10000;//低2位计算 
//temp3=temp3/2; 
//temp=temp+temp3; 

//temp=temp+temp3;//高8位的计算值+低2位的计算值=实际值 





void DB18B20_init()//DB18B20复位 

DQ=1; 
delay1(1);//程序1次延时时间为 19.53us 
DQ=0; 
delay1(250);//程序110次延时时间为 965.71us 
DQ=1; 
delay1(10);//程序1次延时时间为 19.53us 
while(DQ==1); 
//if(DQ==0) 
_nop_(); 
// LED_7=~led_7;//led检测复位正常否,如果DB18B20存在,且正常;led闪烁。 
while(DQ==0); 
delay1(40);//程序20次延时时间为 197.32us 



void write_DB18B20(uchar m1)//写DB18B20 
{  
uchar i,m2; 

for(i=0;i<8;i++) 

m2=m1; 
m2=m2&0x01; 
DQ=0; 
_nop_(); 
DQ=1; 
if(m2==0x01) 
DQ=1; 
else  
DQ=0; 
delay1(50);//程序5次延时时间为 54.25us 
m1=m1>>1; 
DQ=1; 




read_DB18B20()//读DB18B20 
{  
uint 1; 
uchar i; 
for(i=0;i<16;i++) 

1=1>>1; 
DQ=1; 
_nop_(); 
DQ=0; 
_nop_(); 
DQ=1; 
_nop_(); 
_nop_(); 
_nop_(); 
_nop_(); 
if(DQ==1) 
1=1|0x8000; 
//else  
// 1=1|0x0000; 
delay1(50);//程序5次延时时间为 54.25us 

return 1;//返回温度值 


void Negative()//温度为零度以下时,将变换温度 

Negative_Temperature=Temperature; 
Negative_Temperature=Negative_Temperature&0xf800; 
if(Negative_Temperature==0xf800) 

Temperature=~Temperature; 
Temperature=Temperature+1; 
Negative_sign=0; 



void write_Data_String1()//显示时间函数 
{  
uchar i; 
unsigned long mm; 
DispBuf[0]=TEMP_1/1000000;//显示百位 
mm=TEMP_1%1000000; 

DispBuf[1]=mm/100000;//显示十位 
mm=mm%100000; 

DispBuf[2]=mm/10000;//显示个位 
mm=mm%10000; 

DispBuf[3]=mm/1000;//显示小数点:0.1 
mm=mm%1000; 

DispBuf[4]=mm/100;//显示小数点:0.01 
mm=mm%100; 

DispBuf[5]=mm/10;//显示小数点:0.001 
DispBuf[6]=mm%10;//显示小数点:0.0001 

i=DispBuf[0];//百位判断,如果为0,则消隐 
if(i==0) 
i=10;  
else if(Negative_sign==0)//负温度判断,如果为0,则温度为负的,显示负号 
i=11; 

DispBuf[0]=DispTab_1[i];//查表,取字符 
i=DispBuf[1]; 
DispBuf[1]=DispTab_1[i]; 
i=DispBuf[2]; 
DispBuf[2]=DispTab_1[i]; 
i=DispBuf[3]; 
DispBuf[3]=DispTab_1[i]; 
i=DispBuf[4]; 
DispBuf[4]=DispTab_1[i]; 
i=DispBuf[5]; 
DispBuf[5]=DispTab_1[i]; 
i=DispBuf[6]; 
DispBuf[6]=DispTab_1[i]; 


write_Directive(0x80+0x40);//第一行,第五个位置地址 

write_Data(’D’); 
write_Data(’S’); 
write_Data(’1’); 
write_Data(’8’); 
write_Data(’B’); 
write_Data(’2’); 
write_Data(’0’); 
write_Data(’:’); 
write_Data(DispBuf[0]);//第一行,第五个位置 

write_Data(DispBuf[1]);//第一行,第六个位置  
write_Data(DispBuf[2]);//第一行,第八个位置 

write_Data(’.’);//第一行,第七个位置 

write_Data(DispBuf[3]);//第一行,第九个位置 

write_Data(DispBuf[4]);//第一行,第十个位置 

//write_Data(DispBuf[5]);//第一行,第十一个位置 
//write_Data(DispBuf[6]);//第一行,第十二个位置 
write_Data(0x00);//第一行,第十三个位置显示温度符号 



void main() 


//delay1(5);//程序1次延时时间为 19.53us 

init(); 

I_O_init();//I/O口初始化 
Temperature_symbol();//写入温度符号 
while(1) 


DB18B20_init();//DB18B20复位 

write_DB18B20(0xCC);//写DB18B20;0xcc 跳过 ROM 指令 
write_DB18B20(0x44);//写DB18B20;0x44 启动温度转换指令 

delay(1000);//延时1秒 

DB18B20_init();//DB18B20复位 
write_DB18B20(0xcc);//写DB18B20;0xcc 跳过 ROM 指令 
write_DB18B20(0xbe);//写DB18B20;0xbe 读温度指令 
Temperature=read_DB18B20();//读 DB18B20 温度,读出的温度在 Temperature 
Negative();//温度为零度以下时,将变换温度,否则不变 
TEMP_1=Temperature*0.0625*10000;//转换成 十进制(*10000,表示,显示到小数点后4位:0.0000) 
write_Data_String1();//显示温度 

ADC_Conversion();//ADC开始转 
ADC_Calculated();//ADC计算 
write_Data_String();//显示温度 
delay(100);  
}


关键字:STC12C5406AD  1602液晶显示  LM35DZ  温度计

来源: eefocus 引用地址:http://www.eeworld.com.cn/mcu/article_2018011437350.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:24C32~24C512的51单片机读写程序
下一篇:1602液晶显示的电压表程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

基于STC12C5624AD单片机的液晶屏背光模块驱动和调节电路设计

    为使座舱内的用户随时得到准确、可靠的信息,座舱内使用的显示器必须具有高可靠性,同时,因为飞机驾驶员左右手都要操作仪器,且为提高座舱显示器的易读性和缓解视觉疲劳,显示器的光强还应能根据周围环境和用户需求进行自动和手动调整,避免用户在环境光很强时看不清显示内容,或在环境光很暗时感到刺眼。液晶显示器的背光亮度直接决定显示器的平均亮度,通过调节液晶显示器的背光亮度来调节显示器的亮度。    笔者采用国产的STC12C5624AD单片机设计一个液晶屏背光模块驱动和调节电路,能够准确测量环境光的照度,根据环境光实现自动和手动调节背光亮度。    1 显示器背光调节的原理
发表于 2018-04-10 20:14:01
基于STC12C5624AD单片机的液晶屏背光模块驱动和调节电路设计

STC12C2052AD单片机AD转换C语言程序的实现

; 5    4    3      2    1    0                     P1.7  P1.6  P1.5  P1.4  P1.3  P1.2  P1.1  P1.0  同理P3M0  P3M0 也是。因为STC12C2052AD只有两个P口,所以只有这俩组  STC12C5410AD
发表于 2018-03-08 21:25:40
STC12C2052AD单片机AD转换C语言程序的实现

STC12C2052AD单片机看门狗及其溢出时间计算公式

;本程序用于验证 STC12C2052AD 系列 单片机 的看门狗及其溢出时间计算公式 ;看门狗及其溢出时间 = (12 * Pre_scale *32768)/Oscillator Frequency WDTCR           EQU 0E1H ;看门狗地址 WDT_TIME_LED    EQU P1.5 
发表于 2018-02-01 19:24:16

STC12C2052AD单片机做的手机电池充电器程序

;P1.4  P1.3  P1.2  P1.1  P1.0   同理P3M0  P3M0 也是。因为STC12C2052AD只有两个P口,所以只有这俩组  STC12C5410AD还多P2M0 P1M0 有三组       P1M0   P1M1         
发表于 2018-01-30 20:26:55

用STC12C5412AD单片机构成的集成实验板电路

  STC12C5412AD单片机,是一款增强型8051标准的51系列的单片机。速度比普通8051快12倍,可以在家庭中的计算机编程,无需仿真器。    STC12C5412AD有8通道的10位AD转换器,可以检测模拟信号,不用AD时可以当作数字输入输出口用。还有许多优于8051的性能。其指令与普通8051指令代码完全兼容,但执行速度大幅提升。  用其构成的示教学习板电路原理图如下图所示。  本电路的外围电路有:    (1)简单的发声电路:讯响器。    (2)麦克放大电路和半波整流电路。    (3)4个数码管动态显示电路。    (4)15个发光二极管,其中7个发光二极管与数码管的7个笔段驱动脚兼用。    (5)9个按键
发表于 2018-01-30 20:23:48
用STC12C5412AD单片机构成的集成实验板电路

1602液晶显示屏显示字符

本次实验的效果为实现特定字符在1602液晶显示屏上流动显示所用开发板为普中科技开发板,电路图如下:代码如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned int  sbit rs = P2^6;sbit rw = P2^5;sbit lcden = P2^7;  unsigned char table1[16] = " Pechin Science ";unsigned char table2[27] = "Welcome to the world of
发表于 2018-07-14 20:39:12

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved