久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機程序檢測沒問題,發送有回應,但無法控制單片機,求大佬看看,藍牙在最后
[打印本頁]
作者:
愛上機電
時間:
2019-5-23 19:10
標題:
單片機程序檢測沒問題,發送有回應,但無法控制單片機,求大佬看看,藍牙在最后
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar time_data[7];
uchar code write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80}; //數據的地址
uchar code read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
uchar code table1[]="S:000 2000/00/00";
uchar code table2[]="N:000 00:00:00 0";
uchar code table3[]=" "; //清屏內容
uchar code table4[]=" Set Real Time ";
uchar code table5[]=" Set Heat Time ";
uchar code table6[]=" Start Time: ";
uchar code table7[]=" 00:00:00 ";
uchar code table8[]=" End Time: ";
uchar code table9[]=" Set Water Temp";
uchar code table10[]="Temperature: ";
uchar code table11[]=" 000C";
bit Adjust; //調節標志位,=1表示進入調節模式,=0是正常模式
bit Timer; //定時模式標志位,=1表示進入定時開啟模式,=0是光線開啟模式
sbit rs=P1^0; //LCD1602
sbit rw=P1^1; //LCD1602
sbit e=P1^2; //LCD1602
sbit sck=P3^2; //時鐘端口
sbit io=P3^3; //時鐘端口
sbit rst=P3^4; //時鐘端口
sbit SELT =P1^3; //選擇鍵
sbit ENTER=P1^4; //確認鍵
sbit UP =P1^5; //加鍵
sbit DOWN =P1^6; //減鍵
sbit CLEAN_LED=P3^7; //清洗燈接口
sbit CHECK=P3^6; //水位檢測燈接口
sbit HEAT =P3^5; //加熱燈端口
sbit JDQ =P2^7; //繼電器接口
sbit BEEP =P2^6; //蜂鳴器接口
sbit DQ =P2^0; //溫度檢測端口
sbit WATER=P2^1; //水位傳感器接口
sbit CLOSED=P2^2; //紅外檢測接口
sbit PUMP=P2^3; //水泵接口
sbit ADD =P2^5; //加水接口
sbit CLEAN=P2^4; //清洗接口
int temperature; //全局變量 溫度
int temp_set=100; //設定溫度 默認100
uchar Select_num; //選擇按鍵按下次數
uchar Enter_num; //確認按鍵按下次數
float Year,Month,Day,Hour,Minute,Second,Week; //時間設置值
float Hour_H,Minute_H,Second_H; //設置開始時間
float Hour_L,Minute_L,Second_L; //設置結束時間
int Count; //T0中斷次數
uchar Miao; //延時時間10s
void read_rtc();
uchar receive;
/*********************************************************************************************************************/
void delay1(uint z) //延時函數
{
uint x,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
}
void write_com(uchar com) //寫指令函數
{
rw=0;
delay1(5);
rs=0;
delay1(5);
e=1;
delay1(5);
P0=com;
delay1(5);
e=0;
delay1(5);
}
void write_date(uchar date) //寫數據函數
{
rw=0;
delay1(5);
rs=1;
delay1(5);
e=1;
delay1(5);
P0=date;
delay1(5);
e=0;
delay1(5);
}
void init() //初始化函數
{
uchar num;
Hour_H=23;
Minute_H=59;
Second_H=59;
e=0; // 時序表e初始為0
write_com(0x38); //設置16*2顯示,5*7點陣,8位數據接口
write_com(0x0c); //設置光標
write_com(0x06); //光標自動加1,光標輸入方式
write_com(0x01); //清屏
write_com(0x80); //設置初始顯示位置
for(num=0;num<16;num++)
{
write_date(table1[num]);
delay1(5);
}
write_com(0x80+0x40);
for(num=0;num<16;num++)
{
write_date(table2[num]);
delay1(5);
}
}
void SetTime_dispaly(uchar add,uchar dat) //第一個:參數的地址,第二個:參數的內容
{
uchar shi,ge;
shi=dat/10; //十位提取出來
ge=dat%10; //個位提取出來
write_com(add); //要寫的地址
write_date(0x30+shi); //十位的內容 1602字符庫
write_date(0x30+ge); //個位的內容 1602字符庫
}
void Temperature_dispaly(uchar add,uchar dat) //第一個:參數的地址,第二個:參數的內容
{
uchar bai,shi,ge;
bai=dat/100;
shi=dat%100/10; //把溫度的十位提取出來
ge=dat%10; //把溫度的個位提取出來
write_com(add); //要寫的地址
write_date(0x30+bai);
write_date(0x30+shi); //十位的內容 1602字符庫
write_date(0x30+ge); //個位的內容 1602字符庫
}
void Date_dispaly(uchar add,uchar dat) //第一個:參數的地址,第二個:參數的內容
{
uchar shi,ge;
shi=dat/16; //把溫度的十位提取出來
ge=dat%16; //把溫度的個位提取出來
write_com(add); //要寫的地址
write_date(0x30+shi); //十位的內容 1602字符庫
write_date(0x30+ge); //個位的內容 1602字符庫
}
void Week_dispaly(uchar add,uchar dat) //第一個:參數的地址,第二個:參數的內容
{
write_com(add); //要寫的地址
write_date(0x30+dat); //十位的內容 1602字符庫
}
void LCD_Clean(uchar i) //液晶屏清除顯示
{
uchar num;
if(i==1)
{
write_com(0x80); //設置初始顯示位置
for(num=0;num<16;num++) //顯示第一行內容
{
write_date(table3[num]);
delay1(1);
}
}
if(i==2)
{
write_com(0x80+0x40);
for(num=0;num<16;num++) //顯示第二行內容
{
write_date(table3[num]);
delay1(1);
}
}
}
void LCD_Display_String(unsigned char line,unsigned char *string)
{ //液晶屏顯示內容,把要顯示的內容寫到對應的位置
unsigned char i;
unsigned char address=0;
if(line==1)
{
address=0x80; //0X80是第1行的第1個位置 ,0x81第2位
}
else if(line==2)
{
address=0x80+0x40; //0X80+0x40是第2行的第1個位置 ,0X80+0x40+1是第2行第2位
}
for(i=0;i<16;i++)
{
write_com(address);
write_date(string[i]);
address++;
}
}
void Time_Display(void)
{
read_rtc();
Date_dispaly(0x80+0x40+12,time_data[6]); //顯示秒
Date_dispaly(0x80+0x40+9,time_data[5]); //顯示分
Date_dispaly(0x80+0x40+6,time_data[4]); //顯示時
Date_dispaly(0x80+14,time_data[3]); //顯示日
Date_dispaly(0x80+11,time_data[2]); //顯示月
Week_dispaly(0x80+0x40+15,time_data[1]); //顯示周
Date_dispaly(0x80+8,time_data[0]); //顯示年
// Year/10*16+Year%10
Year=time_data[0]/16*10+time_data[0]%16;
Week=time_data[1]/16*10+time_data[1]%16;
Month=time_data[2]/16*10+time_data[2]%16;
Day=time_data[3]/16*10+time_data[3]%16;
Hour=time_data[4]/16*10+time_data[4]%16;
Minute=time_data[5]/16*10+time_data[5]%16;
Second=time_data[6]/16*10+time_data[6]%16;
}
void write_ds1302_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
sck=0;
io=dat&0x01; //準備數據,從最低位開始
dat=dat>>1;
sck=1;
}
}
void write_ds1302(uchar add,uchar dat)
{
rst=0;
_nop_(); //CPU原地踏步
sck=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(add); //傳地址
write_ds1302_byte(dat); //傳數據
rst=0; //不受其他影響
_nop_();
io=1; //釋放
sck=1;
}
uchar read_ds1302(uchar add)
{
uchar i,value;
rst=0;
_nop_(); //CPU原地踏步
sck=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(add);
for(i=0;i<8;i++)
{
value=value>>1;
sck=0;
if(io)
value=value|0x80;
sck=1;
}
rst=0;
_nop_();
sck=0;
_nop_();
sck=1;
io=1;
return value;
}
void set_rtc() //設置時間
{
uchar i,j;
for(i=0;i<7;i++) //轉換BCD碼
{
j=time_data[i]/10;
time_data[i]=time_data[i]%10;
time_data[i]=time_data[i]+j*16;
}
write_ds1302(0x8e,0x00); //去除寫保護
for(i=0;i<7;i++)
{
write_ds1302(write_add[i],time_data[i]);
}
write_ds1302(0x8e,0x80); //加寫保護
}
void read_rtc()
{
uchar i;
for(i=0;i<7;i++)
{
time_data[i]=read_ds1302(read_add[i]); //最終讀出來的數 16進制
}
}
/*************************************************按鍵****************************************************************/
void Keyscan(void)
{
if(SELT==0)
{
delay1(2);
if(SELT==0)
{
while(!SELT);
Select_num++; //選擇鍵按下一次
Adjust=1; //進入調節模式
}
if(Select_num==1)
{
LCD_Clean(1);
LCD_Clean(2);
LCD_Display_String(1,table4);
LCD_Display_String(2,table5);
write_com(0x80+0); //寫 >>
write_date(0x3e);
write_com(0x80+1); //寫 >>
write_date(0x3e);
Enter_num=0;
}
if(Select_num==2)
{
LCD_Clean(1);
LCD_Clean(2);
LCD_Display_String(1,table4);
LCD_Display_String(2,table5);
write_com(0x80+0x40+0); //寫 >>
write_date(0x3e);
write_com(0x80+0x40+1); //寫 >>
write_date(0x3e);
Enter_num=0;
}
if(Select_num==3)
{
LCD_Clean(1);
LCD_Clean(2);
LCD_Display_String(1,table9);
LCD_Display_String(2,table3);
write_com(0x80+0); //寫 >>
write_date(0x3e);
write_com(0x80+1); //寫 >>
write_date(0x3e);
Enter_num=0;
}
if(Select_num==4)
{
LCD_Clean(1);
LCD_Clean(2);
LCD_Display_String(1,table1);
LCD_Display_String(2,table2);
Select_num=0;
Enter_num=0;
Adjust=0;
}
write_com(0x0c); //光標不再閃爍
Enter_num=0;
}
if(ENTER==0)
{
delay1(2);
if(ENTER==0)
{
while(!ENTER);
Enter_num++;
}
if(Select_num==1) //設置實時時間
{
if(Enter_num==1)
{
LCD_Clean(1);
LCD_Clean(2);
LCD_Display_String(1,table1);
LCD_Display_String(2,table2);
SetTime_dispaly(0x80+8,Year);
SetTime_dispaly(0x80+11,Month);
SetTime_dispaly(0x80+14,Day);
SetTime_dispaly(0x80+0x40+6,Hour);
SetTime_dispaly(0x80+0x40+9,Minute);
SetTime_dispaly(0x80+0x40+12,Second);
Week_dispaly(0x80+0x40+15,Week);
write_com(0x80+8); //光標閃爍地址,停留在年的位置上
write_com(0x0f); //光標閃爍
}
if(Enter_num==2)
{
write_com(0x80+11); //光標閃爍地址,停留在月的位置上
write_com(0x0f); //光標閃爍
}
if(Enter_num==3)
{
write_com(0x80+14); //光標閃爍地址,停留在日的位置上
write_com(0x0f); //光標閃爍
}
if(Enter_num==4)
{
write_com(0x80+0x40+6); //光標閃爍地址,停留在時的位置上
write_com(0x0f); //光標閃爍
}
if(Enter_num==5)
{
write_com(0x80+0x40+9); //光標閃爍地址,停留在分的位置上
write_com(0x0f); //光標閃爍
}
if(Enter_num==6)
{
write_com(0x80+0x40+12); //光標閃爍地址,停留在秒的位置上
write_com(0x0f); //光標閃爍
}
if(Enter_num==7)
{
write_com(0x80+0x40+15); //光標閃爍地址,停留在星期的位置上
write_com(0x0f); //光標閃爍
}
if(Enter_num==8)
{
Enter_num=0;
write_com(0x0c); //光標不再閃爍
LCD_Clean(1);
LCD_Clean(2);
LCD_Display_String(1,table1);
LCD_Display_String(2,table2);
time_data[0]=Year;///10*16+Year%10;
time_data[1]=Week;///10*16+Week%10;
time_data[2]=Month;///10*16+Month%10;
time_data[3]=Day;///10*16+Day%10;
time_data[4]=Hour;///10*16+Hour%10;
time_data[5]=Minute;///10*16+Minute%10;
time_data[6]=Second;///10*16+Second%10;
set_rtc(); //設置時間
Select_num=0;
Adjust=0;
}
}
if(Select_num==2) //設置時間段
{
if(Enter_num==1)
{
LCD_Clean(1);
LCD_Clean(2);
LCD_Display_String(1,table6);
LCD_Display_String(2,table7);
SetTime_dispaly(0x80+0x40+4,Hour_L);
SetTime_dispaly(0x80+0x40+7,Minute_L);
SetTime_dispaly(0x80+0x40+10,Second_L);
write_com(0x80+0x40+4); //光標閃爍地址,停留在時的位置上
write_com(0x0f); //光標閃爍
}
if(Enter_num==2)
{
write_com(0x80+0x40+7); //光標閃爍地址,停留在分的位置上
write_com(0x0f); //光標閃爍
}
if(Enter_num==3)
{
write_com(0x80+0x40+10); //光標閃爍地址,停留在秒的位置上
write_com(0x0f); //光標閃爍
}
if(Enter_num==4)
{
write_com(0x0c); //光標不再閃爍
LCD_Clean(1);
LCD_Clean(2);
LCD_Display_String(1,table8);
LCD_Display_String(2,table7);
SetTime_dispaly(0x80+0x40+4,Hour_H);
SetTime_dispaly(0x80+0x40+7,Minute_H);
SetTime_dispaly(0x80+0x40+10,Second_H);
write_com(0x80+0x40+4); //光標閃爍地址,停留在時的位置上
write_com(0x0f); //光標閃爍
}
if(Enter_num==5)
{
write_com(0x80+0x40+7); //光標閃爍地址,停留在分的位置上
write_com(0x0f); //光標閃爍
}
if(Enter_num==6)
{
write_com(0x80+0x40+10); //光標閃爍地址,停留在秒的位置上
write_com(0x0f); //光標閃爍
}
if(Enter_num==7)
{
Enter_num=0;
write_com(0x0c); //光標不再閃爍
LCD_Clean(1);
LCD_Clean(2);
LCD_Display_String(1,table1);
LCD_Display_String(2,table2);
Select_num=0;
Adjust=0;
}
}
if(Select_num==3) //設置水溫
{
if(Enter_num==1)
{
LCD_Clean(1);
LCD_Clean(2);
LCD_Display_String(1,table10);
LCD_Display_String(2,table11);
Temperature_dispaly(0x80+0x40+12,temp_set);
write_com(0x80+0x40+12); //光標閃爍地址,停留在水溫的位置上
write_com(0x0f); //光標閃爍
}
if(Enter_num==2)
{
Enter_num=0;
write_com(0x0c); //光標不再閃爍
LCD_Clean(1);
LCD_Clean(2);
LCD_Display_String(1,table1);
LCD_Display_String(2,table2);
Select_num=0;
Adjust=0;
}
}
}
if(UP==0)
{
delay1(2);
if(UP==0)
{
while(!UP);
if(Select_num==1)
{
if(Enter_num==1)
{
Year++;
if(Year>99)
Year=0;
SetTime_dispaly(0x80+8,Year);
write_com(0x80+8);
write_com(0x0f);
}
if(Enter_num==2)
{
Month++;
if(Month>12)
Month=1;
SetTime_dispaly(0x80+11,Month);
write_com(0x80+11);
write_com(0x0f);
}
if(Enter_num==3)
{
Day++;
if(Day>31)
Day=1;
SetTime_dispaly(0x80+14,Day);
write_com(0x80+14);
write_com(0x0f);
}
if(Enter_num==4)
{
Hour++;
if(Hour>23)
Hour=0;
SetTime_dispaly(0x80+0x40+6,Hour);
write_com(0x80+0x40+6);
write_com(0x0f);
}
if(Enter_num==5)
{
Minute++;
if(Minute>59)
Minute=0;
SetTime_dispaly(0x80+0x40+9,Minute);
write_com(0x80+0x40+9);
write_com(0x0f);
}
if(Enter_num==6)
{
Second++;
if(Second>59)
Second=0;
SetTime_dispaly(0x80+0x40+12,Second);
write_com(0x80+0x40+12);
write_com(0x0f);
}
if(Enter_num==7)
{
Week++;
if(Week>7)
Week=1;
Week_dispaly(0x80+0x40+15,Week);
write_com(0x80+0x40+15);
write_com(0x0f);
}
}
if(Select_num==2)
{
if(Enter_num==1)
{
Hour_L++;
if(Hour_L>23)
Hour_L=0;
SetTime_dispaly(0x80+0x40+4,Hour_L);
write_com(0x80+0x40+4);
write_com(0x0f);
}
if(Enter_num==2)
{
Minute_L++;
if(Minute_L>59)
Minute_L=0;
SetTime_dispaly(0x80+0x40+7,Minute_L);
write_com(0x80+0x40+7);
write_com(0x0f);
}
if(Enter_num==3)
{
Second_L++;
if(Second_L>59)
Second_L=0;
SetTime_dispaly(0x80+0x40+10,Second_L);
write_com(0x80+0x40+10);
write_com(0x0f);
}
if(Enter_num==4)
{
Hour_H++;
if(Hour_H>23)
Hour_H=0;
SetTime_dispaly(0x80+0x40+4,Hour_H);
write_com(0x80+0x40+4);
write_com(0x0f);
}
if(Enter_num==5)
{
Minute_H++;
if(Minute_H>59)
Minute_H=0;
SetTime_dispaly(0x80+0x40+7,Minute_H);
write_com(0x80+0x40+7);
write_com(0x0f);
}
if(Enter_num==6)
{
Second_H++;
if(Second_H>59)
Second_H=0;
SetTime_dispaly(0x80+0x40+10,Second_H);
write_com(0x80+0x40+10);
write_com(0x0f);
}
}
if(Select_num==3)
{
if(Enter_num==1)
{
temp_set++;
if(temp_set>100) //最高100度
temp_set=0;
Temperature_dispaly(0x80+0x40+12,temp_set);
write_com(0x80+0x40+12);
write_com(0x0f);
}
}
}
}
if(DOWN==0)
{
delay1(2);
if(DOWN==0)
{
while(!DOWN);
if(Select_num==1)
{
if(Enter_num==1)
{
Year--;
if(Year<0)
Year=99;
SetTime_dispaly(0x80+8,Year);
write_com(0x80+8);
write_com(0x0f);
}
if(Enter_num==2)
{
Month--;
if(Month<1)
Month=12;
SetTime_dispaly(0x80+11,Month);
write_com(0x80+11);
write_com(0x0f);
}
if(Enter_num==3)
{
Day--;
if(Day<1)
Day=31;
SetTime_dispaly(0x80+14,Day);
write_com(0x80+14);
write_com(0x0f);
}
if(Enter_num==4)
{
Hour--;
if(Hour<0)
Hour=23;
SetTime_dispaly(0x80+0x40+6,Hour);
write_com(0x80+0x40+6);
write_com(0x0f);
}
if(Enter_num==5)
{
Minute--;
if(Minute<0)
Minute=59;
SetTime_dispaly(0x80+0x40+9,Minute);
write_com(0x80+0x40+9);
write_com(0x0f);
}
if(Enter_num==6)
{
Second--;
if(Second<0)
Second=59;
SetTime_dispaly(0x80+0x40+12,Second);
write_com(0x80+0x40+12);
write_com(0x0f);
}
if(Enter_num==7)
{
Week--;
if(Week<1)
Week=7;
Week_dispaly(0x80+0x40+15,Week);
write_com(0x80+0x40+15);
write_com(0x0f);
}
}
if(Select_num==2)
{
if(Enter_num==1)
{
Hour_L--;
if(Hour_L<0)
Hour_L=23;
SetTime_dispaly(0x80+0x40+4,Hour_L);
write_com(0x80+0x40+4);
write_com(0x0f);
}
if(Enter_num==2)
{
Minute_L--;
if(Minute_L<0)
Minute_L=59;
SetTime_dispaly(0x80+0x40+7,Minute_L);
write_com(0x80+0x40+7);
write_com(0x0f);
}
if(Enter_num==3)
{
Second_L--;
if(Second_L<0)
Second_L=59;
SetTime_dispaly(0x80+0x40+10,Second_L);
write_com(0x80+0x40+10);
write_com(0x0f);
}
if(Enter_num==4)
{
Hour_H--;
if(Hour_H<0)
Hour_H=23;
SetTime_dispaly(0x80+0x40+4,Hour_H);
write_com(0x80+0x40+4);
write_com(0x0f);
}
if(Enter_num==5)
{
Minute_H--;
if(Minute_H<0)
Minute_H=59;
SetTime_dispaly(0x80+0x40+7,Minute_H);
write_com(0x80+0x40+7);
write_com(0x0f);
}
if(Enter_num==6)
{
Second_H--;
if(Second_H<0)
Second_H=59;
SetTime_dispaly(0x80+0x40+10,Second_H);
write_com(0x80+0x40+10);
write_com(0x0f);
}
}
if(Select_num==3)
{
if(Enter_num==1)
{
temp_set--;
if(temp_set<0) //最高70度
temp_set=100;
Temperature_dispaly(0x80+0x40+12,temp_set);
write_com(0x80+0x40+12);
write_com(0x0f);
}
}
}
}
}
void Open(void)
{
float Now;
float Set_L,Set_H;
Now=Hour+Minute/60+Second/3600; //把實時時間化成小時為單位
Set_L=Hour_L+Minute_L/60+Second_L/3600; //把設置下限時間化成小時為單位
Set_H=Hour_H+Minute_H/60+Second_H/3600; //把設置上限時間化成小時為單位
if(WATER==1) //表示有水
{
ADD=1; //停止加水
BEEP=0; //關蜂鳴器
CHECK=1; //缺水燈滅
if(temperature<temp_set) //溫度低于設置值 需要加熱
{
if((Now>=Set_L)&(Now<=Set_H)) //實時時間在上下限時間范圍內
{
HEAT=0; //加熱
JDQ=0; //閉合繼電器
}
if((Now<Set_L)|(Now>Set_H)) //實時時間不在范圍內
{
HEAT=1; //停止加熱
JDQ=1; //斷開繼電器
}
}
else
{
HEAT=1; //停止加熱
JDQ=1; //斷開繼電器
}
if(CLOSED==0) //有水時 靠近開水泵出水
PUMP=0;
else
PUMP=1;
}
else //如果缺水
{
CHECK=0; //缺水燈亮
BEEP=1; //開蜂鳴器
HEAT=1; //停止加熱
JDQ=1; //斷開繼電器
ADD=0; //加水
PUMP=1; //無水時無法出水
}
if((time_data[1]==2)&(Hour>=6)&(Hour<7)) //清洗功能 固定周一早上六點到七點 2表示一個星期第二天,星期一
{
CLEAN=0; //開啟清洗電機
CLEAN_LED=0; //開啟清洗燈
}
else
{
CLEAN=1; //關閉清洗電機
CLEAN_LED=1; //關閉清洗燈
}
}
/****************************************************************************************************/
/*void delay(uint y) //DS18B20延時函數(仿真用)
{
while(y--);
}
*/
void delay(uint z) //DS18B20延時函數(實物用)
{
uint x,y;
for(x=z;x>0;x--)
for(y=1;y>0;y--);
}
void write_byte(uint dat) //寫一個字節
{
uchar i;
for(i=0;i<8;i++) //循環八次 共有八位
{
DQ=0; //寫零
DQ=dat&0x01; //向總線寫位數據,從最低位寫起
delay(4);
DQ=1; //寫一
dat>>=1; //下次寫作準備,移位數據
}
delay(4);
}
uchar read_byte(void) //讀一個字節,返回值
{
uchar i;
uint value;
for(i=0;i<8;i++) //循環八次 共有八位
{
DQ=0;
value>>=1;
DQ=1; //釋放總線
if(DQ)
value|=0x80; //DQ=1,value取1
delay(4);
}
return value;
}
void ds18b20_init() //初始化函數
{
uint n;
DQ=1;
delay(8);
DQ=0;
delay(80); //低電平480——960us
DQ=1; //總線釋放
delay(8); //等待50——100us
n=DQ; //讀取復位狀態
delay(4);
}
int readtemperature() //讀整數部分
{
int a,b; //高八位,低八位
ds18b20_init();
write_byte(0xcc); //跳過rom匹配,跳過讀序列號的操作,可節省操作時間
write_byte(0x44); //啟動溫度檢測
delay(300); //測溫度
ds18b20_init(); //開始操作前需要復位
write_byte(0xcc); //跳過rom匹配
write_byte(0xbe); //寫讀寄存器中溫度值的命令
a=read_byte(); //low 低位開始讀取
b=read_byte(); //high 高位開始讀取
b<<=8; //把高位左移八位
b=b|a; //高八位與第八位進行或運算,得到總和
if(b>=0) //如果溫度大于等于0
{
b=b*0.0625; //直接乘以0.0625
}
else //溫度小于0
{
b=~b+1; //取反碼再加一
b=b*0.0625; //再運算
}
return b; //返回b,此時以表示溫度
}
/*******************************************************************************************************/
void T0_init(void)
{
TMOD=0x11; //設置定時器0為工作方式1
TH0=(65536-50000)/256; //50MS定時
TL0=(65536-50000)%256;
EA=1; //開定時器T0的中斷 總中斷
ET0=1; //允許T0中斷
TR0=1; //開啟定時器
}
void UsartConfiguration(void)
{
SCON=0X50; //設置為工作方式1,8位數據,可變波特率
TMOD=0X20; //設置計數器工作方式2
PCON=0X00; //波特率不加倍
TH1=0XFd; //計數器初始值設置,[url=mailto:9600@11.0592MHz]9600@11.0592MHz[/url]
TL1=0XFd;
TR1=1; //打開計數器
ES = 1; //開串口中斷
EA = 1; //開總中斷
}
void main()
{
BEEP=0; //關閉蜂鳴器
T0_init(); //定時器初始化
init(); //液晶初始化
UsartConfiguration();
while(1)
{
if(Adjust==0) //非調節模式下顯示時間和開鎖
{
Time_Display(); //顯示時間
if(Count>=10) //50ms*10次=0.5s
{
temperature=readtemperature(); //讀取溫度
Temperature_dispaly(0x80+0x40+2,temperature);//顯示溫度
Temperature_dispaly(0x80+2,temp_set); //顯示設置溫度
Count=0; //清除計數
}
Open(); //動作判斷
}
Keyscan(); //掃描鍵盤
}
}
void Timer0() interrupt 1 //定時器T0中斷函數
{
TH0=(65536-50000)/256; //賦初值=50ms
TL0=(65536-50000)%256; //TH0=3C,TL0=B0
Count++; //每中斷一次,Count加一,計數20次,表示1s的時間到
}
void UART_SER(void) interrupt 4
{
EA=0;
receive=SBUF;
RI=0;
if(receive=='1')
{
HEAT=0; //加熱
JDQ=0; //閉合繼電器
}
if(receive=='2')
{
HEAT=1; //停止加熱
JDQ=1; //斷開繼電器
}
if(receive=='3')
{
CLEAN=0; //開啟清洗電機
CLEAN_LED=0; //開啟清洗燈
}
if(receive=='4')
{
CLEAN=1; //關閉清洗電機
CLEAN_LED=1; //關閉清洗燈
}
SBUF = receive; //將要發送的數據放入到發送寄存器
while(!TI); //等待發送數據完成
TI=0; //清除發送完成標志位
EA=1;
}
復制代碼
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产成人精品午夜视频免费
|
欧美一级二级在线观看
|
91精品免费视频
|
免费视频一区二区三区在线观看
|
亚洲欧美日韩精品
|
国产精品区一区二区三
|
免费电影av
|
www.久久国产精品
|
欧美日韩亚洲三区
|
波多野结衣一区二区
|
欧美日韩久久精品
|
91爱爱·com
|
99精品国自产在线
|
国产福利资源在线
|
黄色三级免费网站
|
最新日韩在线视频
|
四虎影视一区二区
|
特级a欧美做爰片毛片
|
欧美国产中文
|
亚洲天堂精品一区
|
久久久成人精品
|
国产高清精品一区二区三区
|
久久久亚洲成人
|
91看片免费
|
久久国产一区
|
日韩在线中文
|
中文字幕精品一区二区三区精品
|
亚洲精品久久久久久久久久久
|
自拍偷拍视频网
|
九九久久国产精品
|
91精品国产高清一区二区三区
|
亚洲精品久久
|
欧美日韩午夜精品
|
色综合一区二区
|
中文成人在线
|
99成人在线视频
|
久久精品中文
|
亚洲精品视频在线播放
|
亚洲视频二
|
日本不卡一区二区三区在线观看
|
一区视频
|