?? 37.c
字號(hào):
/*******************************************************************
**************重慶東電通信有限公司***************
文件名:SWS—3000加熱軟件(適用于雙面加熱)
版本:V3.5
編寫(xiě):劉賢曙
創(chuàng)建日期:2006.10.7
2006.10.31調(diào)試OK
*******************************************************************/
#include<reg52.h>
#include<intrins.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
/********************以下是I2C通信定義******************/
uchar RCV_WD[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar SEND_WD[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
#define SLVADR 0x40 //本機(jī)地址
union
{
uint I2c_STemperature;
uchar STemperature[2];
}byte;
#define TPL RCV_WD[0] //主機(jī)發(fā)來(lái)的目標(biāo)溫度低位--02h
#define TPH RCV_WD[1] //主機(jī)發(fā)來(lái)的目標(biāo)溫度高位--01h
#define FLOW RCV_WD[2] //主機(jī)發(fā)來(lái)的流量ml/min --03h
#define CWD RCV_WD[3] //主機(jī)發(fā)來(lái)的命令字- -00h
//#define RCV_WD[4] //保留
//#define RCV_WD[5] //保留
//#define RCV_WD[6] //保留
//#define RCV_WD[7] //保留
#define RTPL SEND_WD[0] //從機(jī)發(fā)送的適時(shí)溫度低位--01h
#define RTPH SEND_WD[1] //從機(jī)發(fā)送的適時(shí)溫度高位----00h
//#define SEND_WD[2] //保留
//#define SEND_WD[3] //保留
//#define SEND_WD[4] //保留
//#define SEND_WD[5] //保留
//#define SEND_WD[6] //保留
//#define SEND_WD[7] //保留
#define nop _nop_()
uchar reg_adr; //地址偏移量
sbit SDA = P3^5; //模擬I2C數(shù)據(jù)傳送位
sbit SCL = P3^3; //模擬I2C時(shí)鐘控制位
sbit K_INT = P3^4;
bit slv; //I2c數(shù)據(jù)控制狀態(tài)標(biāo)志位,0為發(fā)送,1為接收
bit DATOK_FLAG; //數(shù)據(jù)接收完標(biāo)志
bit int1bz; //int1執(zhí)行標(biāo)志
/*******以下是AD轉(zhuǎn)換定義************/
sbit AD7705_CLK = P1^3; //AD7705串行時(shí)鐘
sbit AD7705_DIN = P1^4; //AD7705數(shù)據(jù)輸入端
sbit AD7705_DOUT = P1^5; //AD7705數(shù)據(jù)輸出端
sbit AD7705_DRDY = P3^2; //AD770準(zhǔn)備好信號(hào)
sbit AD7705_REST = P1^2; //AD7705復(fù)位信號(hào),低電平復(fù)位
sbit Door = P1^7; //AD結(jié)果和環(huán)境溫度顯示轉(zhuǎn)換開(kāi)關(guān)
/*********以下是環(huán)境溫度采集及加熱板溫度采集定義*********/
sbit DQ = P1^6;
/**************以下是PID調(diào)節(jié)定義************/
uchar Kp; //PID調(diào)節(jié)比例系數(shù)
#define T_C 2 //采樣周期
float error; //當(dāng)前偏差
float last_error; //上一次偏差
float sum_error; //偏差累加和
float P_out,I_out,D_out,PWM_0; //比例項(xiàng)/積分項(xiàng)/微分項(xiàng)
float T_target=0.0; //目標(biāo)溫度
float T_real = 0.0; //當(dāng)前溫度
float PWM = 0; //輸出量
float Ki = 0; //PID調(diào)節(jié)積分系數(shù)
float SV=0;
float Kd = 0;
#define Ti_H 50
#define Td_H 45 //PID調(diào)節(jié)微分系數(shù)
#define Ti_L 50 //積分時(shí)間常數(shù)
#define Td_L 45 //微分時(shí)間常數(shù)
uint TC_CNT = 0;
uchar TC_zhi=0; //采樣周期計(jì)數(shù)器
uchar PWM_CNT= 0 ;
uchar Per = 0; //t:占空比計(jì)數(shù)器; per:輸出百分比
sbit LED2 = P2^3; //加熱狀態(tài)?燈亮表示正在加熱,燈滅表示停止加熱
sbit LED3 = P2^4; //通信指示,燈亮表示正在通信
sbit PID_SW = P1^0; //加熱控制執(zhí)行
sbit sanre = P1^1; //散熱風(fēng)扇控制
bit PID_flag = 0; //PID運(yùn)算允許標(biāo)志
//bit sanre_flag;
bit First_flag=0;
bit End_flag=0;
bit DY_flag=0;
/**********微秒延時(shí)函數(shù)********/
void delay_US(uchar i)
{
while(i--);
}
/****************************************************
*函數(shù)原形: void Write_7705(uchar word)
*功能: 寫(xiě)AD7705
*參數(shù): AD7705控制命令
*返回值:無(wú)
****************************************************/
void Write_7705(uchar Byte)
{
uchar i;
AD7705_CLK = 1;
for(i=8;i>0;i--)
{
if(Byte&0x80) AD7705_DIN = 1;
else AD7705_DIN = 0;
AD7705_CLK = 1;
nop;
AD7705_CLK = 0;
nop;
AD7705_CLK = 1;
Byte <<= 1;
}
AD7705_CLK = 1;
nop;
AD7705_DIN = 0;
}
/****************************************************
**函數(shù)原形:uint Read_7705()
**功能:讀AD7705轉(zhuǎn)換后數(shù)據(jù)
**參數(shù):無(wú)
**返回值:轉(zhuǎn)換結(jié)果
*****************************************************/
uint Read_7705(void)
{
uchar i,j,k=4;
uint AD_data=0x0000;
long int sum_data=0;
for(j=0;j<8;j++)
{
Write_7705(0x38);
AD7705_CLK=1;
while(AD7705_DRDY==1)
{ delay_US(100);
k-- ;
if(!k) break;
}
for(i=16;i>0;i--)
{
AD_data=AD_data<<1;
AD7705_CLK=0;
nop;
AD7705_DOUT=1;
if(AD7705_DOUT) AD_data|=0x0001;
else AD_data|=0x0000;
AD7705_CLK=1;
}
AD7705_CLK=1;
nop;
AD7705_DIN=1;
sum_data+=AD_data;
AD_data=0x0000;
}
AD_data=sum_data>>3;
return(AD_data);
}
/*******************************************************
**函數(shù)原形: void Init_7705(void)
**功能:初始化AD7705,設(shè)置為20HZ更新率、雙極性、自校準(zhǔn)、增益128
**參數(shù):無(wú)
**返回值:無(wú)
*********************************************************/
void Init_7705(void) //初始化7705
{
uchar i;
AD7705_CLK=1;
nop;
AD7705_DIN=1;
for (i=0;i<40;i++) // AD7705復(fù)位
{
AD7705_CLK=0;
nop;
AD7705_CLK=1;
}
Write_7705(0x20); //寫(xiě)通信寄存器設(shè)置通道1 選擇下一個(gè)操作是寫(xiě)時(shí)鐘寄存器
Write_7705(0x04); //寫(xiě)時(shí)鐘寄存器設(shè)置更新速率為20Hz
Write_7705(0x10); //通道1 ,下一個(gè)寫(xiě)設(shè)置寄存器
Write_7705(0x7a); //寫(xiě)設(shè)置寄存器,設(shè)置成雙極性、增益為128、自校準(zhǔn)
}
/********************************************************
**
**環(huán)境溫度采集
**
**
********************************************************/
Init_DS18B20(void)
{
uchar x = 0;
DQ = 1; //DQ復(fù)位
delay_US(8);
DQ = 0; //拉低
delay_US(80); //延時(shí) 480us
DQ = 1; //拉高總線
delay_US(14); //稍延時(shí)后 如果DQ=0則初始化成功 DQ=1則初始化失敗
x = DQ;
delay_US(20);
}
/*******************************************************
**函數(shù)原形:Read_byte(void )
**函數(shù)功能:讀18B20一個(gè)字節(jié)
**參數(shù):無(wú)
**返回值:讀出的數(shù)據(jù)
********************************************************/
Read_byte(void )
{
uchar i = 0,dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號(hào)
dat >>= 1;
DQ = 1; // 給脈沖信號(hào)
if(DQ)
dat |= 0x80;
delay_US(4);
}
return(dat);
}
/*******************************************************
**函數(shù)原形:void Write_byte(uchar dat)
**函數(shù)字功能:向DS18B20寫(xiě)入命令
**參數(shù):命令數(shù)據(jù)
**返回值:無(wú)
********************************************************/
void Write_byte(uchar dat)
{
uchar i = 0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_US(5);
DQ = 1;
dat >>= 1;
}
}
/*******************************************************
**函數(shù)原形:uint Read_Temp_surr(void)
**函數(shù)功能:讀取DS18B20數(shù)據(jù)并計(jì)算出溫度
**參數(shù):無(wú)
**返回值:溫度
********************************************************/
uint Read_Temp_surr(void)
{
uchar th=0,tl=0;
uint temp=0;
EA=0; //禁T0中斷
Init_DS18B20();
Write_byte(0xCC); // 跳過(guò)讀序號(hào)列號(hào)的操作
Write_byte(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
Init_DS18B20();
Write_byte(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作
Write_byte(0xBE); //讀取溫度寄存器
tl=Read_byte(); //低字節(jié)
th=Read_byte(); //高字節(jié)
EA=1;
temp=(uint)((th*256+tl)/16.0*10);
return temp;
}
/***************************************
定時(shí)器初始化
****************************************/
void T_Init()
{
TMOD = 0xe1 ; //定時(shí)器工作方式:定時(shí)器1外控、計(jì)數(shù)方式2,定時(shí)器0、方式1
IE = 0x0a ; //開(kāi)外中斷INT0
PT1 = 1 ; //定時(shí)器1中斷優(yōu)先
TH1 = 0x0ff ;
TL1 = 0x0ff ;
TH0 = 0xd8; //定時(shí)初值10MS
TL0 = 0xef;
nop;
EA = 1 ; //總中斷開(kāi)放
TR1 = 1 ; //啟動(dòng)T1
}
/*****************************************************
**函數(shù)原形
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -