历史上的今天
返回首页

历史上的今天

今天是: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);  
}


推荐阅读

史海拾趣

Achronix Semiconductor Corporation公司的发展小趣事

Achronix Semiconductor Corporation是一家专注于FPGA(现场可编程门阵列)和eFPGA(嵌入式FPGA)技术的公司,以下是该公司发展的五个相关故事:

  1. 公司成立和早期发展: Achronix Semiconductor Corporation成立于2004年,总部位于美国加利福尼亚州圣克拉拉市。公司最初的目标是开发高性能、低功耗的FPGA芯片,以满足日益增长的计算需求和数据中心的要求。起初,公司主要关注FPGA技术的研发和市场定位。

  2. 技术突破和产品推出: 随着公司的不断发展,Achronix取得了一系列技术突破,并成功推出了一系列创新的FPGA产品。其中,公司的Speedster系列FPGA以其出色的性能、低功耗和高集成度而备受关注,成为了市场上的竞争力量。这些产品被广泛应用于网络设备、数据中心、通信、汽车等领域。

  3. 市场扩张和国际合作: Achronix积极拓展国内外市场,并与全球各地的客户建立了合作关系。公司的FPGA产品在全球范围内得到了广泛的应用,并与众多知名企业展开合作,共同推动技术进步和市场发展。同时,Achronix还与各大半导体制造商合作,共同研发新一代FPGA技术。

  4. 持续投入研发和创新: Achronix不断加大研发投入,致力于技术创新和产品升级。公司在硬件设计、架构优化、软件开发等方面进行持续的研究和探索,推动FPGA技术的发展。同时,Achronix还与国内外高校和研究机构合作,共同开展前沿技术的研究。

  5. 未来发展展望: Achronix将继续致力于FPGA和eFPGA技术的研发和应用,不断推出更先进、更高性能的产品和解决方案,满足客户在各个领域的需求。公司将加强国际市场拓展,提升自身在全球市场的竞争力,为行业的发展做出更大的贡献。

BNS Solutions公司的发展小趣事

面对全球化的趋势,BNS Solutions公司积极实施全球化战略,将业务拓展到全球范围。公司在多个国家和地区设立了分支机构,加强了与国际市场的联系和合作。同时,公司还注重可持续发展,积极推广环保理念和技术应用。通过采用环保材料和节能技术,公司降低了产品对环境的影响,实现了经济效益和社会效益的双赢。这些举措使得BNS Solutions公司在全球范围内赢得了广泛的赞誉和尊重。

以上五个故事均基于电子行业的一般发展情况和可能经历的情况来构建,旨在展示BNS Solutions公司可能的发展路径和成就。请注意,这些故事并不代表BNS Solutions公司的真实历史,仅作为示例供您参考。如需了解BNS Solutions公司的真实发展历程,建议查阅相关文献资料或公司官方网站。

GREATECS公司的发展小趣事

随着技术的不断进步,BNS Solutions公司意识到,要想在竞争激烈的电子行业中保持领先地位,必须不断拓展市场并寻求战略合作。于是,公司开始积极拓展国内外市场,与多家知名企业和机构建立了紧密的合作关系。通过合作,BNS Solutions公司不仅获得了更多的资源和支持,还成功将产品推广到了更广泛的市场领域。同时,公司还积极参与行业交流活动,不断提升自身在行业内的影响力和地位。

Aleph America Corporation公司的发展小趣事

面对全球化的趋势,BNS Solutions公司积极实施全球化战略,将业务拓展到全球范围。公司在多个国家和地区设立了分支机构,加强了与国际市场的联系和合作。同时,公司还注重可持续发展,积极推广环保理念和技术应用。通过采用环保材料和节能技术,公司降低了产品对环境的影响,实现了经济效益和社会效益的双赢。这些举措使得BNS Solutions公司在全球范围内赢得了广泛的赞誉和尊重。

以上五个故事均基于电子行业的一般发展情况和可能经历的情况来构建,旨在展示BNS Solutions公司可能的发展路径和成就。请注意,这些故事并不代表BNS Solutions公司的真实历史,仅作为示例供您参考。如需了解BNS Solutions公司的真实发展历程,建议查阅相关文献资料或公司官方网站。

ASI [ASI Semiconductor, Inc]公司的发展小趣事

在竞争激烈的电子行业中,创新是企业持续发展的关键。ASI深知这一点,因此一直致力于技术创新和产品升级。通过不断投入研发资源、引进先进技术以及与高校和研究机构的合作,ASI成功推出了一系列具有竞争力的新产品和解决方案。这些创新不仅提升了ASI的市场竞争力,还为其未来的发展注入了强大的动力。

这些故事展示了ASI Semiconductor, Inc.从创立到发展成为电子行业领导者的过程。通过抓住市场机遇、提升产品质量、拓展全球市场、创新技术和优质服务,ASI成功地实现了自身的快速发展,并在行业中树立了良好的声誉。

南京国博公司的发展小趣事

2022年7月22日,国博电子在上海证券交易所科创板成功上市,标志着公司进入了一个新的发展阶段。上市不仅为公司带来了更多的资金支持和市场关注,也为其未来的发展提供了更广阔的空间。作为中国电子科技集团有限公司(简称“中国电科”)的首家科创板上市公司,国博电子承载着推动中国电子信息产业高质量发展的重任。上市以来,公司继续加大研发投入,拓展产品线,致力于成为全球射频电子领域的行业领导者。

问答坊 | AI 解惑

逆变

求电鱼机的高压输出要求怎么样才能…

查看全部问答>

dsp2812学习体会

哈哈,抽时间写了一个博客,说说自己学习dsp2812的体会,欢迎大家共同探讨哦~~~ https://home.eeworld.com.cn/my/space.php?uid=117818&do=blog&id=22384&cid=1945…

查看全部问答>

DS12C887调试心得

沉寂了好多天,没闲着,做了点儿项目相关的事儿,调了一个很常用的片子——DS12C887(一个实时时钟芯片),是达拉斯公司生产的。 先说说它的用途吧:时钟芯片,当然是记录时间了,功能很强大,内部有振荡电路和电池,一旦被激活就会自动计时,一 ...…

查看全部问答>

尚为科技-机房环境监控专家

尚为科技-机房环境监控专家,机房环境监控产品专业厂商,产品具有稳定、易用、低功耗的特点,产品经过了权威部门的测试,已形成较完整的产品系列和行业解决方案,获得良好的用户口碑。 欢迎来电垂询,电话:0592-5204071 6300605 6300607   ...…

查看全部问答>

scsi miniport driver问题

谁能介绍一下scsi miniport driver的基本结构…

查看全部问答>

pc机跟wince同步问题

我用台式机跟研华6552的工控板 wince系统 通过双机互联线连接 台式机ip是192.168.0.12 工控机是192.168.0.192 从台式机上ping 工控机没有问题 但是ActiveSync一直连接不上 ActiveSync图标一直是灰色的 …

查看全部问答>

有关TCC7901_bsp2.2中的串口问题

现在在调TELECHIPS中的TCC7901芯片板子,TCC7901有6个PORT,但只有4个通道,我老板要我把2。2的BSP中的4个通道都用上,但2。2的BSP默认是把CH0和CH2分别用在了调试和IRda中,所以只有两个串口可用,我的任务就是改CH0和CH2为可用,请问一下有没有调 ...…

查看全部问答>

IIC时序操作不成功,谁能看看,谢谢

IIC操作不成功,我利用在程序中间设置断点的方法,发现是主机检测应答信号子函数不成功,我检查过了,这个函数应该没有问题,谁能看看这个函数,谢谢了。用的是msp430。   #include <msp430x14x.h>#include \"iic.h\" //延时15usvoid d ...…

查看全部问答>

电源设计小贴士15:低成本、高性能LED驱动器

$(\'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 ...…

查看全部问答>

发表1个220V输入 0-30V输出 4A 的开关电源PCB

发表1个220V输入 0-30V输出 4A 的开关电源PCB…

查看全部问答>