?? main__.c
字號:
#include <mega16.h>
#include <delay.h>
#include <1820.h>
/**************************************************************
timeset-----------------PD2
temperature-------------PD3
hour--------------------PD4
miniute-----------------PD5
**************************************************************/
//time[0]--------HOURS
//time[1]--------miniutes
//temperature[0]---溫度百位
//temperature[1]---溫度十位
//temperature[2]---溫度個位
#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(); /*復(fù)位D18B20*/
ds1820_start(); /*啟動一次轉(zhuǎn)換*/
delay_ms(1000); /*等待轉(zhuǎn)換結(jié)束*/
i = ds1820_read_temp(); /*讀取溫度數(shù)值*/
i = (i * 10) / 16;
j=(unsigned char )i/10;
/*將顯示信息加載到顯示緩存區(qū)*/
temperature[0] = (char)(i /1000); //十位
temperature[1] = (char)(i %1000/ 100); //十位
temperature[2] = (char)(i %100/ 10);//個位
temperature[3] = (char)(i % 10); //小數(shù)位
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 溫度設(shè)定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時間‘時’設(shè)定
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時間‘分’設(shè)定
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檢測一次溫度,若溫度低于設(shè)定值就關(guān)閉風(fēng)扇
//溫度控制一直有,要是不想溫度控制,可以把溫度下限設(shè)置很高,比如50度
if(time_10s_ok)
{
time_10s_ok=0;
T=get_temperature();
if(T_control_flag)
{
if (T<TMAX)
{
#asm("cli");
stop_fan();
}
}
}
//檢測時間,如果時間超過定時上限,就關(guān)閉風(fēng)扇。由于定時功能可有可沒有,
//所以要檢測定時標(biāo)志位
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;
}
#include <mega16.h>
#define PD6 6
#define DQ_IN DDRD &= ~(1 << PD6) /*設(shè)置輸入*/
#define DQ_OUT DDRD |= (1 << PD6) /*設(shè)置輸出*/
#define DQ_CLR PORTD &= ~(1 << PD6) /*置低電平*/
#define DQ_SET PORTD |= (1 << PD6) /*置高電平*/
#define DQ_R PIND & (1 << PD6) /*讀了電平*/
unsigned char flag; /*中斷標(biāo)志緩存*/
/*
延時函數(shù)
延時時間:10um
CPU頻率為:4MHz。
*/
void delay_2us(void)
{ #asm("NOP");
return;
}
void delay_10us(unsigned char i) {
unsigned char j;
while (i--) {
j=5;
while(j--);
}
}
/*DS18B20復(fù)位函數(shù)*/
unsigned char ds1820_reset(void) {
unsigned char i;
flag = SREG; /*中斷保護(hù)*/
#asm("cli") /*關(guān)中斷*/
DQ_OUT;
DQ_CLR;
delay_10us(50); /*延時500uS(480-960)*/
DQ_SET;
DQ_IN;
delay_10us(8); /*延時80uS*/
i = DQ_R;
delay_10us(50); /*延時500uS(保持>480uS)*/
if (flag & 0x80) { /*恢復(fù)中斷狀態(tài)*/
#asm("sei")
}
if (i) {
return 0x00;
}
else {
return 0x01;
}
}
/*DS18B20字節(jié)讀取函數(shù)*/
unsigned char ds1820_read_byte(void) {
unsigned char i;
unsigned char value = 0;
flag = SREG; /*中斷保護(hù)*/
#asm("cli") /*關(guān)中斷*/
for (i = 8; i != 0; i--) {
value >>= 1;
DQ_OUT;
DQ_CLR;
delay_2us(); /*延時4uS*/
delay_2us();
DQ_SET;
DQ_IN;
delay_10us(1); /*延時10uS*/
if (DQ_R) {
value|=0x80;
}
delay_10us(6); /*延時60uS*/
}
if (flag & 0x80) { /*恢復(fù)中斷狀態(tài)*/
#asm("sei")
}
return(value);
}
/*DS18B20字節(jié)寫入函數(shù)*/
void ds1820_write_byte(unsigned char value) {
unsigned char i;
flag = SREG; /*中斷保護(hù)*/
#asm("cli") /*關(guān)中斷*/
for (i = 8; i != 0; i--) {
DQ_OUT;
DQ_CLR;
delay_2us(); /*延時4uS*/
delay_2us();
if (value & 0x01) {
DQ_SET;
}
delay_10us(8); /*延時80uS*/
DQ_SET; /*位結(jié)束*/
value >>= 1;
}
if (flag & 0x80) { /*恢復(fù)中斷狀態(tài)*/
#asm("sei")
}
}
/*啟動ds1820轉(zhuǎn)換*/
void ds1820_start(void) {
ds1820_reset();
ds1820_write_byte(0xCC); /*勿略地址*/
ds1820_write_byte(0x44); /*啟動轉(zhuǎn)換*/
}
/*DS8B20讀取溫度信息*/
unsigned int ds1820_read_temp(void)
{
unsigned int i;
unsigned char buf[9];
ds1820_reset();
ds1820_write_byte(0xCC); /*勿略地址*/
ds1820_write_byte(0xBE); /*讀取溫度*/
for (i = 0; i < 9; i++) {
buf[i] = ds1820_read_byte();
}
i = buf[1];
i <<= 8;
i |= buf[0];
return i;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -