历史上的今天
返回首页

历史上的今天

今天是:2024年11月18日(星期一)

正在发生

2019年11月18日 | PIC单片机温感器DS18B20 C语言程序代码

2019-11-18 来源:51hei

/*温感器
此为自已写的,已修正时序,自测过延时时间
采用天祥温度转换模块算法
*/

#include

__CONFIG(0X3B31);

#define uint unsigned int

#define uchar unsigned char

#define DQ RC1

#define DQ_DIR TRISC1

#define DQ_HIGH() TRISC1=1

#define DQ_LOW() DQ=0;TRISC1=0


unsigned char shi;           //整数十位

unsigned char ge;            //整数个位

unsigned char shifen;        //十分位

unsigned char baifen;        //百分位

unsigned char qianfen;       //千分位

unsigned char wanfen;        //万分位


const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示数组0


void delayus(char x,char y) //慧净提供的us级的延时

{

char z;     //定义Z

do {     //先执行一次do

  z=y;    //把Y的值给Z

  do{;}while(--z); //do空语句,等待--z,直到z=0结束,do--while语句,延时在这产生

  }     

while (--x);   //同理x在--,再产生延时

}


void delay(uint x)

{

uint a,b;

for(a=x;a>0;a--)

for(b=110;b>0;b--);

}

void display(char shi,char ge,char shifen,char baifen,char qianfen)

{

PORTD=table[shi];

PORTA=0x02;

delay(2);


PORTD=table[ge]|0x80; //或上0x80显示出小数点

PORTA=0x04;

delay(2);


PORTD=table[shifen];

PORTA=0x06;

delay(2);


PORTD=table[baifen];

PORTA=0x08;

delay(2);


PORTD=table[qianfen];

PORTA=0x0a;

delay(2);

}


void init(void)

{

TRISA=0;PORTA=0x00;

TRISC=0xf0;PORTC=1;

TRISD=0;

}


void reset(void)

{

char pe=1;

while(pe)

{

DQ_LOW();

delayus(2,81);       //延时502us

DQ_HIGH();

delayus(4,4);       //延时71us

if(DQ==1)pe=1;  //判断是否响应(响应时拉至低电平),没响应时置1循环重发

else pe=0;   //否则就是响应了,置0以退出循环

delayus(2,81);       //延时502us

}

}


void write_byte(char val)

{

uchar i,temp;

for(i=8;i>0;i--)     //循环8次构成一个字节

{

temp=val&0x01;     //取出,最低位,相与取出1

DQ_LOW();

delayus(1,1);       //延时15us

if(temp==1)DQ_HIGH();   //判断如果取出的是1时拉至高电平,发出去

delayus(3,3);       //延时45us,如果取出的是0时,也发送去

DQ_HIGH();      //拉高至高电平

NOP();NOP();       //延时2us

val=val>>1;      //右移一次以便下次取出

}

}


uchar read_byte(void)

{

uchar i,val=0;

static bit j;   //静态位变量,一个状态位,不能是一个字节

for(i=8;i>0;i--)

{

val=val>>1;   //先移一个位

DQ_LOW();   //拉至低电平

NOP();NOP();NOP();NOP();NOP();NOP(); //延时6us

DQ_HIGH();   

NOP();NOP();NOP();NOP();    //延时4us

j=DQ;    //读取数据线的状态以得到一个状态位,进行数据处理 //所以要定义static bit j;

if(j==1)val=val|0x80;     //数据处理:如果读到是1先放在最高位第1位,再利用逐个后移就构与一个字节了

delayus(1,6);       //延时30us,以重复以上步骤

}

return(val);   //构成1个字节后返回走

}


void get_temp(void)  //01:40:26 //获取温度,器件匹配(多个温感)

{

uchar TLV,THV,num;  //tem1/tem2;还有2个字节温度指令

float aaa;

uint temper;

reset();       //复位

write_byte(0xCC);   //跳过ROM

write_byte(0x44);   //温度转换,需延时

for(num=100;num>0;num--) //原本这里是delay(1000)延时1秒的。可效果却是晃一下就没了,

  display(shi,ge,shifen,baifen,qianfen); //所以用显示的来代替延时,显100次算得差不多就是750ms以上

reset();     //每次操作RAM之前,需复位下18B20,再匹配下

write_byte(0xCC);   //跳过ROM

write_byte(0xBE);   //告诉它,接下来我就要读你的温度了,读暂存器

TLV=read_byte();   //RAM有9个字节(我们只需要2个字节LSB和MSB这两个字节),它读的时候都是从最低位开始读

THV=read_byte();   //01:45:10处+锐志在58:52分处

DQ_HIGH();     //释放总线

aaa=(THV*256+TLV)*0.0625*1000; //(16位的温度数据)*0.0625就是实际的温度(十进制数)

temper=(int)aaa;   //因为编译时警告;有小数点是浮点类到整形转换;我们用强制转换成整形     要把小数点的值取出来(小数点不好取,用乘以100来取)

shi=temper/10000;   //几十点几几分配到五个数码管上,四个数码显示的感觉怪怪的所以用五个数码管;在1:51:00处讲

ge=temper%10000/1000;  //我是要用五个数码管来显示所以就是10000五位数

shifen=temper%1000/100;  //

baifen=temper%100/10;  //

qianfen=temper%10;   // 

}


void main()

{

init ();

while(1)

{

get_temp();

display(shi,ge,shifen,baifen,qianfen);  //没带形参编译器过不了,带类形的形参也过不了

}

}



推荐阅读

史海拾趣

FERYSTER公司的发展小趣事

FERYSTER公司的创始人在一次国际电子展览会上,被一款新型半导体芯片技术深深吸引。他意识到这项技术将引领电子行业的新一轮革命。于是,他果断决定投入大量资金和资源,组建研发团队,对该技术进行深入研究。经过数年的努力,FERYSTER公司成功掌握了这项技术,并推出了基于该技术的全新产品系列。这些产品以其卓越的性能和稳定性,迅速在市场上取得了成功,为公司的快速发展奠定了坚实基础。

CalAmp公司的发展小趣事

随着物联网技术的快速发展,车队管理成为了一个重要的应用领域。CalAmp公司凭借其深厚的技术积累和市场洞察力,成功推出了一款车队管理新解决方案。该方案通过直观的用户界面(UI)设计,为企业、政府和建筑机构提供了更为便捷、高效的车队管理工具。用户可以通过该界面轻松获取关键业务数据,如资产位置、驾驶行为和车辆状态等,从而加快智能决策,提高车队运营效率,降低成本并增强安全性。这一创新解决方案的推出,进一步巩固了CalAmp在车队管理领域的领先地位。

Dawn Electronics Inc公司的发展小趣事

在快速发展的同时,Dawn Electronics Inc公司始终关注社会责任。公司积极参与公益活动,支持教育、环保等事业。同时,公司还注重环保和可持续发展,采用环保材料和生产工艺,减少对环境的影响。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

光磊(GL)公司的发展小趣事

在技术创新的基础上,Dawn Electronics Inc公司开始积极拓展市场。公司加强了与国内外客户的合作,通过提供优质的产品和服务,赢得了客户的信任和支持。同时,公司还注重品牌建设,积极参与行业展会和交流活动,提高了品牌知名度和影响力。这些努力为公司赢得了更多的市场份额和合作机会。

ELPIDA公司的发展小趣事

在被美光收购后,ELPIDA的技术和人才得到了保留和传承。美光利用ELPIDA的技术优势和市场经验,继续推出了一系列高性能的DRAM产品。同时,ELPIDA也在新的领域进行探索和尝试,如生物生产等。这些努力不仅为美光公司带来了新的增长点,也为ELPIDA品牌注入了新的活力。

以上五个故事概述了ELPIDA公司在电子行业中的重要发展历程。这些故事反映了公司在市场竞争中的起伏和挑战,以及公司在技术和市场上的不断探索和创新。

Component General Inc公司的发展小趣事

在技术创新的基础上,Component General Inc公司开始积极拓展市场。公司不仅在国内市场取得了良好的销售业绩,还积极开拓国际市场,与多家海外企业建立了合作关系。同时,公司也注重品牌建设,通过参加各种行业展会、举办技术研讨会等方式,提升公司的知名度和影响力。

问答坊 | AI 解惑

微波式感应控制电路

微波式控制电路是根据多普勒效应进行工作的:由本机振荡电路产生一个固定的高频信号(一般为400~800MHZ),经天线辐射到周围空间。当在天线附近一定距离内有物体运动时,高频信号就会被运动物体反射回来再被天线接收,使原振荡电路的振荡频率和信 ...…

查看全部问答>

电子陶瓷相关术语

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑   在电子工业中能够利用电、磁性质的陶瓷,称为电子陶瓷。电子陶瓷是通过对表面、晶界和尺寸结构的精密控制而最终获得具有新功能的陶瓷。在能源、家用电器、汽车等方面可以广泛应用。 陶瓷基 ...…

查看全部问答>

关于单片机与TC35I遇到的问题

不知道有没有人在做单片机与短信模块连接的时候遇到这样的问题,我用电脑串口监视发送接收数据都是正常的,短信模块联机也是正常的,但单片机串口读不到数据也进了中断,请大家帮忙指点下,有做过类似产品的把原理图给我参考下,看自己的是不是有问 ...…

查看全部问答>

说两个我上初中时候的搞笑事(我自己做的事哦)

今天看看到了一个关于课堂答题的笑话。那我也来说说我的亲身经历吧。 记得是上初二的时候,说明一下:都跟上课打瞌睡有关。 第一次是上英语课,正在迷迷糊糊的瞌睡,忽然听到老师说:这道题选那个答案呢?隐约中听到老师问了好几遍,最后一遍声音 ...…

查看全部问答>

Keil在windows7下的注册问题

最近装了Windows7可KEIL注册老是出问题,用注册机得到的注册码没问题用管理员运行KEIL也提示注册成功,可就是编译时总是提示 *** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED     MODULE:  F:\\PROGRAM ...…

查看全部问答>

2440与pc实时语音通讯

本人新手,任务是2440与pc实时语音wifi通讯,现在摸索找资料阶段。 wifi与pc数据收发之前已经调试通过了。现在是要实现arm接收音频数据。 AC97芯片驱动已通过PB加到WINCE里。这个任务应该怎样实现? 是不是2440在一时间片内接收音频数据,在下一 ...…

查看全部问答>

TIDM6446摄像头

我需要支持ti dm6446板子的摄像头,在网上没搜到,请哪位仁兄能提供以下信息。…

查看全部问答>

大虾救命呀!evc串口问题.....

我用evc编了串口测试程序,用的采集设备大约10k/s数据量向工控板发数据,我无论用waitcommevent还是每过10毫秒readfile串口,一开始能读上来数据,大约过了20小时后就不能读上来数据了。。。。把程序关了重新打开又可以读上来数据了。。。大虾们, ...…

查看全部问答>

周立功的Stellaris®外设驱动库

网上找到的外设驱动资料,不知道发重了没有…

查看全部问答>

C2000版块参与TI DIY数控电源活动召集志愿者

本版块参与人员负责C2000软件部分的编写 ,目前项目组初步决定采用28035。   初步方案如图,28035处理如下模块: 1.根据9路采集的AD信号进行PWM输出控制,频率为200KHZ. 2.面板显示键盘输入 3.主机通讯。   有兴趣参与的坛友可回 ...…

查看全部问答>