历史上的今天
今天是: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位数码管全动态输出*/ }
史海拾趣
|
我们公司现在做一个报警控制器,需要支持Contact Id 协议,但自己以前没有做过,而且那个协议文档写的不是很清楚,希望以前做过的能指点一下,或者也可以和我们公司合作(你以前做过硬件电路和软件实现)。 QQ:275556641 Email: yuangangaaa@163 ...… 查看全部问答> |
|
想问一下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怀表”这是一个DIY作品,作者觉得这可能是第一个LED怀表,来自Paul,其对祖父留下来的一个旧怀表进行改造,当然能用的也只有怀表的外壳。 怀表里面一共安装了133个LED,每一个都是手工焊接而成,LED可显示60秒、60分钟和12小时,另外还有一 ...… 查看全部问答> |
|
我下的iar ewarm5.30照别个说的方法怎么补能破解呢? 未命名.JPG (53.53 KB) 下载次数:7 2010-6-15 20:52 … 查看全部问答> |
|
帮忙看看2407点灯的程序吧,为什么lacc #8语句中输入>8的数时,在单步调试运行时,延时程序就跳不出来了,好像死机了似的。可是lacc #8语句中输入<=8的数就什么问题都没有。快帮忙看看吧,我都在这个问题上停留好长 ...… 查看全部问答> |




