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