?? main.c
字號:
/*************************************************
File name: main.c
Description:
1.本程序文件主要功能:實現儀器運行狀態的控制,讀取當前溫度值,和撥碼開關校準值,控制LED狀態指示燈.
2.void main (void) 主函數調用 init(),ad_read(),temp_control()函數.
3.init():單片機配置的初始化
ad_read():輸出當前采樣的溫度值,act_temp;
輸出當前AD采樣的校準值,adjust_value;
輸出斷路,短路報警,控溫過程中超溫報警;
4. temp_control():控溫程序
Others:
Function List:
1.void main (void) 主函數
2.void init(void) 初始化函數
3.void temp_control() 控溫程序
4.void ad_read() 讀取AD采樣值,并計算當前溫度,判斷儀器運行狀態.
History:
1. Date:
Author:
Modification:
2. ...
*************************************************/
/**/
#include <pic.h>
#include "main.h"
#include <stdlib.h>
/**********************
申明模塊中所調用的函數
***********************/
void init(void);
//void temp_control();
void ad_read();
/*************************
申明變量
*************************/
unsigned char channel; //ad采樣通道變量
unsigned char machine_status; //儀器運行狀態變量
int temp_ad_value; //ad采樣的溫度變量
unsigned int adjust_ad_value; //ad采樣校準值
int control_temp; //控制溫度變量
int i_data,p_data; //pid控制參數
int act_temp; //計算溫度值
int run_control; //pid控制量
extern bit keyok; //按鍵檢測標志位
extern bit error_flag; //超溫報警標志
extern unsigned char led_time; //led閃爍時間控制量
extern int adjust_value; //校準值
extern bit err_time_flag;;
extern unsigned char adjust_num;
extern unsigned int error_time;
extern unsigned char adjust_scan;
extern bit run_flag;
const int ad_value_tab[9]={0x0075,0x00DC,0x014C,0x01BF,0x0232,0x02A3,0x0310,0x0375,0x03D4};//溫度采樣值
// 0, 5, 10, 15, 20, 25, 30, 35, 40
const int adjust_tab[9]={0x0000,0x0088,0x010D,0x0188,0x01F8,0x025F,0x02BE,0x0316,0x0367}; //撥碼開關采樣值。
//-2 ,-1.5, -1.0, -0.5, 0, 0.5, 1.0, 1.5 , 2,
/***********************************************************
Function: ad_read()
Description: 讀取AD采樣值,溫度計算,檢測傳感器,撥碼開關短路報警,斷路報警;超溫報警
以及儀器運行狀態指示燈顯示。
Calls:
Called By: main();
Input:
Output: act_temp;adjust_value;
Return:
Others:
**************************************************************/
void ad_read()
{
unsigned char temp;
temp=0;
if(temp_ad_value>=ad_value_tab[0] && temp_ad_value<=ad_value_tab[8]) //判斷是否在控溫范圍之內.
{
while(temp<=8)
{
if ((temp_ad_value >= ad_value_tab[temp]) && (temp_ad_value <= ad_value_tab[temp+1]))
{
act_temp=(int)(temp*50)+(50*(temp_ad_value-ad_value_tab[temp]))/(ad_value_tab[temp+1]-ad_value_tab[temp]);//計算溫度值
temp=8;
}//end if ((temp_ad_value >= ad_value_tab[temp]) && (temp_ad_value <= ad_value_tab[temp+1]))
temp++;
}//end while(temp<=8)
if(machine_status==stop) //停止狀態指示燈狀態
{
hold_led=false;
if(led_time<25)
{
cool_led=true;
}
else
{
cool_led=false;
}
}//end if (machine_status==stop)
if(machine_status==run) //運行狀態 指示燈狀態
{
if((act_temp-control_temp)>6)
{
cool_led=true; //制冷
hold_led=false;
}
else if((control_temp-act_temp)>6)
{
cool_led=false; //加熱
hold_led=false;
}
else
{
cool_led=false;
hold_led=true; //恒溫
err_time_flag=true;
// error_flag=true;
}
if(error_flag==true && abs(act_temp-control_temp)>30)
{
if(led_time<25)
{
cool_led=true;
hold_led=true; //超溫報警
}
else
{
cool_led=false;
hold_led=false;
}
}
} //end if (machine_status==run)
}//end if(temp_ad_value>=ad_value_tab[0] && temp_ad_value<=ad_value_tab[8])(ad_value_tab[0]-100)(ad_value_tab[8]+38)
else if(temp_ad_value<=0 || temp_ad_value>=0x3FF) //傳感器報警指示燈狀態
{
if(led_time<25)
{
cool_led=true;
hold_led=true; //制冷,恒溫指示燈同時閃爍i
}
else
{
cool_led=false;
hold_led=false;
}
run_flag=false;
machine_status=stop;
}//end if(temp_ad_value<(ad_value_tab[0]-40) || temp_ad_value>(ad_value_tab[8]+15))
for(adjust_num=0;adjust_num<9;adjust_num++)
{
if(abs(adjust_ad_value-adjust_tab[adjust_num])<30)
{
adjust_scan=adjust_num;
}
}
switch(adjust_scan) //讀取撥碼開關狀態
{
case 0:adjust_value=-20;break;
case 1:adjust_value=-15;break;
case 2:adjust_value=-10;break;
case 3:adjust_value=-5; break;
case 4:adjust_value=0; break;
case 5:adjust_value=5;break;
case 6:adjust_value=10;break;
case 7:adjust_value=15;break;
case 8:adjust_value=20;break;
default:;
}
if(adjust_ad_value>=(adjust_tab[8]+50))//撥碼開關,短路斷路報警.
{
if(led_time<25)
{
cool_led=true;
hold_led=true;
}
else
{
cool_led=false;
hold_led=false;
}
run_flag=false;
machine_status=stop;
}//end if(adjust_ad_value>=(adjust_tab[8]+50))
// adjust_value=0;
}
/*************************************************
Function: void init(void)
Description:
Calls:
Called By: main()
Input:
Output: 單片機基本配置
Return:
Others:
*************************************************/
void init(void) //初始化函數
{
//初始化PORTC
// IRP=1;
OSCCON=0x67;
CMCON0=0x07;
PORTC = 0x00;
//RC0,RC1,RC5輸出;其他做為輸入端口。三態控制寄存器。
TRISC=0x1C;
ADCON0 = 0xC0; //結果右對齊,參考電壓選擇VREF.
ADCON1 = 0x10; //fosc/8
ANSEL = 0xC0; //AN7,AN6為模擬輸入口;其他為I/O口。11000000;
ADIF = 0;
ADIE = 1; //使能AD轉換中斷
ADON = 1; //A/D轉換模塊正在工作
//T1初始化
T1CON = 0x05; //T1CON控制寄存器 啟動T1 ,選擇內部時鐘源FOSC/4,不于外部時鐘輸入同步。
TMR1L = 0xF0;
TMR1H = 0xD8;
PIE1 = 0x41; //外設中斷使能寄存器1,使能time1溢出中斷 ,使能AD轉換中斷 ,T2匹配中斷
TMR1IF=0;
TMR1IE = 1;
TMR1ON = 1; //啟動T1
INTCON = 0xE0;
//T2初始化
T2CON=0x00; //TMR2控制寄存器
CCP1CON=0x0C; //Single output; P1B modulated; P1B, P1C, P1D assigned as port pinsPWM mode; P1A, P1C active-high; P1B, P1D active-high
TMR2IF=0;
CCPR1L=0x00;
PR2=0x3F; //設置pwm周期
TMR2ON = 1;
//TIME0 初始化
T0CS = 0; ///選擇內部指令時鐘周期
T0IF=0;
T0IE=1;
TMR0 = 0x00;
GIE=1; //使能所有非屏蔽中斷
}
/********************************************
Function: void main(void)
Description:
主程序,控制儀器運行.
Calls: init(),ad_read(),temp_control();
Called By:
Input:
Output: 儀器運行狀態
Return:
Others:
*********************************************/
void main(void)
{
init(); //調用初始化函數
keyok=false;
channel=6; //附ad采樣通道
run_flag=false;
machine_status=stop; //儀器進入停止狀態.
while (1)
{
if(machine_status==stop)
{
error_flag=false;
err_time_flag=false;
error_time=0;
ad_read(); //調用ad_read()
if(keyok==true)
{
keyok=false;
run_flag=true;
machine_status=run;
}
}//end if(machine_status==stop)
else if(machine_status==run)
{
ad_read();
control_temp=40+adjust_value; //控溫點
// temp_control(); //調用控溫函數
if(keyok==true) //有鍵按下,進入停止狀態
{
keyok=false;
run_flag=false;
machine_status=stop;
}
}//end if(machine_status==run)
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -