{
value>>=1;
DQ = 0; // pull DQ low to start timeslot DQ = 1; // then return high {unsigned char i;
for(i=0;i<2;i++);}//11us if(DQ)value|=0x80;
delay(6);// wait for rest of timeslot } EA=1;
return(value); }
/******************************************************** 向 1-WIRE 总线上写一个字节
*********************************************************/ static void write_byte(char val) {
byte i; EA=0;
for (i=8; i>0; i--) // writes byte, one bit at a time {
DQ = 0; // pull DQ low to start timeslot DQ=0;
DQ = val&0x01; //6US
delay(5);// hold value for remainder of timeslot //74us DQ = 1; val=val>>1; }
EA=1; delay(5); }
/******************************************************* 读取温度
*******************************************************/ word Read_Temperature(void) {
union{
14
byte c[2]; word x; }temp; ow_reset();
write_byte(0xCC); // Skip ROM
write_byte(0xBE); // Read Scratch Pad temp.c[1]=read_byte(); temp.c[0]=read_byte(); ow_reset();
write_byte(0xCC); //Skip ROM
write_byte(0x44); // Start Conversion return temp.x; }
/*************************************************************** 求解温度
***************************************************************/ extern byte Real_Tem(void) {
word wen;
wen=Read_Temperature(); return((wen>>4)&0x00ff); }
/*********************************************************************** Main.c
***********************************************************************/ #include
#define time_default 41
byte dingshi_time=time_default;//存放定时时间'''''' bit flag_dingshi=0; //0表示没有定时 word dingshi_jishu3=1000;//1000*60=1分钟 //
bit flag_dingshi_delay=0;//1表示有 byte dingshi_delay=100; //
#define hwx_delay_const 3 //人体感应延时时间
15
byte hwx_delay=hwx_delay_const;//用于保存红外线触发延长时间 word hwx_jishu1=0; //
byte wendu=0;//用于存放温度值'''''' //
#define low_wen 18 #define mid_wen 20 #define hig_wen 24 #define vhi_wen 28 //
byte time_stor=100; //存储主观时间//触发显示 byte wendu_stor=low_wen;//存储主观温度//触发显示 //
enum station0{zidong,dingshi,shoudong,weak}state; //函数说明区
extern byte Real_Tem(void );
extern void delay(word useconds); void mingjiao(void);
void display(byte input,bit kkl); void auto_speed(void); void weak_default(void);
/******************************************************************* 主程序
*******************************************************************/
void main() {
//定时器0用于键盘扫描
TMOD=0x01|TMOD;//定时器0的1方式
TH0=0xd8;TL0=0xf0; //定时器0初始化10ms扫描一次 //定时器1用于显示
TMOD=0x10|TMOD;//定时器1的1方式
TH1=0x15;TL1=0xA0; //定时器1初始化60ms中断一次
//外部中断
TCON=TCON|0x01;//外部中断0都下降沿触发 //以下为开启部分
IP=0X01; //两个定时器同等优先级
16
IE=0x8b; //开启定时器0,1,外部中断0中断
//
while(Real_Tem()==85); auto_speed();
LED_zidong=0; //刚开始为自动方式 P1=P1|0X7C; //拉高五个键盘
wendu_stor=100; //两个不可能值//用于启动显示 time_stor=100; //两个不可能值//用于启动显示 //
TR0=1; //开启定时器0
TR1=1; while(1) {
wendu=Real_Tem(); } }
/***********************************************************************************
定时器0中断服务子程序 功能:进行键盘处理
说明:键盘输入为P1.0到P1.4
***********************************************************************************/
void time0(void) interrupt 1 {
byte jianpan; TH0=0xd8;TL0=0xf0; jianpan = P1 & wujian;
if(jianpan != wujian) //如果还有键盘值提取键盘值 {
delay(500);//延时消抖
jianpan = P1 & wujian;
if(jianpan==wujian)goto time_out; switch(state) {
case dingshi: if(KEY1==0)//状态转换时做些相应的处理
17
{
state=shoudong; LED_shoudong=0; flag_dingshi_delay=0;dingshi_delay=100;
time_stor=100;wendu_stor=100;//触发 mingjiao(); while(KEY1==0); }
{
if(dingshi_time<90) {dingshi_time+=10;} dingshi_delay=100;// mingjiao(); while(KEY2==0); }
else if(KEY3==0)//减分 {
if(dingshi_time>10) {dingshi_time-=10;} dingshi_delay=100;// mingjiao(); while(KEY3==0); }
else if(KEY4==0)//定时与否
{
flag_dingshi=~flag_dingshi; if(flag_dingshi==1){LED_dingshi=0;} else {LED_dingshi=1;dingshi_jishu3=1000;} dingshi_delay=100;// // mingjiao(); while(KEY4==0); }
else if(KEY5==0) {
weak_default(); mingjiao();
18
else if(KEY2==0)//加分