久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2140|回復: 6
打印 上一主題 下一主題
收起左側

求助,單片機溫度程序不知道是哪里出了問題

[復制鏈接]
跳轉到指定樓層
樓主
要求是這樣的
設計內容:?

1、可設置三種最高溫度值,如低溫(20°),中溫(30°),高溫(50°);(20分)?

2、可設置最長10分鐘定時;(20分)?

3、用DS18B20感知溫度,當溫度達到設置溫度值,并持續設定時間長度時,蜂鳴器報警提示,同時時間歸零
我做出來仿真,溫度到了沒有倒計時是怎么回事,哪里出問題了?
求大佬



#define jum_ROM 0xcC//ds18B20 定義
#define start 0x44
#define read_EEROM 0xBE
void delay(unsigned int N) ;
void delay_1();
unsigned char Reset (void);//復位DS18B20
unsigned char read_bit (void) ;//從DS18B20讀一個位值
void write_bit(unsigned char bitval); //向DS18B20寫一位
unsigned char read_byte(void);//從DS18B20讀一個字節
void write_byte(unsigned char val);// 向DS18B20寫一個字節

#include<reg52.h>
#include"wendu.h"
sbit DQ=P2^3;//DS18B20數據口
/********************************************************************
*名稱: delay()
*功能:延時,延時時間大概為140US.
*輸入:無
*輸出:無
***********************************************************************/
void delay_1()
{
int i,j;
for(i=0; i<=10; i++)
for(j=0; j<=2; j++);
}
/***********************************************************
*名稱: delay()
*功能:延時函數
*輸入:無
*輸出:無
***********************************************************************/
void delay(unsigned int N)
{
int i;
for(i=0; i<N; i++);
}
/***********************************************************
*名稱: Reset()
*功能:復位DS18B20
*輸入:無
*輸出:無
***********************************************************************/
unsigned char Reset (void)
{
unsigned char deceive_ready;
DQ=0;
delay(29) ;
DQ=1;
delay(3);
deceive_ready = DQ;
delay(25);
return (deceive_ready) ;
}
/********************************************************************
*名稱: read_ _byte ()
*功能:從DS18B20讀一個字節
*輸入:無
*輸出:從DS18B20讀到的值
*******************************************************/
/************************************************
*名稱: read_bit()
*功能:從DS18B20讀一個位值
*輸入:無
*輸出:從DS18B20讀出的一個位值
***********************************************************/
unsigned char read_bit (void)
{
unsigned char i;
DQ=0;
DQ=1;
for(i=0; i<3; i++);
return(DQ) ;
}
/********************************************************************
*名稱: write_ _bit()
*功能:向DS18B20寫一位
*輸入: bitval (要對DS18B20寫入的位值)
*輸出:無
********************************************************************/
void write_bit (unsigned char bitval)
{
DQ=0; if (bitval==1)
DQ=1;
delay(5);
DQ=1;
}
/**********************************************************
*名稱: read_ byte()
*功能:從DS18B20讀一個字節
*輸入:無
*輸出:從DS18B20讀到的值
***********************************************************************/
unsigned char read_byte(void)
{
unsigned char i,m,receive_data;
m= 1;
receive_data = 0;
for(i=0; i<8; i++)
{
if(read_bit())
{
receive_data = receive_data + (m<<i);
}
delay(6);
}
return (receive_data);
}
/************************************************************
*名稱: write_ _byte ()
*功能:向DS18B20寫一個字節
*輸入: val
(要對DS18B20寫入的命令值)
*輸出:無
***********************************************************************/
void write_byte(unsigned char val)
{
unsigned char i,temp;
for(i=0; i<8; i++)
{
temp=val>>i;
temp = temp&0x01;
write_bit(temp);
delay(5);
}
}
#include<reg52.h>
#include"wendu.h"
sbit key1=P1^4;//矩陣鍵盤定義
sbit key2=P1^5;
sbit key3=P1^6;
sbit key4=P1^7;
sbit S1=P3^2;//按鍵定義
sbit S2=P3^3;
sbit S3=P3^4;
sbit RS=P2^5;//12864定義
sbit RW=P2^6;
sbit E=P2^7;
sbit BEEP = P2^0;//蜂鳴器定義
sbit Hot=P2^1;
unsigned char TMPH,TMPL,key41=1,Temp,T; //溫度常量
unsigned int count1,count2,count3;//時間常量
unsigned int countor,m,s;//計時常量
unsigned char button,sound;//其他常 量
unsigned char code table[]={"0123456789"};
/***************************************/
void delay_1ms(unsigned int i)//1ms延時
{
unsigned char x,j;
for (j=0;j<i;j++)
for (x=0;x<=148;x++) ;
}
/***************************************/
void delay6() //延時子程序
{
int a,b;
for(a=0;a<100;a++)
for(b=0;b<10;b++) ;
}
/*****************************************/
void beep()//響鈴程序
{
unsigned char i;
for (i=0;i<100;i++)
{
delay_1ms(1);
BEEP= !BEEP ; //BEEP取反
}
BEEP=1;
//關閉蜂鳴器
}
/*******************************************/
void set(char n) //12864 寫指令子程序
{
P0=n;
RS=0;
RW=0;
E=0;
delay6();
E=1;
delay6();
}
/**********************************/
void weizhi(int hang,int lie)//12864字符顯示位置
{
char a;
if (hang==1) a=0x80;
if (hang==2) a=0xc0;
a=a+lie-1;
set(a);
}
/**********************************/
void wdata(unsigned char d)//往 12864寫數據,單個字符
{
RS=1;
RW=0;
P0=d;
E=0;
delay6();
E=1;
delay6();
}
/**********************************/
void wsdata (char tab[])//往12864寫數據,字符串
{
int i=0;
RS=1;
RW=0;
while(tab[ i]!='\0' )//不是結束符時執行
{
P0=tab[ i];
E=0;
delay6();
E=1;
delay6();
i++;
}
}
/**********************************/
void scan()//矩陣鍵盤第- -列掃描,確定所輸入的時間
{
P1=0xfe;
if(key1==0)
{ delay6();
if(key1==1)
{ count1++;
beep();
}
}
if(key2==0)
{ delay6();
if(key2==1)
{
count2++;
beep();
}
}
if(key3==0)
{ delay6();
if(key3==1)
{
count3++;
beep();
}
}
if(key4==0)
{
key41=0;
beep();
}
}
/************************************/
void setTemp()//溫度設定,采用掃描獨立鍵盤來確定輸入
{while(1)
{
P3=0xff;
if(S1==0) button=1;//20度
if(S2==0) button=2;//30度
if(S3==0) button=3;//50度
if(button==1)
{
T=20;
weizhi(2,5);
wdata(table[2]);
delay_1ms(1);
weizhi(2,6);
wdata(table[0]);
}
if (button==2)
{
T=30;
weizhi(2,5);
wdata(table[3]);
delay_1ms(1);
weizhi(2,6);
wdata(table[0]);
}
if (button==3)
{
T=50;
weizhi(2,5);
wdata(table[5]);
delay_1ms(1);
weizhi(2,6);
wdata (table[0]);
}
if (button==1||button==2||button==3)
break;
}
}
/*********************************/
void setTime() //時間設定
{
while(1)
{
scan();
if(key41==0)
break;
}
m=(1*count1)+(2*count2)+(5*count3);//計算所設定的時間
Hot=1;
}
/*********************************/
void daoji()//倒計時
{
if(m==0&s==0)
{
m=0;
s=0;
sound=1;
Hot=0;
TR0=0;
}
else if(s==0)
{ m--;s=59;}
else
s--;
}
/************************************/
void showTime ()//顯示時間
{
weizhi(2,11);
wdata(table[m/10]);//顯示分
delay_1ms(1);
weizhi(2,12);
wdata(table[m%10]);
delay_1ms(1);
weizhi(2,13);
wdata(':');
delay_1ms (1);
weizhi(2,14);
wdata(table[s/10]);//顯示秒
delay_1ms(1);
weizhi(2,15);
wdata(table[s%10]);
delay_1ms(1);
}
/********************************/
void showTemp()//顯示溫度
{
delay_1ms(1);
weizhi(1,13);
wdata(table[Temp/10]);
delay_1ms(1);
weizhi(1,14);
wdata(table[Temp%10]);
delay_1ms(1);
}
/***********************************/
void chu12864() //初始化 12864
{
set(0x01);//清屏.
set(0x38);//顯示模式
set(0x0c);//顯示開
set(0x06);//光標設置
weizhi(1,4); //定義字符顯示位置 第一行,第四列
wsdata("Welcome"); //顯示開機歡迎語
weizhi(2,3);
wsdata("T=");
weizhi(2,7);
wsdata("oC");
IE=0x82; //設定定時 器工作方式
TMOD=0X01;
TH0=(65536-50000)/256; //設定 計時器的定時時長50MS
TL0=(65536-50000)%256;
button=0;//初始化參數
count1=0;
count2=0;
count3=0;
Hot=0;
m=0;
s=0;
T=0;
}
void chuDS() //初始化 DS18B20
{
Reset();
write_byte(0xCC);
write_byte(start);
Reset();
write_byte(0xCC);
write_byte(read_EEROM) ;
TMPL = read_byte();
TMPH = read_byte ();
Temp=TMPL/16+TMPH*16;
delay_1ms(1);
}
/*************************************/
void main()//主函數
{
chu12864();
setTemp();
setTime();
while(1)
{
chuDS();
if(Temp==T)
TR0=1;
showTemp();
showTime();
if(sound==1)
beep();
}
}
/*************************************/
void time0(void) interrupt 1 using 1 //定時中斷程序
{
countor++;
if(countor==20)
{
daoji();
countor=0;
}
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:744327 發表于 2020-6-2 08:42 | 只看該作者
void setTemp()//溫度設定,采用掃描獨立鍵盤來確定輸入
{while(1)
{
P3=0xff;
if(S1==0) button=1;//20度
if(S2==0) button=2;//30度
if(S3==0) button=3;//50度
if(button==1)
{
T=20;
weizhi(2,5);
wdata(table[2]);
delay_1ms(1);
weizhi(2,6);
wdata(table[0]);
}
這段程序沒有進行按鍵消抖
回復

使用道具 舉報

板凳
ID:739545 發表于 2020-6-2 09:29 | 只看該作者
主函數都沒有調用倒計時函數,另軟件里面有兩個調用REG52,及不同的DS算法,不知道你是怎么編譯過的。估計只是用了下人家的hex文件,然后胡亂copy下代碼
回復

使用道具 舉報

地板
ID:765457 發表于 2020-6-2 12:26 | 只看該作者
lovezjf234 發表于 2020-6-2 09:29
主函數都沒有調用倒計時函數,另軟件里面有兩個調用REG52,及不同的DS算法,不知道你是怎么編譯過的。估計 ...

程序確實不是我的,我還在初步學習,但我想知道問題出在哪里,我把if(Temp==T)這句刪掉依然可以倒計時,T能顯示所以是有賦值的,所以我認為問題出在了DS18B20溫度讀取TEMP上,但是不知道怎么改,能教我一下嗎
回復

使用道具 舉報

5#
ID:765457 發表于 2020-6-2 12:29 | 只看該作者
烈火 發表于 2020-6-2 08:42
void setTemp()//溫度設定,采用掃描獨立鍵盤來確定輸入
{while(1)
{

我覺得問題出在了DS18B20上面,我刪了就能倒計時,應該是temp數據讀取那邊程序有問題,但我不知道怎么改。
回復

使用道具 舉報

6#
ID:767431 發表于 2020-6-2 14:01 | 只看該作者
買個20多塊的邏輯分析儀調試,分析iic spi都能用得上
回復

使用道具 舉報

7#
ID:739545 發表于 2020-6-4 09:17 | 只看該作者
1042860439 發表于 2020-6-2 12:26
程序確實不是我的,我還在初步學習,但我想知道問題出在哪里,我把if(Temp==T)這句刪掉依然可以倒計時,T ...

你代碼都沒有完全搞清楚,就隨便刪除,能找到原因就怪了。你把主函數代碼搞清楚,再看子函數的調用是否正確。做事要按照步驟來。 直接從頭建立一個工程,按照自己的理解把代碼填進去
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人91| 不卡欧美 | 国产精品a久久久久 | 亚洲国产免费 | 精品欧美激情在线观看 | 亚洲国产精品人人爽夜夜爽 | 久草免费在线 | a级毛片毛片免费观看久潮喷 | 国产精品毛片一区二区在线看 | 日韩精品一区二区三区中文字幕 | www.久| 超碰av免费 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 日韩成人久久 | 99综合| 亚洲精品一区二区三区蜜桃久 | 国产一区二区三区在线视频 | 老妇激情毛片免费 | av中文字幕在线 | 国产精品一区二区精品 | 国产目拍亚洲精品99久久精品 | 婷婷精品 | 一级片免费在线观看 | 亚洲精品2区 | 亚洲播放一区 | 最新高清无码专区 | 五月激情综合 | 国产成人一区二区三区久久久 | 亚洲成人中文字幕 | 久久国产精品无码网站 | 欧美精品成人一区二区三区四区 | av在线一区二区三区 | 男女啪啪高潮无遮挡免费动态 | 视频一二三区 | 免费观看www7722午夜电影 | 成人福利在线 | 欧美一区二区三区视频在线 | 午夜成人免费视频 | 91精品国产91久久久久久 | 国产一级片| 亚洲国产精品一区 |