历史上的今天
返回首页

历史上的今天

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

正在发生

2019年11月25日 | PIC16f877a单片机DS18b20源程序

2019-11-25 来源:51hei

//调试总结:
//显著的问题是,写时序、读时序中,PIC MCU向总线写1是通过改方向为输入方向由上拉电阻拉高数据线实现的,而非在输出方向下输出1,与AVR不同
//某IO口8位未全使用时,对整个IO口读取进行位运算无效
//使用if(dat2&0xf8==0xf8)时,进错分支导致显示乱码仍未找到原因,用if(dat2>=240)代替正常


#include

#define uchar unsigned char

#define uint unsigned int

#define rs_h (PORTC|=0x01)

#define rs_l (PORTC&=0xfe)

#define rs_o (TRISC&=0xfe)

#define rw_h (PORTC|=0x02)

#define rw_l (PORTC&=0xfd)

#define rw_o (TRISC&=0xfd)

#define en_h (PORTC|=0x04) 

#define en_l (PORTC&=0xfb)

#define en_o (TRISC&=0xfb)

#define temp_h (PORTC|=0x08) 

#define temp_l (PORTC&=0xf7) 

#define temp_o (TRISC&=0xf7)

#define temp_i (TRISC|=0x08)

#define led_o (TRISC&=0xef)

#define led_l (PORTC&=0xef)

#define led_h (PORTC|=0x10)

#define LCD PORTB

uchar dat1,dat2;//保存读出的温度z

unsigned long int dat;

void delayms(uint x) //4M晶振下,延时1ms

{

        uint y,z;

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

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

}

void Ds18b20_reset(void)//DS18B20初始化

{

        uint count;

        uchar i,flag=1;

        temp_o;

        temp_l;

        for(count=60;count>0;count--);//延时480us

        temp_i;

        while(flag)

        {

                //temp=PORTC;//此例中,C口部分引脚未使用处于高阻态,对整个C口的读取无效,所以if(RC3)不能换成if(temp&0x08==0x08)

                if(RC3)//temp&0x08==0x08)

                        flag=1;

                else

                        flag=0;        

        }

        led_o;

        led_l;//开指示灯

        for(count=60;count>0;count--);//延时480us

}

void Ds18b20_write(uchar datt)//向DS18B20写一个字节

{

        uchar count;

        uchar i;

        temp_o;

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

        {

                temp_o;

                temp_l;

                for(count=1;count>0;count--);

                //temp_h;//不能有此语句

                if(datt&0x01==0x01)

                        temp_i;

                else

                {        

                        temp_o;

                        temp_l;

                }

                for(count=23;count>0;count--);//延时60us

                temp_i;

                for(count=1;count>0;count--);

                datt>>=1;        

        }        

}

uchar Ds18b20_read(void) //从DS18B20读一个字节

{

        uchar i,datt;

        uchar count;

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

        {

                datt>>=1;

                temp_o;

                temp_l;

                for(count=1;count>0;count--);

                temp_i;//改为输入方向时,上拉电阻把数据线拉高,释放总线,此语句必须有,参考datasheet的P15

                for(count=1;count>0;count--);

                if(RC3)//(PORTC&0x08==0x08)//换成(PORTC&0x08==0x08)后程序不正确

                        datt|=0x80;

                for(count=23;count>0;count--);//延时60us        

        }

        return datt;

}

void lcd_com(uchar com)//向LCD1602写命令

{

         rs_o;

        rw_o;

        en_o;

        TRISB=0x00;//配置RB为输出方向

        rs_l;        

        rw_l;

        LCD=com;

        delayms(1);

        en_h;

        delayms(1);        

        en_l;

        delayms(1);                

}

void lcd_dat(uchar dat)//向LCD1602写数据

{

         rs_o;

        rw_o;

        TRISB=0x00;//配置RB为输出方向

        en_o;

        rs_h;        

        rw_l;

        LCD=dat;

        delayms(1);

        en_h;

        delayms(1);

        en_l;

        delayms(1);        

}

void lcd_write(uchar c,uchar r,uchar dat)//向LCD1602指定行、指定列、写数据

{

        lcd_com(0x80+0x40*c+r);

        lcd_dat(dat);

        delayms(1);

}

void lcd_init(void)//LCD1602初始化,初始化后第一行显示temperature:,第二行显示.C

{

        lcd_com(0x38);

        lcd_com(0x0c);

        lcd_com(0x06);

        lcd_write(0,2,0x54);

        lcd_write(0,3,0x65);

        lcd_write(0,4,0x6d);

        lcd_write(0,5,0x70);

        lcd_write(0,6,0x65);

        lcd_write(0,7,0x72);

        lcd_write(0,8,0x61);

        lcd_write(0,9,0x74);

        lcd_write(0,10,0x75);

        lcd_write(0,11,0x72);

        lcd_write(0,12,0x65);

        lcd_write(0,13,0x3a);

        lcd_write(1,11,0xdf);

        lcd_write(1,12,0x43);

}

void show(void)//把温度值送LCD1602显示

{

        uchar flag;

        uchar t[4];

        uint temp;

        if(dat2>=240)//遗留问题,温度为25时读出dat1=144,dat2=1正确,但却进入if(dat2&0xf8==0xf8)分支导致显示乱码;

        {

                dat= (~(dat2*256+dat1)+1)*(0.0625*10);//取反加一,保留一位小数

                flag=1;

        }

        else

        {

                dat=(dat2*256+dat1)*(0.0625*10);

                flag=0;

        };

        temp=dat%10;

        t[0]=(0x30+temp);

        temp=dat%100;

        temp=temp/10;

        t[1]=(0x30+temp);

        temp=dat%1000;

        temp=temp/100;

        t[2]=(0x30+temp);

        temp=dat/1000;

        t[3]=(0x30+temp);

        if(flag==1)//负温度显示

        {

                lcd_write(1,10,t[0]);

                lcd_write(1,9,0xa5);

                lcd_write(1,8,t[1]);

                lcd_write(1,7,t[2]);

                lcd_write(1,6,t[3]);

                lcd_write(1,5,0x2d);

        }

        if(flag==0)//正温度显示

        {

                lcd_write(1,10,t[0]);

                lcd_write(1,9,0xa5);

                lcd_write(1,8,t[1]);

                lcd_write(1,7,t[2]);

                lcd_write(1,6,t[3]);

                lcd_write(1,5,0x20);//显示空格,刷掉负号

        }

}

void main(void)

{

        lcd_init();

        while(1)

        {

                Ds18b20_reset();

                Ds18b20_write(0xcc);

                Ds18b20_write(0x44);//发送温度转换命令

                delayms(1000);//延时1s,等待温度转换完成

                Ds18b20_reset();

                Ds18b20_write(0xcc);

                Ds18b20_write(0xbe);//发送读温度寄存器命令

                dat1=Ds18b20_read();

                dat2=Ds18b20_read();

                show();

                led_h;//关指示灯

推荐阅读

史海拾趣

Andon Electronics公司的发展小趣事

Andon Electronics 是一家全球领先的电子元件制造商,以下是该公司发展的相关故事:

  1. 公司成立与初期发展:Andon Electronics 成立于 1984 年,总部位于美国加利福尼亚州。最初,公司主要从事 LED 和其他电子元件的生产和销售。由于对高质量产品和客户服务的执着追求,公司迅速赢得了客户的信任和好评。

  2. 技术创新与产品拓展:随着市场需求的变化和技术的进步,Andon Electronics 不断进行技术创新,并逐步扩大产品线。除了 LED 产品外,公司还推出了多种其他电子元件,包括连接器、电缆组件、线束和传感器等。这些产品在汽车、工业、通信和消费电子等领域得到了广泛应用。

  3. 质量管理和认证:Andon Electronics 一直致力于质量管理和产品认证,确保产品符合国际标准和客户要求。公司拥有 ISO 9001 质量管理体系认证,并不断优化生产流程和质量控制体系,以确保产品质量的稳定性和可靠性。

  4. 全球布局和市场拓展:随着业务的不断发展,Andon Electronics 在全球建立了多个生产基地和销售办事处。除了在美国的总部和生产基地外,公司还在亚洲、欧洲和其他地区设立了办事处和生产工厂,以更好地服务全球客户,并适应当地市场的需求。

  5. 可持续发展和未来展望:Andon Electronics 将继续致力于技术创新、产品拓展和质量管理,以满足客户不断变化的需求。公司将继续关注环保和可持续发展,推动节能减排和资源利用效率的提升。同时,Andon Electronics 也将积极响应行业的变革和挑战,不断调整战略,保持在电子元件制造业的领先地位。

Chino-Excel公司的发展小趣事

随着公司规模的扩大,Chino-Excel公司开始实施全球化战略布局。公司先后在多个国家和地区设立研发中心和生产基地,以充分利用当地资源和市场优势。同时,公司加强与全球合作伙伴的紧密合作,共同开发新产品和技术,进一步巩固了在全球市场的地位。

汇顶科技(GOODiX)公司的发展小趣事

随着公司规模的扩大,Chino-Excel公司开始实施全球化战略布局。公司先后在多个国家和地区设立研发中心和生产基地,以充分利用当地资源和市场优势。同时,公司加强与全球合作伙伴的紧密合作,共同开发新产品和技术,进一步巩固了在全球市场的地位。

Electro Technik Industries公司的发展小趣事

随着电子技术的快速发展,ETI意识到只有不断创新才能在竞争中立于不败之地。公司加大了对研发的投入,积极引进国内外先进技术,并鼓励员工提出创新性的想法。在一次偶然的实验中,ETI的研发团队成功研发出了一种具有高效能、低功耗特点的电子元器件,这一突破性的技术成果迅速获得了市场的认可,为ETI带来了可观的收益。

Eureka Microelectronics Inc公司的发展小趣事

为了支持公司的持续发展和业务扩张,Eureka成功完成了多轮融资。这些融资不仅为公司提供了充足的资金支持,也吸引了众多投资者的关注。借助这些资金,Eureka加大了在研发、生产、销售等方面的投入,进一步提升了公司的竞争力和市场地位。同时,公司也积极开展战略合作,与上下游企业建立了紧密的合作关系,共同推动产业链的发展。

歌尔(Goertek)公司的发展小趣事

Eureka一直重视研发实力的提升和技术创新。公司拥有一支专业的研发团队,致力于新技术的研发和应用。近年来,Eureka在人工智能、物联网等领域取得了多项技术突破,推出了一系列具有竞争力的新产品。这些技术的突破和应用,不仅提升了Eureka的产品性能和质量,也推动了公司在行业内的领先地位。

问答坊 | AI 解惑

2008-10-18,TI C64x网络开发应用技术讲座邀请函

——AKA阿卡技术沙龙之DSP篇 2008年10月18日,AKA阿卡技术沙龙之DSP技术讲座在北京交通大学九教中102室举行,大会特邀了闻亭数字技术总监——尚高,就德州仪器(TI)公司最新推出的TI C64x网络开发应用技术做主题演讲。 德州仪器(TI)公司作为模拟 ...…

查看全部问答>

MSP430最小系统资料

本最小系板购于淘宝,位开发热量表而购置的。 焊接前: 焊接后: MSP430F149最小系统原理图及其使用手册:…

查看全部问答>

试问从51单片机到ARM的路有多远

RT      望有经验之大师,谈谈彼此之间想法, 以借我们菜鸟分享学习~~~~…

查看全部问答>

evc显示汉字问题

我在查询程序中,在“类型”一项里需要有中文的显示。但在开发板里显示的是□□□,请问高手怎样才能让它显示汉字?我的查询显示语句是strTemp.Format(_T(\"%s-车号%s-类型%s-毛重%s-皮重%s-净重%s\"),q.fieldValue(1),q.fieldValue(2),q.fieldValu ...…

查看全部问答>

将要进入嵌入软件开发 的人

各位大哥们,我还是一个大一的学生,现在听说嵌入开发还可以,所以就有一点想向这一方面发展,但是现在在我面前的一个问题就是 我不知道要学那些东西,我也是一个计算机班的学生,这是不是有很大的优点. 所以就想问一下大哥们的应该出什么方向入手好一 ...…

查看全部问答>

nb0和nb1的问题

小弟最近用wince5.0编译内核,发现在某些情况下会生成。nb1文件,比如说eboot.nb1这种情况看了一些说法是eboot.nb0空间不够存放内核,所以放到eboot.nb1中,但是查看eboot.bin文件发现空间还多的是。在有些时候会出现上面的情况。我用的AT91SAM9261 ...…

查看全部问答>

解答FPGA工程师面试第一题+第二题(每日一题)...............................

1.同步电路与异步电路的区别是什么? 异步电路主要是组合逻辑电路,用于产生地址译码器、FIFO或RAM的读写控制信号脉冲,但它同时也用在时序电路中,此时它没有统一的时钟,状态变化的时刻是不稳定的,通常输入信号只在电路处于稳定状态时才 ...…

查看全部问答>

关于JLINK选项在MDK中的设置问题

选中RDI Interface Driver后,设置Settings的时候出现错误提示对话框:Error:Cannot load driver \'C:\\Keil\\ARM\\BIN\\AGDIRDI.DLL\'.,…

查看全部问答>

EDA实验与实践 filter_200us

module filter_200us(clk,in,out); input  clk; input  in; output out; reg[19:0] cnt; reg          out_r; always @(posedge clk) begin     if(in == 1\'h1)    ...…

查看全部问答>

NXP LPC1768宝马开发板第十章ADC

第十章    宝马1768——ADC 开发环境:集成开发环境μVision4 IDE版本4.60.0.0主机系统:Microsoft Windows XP开发平台:旺宝NXP LPC1768开发板 10.1 TIME定时器10.2 硬件描述10.3 程序说明10.4 实验现象 1、LPC1768_ADC:LPC1768 ...…

查看全部问答>