📄 main.c~
字号:
#include <mega16.h>
#include <delay.h>
#include <1820.h>
/*******************功能原理***********************************
一共有4个键,
时间设定键:在RUN模式,即正常工作状态,电风扇转动,按下时如果
时间设定标志位为1,就关闭定时功能,否则就置位时间设定标志位。
时间寄存器清零。如果按下时,模式为设定时间状态就进入RUN正常工作中去。
温度设定:在RUN模式下,按下时若温度控制标志位为1就关闭温度控制,归零,
否则置位;如果原来模式是温度设定过程,就进入RUN中。
时,温度十位键:时间设定状态,‘时’+1;在温度设定状态,'十位+1;
在RUN状态,显示时间标志位置1;
/**************************************************************
timeset-----------------PD2
temperature-------------PD3
hour--------------------PD4
miniute-----------------PD5
**************************************************************/
//time[0]--------HOURS
//time[1]--------miniutes
//temperature[0]---温度百位
//temperature[1]---温度十位
//temperature[2]---温度个位
//temperature[3]---温度小数
#define TEMPERATURE_SET 1
#define TIME_SET 2
#define RUN 3
#define time_page 1
#define T_page 2
flash unsigned char led_7[10]={0,0,0,0,0,0,0};
flash unsigned char position[4]={0,0,0,0};
unsigned char T;
unsigned char timeMAX;
unsigned char TMAX;
unsigned char time[3]={0,0,0};
unsigned char time_v=0;
unsigned char posit;
unsigned char temperature[4]={0,0,0,0};
unsigned char dis_buff[4]={0,0,0,0};
unsigned char mode;
int time_counter=0;
bit time_10s_ok=0;
bit time_1s_ok=0;
bit time_control_flag=0;
bit point_on=0;
bit T_control_flag=0;
bit time_dis_flag=1;
unsigned char get_temperature(void);
void stop_fan(void);
void time_to_disbuffer (void);
void display(unsigned char page);
unsigned char get_temperature()
{
unsigned int i;
unsigned char j;
ds1820_reset(); /*复位D18B20*/
ds1820_start(); /*启动一次转换*/
delay_ms(1000); /*等待转换结束*/
i = ds1820_read_temp(); /*读取温度数值*/
i = (i * 10) / 16;
j=(unsigned char )i/10;
/*将显示信息加载到显示缓存区*/
temperature[0] = (char)(i /1000); //十位
temperature[1] = (char)(i %1000/ 100); //十位
temperature[2] = (char)(i %100/ 10);//个位
temperature[3] = (char)(i % 10); //小数位
return j;
}
void main (void )
{
unsigned char buttons = 0;
unsigned char buttons2 = 0;
while( 1 )//功能键连接端口
{
buttons = PIND & 0x3C;
delay_ms(10);
buttons2 = PIND & 0x3C;
if( ( buttons == buttons2 ) && ( buttons != 0x3C ) )
{
while( ( PIND & 0xF0 ) != 0x3C ); // wait for button release
switch( buttons )
{
case 0x38 : //PD2按下timeset
if(mode==TIME_SET)
{
time_control_flag=1;
mode=TEMPERATURE_SET;
}
else if (mode==RUN)
{
if(time_control_flag)
{
#asm("cli");
time_control_flag=0;
time_v=0;
time[0]=0;
time[1]=0;
time[2]=0;
dis_buff[0]=0;
dis_buff[1]=0;
dis_buff[2]=0;
dis_buff[3]=0;
}
else
mode=TIME_SET;
}
break;
case 0x34 : //PD3 温度设定temperature_set
if (mode==TEMPERATURE_SET)
{
T_control_flag=1;
TMAX=temperature[1]*10+temperature[2];
mode=RUN;
}
else if(mode==RUN)
{
if(T_control_flag)
{
T_control_flag=0;
}
else
mode=TEMPERATURE_SET;
}
break;
case 0x2C : //PD4时间‘时’设定
if (mode==TIME_SET)
{
time[0]++;
if (time[0]>24)
time[0]=0;
time_to_disbuffer();
}
else if (mode==TEMPERATURE_SET)
{
temperature[1]++;
if(temperature[1]>9)
temperature[1]=0;
}
else //mode==RUN
time_dis_flag=1;
break;
case 0x1C : //PD5时间‘分’设定
if (mode==TIME_SET)
{
time[1]++;
if (time[1]>60)
time[1]=0;
time_to_disbuffer();
}
else if (mode==TEMPERATURE_SET)
{
temperature[2]++;
if(temperature[2]>9)
temperature[2]=0;
}
else //mode==RUN
time_dis_flag=0;
break;
default : break;
}
}
//每10S检测一次温度,若温度低于设定值就关闭风扇
//温度控制一直有,要是不想温度控制,可以把温度下限设置很高,比如50度
if(time_10s_ok)
{
time_10s_ok=0;
T=get_temperature();
if(T_control_flag)
{
if (T<TMAX)
{
#asm("cli");
stop_fan();
}
}
}
//检测时间,如果时间超过定时上限,就关闭风扇。由于定时功能可有可没有,
//所以要检测定时标志位
if(time_control_flag)
{
if( time_v>timeMAX)
{
#asm("cli");
stop_fan();
}
}
}
}
void time_to_disbuffer (void)
{
dis_buff[0]=time[0]/10;
dis_buff[1]=time[0]%10;
dis_buff[2]=time[1]/10;
dis_buff[3]=time[1]%10;
}
void stop_fan(void)
{
PORTD&=~0x80;
}
interrupt [TIM0_COMP] void timer0_comp_isr (void)
{ //2ms计时器
if(time_dis_flag)
display(time_page);
else
display(T_page);
if (++time_counter>=500) //1s
{
time_counter=0;
time_1s_ok=1;
if (++time[2] >=60)
{
time[2]=0;
if (++time[1] >=60) //time 1 是分
{
time[1]=0;
if (++time[2] >=99)
time[1]=0;
}
}
}
}
void display(unsigned char page)
{
PORTC=0xff;
if(page==time_page)
{
PORTA=led_7[dis_buff[posit]];
if(point_on&&posit==1) PORTA|=0x80;
}
else if(page==T_page )
{
PORTA=led_7[temperature[posit]];
if(posit==1) PORTA|=0x80;
}
PORTC=position[posit];
if(++posit>=4) posit=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -