历史上的今天
今天是:2025年01月14日(星期二)
2018年01月14日 | STC12C5406AD 1602液晶显示+LM35DZ 温度计
2018-01-14 来源:eefocus
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);
}
}
下一篇:1602液晶显示的电压表程序
史海拾趣
|
哈哈,抽时间写了一个博客,说说自己学习dsp2812的体会,欢迎大家共同探讨哦~~~ https://home.eeworld.com.cn/my/space.php?uid=117818&do=blog&id=22384&cid=1945… 查看全部问答> |
|
沉寂了好多天,没闲着,做了点儿项目相关的事儿,调了一个很常用的片子——DS12C887(一个实时时钟芯片),是达拉斯公司生产的。 先说说它的用途吧:时钟芯片,当然是记录时间了,功能很强大,内部有振荡电路和电池,一旦被激活就会自动计时,一 ...… 查看全部问答> |
|
尚为科技-机房环境监控专家,机房环境监控产品专业厂商,产品具有稳定、易用、低功耗的特点,产品经过了权威部门的测试,已形成较完整的产品系列和行业解决方案,获得良好的用户口碑。 欢迎来电垂询,电话:0592-5204071 6300605 6300607 ...… 查看全部问答> |
|
我用台式机跟研华6552的工控板 wince系统 通过双机互联线连接 台式机ip是192.168.0.12 工控机是192.168.0.192 从台式机上ping 工控机没有问题 但是ActiveSync一直连接不上 ActiveSync图标一直是灰色的 … 查看全部问答> |
|
现在在调TELECHIPS中的TCC7901芯片板子,TCC7901有6个PORT,但只有4个通道,我老板要我把2。2的BSP中的4个通道都用上,但2。2的BSP默认是把CH0和CH2分别用在了调试和IRda中,所以只有两个串口可用,我的任务就是改CH0和CH2为可用,请问一下有没有调 ...… 查看全部问答> |
|
IIC操作不成功,我利用在程序中间设置断点的方法,发现是主机检测应答信号子函数不成功,我检查过了,这个函数应该没有问题,谁能看看这个函数,谢谢了。用的是msp430。 #include <msp430x14x.h>#include \"iic.h\" //延时15usvoid d ...… 查看全部问答> |
|
$(\'swf_GH3\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XMzY1NzQ3ODI0/v.sw ...… 查看全部问答> |




