📄 mainkey.c
字号:
//ICC-AVR application builder : 2005-4-11 12:45:38
// Target : M16
// Crystal: 8.0000Mhz
#include <iom16v.h>
#include <macros.h>
#include "DS18B20.h"
#include "7279.h"
//*****变量声明*******
const unsigned char table[]="0123456789ABCDEF";
unsigned char DS18B20[9]={0,0,0,0,0,0,0,0,0};
unsigned char sec_count[4]={0,0,0,0x0f};
unsigned char DisplayTable[4]={0,0,0,0};
unsigned char RateDisplay[2]={0,0};
unsigned char key_dis[5]={0,0,0,0x0f,0x0f};
unsigned int RateBuff[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
unsigned int RateBuff_to80[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned char RateDisplay_to80[2]={0,0};
unsigned char *asc2p,*RateDis;
unsigned int value_temp;
unsigned int init_temper;
unsigned int Occupy_delay,Sum_value;
unsigned int Open,Close;
unsigned int FirstValue=0;
unsigned int Begin_value,ave_hot=0;
unsigned int Begin_valueTo80=800;
unsigned char flag_cal=1;
unsigned char flag_beginValue=1;
unsigned char RateCount=0;
unsigned char count=0;
unsigned char flag_sec=0;
unsigned char testcount=0;
unsigned char BuffCount=0;
unsigned char key_number=0;
unsigned char key_temp=0;
unsigned char flag_key=0;
unsigned char normal_hot=0;
unsigned char average_hot=0;
unsigned char flag_dis=1;
unsigned char flag_disTo80=1;
unsigned char rate_min=0;
unsigned char RateCountTo80=0;
unsigned char BeforeCountTo80=0;
unsigned char BuffCountTo80=0;
unsigned char flag_secDis=1;
unsigned char flag_hot=0;
unsigned char flag_warn=0;
void port_init(void)
{
PORTA = 0x01;
DDRA = 0x07;
PORTB = 0x00;
DDRB = 0x07;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}
//TIMER1 initialize - prescale:64
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1Sec
// actual value: 1.000Sec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xE3; //setup
TCNT1L = 0xE1;
OCR1AH = 0x1C;
OCR1AL = 0x1F;
OCR1BH = 0x1C;
OCR1BL = 0x1F;
//OCR1CH = $OCR1CH$;
//OCR1CL = $OCR1CL$;
ICR1H = 0x1C;
ICR1L = 0x1F;
TCCR1A = 0x00;
TCCR1B = 0x05; //start Timer
}
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
CLI(); //关中断
if(normal_hot)
{
if(RateCount==60) //判断是否60秒
{
if(value_temp<=800)//判断是否到50度
{
//if(flag_cal)
//{
RateBuff[BuffCount]=value_temp-Begin_value;
Begin_value=value_temp;
BuffCount++;
RateCount=0;
// }
}
else
{
//flag_cal=0;
//TCCR1B = 0x00; //Stop Timer
flag_dis=0; //显示设定值标志
flag_sec=1; //读秒显示标志
flag_secDis=0;
}
}
if(value_temp>800)//判断是否到50度
{
flag_sec=1; //读秒显示标志
flag_dis=0; //显示设定值标志
flag_secDis=0;
}
RateCount++;
if(flag_sec)
sec_display();
}
if(average_hot)
{
//flag_sec=0;
if(RateCountTo80==60) //判断是否60秒
{
if(value_temp<=1280)//判断是否到80度
{
if(value_temp>Begin_valueTo80)
//if(flag_cal)
{
BeforeCountTo80=BuffCountTo80;
RateBuff_to80[BuffCountTo80]=value_temp-Begin_valueTo80;
/*if((RateBuff_to80[BeforeCountTo80]>56)&&(RateBuff_to80[BeforeCountTo80]<40))
{
PORTA|=(1<<1); //声报警
PORTA|=(1<<2); //光报警
//PORTA&=~(1<<1); //关声报警
//PORTA&=~(1<<2); //关光报警
}
if((RateBuff_to80[BeforeCountTo80]<=56)&&(RateBuff_to80[BeforeCountTo80]>=40))
{
PORTA&=~(1<<1); //关声报警
PORTA&=~(1<<2); //关光报警
//PORTA|=(1<<1); //声报警
//PORTA|=(1<<2); //光报警
}*/
if((RateBuff_to80[BeforeCountTo80]<=56)&&(RateBuff_to80[BeforeCountTo80]>=40))
flag_warn=1;
else
flag_warn=0;
if(flag_warn)
{
//PORTA|=(1<<1);
//PORTA|=(1<<2);
PORTA&=~(1<<1);
PORTA&=~(1<<2);
}
else
{
PORTA|=(1<<1);
PORTA|=(1<<2);
//PORTA&=~(1<<1);
//PORTA&=~(1<<2);
}
Begin_valueTo80=value_temp;
BuffCountTo80++;
RateCountTo80=0;
}
}
else
{
//flag_cal=0;
TCCR1B = 0x00; //Stop Timer
//flag_dis=0;
}
}
RateCountTo80++;
}
//TIMER1 has overflowed
TCNT1H = 0xE3; //reload counter high value
TCNT1L = 0xE1; //reload counter low value
SEI();
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer1_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x04; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void main(void)
{
unsigned char i,j;
//OSCCAL=0X9F;
init_devices(); //端口初始化
Write_Init(); //18B20初始化
PORTA&=~(1<<1);
PORTA&=~(1<<2);
send_byte(CMD_RESET); // 清除显示
//write7279(BLINKCTL,0xff); // 清除闪烁设置
while(1)
{
if ((PINB&0x08)==0) // 如果有键按
{
key_number=read7279(CMD_READ); // 读出键码
//write7279(DECODE1+1,key_number/16); // 在第2位显示键码高8位
//write7279(DECODE1,key_number&0x0f); // 在第1位显示键码低8位
switch (key_number)
{
case 0x0F: key_temp=5; key_display(key_temp); break;//数字键5
case 0x0E: key_temp=6; key_display(key_temp); break;//数字键6
case 0x0D: key_temp=7; key_display(key_temp); break;//数字键7
case 0x0C: key_temp=8; key_display(key_temp); break;//数字键8
case 0x0B: key_temp=9; key_display(key_temp); break;//数字键9
case 0x0A: Change_sum(); break;//显示升率
case 0x09: PORTA&=~(1<<1); break;//消声
case 0x08:
normal_hot=0;average_hot=0;PORTA|=(1<<0);
flag_sec=0;PORTA&=~(1<<1);PORTA&=~(1<<2);
send_byte(CMD_RESET);TCCR1B = 0x00; break;//复位
case 0x07: key_temp=0; key_display(key_temp); break;//数字键0
case 0x06: key_temp=1; key_display(key_temp); break;//数字键1
case 0x05: key_temp=2; key_display(key_temp); break;//数字键2
case 0x04: key_temp=3; key_display(key_temp); break;//数字键3
case 0x03: key_temp=4; key_display(key_temp); break;//数字键4
case 0x02:
init_temper=(key_dis[2]*10+key_dis[1])*16; break;//设定温度
case 0x01:
normal_hot=1;average_hot=0;TCCR1B=0x05;
PORTA&=~(1<<1);PORTA&=~(1<<2); break;//正常加热
case 0x00:
average_hot=1;flag_sec=0;
normal_hot=0;TCCR1B=0x05;
ave_hot=1280;
PORTA&=~(1<<1);PORTA&=~(1<<2); break;//匀速加热
default : break;
}
while ((PINB&0x08)==0); // 等待按键放开
}
if(normal_hot) //正常加热 室温到50度
{
convert_T();
//if((init_temper-1)>=value_temp)
if(init_temper>=value_temp)
{
Sum_value=init_temper-value_temp;
if(Sum_value>108)
{
for(i=0;i<20;i++)
{
PORTA&=~(1<<0);
delay_nms(30);
}
}
//else if(value_temp>
else
{
Occupy_delay=Sum_value/10;
//Open=(Occupy_delay*280)/100;
Open=(Occupy_delay*295)/100;
//Open=Occupy_delay*3;
Close=30-Open;
for(i=0;i<20;i++)
{
PORTA&=~(1<<0);
delay_nms(Open);
PORTA|=(1<<0);
delay_nms(Close);
}
}
}
else
{
//if(!flag_hot)
// {
for(i=0;i<20;i++)
{
PORTA|=(1<<0);
delay_nms(30);
//PORTA&=~(1<<0);
//delay_nms(1);
}
//flag_hot=1;
//}
//if(flag_hot)
//{
// if((value_temp>=800)&&(value_temp<801))
// {
// for(i=0;i<20;i++)
// {
// PORTA|=(1<<0);
// delay_nms(29);
// PORTA&=~(1<<0);
// delay_nms(1);
// }
// }
//if(value_temp>=801)
// {
// for(i=0;i<20;i++)
// {
// PORTA|=(1<<0);
// delay_nms(30);
//PORTA&=~(1<<0);
//delay_nms(1);
// }
}
//}
// }
turnon();
if(flag_secDis)
{
if(FirstValue) //第一次转换值不要
{
DS18B20Display();
if(flag_beginValue)
{
Begin_value=value_temp;
flag_beginValue=0;
}
}
else
FirstValue=1;
}
}
if(average_hot)
{
convert_T();
if(value_temp<=ave_hot)
{
if(value_temp>=800)
{
TCCR1B=0x05;
if(value_temp<824)//小于51.5度
{
for(i=0;i<20;i++)
{
PORTA|=(1<<0);
delay_nms(3);
PORTA&=~(1<<0);
delay_nms(27);
}
}
if((value_temp>=824)&&(value_temp<848))//大于51.5小于53
{
for(i=0;i<20;i++)
{
PORTA|=(1<<0);
delay_nms(8);
PORTA&=~(1<<0);
delay_nms(22);
}
}
if((value_temp>=848)&&(value_temp<896))//大于53小于56
{
for(i=0;i<20;i++)
{
PORTA|=(1<<0);
delay_nms(20);
PORTA&=~(1<<0);
delay_nms(10);
}
}
if((value_temp>=896)&&(value_temp<960))//大于56小于60
{
for(i=0;i<20;i++)
{
PORTA|=(1<<0);
delay_nms(14);
PORTA&=~(1<<0);
delay_nms(16);
}
}
if((value_temp>=960)&&(value_temp<1040))//大于60小于65
{
for(i=0;i<20;i++)
{
PORTA|=(1<<0);
delay_nms(15);
PORTA&=~(1<<0);
delay_nms(15);
}
}
if((value_temp>=1040)&&(value_temp<1120))//大于65小于70 1218
{
for(i=0;i<20;i++)
{
PORTA|=(1<<0);
delay_nms(13);
PORTA&=~(1<<0);
delay_nms(17);
}
}
if((value_temp>=1120)&&(value_temp<1200))//大于70小于75
{
for(i=0;i<20;i++)
{
PORTA|=(1<<0);
delay_nms(12);
PORTA&=~(1<<0);
delay_nms(18);
}
}
if((value_temp>=1200)&&(value_temp<1280))//大于75小于80
{
for(i=0;i<20;i++)
{
PORTA|=(1<<0);
delay_nms(11);
PORTA&=~(1<<0);
delay_nms(19);
}
}
}
else
{
for(i=0;i<20;i++)
{
PORTA|=(1<<0);
delay_nms(2);
PORTA&=~(1<<0);
delay_nms(28);
}
}
}
else
{
for(i=0;i<20;i++)
{
PORTA|=(1<<0);
delay_nms(30);
// PORTA&=~(1<<0);
// delay_nms(23);
}
}
turnon();
DS18B20Display();
}
}
}
/****温度转换****/
void turnon(void)
{
unsigned long int turnoff;
unsigned char i,crc;
unsigned int DS18B20_temp;
DS18B20_reset();
DS18B20_write(0xcc); // 跳过多器件识别
DS18B20_write(0xbe); // 读暂存器
for(i=0;i<9;i++)
DS18B20[i]=DS18B20_read();
asc2p=&DS18B20[0];
crc=CRCcheck(asc2p,9);
delay(3);
if(crc==0x00)
{
DS18B20_temp=DS18B20[1];
DS18B20_temp=DS18B20_temp<<8;
DS18B20_temp+=DS18B20[0];
value_temp=DS18B20_temp;
asc2p=&DS18B20[0];
}
turnoff=(unsigned long int)(DS18B20_temp);
turnoff=(turnoff*10000/16);
/*for(i=6;i>0;i--)
{
DS18B20[i-1]=table[turnoff%10];
turnoff/=10;
}*/
for(i=0;i<6;i++)
{
DS18B20[i]=table[turnoff%10];
turnoff/=10;
}
DS18B20[4]|=0x80;
//return(value_temp);
for(i=0;i<4;i++)
DisplayTable[i]=DS18B20[i+2];
//delay(2);
}
/****温度显示****/
void DS18B20Display(void)
{
unsigned char i,j;
unsigned int buff_tempTo80;//temp_warn;
//send_byte(CMD_RESET); // 复位HD7279A
for(i=0;i<4;i++)
write7279(DECODE1+i,DisplayTable[i]);
if(normal_hot)
{
if(flag_dis) //显示设定值
for(j=0;j<4;j++)
write7279(DECODE0+j+4,key_dis[j+1]);
}
if(average_hot)
{
//if(RateBuff_to80[BuffCountTo80]!=0)
//{
buff_tempTo80=(RateBuff_to80[BeforeCountTo80]*10)/16;
//temp_warn=buff_tempTo80;
for(i=0;i<2;i++)
{
RateDisplay_to80[i]=buff_tempTo80%10;
buff_tempTo80/=10;
}
RateDisplay_to80[1]|=0x80;
write7279(DECODE1+7,BuffCountTo80);
for(j=0;j<2;j++)
write7279(DECODE1+j+4,RateDisplay_to80[j]);
//}
//else
//{
// write7279(DECODE1+7,BuffCountTo80);
// for(j=0;j<2;j++)
// write7279(DECODE1+j,RateDisplay_to80[j]);
//}
}
}
/****读秒计数****/
void sec_display(void)
{
unsigned char i,j;
{
count++;
j=count;
for(i=0;i<3;i++)
{
sec_count[i]=j%10;
j/=10;
}
for(i=4;i<8;i++)
write7279(DECODE0+i,sec_count[i-4]);
}
for(i=0;i<4;i++)
write7279(DECODE1+i,DisplayTable[i]);
}
/*unsigned char switch_T()
{
//temp_mul=MUL*16;
Occupy=10*(Sum_value/160);
//kinds=5/N;
//ChaZhi=ChaZhi/(N*16);
//Occupy=kinds*ChaZhi;
return(Occupy);
}*/
/*
/*******升率运算程序******
void Cal_sum(void)
{
unsigned char i,j;
for(i=0;i<BuffCount;i++)
RateCal[i]=RateBuff[i+1]-RateBuff[i];
RateDis=RateCal;
}
*/
/*******转换程序******/
void Change_sum(void)
{
unsigned char i,j;
unsigned int buff_temp;
if(RateBuff[rate_min]==0xff)
{
rate_min=0;
buff_temp=(RateBuff[rate_min]*10)/16;
for(i=0;i<2;i++)
{
RateDisplay[i]=buff_temp%10;
buff_temp/=10;
}
RateDisplay[1]|=0x80;
send_byte(CMD_RESET); // 清除显示
write7279(DECODE1+7,rate_min+1);
for(j=0;j<2;j++)
write7279(DECODE1+j,RateDisplay[j]);
rate_min++;
}
else
{
buff_temp=(RateBuff[rate_min]*10)/16;
for(i=0;i<2;i++)
{
RateDisplay[i]=buff_temp%10;
buff_temp/=10;
}
RateDisplay[1]|=0x80;
send_byte(CMD_RESET); // 清除显示
write7279(DECODE1+7,rate_min+1);
for(j=0;j<2;j++)
write7279(DECODE1+j,RateDisplay[j]);
rate_min++;
}
}
//****************
// 0-9显示程序
//****************
void key_display(unsigned char key_TempValue)
{
unsigned char i;
key_dis[0]=key_TempValue;
for(i=0;i<2;i++)
write7279(DECODE1+i+4,key_dis[i]);
if(flag_key)
{
key_dis[2]=key_dis[1];
key_dis[1]=key_dis[0];
}
flag_key=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -