📄 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 + -