第一次发帖。泡论坛一段时间,趁国庆有时间做了一个,程序是凑出来的,再修改。哈哈。共阴跟共阳数码管亮度不一样,算不算个性。大于99.9和负温度没有弄,毕竟室内不会出现那么极端的气温。电路图有空再补上,还没画。上图,渣渣的焊工。
渣渣的焊接,废了不少时间。
单片机源程序如下:
- #include "CONFIG.H"
- #include "DS18B20.H"
- #include "SHUMAGUAN.H"
- extern uchar LedBuff[3];
- sbit RED = P1^5;
- sbit YELLOW = P1^7;
- sbit GREEN = P1^3;
- bit flag1s = 0; //1s 定时标志
- //bit SMG_FLAG=0; //数码管刷新标志
- uchar T0RH = 0; //T0 重载值的高字节
- uchar T0RL = 0; //T0 重载值的低字节
- void ConfigTimer0(uint ms);
- void main()
- {
- bit res;
- int temperature; //读取到的当前温度值
- int intT, decT; //温度值的整数和小数部分
- EA = 1; //开总中断
- ConfigTimer0(2); //T0 定时 2ms
- Start18B20(); //启动 DS18B20
- while (1)
- {
- if (flag1s) //每秒更新一次温度
- {
- flag1s = 0;
- res = Get18B20Temp(&temperature); //读取当前温度
- if (res) //读取成功时,刷新当前温度显示
- {
- intT = temperature >> 4; //分离出温度值整数部分 右移后不用乘精度。
- decT = temperature & 0xF; //分离出温度值小数部分
- LedBuff[0]=intT/10;
- LedBuff[1]=intT%10;
- LedBuff[2]=(decT*10)/16;
- if ((intT>35)|(intT<10))
- {
- RED=0;
- YELLOW=1;
- GREEN=1;
- }
- else if ((intT>=15)&&(intT<=28))
- {
- RED=1;
- YELLOW=1;
- GREEN=0;
- }
- else if (((intT>=10)&&(intT<15))|((intT>28)&&(intT<=35)))
- {
- RED=1;
- YELLOW=0;
- GREEN=1;
- }
- Start18B20();
- }
- else //读取失败时,提示错误信息
- {
- Start18B20(); //重新启动下一次转换
- }
- }
- /*if (SMG_FLAG)
- {
- LedRefresh();
- SMG_FLAG=0;
-
- }*/
- }
- }
- /* 配置并启动 T0, ms-T0 定时时间 */
- void ConfigTimer0(uint ms)
- {
- ulong tmp; //临时变量
- tmp = 12000000 / 12; //定时器计数频率
- tmp = (tmp * ms) / 1000; //计算所需的计数值
- tmp = 65536 - tmp; //计算定时器重载值
- // tmp = tmp + 12; //补偿中断响应延时造成的误差
- T0RH = (uchar)(tmp>>8); //定时器重载值拆分为高低字节
- T0RL = (uchar)tmp;
- TMOD &= 0xF0; //清零 T0 的控制位
- TMOD |= 0x01; //配置 T0 为模式 1
- TH0 = T0RH; //加载 T0 重载值
- TL0 = T0RL;
- ET0 = 1; //使能 T0 中断
- TR0 = 1; //启动 T0
- }
- /* T0 中断服务函数,完成 1 秒定时 */
- void InterruptTimer0() interrupt 1
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
DS18B20.rar
(43.15 KB, 下载次数: 20)
|