📄 ze015_1._c
字号:
temp_checksum ^=*point_txd++; //异或校验
*point_txd=act_state2;//数据7输出2
temp_checksum ^=*point_txd++; //异或校验
temp_txd =fault_comp_guozai_times; //b1b0压缩机过载保护次数
temp=fault_lpp_times<<2; //b3b2低压保护次数
temp_txd +=temp;
temp=fault_exh_times<<4; //b5b4排气温度过高保护次数
temp_txd +=temp;
if ((PINB &cap_boma2)==0) temp_txd |=0x80;
if ((PINB &cap_boma1)==0) temp_txd |=0x40;
*point_txd=temp_txd; //数据8 故障+容量拨码21
temp_checksum ^=*point_txd++; //异或校验
*point_txd=fault_state2; //数据9 故障2
temp_checksum ^=*point_txd++; //异或校验
*point_txd=fault_state3; //数据10 故障3
temp_checksum ^=*point_txd++; //异或校验
*point_txd=fault_state4; //数据11 故障4
temp_checksum ^=*point_txd++; //异或校验
*point_txd=fault_state5; //数据12 故障5
temp_checksum ^=*point_txd++; //异或校验
*point_txd=fault_state6; //数据13 故障6
temp_checksum ^=*point_txd++; //异或校验
*point_txd=dangwei_ofan; //数据14 室外风机档位预留
temp_checksum ^=*point_txd++; //异或校验
*point_txd= outroom_TH;//evin_TH; //outroom_TH; //数据15 预留室外环境温度
temp_checksum ^=*point_txd++; //异或校验
*point_txd=0; //数据16 预留电流A整数
temp_checksum ^=*point_txd++; //异或校验
*point_txd=0; //数据17 预留电流B整数
temp_checksum ^=*point_txd++; //异或校验
*point_txd=0; //数据18 预留电流C整数
temp_checksum ^=*point_txd++; //异或校验
*point_txd=0; //数据19 预留高1位电流A +电流B +电流C
temp_checksum ^=*point_txd++; //异或校验
*point_txd=defrost_TH; //数据20 预留管温值温度带负数
temp_checksum ^=*point_txd++; //异或校验
temp_stepnum = (unsigned int) (stepnum);
*point_txd=(unsigned char)(temp_stepnum>>8)//0; //数据21 预留
temp_checksum ^=*point_txd++; //异或校验
temp_stepnum = (unsigned int) (stepnum);
*point_txd=(unsigned char) ((stepnum<<8)>>8); //数据22 预留
temp_checksum ^=*point_txd++; //异或校验
*point_txd=temp_checksum; //校验码
txd_len0_ask=32; //ask len
txd_rxd_delaytime0=0; //clear
txd_state0 |=rxd_txdstart0; //rxd_txdstart0=1
}
#pragma interrupt_handler uart0_tx_isr:21
void uart0_tx_isr(void)
{
//character has been transmitted
if (txd_len0 >=txd_len0_ask) //txd finished
{
txd_len0 =0;
PORTE &= ~b_con4850; //pe2为uart0 485控制端=0接收
rxd_state0=0;
UCSR0B = 0x90; // uart0_rxd_on允许接收完成中断及接收
PORTE |=0x02; //发送完成后置发送端PE1 TXD=1
}
else
{UDR0=txd_data0[txd_len0]; //
txd_len0++;}
}
//UART1 initialize禁止UART1
// desired baud rate:9600
// actual baud rate:9615 (0.2%)
void uart1_init(void)
{
UCSR1B = 0x00; //disable while setting baud rate
UCSR1A = 0x00;
UCSR1C = 0x06;
UBRR1L = 0x19; //set baud rate lo
UBRR1H = 0x00; //set baud rate hi
}
//ADC initialize
// Conversion time: 26uS
void adc_init(void)
{
ADCSRA = 0x00; //disable adc
ADMUX = 0x00; //select adc input 0
ACSR = 0x80; //模拟比较器禁止
ADCSRB = 0x00; //触发选择无用
ADCSRA = 0x85; //使能AD,但不启动AD转换,32分频
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV = 0x00; //xtal divider
XMCRA = 0x00; //external memory
port_init();
watchdog_init();
timer0_init(); //10ms
timer1_init(); //1s
timer2_init(); //beep
timer3_init(); //no use
uart0_init();
uart1_init();
adc_init();
MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x45; //timer interrupt sources
ETIMSK = 0x04; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void main(void)
{
init_devices();
fun_1232_wdt(); //1232的看门狗翻转时钟脉冲
valctlcount=0;
ID_h =0x70; //IDH机组ID号7002
ID_l =0x02; //IDl机组ID号
t_comp_stop=0x00; //压缩机最小停机时间
t_comp_run=0x00; //压缩机最小运行时间
t_comp_ondelay=0x00; //压缩机延时启动时间
t_fan_ondelay=0x00; //送风机延时启动时间
t_lppdelay=0x00; //低压保护延时
t_outpai_turn=0x00; //加湿器定时排水间隔时间
t_outpai=0x00; //加湿器定时排水时间
t_fan_offdelay=0x00; //内风机关机延时计时
t_ofan_offdelay=0x00; //冷凝风机关机延时计时
//设置上电时为自动关机,所有关,设置默认值
mode=0x00; //自动关机
manual_set=0x00; //手动开机时模式off
fun_set_default(); //初次上电开始初始化
fun_beep(20); //初始化定时器2,开始CTC模式
NOP();
NOP();
if ((PINE &b_key_fast)==0) // PE5快测短路块
{//上电时检测是否有短路,有则快测
mode |=b_fast_test; //0x08 //1快测
exghaust_AD=43; //排气温度=25
}
while(1)
{
NOP();NOP();NOP();NOP();NOP();
if (mode&b_fast_test)
{//快测时计数时间
t_1min_3s_std=300; //1min快测时时间 3秒
t_10min_10s_std=1000; //10min快测时时间 10秒
t_180s_10s=1200; //180秒到快测10秒
t_10min_15s_std=1500; //10min快测时时间 15秒
}
else
{//不快测时计数时间
t_1min_3s_std=60; //1min快测时时间 3秒
t_10min_10s_std=600; //SHT读正确次数 10min
t_180s_10s=180; //180秒到快测10秒
t_10min_15s_std=600; //10min快测时时间 10秒
}
//f_100ms==1启动AD采样 ,检测湿度SHT15的测量应答时间
if (time_flag &b_time_100ms)
{//将AD采样值进行64次加,取高8位为AD值
WDR(); //
fun_1232_wdt(); //1232的看门狗翻转时钟脉冲
funADsum(); //test
time_flag &=~b_time_100ms;
t_100ms_times++; //计时+1
if (t_100ms_times >=50) //50*0.1=定时5s到
{//20080201因SHT不能快测,将SHT测试程序移到100ms的计时中
fun_measure_temp(); //测量rt1温度\湿度程序
t_100ms_times=0; //计时清0
}
}
//定时5s到
if (time_flag &b_time_5s) //定时5s到时读SHT15温湿度检测
{
time_flag &=~b_time_5s; //clear
//5S中定时20s
t_20s_times++; //计时+1
if (t_20s_times >=4) //定时20s到
{ t_20s_times=0; //计时清0
time_flag |=b_time_20s; //置标志1
}
//拨到ON时引脚0地址为1,拨到OFF时引脚1地址为0。
if ((PINB &0x03)==0x00)address =0x43; //
else if ((PINB &0x03)==0x02)address =0x42;
else if ((PINB &0x03)==0x01)address =0x41;
else address =0x40;
NOP();
}
if (time_flag &b_time_1s) //定时1s到
{
fun_key(); //连续按钮5秒时按钮动作-应急、故障复位按钮快测
time_flag &=~b_time_1s; //定时1s清0
if (evin_AD>1000 || evin_AD<20) evin_time++;
else {evin_time=0;b_evinerr=0;}
if (defrost_AD>1000 || defrost_AD<20) defrost_time++;
else {defrost_time=0;b_defrosterr=0;}
if (PINB &b_comp) valctlcount++;
if (mode & b_kaiji)
{
if (mode & b_urgent)//开机且应急时灯闪烁
{
if (PINE &led_run) PORTE&=~led_run;
else PORTE |=led_run;//开机时
}
else PORTE |=led_run;//开机非应急时运行灯亮
}
else PORTE&=~led_run; //关机时PE7运行灯灭
//20080215 if ((fault_state==0) &&(fault_state2==0)&&(fault_state3==0)&&(fault_state4==0)&&(fault_state5==0)&&(fault_state==0)&&(fault_state6==0))PORTE&=~led_alarm;
if ((fault_state2==0)&&(fault_state3==0)&&(fault_state4==0)&&(fault_state5==0)&&(fault_state==0))PORTE&=~led_alarm;
else PORTE |=led_alarm; //有故障时故障灯亮
fun_delaytime_1s(); //1s中执行延时启动的计时程序
if (run_state2 &b_fault_reset) //故障复位命令
{
fun_fault_reset(); //故障复位程序
run_state2 &=~b_fault_reset; //故障复位命令clear
fun_fault_beep(); //20080201增加故障报警蜂鸣器子程序
}
fun_fault_detect(); //上电就开始故障检测程序
fun_act_state(); //计算输出状态1、2
if (t_power_on <1000) t_power_on++; //上电时间超过15分钟时不继续加
if (t_power_on >=180) //上电时间超过180秒后才开始动作
{//初次上电时机组开始时运行时间
if (mode & b_urgent)//开机且应急时灯闪烁
{
mode &=~b_manual_on; //应急时为自动
fun_set_default(); //应急下设置值为出厂设置值
}
// if (((fault_state2&b_fault_tongxun)!=0)||((fault_state5&0x90) !=0)||((fault_state3&b_fault_pfan) !=0)||((fault_yuliu&b_fault_stop) !=0))
if (((fault_state5&0x90) !=0)||((fault_state3&b_fault_pfan) !=0)||((fault_yuliu&b_fault_stop) !=0))
{//通讯、风机低风压故障、离心风机过载、逆相保护时、主模块板的故障关机
fun_fault_guanji(); //故障停机关闭压缩机、电加热、加湿器
}
else if (fault_state2 &b_fault_sht) fun_guanji_sht(); //回风探头故障正常关机,风机保持原状
else if (((fault_state2&b_fault_tongxun)!=0)&&((mode & b_urgent) ==0))fun_guanji_sht(); //正常时通讯故障停机关闭压缩机、电加热、加湿器
else if (((fault_yuliu&b_fault_hmi)!=0)&&((mode & b_urgent) ==0))fun_guanji_sht(); //正常时通讯故障停机关闭压缩机、电加热、加湿器
else fun_nofault_run(); //无故障时动作或应急时有通讯故障也正常动作
if ((mode & b_kaiji)==0) manual_set=0; //20080417add关机时请求=0
}
}
if (valctlcount>=30)
{
valctlcount=0;valveproc();
}
if (m_32mscountv>=4)
{
m_32mscountv=0;
jf_valvetotal();
}
if (time_flag &b_time_20s) //定时20s到
{
time_flag &=~b_time_20s; //定时20s清0
fun_delaytime_20s(); //20s中执行程序
}
if (time_flag &b_time_1min) //定时2min到
{
time_flag &=~b_time_1min; //定时2min清0
if (mode &b_fast_test)
{//快测10分钟后结束
if (fast_test_time>1000)
{//结束快测时,将故障计时清0,防止在慢测时溢出
mode &=~b_fast_test; //
rxd_nogood_time =0; //
tongxun_ok_time=0; //通讯正常时间
t_b_fault_tongxun=0; //通讯故障时间
t_b_fault_sht=0; //在1秒计时中定义SHT故障是否恢复
sht_ok_times=0; //SHT读正确次数清0
sht_noread_time=0; //20080222改为未读到SHT的计时
}
else fast_test_time++;
}
}
}
}
void fun_nofault_run(void) // 无故障时动作
{
if (mode & b_kaiji) //开机时根据手动,自动时条件选择
{
if ((mode&b_manual_on)==0) //自动on
{
if (t_auto_start>=10)
{//自动10秒后
fun_auto_set_caculate(); //计算设定值的温度湿度
fun_auto_set(); //10s后判定自动所处状态,选择具体模式
}
else
{
t_auto_start++; //10秒前加自动开始时间
manual_set=0; //刚进入自动时清除模式选择
}
manual_set |=b_fan_onask; //自动开机时内风机为开
manual_set &=~b_paishui_onask; //自动排水开请求始终为关
mokuai_set &=~b_jinshui_onask; //自动进水开请求始终为关
}
else //手动开机时取手动设定,无等待时间
{
manual_set =manual_act_ask; //手动开时以显示板或触摸屏的手动设置
if (manual_act_ask &0x74) //comp\heat1\heat2\humid开时风机默认为开
{
manual_set |=b_fan_onask; //comp\heat1\heat2\humid开时内风机为开
}
if ((manual_act_ask &b_comp_onask)==0) //手动开时comp不开时除湿阀、能量调节阀关
{
manual_set &=~b_yvadjust_onask; //
manual_set &=~b_dry_offask; //除湿关
}
if ((PINB &b_comp)==0)manual_set &=~b_yvadjust_onask; //压缩机未开时能量调节阀关
}
fun_act_on(); //根据请求动作manual_set
}
else fun_guanji(); //关机
}
void fun_txddata0_ID(void) //取uart0发送ID
{
unsigned char i,temp ;
i=0;
txd_data0[i]=0x7E; //头码
i++;
txd_data0[i]=0x7E;
i++;
txd_data0[i]=0xFF; //显示板地址FF
temp=txd_data0[i]; //异或校验
i++;
txd_data0[i]=0x40; //20080201 address; //本机地址
temp ^=txd_data0[i]; //异或校验
i++;
txd_data0[i]=0x11; //包号
temp ^=txd_data0[i]; //异或校验
i++;
txd_data0[i]=4; //长度
temp ^=txd_data0[i]; //异或校验
i++;
txd_data0[i]=ID_l; //IDH机组ID号
temp ^=txd_data0[i]; //异或校验
i++;
txd_data0[i]=ID_h; //IDl机组ID号
temp ^=txd_data0[i]; //异或校验
i++;
txd_data0[i]=0x81; //回复IDl机组ID号命令81H
temp ^=txd_data0[i]; //异或校验
i++;
txd_data0[i]=temp; //异或校验
txd_len0_ask=10; //ask len
txd_rxd_delaytime0=00; //clear
txd_state0 |=rxd_txdstart0; //rxd_txdstart0=1
}
void fun_1232_wdt(void) //1232的看门狗翻转时钟脉冲
{
if (PING &b_watchdog) PORTG &=~b_watchdog;//PG4看门狗
else PORTG |=b_watchdog;
}
void fun_act_state(void) //计算输出状态1、2
{
unsigned char temp_txd =0; //数据6输出1
if (PINC &b_yv_dry) temp_txd |=0x08; //yv_dry=1
if (PIND &b_yv_comp) temp_txd |=0x04; //yv_comp=1
if (PIND &b_yv_in) temp_txd |=0x80; //yv_in=1
if (PIND &b_yv_out) temp_txd |=0x40; //yv_out=1
if (PINB &b_comp) temp_txd |=0x01; //comp=1
if (PING &b_ofan) temp_txd |=0x02; //b_ofan=1
if (PING &b_yv_adjust) temp_txd |=0x20; //b_yv_adjust=1
if (PIND &b_heat_comp) temp_txd |=0x10; //b_heat_comp=1
// if (mokuai_set &b_fault_rst_onask) temp_txd |=0x08; //故障复位命令已收到
act_state1 =temp_txd; //数据6输出1
temp_txd = mode &0x0f; //数据7输出2
if (PING &b_fan) temp_txd |=0x80; //b_fan=1
if (PIND &b_humid) temp_txd |=0x40; //humid=1
if (PINB &b_heat1) temp_txd |=0x20; //heat1=1
if (PINB &b_heat2) temp_txd |=0x10; //heat2=1
act_state2 =temp_txd; //数据7输出2
}
void fun_fault_reset(void) //故障复位程序
{//显示板或触摸屏设置的故障复位命令或按钮时将所有故障清除,并清除计时
fault_state=0; //故障标志
fault_state2=0; //故障标志
fault_state3=0; //故障标志
fault_state4=0; //故障标志
fault_state5=0; //故障标志
fault_state6=0; //故障标志
fault_lpp_times=0; //低压保护连续次数
fault_hpp_times=0; //h压保护连续次数
fault_exTH0_time=0; //排气感温包短路故障时间
fault_exTH0_times=0; //排气感温包短路故障次数
fault_exTHh_time=0; //排气温度过高故障时间
fault_exh_times=0; //排气温度保护次数
rxd_nogood_time =0; //通讯故障连续时间
fault_highwater_time =0; //高水位保护故障时间
fault_humid_lowi_time =0; //加湿电流连续5分钟低于1A
fault_i_humid_time =0; //加湿电流连续高过载
fault_low_fan_times =0; //风机低风压故障时间
sht_ok_times=0; //SHT读正确次数清0
t_b_fault_sht=0; //20080214在1秒计时中定义SHT故障是否恢复
b_fault_sht_times=0;
auto_state &=~b_sht_noACK; //清除SHT无应答标志
t_value_lowset_times=0; //clear
t_value_highset_times=0; //clear
rh_value_highset_times=0; //clear
rh_value_lowset_times=0; //clear
fault_comp_guozai_s=0; //清除压缩机过载故障时间计数
fault_comp_guozai_times =0; //压缩机过载故障出现次数=0
fault_overheat1_times=0;
fault_overheat2_times =0;
fault_pfan_times=0;
fault_nixiang_times=0;
fault_heatdai_times=0;
fault_pfilter_times=0; //20080114add
start_state2 &=~b_exTHh_delaystart;
start_state2 &=~b_exTH0_delaystart;
start_state2 &=~b_lpp_delay2start;
t_exh_delaytime=0; //计时清0
start_state2 &=~b_highwater_delaystart;
start_state2 &=~b_comp_gz_delaystart; //压缩机过载时启动计时3分钟
t_comp_gz_delaytime=0; //
comp_guozai_clear_time =0; //开始过载恢复的计时
t_lpp_compoff=0; //关压缩机时低压保护的监测
t_exTH0_delaytime=0; //计时清0
tongxun_ok_time=0; //通讯正常时间
t_b_fault_tongxun=0; //通讯故障时间
fault_tongxun_times=0;
sht_noread_time=0; //20080222改为未读到SHT的计时
NOP();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -