久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機溫控風扇代碼與Proteus仿真原理圖
[打印本頁]
作者:
默茗
時間:
2021-5-19 15:20
標題:
單片機溫控風扇代碼與Proteus仿真原理圖
溫控風扇仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png
(17.66 KB, 下載次數: 86)
下載附件
2021-5-19 18:32 上傳
單片機源程序如下:
#include<reg52.h>
#include<intrins.h> //包含頭文件
#define uchar unsigned char
#define uint unsigned int //宏定義
////////////////////
sbit dj=P1^0;//電機控制端接口
sbit DQ=P1^6;//溫度傳感器接口
//////////按鍵接口/////////////////////////////////
sbit key1=P3^5;//設置溫度
sbit key2=P3^6;//溫度加
sbit key3=P3^7;//溫度減
//////////////////////////////////////////////////////
sbit w1=P2^4;
sbit w2=P2^5;
sbit w3=P2^6;
sbit w4=P2^7; //數碼管的位選端
/////共陰數碼管段選//////////////////////////////////////////////
uchar table[22]=
{0x3F,0x06,0x5B,0x4F,0x66, //0 1 2 3 4
0x6D,0x7D,0x07,0x7F,0x6F, //5 6 7 8 9
0x77,0x7C,0x39,0x5E,0x79,0x71,
0x40,0x38,0x76,0x00,0xff,0x37};//'-',L,H,滅,全亮,n 16-21
uint wen_du; //溫度變量
int shang,xia; //對比溫度暫存變量
uchar dang;//檔位顯示
uchar speed; //速度變量
uchar flag=0; //設置的變量
bit start=0; //開始采集溫度變量
uchar d1,d2,d3;//顯示數據暫存變量
void delay(uint ms) //延時函數
{
uchar x;
for(ms;ms>0;ms--)
for(x=10;x>0;x--);
}
/***********ds18b20延遲子函數(晶振12MHz )*******/
void delay_18B20(uint i)
{
while(i--);
}
/**********ds18b20初始化函數**********************/
void Init_DS18B20()
{
uchar x=0;
DQ=1; //DQ復位
delay_18B20(8); //稍做延時
DQ=0; //單片機將DQ拉低
delay_18B20(80); //精確延時 大于 480us
DQ=1; //拉高總線
delay_18B20(14);
x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
delay_18B20(20);
}
/***********ds18b20讀一個字節**************/
uchar ReadOneChar()
{
uchar i=0;
uchar dat=0;
for (i=8;i>0;i--)
{
DQ=0; // 給脈沖信號
dat>>=1;
DQ=1; // 給脈沖信號
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/*************ds18b20寫一個字節****************/
void WriteOneChar(uchar dat)
{
uchar i=0;
for (i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay_18B20(5);
DQ=1;
dat>>=1;
}
}
/**************讀取ds18b20當前溫度************/
void ReadTemperature()
{
uchar a=0;
uchar b=0;
uchar t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換
// delay_18B20(100); // this message is wery important
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
// delay_18B20(100);
a=ReadOneChar(); //讀取溫度值低位
b=ReadOneChar(); //讀取溫度值高位
wen_du=((b*256+a)>>4); //當前采集溫度值除16得實際溫度值
}
void init() //定時器初始化函數
{
TMOD=0x01; //工作方式
TH0=0xff;
TL0=0x38; //定時器賦初值
EA=1; //打開中斷總開關
ET0=1; //打開定時器0中斷允許開關
TR0=1; //打開定時器0定時開關
}
void init_dis() //開機顯示
{
w1=0;w2=0;w3=0;w4=0;P0=table[16];
}
void display()//顯示溫度
{
if(flag==0)
{
if(speed>5) d1=speed-5;else d1=0;d2=wen_du/10;d3=wen_du%10; //速度分10個檔位,但是風扇在1 2 3 4 5檔位時轉不起來,所以從6開始為轉動的1檔
}
w1=0;P0=table[d1];delay(20); //第1位
P0=0x00;w1=1;
w2=0;P0=table[16];delay(20);//第2位
P0=0x00;w2=1;
w3=0;P0=table[d2]; delay(20);//第3位
P0=0x00;w3=1;;
w4=0;P0=table[d3];delay(20);//第4位
P0=0x00;w4=1;
}
void zi_keyscan()//自動模式按鍵掃描函數
{
if(key1==0) //設置鍵按下
{
delay(10); //按鍵去抖
if(key1==0) //再次判斷
{
flag++; //設置狀態加,等于1時是設置上限,等于2時是設置下限,等于0時退出設置
TR0=0; //關閉定時器
dj=0; //關閉風扇
if(flag>=3) //退出設置
{
TR0=1; //打開定時器,準備讀取溫度
flag=0; //變量清零,退出設置
}
}
while(key1==0) display();//按鍵釋放,按鍵不松開,程序就停在這里,防止重復執行上面的程序,造成按鍵重復判斷
}
if(flag==1) //設置上限時
{
d1=18;d2=shang/10;d3=shang%10; //顯示字母H
if(key2==0) //加鍵按下
{
delay(10); //延時去抖
if(key2==0) //再次判斷按鍵
{
shang+=1; //上限值加
if(shang>=99)shang=99; //最大加到99
}
while(key2==0) display();//松手檢測
}
if(key3==0) //減鍵按下
{
delay(10); //延時去抖
if(key3==0) //再次判斷
{
shang-=1; //上限減
if(shang<=xia+4)shang=xia+4; //上限最小比下限大4
}
while(key3==0) display();//松手檢測
}
}
if(flag==2) //設置下限
{
d1=17;d2=xia/10;d3=xia%10; //顯示字母L
if(key2==0)
{ //以下注釋參考設置上限
delay(10);
if(key2==0)
{
xia+=1;
if(xia>=shang-4)xia=shang-4;
}
while(key2==0) display();//松手檢測
}
if(key3==0)
{
delay(10);
if(key3==0)
{
xia-=1;
if(xia<=0)xia=0;
}
while(key3==0) display();//松手檢測
}
}
}
void zi_dong()//自動溫控模式
{
// 此函數的目的是將上限和下限的差值平均為5份,每一份對應一個速度值 14-25
if(wen_du<xia) //溫度小于下限
speed=0; //速度0檔
else if(wen_du>=xia&&(wen_du<(uint)((shang-xia)/4+xia))) //溫度大于下限并且小于(上限減去下限)除以4加下限
speed=6; //6檔 14-16.75 14-15
else if((wen_du>=(uint)((float)(shang-xia)/4+xia))&&(wen_du<(uint)((float)(shang-xia)/2+xia))) //溫度大于 (上限減去下限)除以4加下限 并且小于(上限減去下限)除以2加下限
speed=7; //7檔 16-19.5 16-18
else if((wen_du>=(uint)(shang-xia)/2+xia)&&(wen_du<(uint)((float)((float)(shang-xia)/4)*3+xia))) //溫度大于 (上限減去下限)除以2加下限 并且小于(上限減去下限)除以4乘以3加下限
speed=8; //8檔 19-22.25 19-21
else if((wen_du>=(uint)((float)((float)(shang-xia)/4)*3+xia))&&wen_du<shang) //溫度大于 (上限減去下限)除以4乘以3加下限 并且小于上限
speed=9; //9檔 22-24 22-24
else if(wen_du>=shang) //大于上限
speed=10; //10檔 >25
}
void main() //主函數
{
uchar j;
dj=0; //關閉風扇
shang=34; //34 30
xia=30; //初始化上下限值
init_dis(); //初始化顯示
for(j=0;j<200;j++) //讀取溫度,防止開機顯示85
ReadTemperature();
init(); //定時器初始化
while(1) //進入while循環,括號內為1,也就是死循環
{
if(start==1) //開始讀取溫度
{
start=0; //清零
TR0=0; //關閉定時器
dj=0; //關閉風扇
ReadTemperature();//讀取溫度
TR0=1; //打開定時器
zi_dong();//自動溫控模式
}
zi_keyscan();//按鍵掃描函數
display(); //顯示函數
}
}
//以下是控制PWM的
void time0() interrupt 1 //定時器服務函數
{
uchar m;
uint n;
TH0=0xff; //200us初值
TL0=0x38;
if(m<speed) //m值小于speed
dj=1; //打開風扇
else if(m>=speed) //否則
dj=0; //關閉風扇
m++; //m加
if(m>=10) //m極愛到10,也就是2ms
m=0;
n++; //200us n加一次
if(n>=10000) //n加到10000 也就是2秒
{
n=0;
start=1; //啟動一次溫度測量
}
}
復制代碼
所有資料51hei提供下載:
溫控風扇.zip
(715.49 KB, 下載次數: 48)
2021-5-19 15:20 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
ddok
時間:
2021-5-26 14:50
請問我仿真完之后只在第一位顯示8怎么處理啊
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
欧美一区二区在线看
|
国产a一区二区
|
在线免费观看日本
|
国产羞羞视频在线观看
|
成人av网站在线观看
|
a久久
|
国产激情视频
|
五月婷婷在线视频
|
色香婷婷
|
成人av一区二区亚洲精
|
国产综合在线视频
|
伊人狠狠干
|
一区二区三区欧美在线
|
中文字幕久久精品
|
国产精品污www一区二区三区
|
日韩精品一区二区三区在线
|
日韩成年人视频在线
|
久久久免费在线观看
|
激情欧美日韩一区二区
|
精品一区二区三区四区
|
国产美女在线精品免费
|
黄色永久免费
|
91视频18
|
欧美成人在线网站
|
国产精品视频免费观看
|
免费看av大片
|
黄片毛片
|
xx性欧美肥妇精品久久久久久
|
国产一区二区在线免费观看
|
欧美456
|
中文字幕免费视频
|
91美女在线观看
|
精久久久
|
日韩视频在线播放
|
亚洲国产成人av好男人在线观看
|
久久久夜夜夜
|
日本精品一区二区
|
91污在线
|
日韩中文字幕网
|
欧美日韩久久久久
|
日韩精品在线免费观看视频
|