这是DS18B20温度上下限控制的原理图和源程序
原理图:
单片机源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #include <DS18B20.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define SMGIO P0
- sbit SET=P1^0; //定义设定上下限键
- sbit ADD=P1^1; //定义增加键
- sbit DEC=P1^2; //定义减小限键
- sbit SMG1=P2^0; //定义数码管第一位
- sbit SMG2=P2^1; //定义数码管第二位
- sbit SMG3=P2^2; //定义数码管第三位
- sbit SMG4=P2^3; //定义数码管第四位
- sbit BEEP=P2^5; //定义蜂鸣器报警
- uint tempValue; //变量 存储当前温度值
- uint HI_Alarm=30; //初始上限
- uint LO_Alarm=10; //初始下限
- uchar SMG_CC[]={0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,0x45,0xdf,0xd7}; //共阴极数码管0-9编码
- uchar SMG_CC_DOT[]={0x7f,0x64,0xbd,0xf5,0xe6,0xf3,0xfb,0x65,0xff,0xf7}; //共阴极数码管0-9编码 带小数点
- /********************************************************************/
- /* 1ms延时 */
- /********************************************************************/
- void delayms(uint x)
- {
- uchar i;
- while(x--)
- {
- for(i=150;i>0;i--);
- }
- }
- void Display_Temperature() //显示温度
- {
- char smg1,smg2,smg3,smg4;
- smg1=tempValue/1000; //以下表示将温度值拆分开
- smg2=(tempValue-smg1*1000)/100;
- smg3=(tempValue%100)/10;
- smg4=tempValue%10;
- if(tflag==1) //负数显示
- {
- SMGIO=SMG_CC[smg4]; //显示小数位
- SMG4=0;
- delayms(1);
- SMG4=1;
- SMGIO=SMG_CC_DOT[smg3]; //显示个数位
- SMG3=0;
- delayms(1);
- SMG3=1;
- if(smg2==0)
- {
- SMGIO=0x40; //显示十数位
- SMG2=0;
- delayms(1);
- SMG2=1;
- SMGIO=0x00; //显示百数位
- SMG1=0;
- delayms(1);
- SMG1=1;
- }
- else
- {
- SMGIO=SMG_CC[smg2]; //显示十数位
- SMG2=0;
- delayms(1);
- SMG2=1;
- SMGIO=0x40; //显示十数位
- SMG1=0;
- delayms(1);
- SMG1=1;
- }
- }
- else //正数显示
- {
- SMGIO=SMG_CC[smg4]; //显示小数位
- SMG4=0;
- delayms(1);
- SMG4=1;
- SMGIO=SMG_CC_DOT[smg3]; //显示个数位
- SMG3=0;
- delayms(1);
- SMG3=1;
- if(smg1==0)
- {
- SMGIO=0x00;
- SMG1=0;
- delayms(1);
- SMG1=1;
- if(smg2==0)
- {
- SMGIO=0x00;
- SMG1=0;
- delayms(1);
- SMG1=1;
- }
- else
- {
- SMGIO=SMG_CC[smg2];
- SMG2=0;
- delayms(1);
- SMG2=1;
- }
- }
- else
- {
- SMGIO=SMG_CC[smg1];
- SMG1=0;
- delayms(1);
- SMG1=1;
- SMGIO=SMG_CC[smg2];
- SMG2=0;
- delayms(1);
- SMG2=1;
- }
-
- }
- }
- void Display_HI_Alarm()
- {
- SMGIO=0xce; //显示H
- SMG1=0;
- delayms(1);
- SMG1=1;
- SMGIO=0x80; //显示-
- SMG2=0;
- delayms(1);
- SMG2=1;
- SMGIO=SMG_CC[HI_Alarm/10]; //显示报警高值十位
- SMG3=0;
- delayms(1);
- SMG3=1;
- SMGIO=SMG_CC[HI_Alarm%10]; //显示报警高值个数位
- SMG4=0;
- delayms(1);
- SMG4=1;
- }
- void Display_LO_Alarm()
- {
- SMGIO=0x1a; //显示L
- SMG1=0;
- delayms(1);
- SMG1=1;
- SMGIO=0x80; //显示-
- SMG2=0;
- delayms(1);
- SMG2=1;
- SMGIO=SMG_CC[LO_Alarm/10]; //显示报警高值十位
- SMG3=0;
- delayms(1);
- SMG3=1;
- SMGIO=SMG_CC[LO_Alarm%10]; //显示报警高值个数位
- SMG4=0;
- delayms(1);
- SMG4=1;
- }
- void SET_KEY()
- { bit SET_FLAG=1;
- if(SET==0) //设定按键按下
- {
- delayms(40);
- if(SET==1) //延时去除抖动再次判断是否按下按键
- {
- while(SET_FLAG==1)
- {
- Display_HI_Alarm(); //设定上限温度值
- if(ADD==0) //增加按键
- {
- delayms(40); //延时去除抖动再次判断是否按下按键
- if(ADD==1)
- HI_Alarm++; //温度值加一
- }
- if(DEC==0) //减小按键
- {
- delayms(40);
- if(DEC==1) //延时去除抖动再次判断是否按下按键
- HI_Alarm--; //温度值减一
- }
- if(SET==0) //以下表示 再次按下设定按键 进入设定下限程序
- {
- delayms(40);
- if(SET==1) //延时去除抖动再次判断是否按下按键
- {
- while(1)
- {
- Display_LO_Alarm(); //设定下限温度值
- if(ADD==0) //增加按键
- {
- delayms(40);
- if(ADD==1) //延时去除抖动再次判断是否按下按键
- LO_Alarm++; //温度值加一
- }
- if(DEC==0) //减小按键
- {
- delayms(40);
- if(DEC==1) //延时去除抖动再次判断是否按下按键
- LO_Alarm--; //温度值减一
- }
- if(SET==0) //设定按键按下
- {
- delayms(40);
- if(SET==1)
- { //延时去除抖动再次判断是否按下按键
- SET_FLAG=0;
- break; //上下限设定完成 退出
- }
- }
- }
- }
- }
- }
- }
- }
- }
- void BJ_LED()
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
程序.doc
(37.5 KB, 下载次数: 61)
4、word原理图.doc
(21 KB, 下载次数: 35)
|