历史上的今天
返回首页

历史上的今天

今天是:2024年10月12日(星期六)

正在发生

2020年10月12日 | 单片机动态数码管显示DS18B20测温显示程序

2020-10-12 来源:51hei

动态数码管显示DS18B20测温显示,折腾好几天了,终于搞定了,开始要么不能正常显示温度,要么乱跳动。究其原因是DS18B20读写的时序太严格了,程序中动态数码管显示需要开定时中断扫描显示,折腾多天的问题就是这个定时中断打断了正常的读写时序。

单片机源程序如下:

/*********

测试DS18B20测温数码管动态显示

**********/

#include

#include"ds18b20.h"


#define uchar unsigned char

#define uint  unsigned int


#define LedDuan  P0      /*定义数码管段码的控制脚*/

#define LedWei P2    /*定义数码管位码的控制脚*/


sbit        Out0=P3^2;//增氧泵控制输出


uchar code NumTab[]={//显示段码共阳码64231750

0x21,0xEB,0x85,0x83,0x4B,0x13,0x11,0xAB,0x01,0x03,  //"9"

0x09,0x51,0x35,0xC1,0x15,0x1D,0x49,0x75,0x29,0x61,0x0D,0xD1,0xDF,0xFF,0x3D,0xD9};

//A   B     C    D    E   F    H    I    N    U    P    o     -  熄灭  T     n

uchar code DisBit[]={/*0xfe,*/0xfd,0xfb,0xf7,0xef,0xdf,0xbf/*,0x7f*/};//LED位驱动

uchar data DisBuf[6]={0xff,0xff,0xff,0xff,0xff,0xff}; /*显示段码缓冲值*/

uchar data DisBitCnt=0;//显示第几位选择




/*****************************************************************

函数名:毫秒级CPU延时函数

调  用:delay (?);

参  数:1~65535(参数不可为0)

返回值:无

结  果:占用CPU方式延时与参数数值相同的毫秒时间

备  注:应用于1T单片机时i<600,应用于12T单片机时i<125

/******************************************************************/

void DelaymsN(uint t)

{

        uint i;               //定义变量

        for(;t>0;t--)             //如果t大于0,t减1(外层循环)

        for(i=120;i>0;i--);         //i等于124,如果i大于0,i减1

}

/******************************

初始化设置定时器0,2MS at 12Mhz

******************************/

void timeinit() /*定义中断方式*/

{

    TMOD=0x01;  /*定时0,1工作在方式1*/

    TH0=0xf8;//(65535-1000)/256;//定时1MS*2_6Mhz=2Ms

    TL0=0x2f;//(65535-1000)%256;

    ET0=1;     /*开定时器0中断*/


//        ClearEPROM();


//        ReadE2P();//读出设定的值

          EA=1;     /*开总中断*/

        TR0=1;

}

/********

显示数据处理

************/

/*******************************************************************************

* 函 数 名         : LcdDisplay()

* 函数功能                   : LCD显示读取到的温度

* 输    入         : v

* 输    出         : 无

*******************************************************************************/


void DisplayTablex(int temp)          //lcd显示

{

           float tp;  

        if(temp< 0)                                //当温度值为负数

          {

                DisBuf[0] = 0xdf; //显示-号

                //因为读取的温度是实际温度的补码,所以减1,再取反求出原码

                temp=temp-1;

                temp=~temp;

                tp=temp;

                temp=tp*0.0625*100+0.5;       

                //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

                //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

                //算由?.5,还是在小数点后面。


          }

        else

          {                       

                DisBuf[0] = 0xff;

                tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量

                //如果温度是正的那么,那么正数的原码就是补码它本身

                temp=tp*0.0625*100+0.5;       

                //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

                //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

                //算加上0.5,还是在小数点后面。

        }

        DisBuf[1]= NumTab[temp / 10000];

        DisBuf[2]= NumTab[temp % 10000 / 1000];

        DisBuf[3]= NumTab[temp % 1000 / 100] &0xfe;

        DisBuf[4]= NumTab[temp % 100 / 10];

        DisBuf[5]= NumTab[temp % 10];

}


/*****************

主函数

****************************/

void main()

{


        timeinit();//初始化

        while(1)

        {

                DisplayTablex(Ds18b20ReadTemp());

                DelaymsN(200);

                DelaymsN(200);

        }

}


/*****第一种显示方式数据处理****

void Dis0()

{

        DisBuf[0]=NumTab[0];//O

        DisBuf[1]=NumTab[15];//F

        DisBuf[2]=NumTab[15];//F

        DisBuf[3]=0xff;

        DisBuf[4]=0xff;

        DisBuf[5]=0xff;

}  */

/*-----------------------------------------------

显示部分程序,采用定时器0产生中断,2MS更新一次

因为使用晶振为12Mhz

------------------------------------------------*/

void Display() interrupt 1 //using 3

{


        TR0=0;//关定时器0

    TH0=0xf8;//(65535-1000)/256;//定时1MS*2_6Mhz=2Ms

    TL0=0x2f;//(65535-1000)%256;

        LedWei=0xff; /*关闭显示*/

        TR0=1;//打开定时器0


//        Dis0();//第一种显示方式

        /********开始显示******************/

        LedDuan=DisBuf[DisBitCnt]; /*输出段码数据到数码管*/

        LedWei=DisBit[DisBitCnt]; /*输出位码数据到数码管*/

        DisBitCnt++;

        if(DisBitCnt>=6)

        DisBitCnt=0; /*6位数码管全动态输出*/

}


推荐阅读

史海拾趣

Broadcom(博通)公司的发展小趣事

进入21世纪,随着网络泡沫的破灭,博通陷入了严重的财务困境。亏损累计高达65亿美元,股价大幅下跌,公司甚至不得不裁员以维持运营。然而,正是在这样的困境中,博通展现出了坚韧不拔的精神。通过优化产品结构、调整市场策略,博通逐渐走出了低谷,并在2003年推出了全球第一个802.11b单片机,重新赢得了市场的关注。

ERGOBAHCO公司的发展小趣事

在快速发展的同时,ERGOBAHCO公司始终不忘履行社会责任和推动可持续发展。公司积极参与社会公益事业,捐款捐物支持贫困地区的教育、医疗等事业。同时,ERGOBAHCO公司还注重环保和节能减排工作,通过引进先进的环保技术和设备,实现了生产过程的绿色化、低碳化。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

Digilent公司的发展小趣事

作为电子行业的领军企业之一,DIALIGHT始终将技术创新作为公司发展的核心驱动力。公司拥有一支高素质的研发团队和先进的研发设施,不断推出具有创新性和竞争力的LED产品。同时,DIALIGHT还积极与高校、科研机构等合作,共同推动LED照明技术的进步和应用。

FTDI [Future Technology Devices International Ltd.]公司的发展小趣事

随着市场需求的变化,FTDI并未满足于初期的成就,而是积极拓展产品线。他们推出了如MM232R和USB-COM232-PLUS1等接口产品,这些产品在连接性和兼容性上展现了公司强大的技术实力和创新精神。同时,FTDI还涉足USB和其他通信协议的转换领域,满足了多样化的市场需求,进一步巩固了其在电子行业中的地位。

Global Mixed-Mode Technology Inc公司的发展小趣事
报警灯的颜色和数量可以根据实际需求来设定。通常,为了区分不同的缺相情况,可以使用不同颜色的报警灯来对应不同的缺相相别。例如,黄色灯表示L1相缺相,绿色灯表示L2相缺相,红色灯表示L3相缺相。数量上,一般至少需要一个报警灯来指示缺相状态,但也可以设置多个报警灯以增加冗余或提供额外的视觉提示。
CDE [ CORNELL DUBILIER ELECTRONICS ]公司的发展小趣事

近年来,随着新能源市场的蓬勃发展,CDE公司敏锐地抓住了这一机遇。公司积极参与军事和能源应用的高压直流链路电容器市场,并成功推出了针对EV快速充电的高压直流链路电容器。这一产品的推出不仅满足了市场对高效、可靠电容器的需求,也为CDE在新能源领域的发展奠定了坚实基础。

问答坊 | AI 解惑

contact ID 协议 (安定宝协议)

我们公司现在做一个报警控制器,需要支持Contact Id 协议,但自己以前没有做过,而且那个协议文档写的不是很清楚,希望以前做过的能指点一下,或者也可以和我们公司合作(你以前做过硬件电路和软件实现)。 QQ:275556641 Email: yuangangaaa@163 ...…

查看全部问答>

wince6.0 支持TransparentBlt吗?

wince6.0 支持TransparentBlt吗?我在调试的时候该函数返回一直是0,不知道是为什么?各位大虾指导下!…

查看全部问答>

PB 下如何实现USB键盘和鼠标

想问一下Core OS\\Core OS Services\\USB Host Support下的内容已经Add to OS Desgin,但USB的键盘和鼠标还是没有用,并且开机时蜂鸣器长响,是什么原因? 另外,Device Drivers\\USB Function 和USB Host 之间的区别?…

查看全部问答>

[100分!急!]在WinCE里用VC++.NET操作远程SQL Server2000问题

本人想在VS2005上用VC++.NET开发一个基于WinCE 5.0的操作远端的SQL Server2000的程序,怎么写啊. 1. 源代码和具体步骤? 2. 如何使用SQL CE 2,如何在WinCE 上装SQL CE 2? 3. WinCE 上操作远程SQLServer2000数据库非得装SQL CE吗? 4. 如何用V ...…

查看全部问答>

创意手工LED发光怀表

LED怀表”这是一个DIY作品,作者觉得这可能是第一个LED怀表,来自Paul,其对祖父留下来的一个旧怀表进行改造,当然能用的也只有怀表的外壳。   怀表里面一共安装了133个LED,每一个都是手工焊接而成,LED可显示60秒、60分钟和12小时,另外还有一 ...…

查看全部问答>

怎样破解iarewarm5.30?

我下的iar ewarm5.30照别个说的方法怎么补能破解呢? 未命名.JPG (53.53 KB) 下载次数:7 2010-6-15 20:52 …

查看全部问答>

请问IARSTM8的中断程序怎么搞?最好能提供个范本,谢谢!

                                 请问IAR STM8的中断程序怎么搞?最好能提供个范本,谢谢!…

查看全部问答>

帮忙看看2407的程序吧

帮忙看看2407点灯的程序吧,为什么lacc    #8语句中输入>8的数时,在单步调试运行时,延时程序就跳不出来了,好像死机了似的。可是lacc    #8语句中输入<=8的数就什么问题都没有。快帮忙看看吧,我都在这个问题上停留好长 ...…

查看全部问答>

在掉电时存的数不能丢失,如何做呀,

请教给位高手:我需要在MSP430里的某个字节存数,在掉电时存的数不能丢失,如何做呀,谢谢!我用的是MSP430F412.…

查看全部问答>

谈喇叭阻抗问题。

  大家都知道喇叭最常见的是8欧阻抗,用万用表量,通常在8欧左右,小功率的就不说了。如上图这个8欧30W喇叭,满载电压约为15.5V 1.9365A,自损损耗就是30W,这样一算我就怀疑了,它上面标的8欧30W,30W是输出功率还是自身损耗呢???(喇 ...…

查看全部问答>