📄 text1.c
字号:
/********************************************************
file name: temprature control system
date : 2007-8-9
author : dalfer
instruction:关于温度显示的简单程
序为ds18b20单总线温度传感器,dq端接这p1.7,
*********************************************************/
#include <reg51.h>
#include <stdio.h>
#include <ctype.h>
#include <intrins.h>
#include <absacc.h>
/***************************************************************/
#define bit_add XBYTE[0X7FFF]
#define seg_add XBYTE[0XBFFF]
#define uchar unsigned char
#define uint unsigned int
#define SET 5000//设定
#define K 3//比例系数
#define TI 2//积分常数
#define TD 1//微分常数
#define T 1//采样周期
/***************************************************************/
char table[]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
char disp_dot[11]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xc0};
int ek=0;
int ek_1=0;
int ek_2=0;
int pt;
int it;
int dt;
int departure;
int result;
uint time;
uint point;
/***************************************************************/
sbit DQ=P1^0;
sbit con=P1^1;//低电平加热
sbit set_dis=P1^2;
sbit add=P1^3;
sbit sub=P1^4;
/***************************************************************/
bit inc_flag=0;//增频
bit dec_flag=0;//减频
bit dis_flag=0;//显示设定
/***************************************************************
*函数名称(function name): delay_18B20
*函数功能(function funcation): delay
*入口参数(in parameter): i
*出口参数(out parameter): NO
*备注(remark): 晶振12MHz
****************************************************************/
void delay_18B20(unsigned int i)
{
while(i--);
}
/***************************************************************
*函数名称(function name): Init_DS18B20
*函数功能(function funcation): Initialize DS18B20
*入口参数(in parameter): NO
*出口参数(out parameter): NO
*备注(remark): NO
****************************************************************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay_18B20(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay_18B20(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay_18B20(20);
}
/***************************************************************
*函数名称(function name): ReadOneChar
*函数功能(function funcation): Read a byte data
*入口参数(in parameter): NO
*出口参数(out parameter): NO
*备注(remark): NO
****************************************************************/
int ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/***************************************************************
*函数名称(function name): WriteOneChar
*函数功能(function funcation): Write a byte data
*入口参数(in parameter): dat
*出口参数(out parameter): NO
*备注(remark): NO
****************************************************************/ //写一个字节
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}
/***************************************************************
*函数名称(function name): ReadTemperature
*函数功能(function funcation): Read temprature
*入口参数(in parameter): NO
*出口参数(out parameter): NO
*备注(remark): NO
****************************************************************/
int ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay_18B20(100);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
//传感器返回值除16得实际温度值
//为了得到2位小数位,先乘100,再除16,考虑整型数据长度,
//技巧处理后先乘25,再除4,除4用右移实现
t = (b*256+a)*25;
return( t >> 2 );
}
/***************************************************************
*名称(name): time1
*功能(funcation): PWM
*备注(remark): NO
****************************************************************/
void time1(void) interrupt 3 using 3
{
TR1=0;
ET1=0;
EA=0;
if(dec_flag==1)//低电平变窄,高电平变宽
{
++time;
if(time<(point))
{
con=0;
}
if(time>=(point))
{
con=1;
}
if(time>500)
{
time=0;
}
}
TR1=1;
ET1=1;
TH1=0xff;//100um
TL1=0xfe;
}
/***************************************************************
*函数名称(function name): disp
*函数功能(function funcation): Display temprature on 7SEG-LED
*入口参数(in parameter): NO
*出口参数(out parameter): NO
*备注(remark): NO
****************************************************************/
void disp(void)
{
unsigned int tmp;
tmp =ek;
bit_add = 0xff;
seg_add = table[tmp%10];
bit_add = 0xf7;
delay_18B20(100);
bit_add = 0xff;
seg_add = table[tmp/10%10];
bit_add=0xfb;
delay_18B20(100);
bit_add = 0xff;
seg_add = disp_dot[tmp/100%10];
bit_add = 0xfd;
delay_18B20(100);
bit_add = 0xff;
seg_add = table[tmp/1000];
bit_add= 0xfe;
delay_18B20(100);
}
/***************************************************************
*函数名称(function name): control
*函数功能(function funcation):
*入口参数(in parameter): NO
*出口参数(out parameter): NO
*备注(remark): NO
****************************************************************/
void control(void)
{
delay_18B20(100);
disp();
if(ek<4500) //一直加热
{con=0;
EA=0;
dec_flag=0;
}
if((ek>=4500)&&(ek<=5000))//PID
{
TR1=1;
ET1=1;
EA=1;
if((ek>=4500)&&(ek<5000))//pid
{
point=SET-ek;//5000-45**的值
dec_flag=1;//低电平变窄,高电平变宽
}
if(ek==5000)
{
con=1;
}
}
if(ek>5000) //保持停止加热
{
con=1;
EA=0;
dec_flag=0;
}
}
/***************************************************************
*函数名称(function name): main
*函数功能(function funcation): realize temprature controlled
*入口参数(in parameter): NO
*出口参数(out parameter): NO
*备注(remark): NO
****************************************************************/
void main(void)
{
PT1=1;//中断优先
TH1=0xff;//100um
TL1=0xfe;
con=0;
while(1)
{
ek=ReadTemperature();
control();
if((dec_flag==1))
{
TR1=1;
ET1=1;
EA=1;
}
if((dec_flag==0))
{
TR1=0;
ET1=0;
EA=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -