導航:首頁 > 編程語言 > 51溫控程序

51溫控程序

發布時間:2021-03-05 13:26:56

❶ 求一個51單片機的多路溫度控制系統的C語言程序

#include<reg52.h> #include<math.h>
#include<INTRINS.H>
#define uchar unsigned char
#define uint unsigned int;
/******************************************************************/
/* 定義埠 */
/******************************************************************/
sbit seg1=P2^0;
sbit seg2=P2^1;
sbit seg3=P2^2;
sbit DQ=P1^7;//ds18b20 埠
sfr dataled=0x80;//顯示數據埠
/******************************************************************/
/* 全局變數 */
/******************************************************************/
uint temp;
uchar flag_get,count,num,minute,second;
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//7段數碼管段碼表共陽
uchar str[6];
/******************************************************************/
/* 函數聲明 */
/******************************************************************/
void delay1(uchar MS);
unsigned int ReadTemperature(void);
void Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void delay(unsigned int i);
/******************************************************************/
/* 主函數 */
/******************************************************************/
main()
{
unsigned char TempH,TempL;
TMOD|=0x01;//定時器設置
TH0=0xef;
TL0=0xf0;
IE=0x82;
TR0=1;
P2=0x00;
count=0;
while(1)
{
str[5]=0x39; //顯示C符號
str[1]=tab[TempH/100]; //十位溫度
str[2]=tab[(TempH%100)/10]; //十位溫度
str[3]=tab[(TempH%100)%10]|0x80; //個位溫度,帶小數點
str[4]=tab[TempL];
if(flag_get==1) //定時讀取當前溫度
{
temp=ReadTemperature();
if(temp&0x8000)
{
str[0]=0x40;//負號標志
temp=~temp; // 取反加1
temp +=1;
}
else
str[0]=0;
TempH=temp>>4;
TempL=temp&0x0F;
TempL=TempL*6/10;//小數近似處理
flag_get=0;
}
}
}

/******************************************************************/
/* 定時器中斷 */
/******************************************************************/
void tim(void) interrupt 1 using 1//中斷,用於數碼管掃描和溫度檢測間隔
{
TH0=0xef;//定時器重裝值
TL0=0xf0;
num++;
if (num==50)
{num=0;
flag_get=1;//標志位有效
second++;
if(second>=60)
{second=0;
minute++;
}
}
count++;
if(count==1)
{P2=0;
dataled=str[0];}//數碼管掃描
if(count==2)
{P2=1;
dataled=str[1];}
if(count==3)
{ P2=2;
dataled=str[2];
}
if(count==4)
{ P2=3;
dataled=str[3];
}
if(count==5)
{ P2=4;
dataled=str[4];
}
if(count==6)
{ P2=5;
dataled=str[5];
count=0;}
}
/******************************************************************/
/* 延時函數 */
/******************************************************************/
void delay(unsigned int i)//延時函數
{
while(i--);
}
/******************************************************************/
/* 初始化 */
/******************************************************************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ復位
delay(8); //稍做延時
DQ = 0; //單片機將DQ拉低
delay(80); //精確延時 大於 480us
DQ = 1; //拉高匯流排
delay(10);
x=DQ; //稍做延時後 如果x=0則初始化成功 x=1則初始化失敗
delay(5);
}
/******************************************************************/
/* 讀一個位元組 */
/******************************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
delay(5);
}
return(dat);
}
/******************************************************************/
/* 寫一個位元組 */
/******************************************************************/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
delay(5);
}
/******************************************************************/
/* 讀取溫度 */
/******************************************************************/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換
delay(200);
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
b<<=8;
t=a+b;
return(t);
}
//LZ,這是測溫並且用數碼管顯示程序,報警可以自己另行添加!主要程序就是這些!
()

❷ 我准備用51做一個溫度控制的模擬以下是程序但是我不知道怎麼接線,求大神幫助 1L是程序

ORG 000BH
AJMP PIT0
ORG 001BH
AJMP PIT1 ;中斷入口及優先順序

;顯示子程序
DIR: MOV SCON ,#00H ;置串列口移位寄存器狀態
SETB P1.4 ;開顯示
JB 5DH,DL1 ;顯示設定溫度
DL2: MOV DPTR,#SEGT
DL0: MOV A,@R0
MOVC A,@A+DPTR
MOV SBUF ,A
LOOP1: JNB TI, LOOP1
CLR TI
INC R0
MOV A,@R0
MOVC A,@A+DPTR
ANL A, #7FH ;使數帶小數點
MOV SBUF ,A
LOOP2: JNB TI,LOOP2
CLR TI
INC R0
MOV A,@R0
MOVC A,@A+DPTR
MOV SBUF,A
LOOP3: JNB TI,LOOP3
CLR TI
CLR P1.4
CLR 5DH
RET
DL1: MOV 50H,#0AH ;小數位黑屏
AJMP DL2
SEGT: DB 0C0H ,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
;加一子程序
DAAD1: MOV A,#00H
ORL A,@R1
ADD A,#01H
CJNE A,#30H,DAAD2 ;超過48度了嗎?
DAAD3: MOV @R1,A
DAA: RET
DAAD2: JC DAAD3
MOV @R1,#15EH ;超過48則轉回到355
AJMP DAA
;減一子程序
DEEC1: MOV A,@R1
DEC A
CJNE A,#15EH,DEEC2 ;低於355度了嗎?
DEEC3: MOV @R1,A
DEE: RET
DEEC2: JNC DEEC3
MOV @R1,#30H ;低於355則轉回到48
AJMP DEE
;T0中斷子程序
PIT0: CLR EA
PUSH ACC
PUSH PSW
PUSH DPL
PUSH DPH
SETB EA ;壓棧後開中斷響應鍵盤
PPP: LCALL SAWP ;采樣數據
LCALL FILTER ;數字濾波
MOV A,2AH ;取采樣值
CJNE A,#07H,AAA ;下限48比較
AJMP BBB
AAA: JC CCC ;小於48度轉
CJNE A,#0FEH ,DDD ;上限355比較
AJMP BBB ;轉至48~355正常范圍處理
DDD: JC BBB
CLR P1.2 ;大於355黃燈亮
SETB 5EH
CLR P1.1 ;置標志 啟動風扇
AJMP PPP
CCC: CLR P1.3 ;小於48紅燈亮
SETB 5FH
BBB: CLR P1.0 ;置標志啟動電爐
AJMP PPP
SETB P1.0
SETB P1.1
SETB P1.2
SETB P1.3
CLR 5EH
CLR 5FH ;50~350之間正常

JNB 20H,EEE ;設定溫度小於實際值轉到風扇
MOV A,29H
LCALL FFF
CLR P1.0
LOOP10: MOV R0,#56H ;存放相乘結果的首址
MOV R1,#55H ;賦顯示緩沖區最高位地址
;標度轉化
MOV R0,#53H ;賦顯示首址
CLR DIR
JB 0D5H,LOOP10 ;等待T1中斷
CLR EA
POP DPH
POP DPL
POP PSW
SETB EA
POP ACC
RETI
EEE: MOV A,28H ;風扇處理
LCALL FFF
CLR P1.1
AJMP LOOP10
FFF: CLR A ;根據PID結果計算T1初值
INC A
MOV TL1,A
MOV TH1,#0FFH
SETB PIT1
SETB TR1
SETB ET1
RET

;采樣子程序
SAWP: MOV R0,#20H
MOV R1,#03H
SAW1: MOV DPTR,#7FF8H
MOVX @DPTR,A ;A/D轉化
MOV R2,#20H
DLY: DJNZ R2,DLY ;延時
HERE: JB P3.3 ,HERE
MOV DPTR,#7FF8H
MOVX A,@DPTR ;讀轉化結果
MOV @R0,A
INC R0
DJNZ R1,SAW1
RET
;數字濾波
FILTER: MOV A, 20H
CJNE A,2DH,CMP1
AJMP CMP2
CMP1: JNC CMP2
XCH A,2DH
XCH A,2CH
CMP2: MOV A,2DH
CJNE A,22EH,CMP3
MOV 2AH,A
AJMP RRR
CMP3: JC CMP4
MOV 2AH,A
AJMP RRR
CMP4: MOV A,2EH
CJNE A,2CH,CMP5
MOV 2AH ,A
AJMP RRR
CMP5: JC CMP6
XCH A,2CH
CMP6: MOV 2AH,A
RRR: RET
;T1中斷
PIT1: CLR 00H
JB 20H, GGG
SETB P1.0 ;關閉電爐
GG: CLR PT1
RETI
GGG: SETB P1.1 ;關閉風扇
CLR 20H
AJMP GG
;延時10MS子程序
DLY10MS: MOV R7,#0A0H
DL00: MOV R6,#0FFH
DL11: DJNZ R6,DL11
DJNZ R7,DL00
RET

❸ 求一個51單片機溫控程序

網路一下,有很多,下一個自己稍加修改就可以了。

❹ 用51單片機編寫的溫控系統程序該怎麼寫啊

建議 去 我的領地 5d6d 的 proteus 論壇看看

那裡有很多 單片機模擬實例,包括proteus 模擬圖 和 源碼

❺ 51單片機溫度控制系統溫控模塊要怎麼做

你好

溫度控制可以用18b20,可以根據18b20的地址,實現多點溫度控制

也可以通過串口將溫度傳到上位機電腦

❻ 51單片機做數電溫控系統軟體程序

公園丁當初一,808小「為。薄8:8、小入一

❼ 急求用51單片機和熱敏電阻製作溫度控制器的C程序及電路圖

給你一個用ADC0809做AD轉換的C程序作參考吧!希望對你有所幫助!

#include<reg52.h>
unsigned char code dispbitcode[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
unsigned char dispbuf[4];
unsigned int i;
unsigned int j;
unsigned char getdata;
unsigned int temp;
unsigned int temp1;
unsigned char count;
unsigned char d;
sbit ST=P3^0;
sbit OE=P3^1;
sbit EOC=P3^2;
sbit CLK=P3^3;
sbit P34=P3^4;
sbit P35=P3^5;
sbit P36=P3^6;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P17=P1^7;
void TimeInitial();
void Delay(unsigned int i);//
void TimeInitial()
{
TMOD=0x10;
TH1=(65536-200)/256;//定時時間為2us,亦即CLK周期為0.4us
TL1=(65536-200)%256;
EA=1;
ET1=1;
TR1=1;
}

void Delay(unsigned int i)//延時函數
{
unsigned int j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}

void Display()//

{
P1=dispbitcode[dispbuf[3]];//十位
P20=0;
P21=1;
P22=1;
P23=1;
Delay(10);
P1=0x00;
P1=dispbitcode[dispbuf[2]];//個位
P17=1;//顯示小數點
P20=1;
P21=0;
P22=1;
P23=1;
Delay(10);
P1=0x00;
P1=dispbitcode[dispbuf[1]];//十分位
P20=1;
P21=1;
P22=0;
P23=1;
Delay(10);
P1=0x00;
P1=dispbitcode[dispbuf[0]];//百分位
P20=1;
P21=1;
P22=1;
P23=0;
Delay(10);
P1=0x00;
}

void main()//主函數
{
TimeInitial();
while(1)
{
ST=0;//關閉轉換
OE=0;//關閉輸出
ST=1;//開啟轉換
ST=0;//關閉轉換
P34=0;//選擇通道0
P35=0;
P36=0;
while(EOC==0);//判斷是否轉換結束:是則執行以下語句,否則等待
OE=1;//開啟數據輸出允許
getdata=P0;//將數據取走,存放在變數getdata中
OE=0;//關閉輸出
temp=getdata*1.0/255*500;//電壓值轉換,5V作為參考電壓,分成256份
dispbuf[0]=temp%10;//百分位
dispbuf[1]=temp/10%10;//十分位
dispbuf[2]=temp/100%10;//個位
dispbuf[3]=temp/1000;//十位
Display();
}
}

void t1(void) interrupt 3 using 0//定時器中斷服務函數;作用:產生CLK信號
{
TH1=(65536-200)/256;
TL1=(65536-200)%256;
CLK=~CLK;
}

❽ lm35,89c51,溫控的程序

//安裝目錄下的EXE文件打開後可在電腦上顯示當前溫度值
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P2^2; //define interface
uint temp; // variable of temperature
uchar flag1; // sign of the result positive or negative
sbit la=P2^6;
sbit wela=P2^7;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};
void delay(uint count) //delay
{
uint i;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
///////功能:串口初始化,波特率9600,方式1///////
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
void dsreset(void) //send reset and initialization command
{
uint i;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
bit tmpread()bit(void) //read() a bit
{
uint i;
bit dat;
DS=0;i++; //i++ for delay
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}
uchar tmpread()(void) //read a byte date
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個位元組在DAT里
}
return(dat);
}
void tmpwritebyte(uchar dat) //write a byte to ds18b20
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
void tmpchange(void) //DS18B20 begin change
{
dsreset();
delay(1);
tmpwritebyte(0xcc); // address all drivers on bus
tmpwritebyte(0x44); // initiates a single temperature conversion
}
uint tmp() //get the temperature
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp<<=8; //two byte compose a int variable
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}
void readrom() //read the serial
{
uchar sn1,sn2;
dsreset();
delay(1);
tmpwritebyte(0x33);
sn1=tmpread();
sn2=tmpread();
}
void delay10ms() //delay
{
uchar a,b;
for(a=10;a>0;a--)
for(b=60;b>0;b--);
}
void display(uint temp) //顯示程序
{
uchar A1,A2,A2t,A3,ser;
ser=temp/10;
SBUF=ser;
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
la=0;
P0=table[A1]; //顯示百位
la=1;
la=0;
wela=0;
P0=0x7e;
wela=1;
wela=0;
delay(1);
la=0;
P0=table1[A2]; //顯示十位
la=1;
la=0;
wela=0;
P0=0x7d;
wela=1;
wela=0;
delay(1);
P0=table[A3]; //顯示個位
la=1;
la=0;
P0=0x7b;
wela=1;
wela=0;
delay(1);
}
void main()
{
uchar a;
Init_Com();
do
{
tmpchange();
// delay(200);
for(a=10;a>0;a--)
{
display(tmp());
}
}while(1);
}
將二管腳接到P2.2就可以了
你可以參考一下,純屬抄襲,絕非手打

❾ 求教:51單片機智能溫控風扇程序編寫

一路來定時器掃描做數碼源管和按鍵,另外一路定時器做pwm調速。主程序循環裡面去處理溫度讀取判斷,按鍵處理等。只提供參考思路,這里是幾乎不可能要到別人寫好的程序的。
如果想要別人幫你寫,要幾百,某魚和某寶上有很多,網路知道沒有免費的程序員,你這個程序要花掉好幾個小時,半天就花掉了,後續有bug你還要debug,你不會還得問,這種麻吃力不討好的事情沒人做的。。。
你要是來不及,花錢去某魚和某寶代做是最好的選擇。

❿ 51單片機溫度控制系統的C語言程序

你好!

顯示用數碼管還是用液晶呢?人機對話,是和上位機通訊嗎

閱讀全文

與51溫控程序相關的資料

熱點內容
蘋果7充電沒充滿就拔掉 瀏覽:851
網上哪裡可以下載工商文件 瀏覽:682
最近有沒有新網站你懂得 瀏覽:662
如何在番茄小說網站上傳小說 瀏覽:650
可不可以在現實里壓縮文件 瀏覽:892
第四印象加密文件 瀏覽:621
新電影app 瀏覽:616
日本軍官愛上中國少女的電影台灣片 瀏覽:769
可以看歐美劇情的網站 瀏覽:829
最好的易語言教程 瀏覽:212
田佳秀主演的電影 瀏覽:330
raw文件系統無法格式化 瀏覽:188
三菱編程軟體哪個最新 瀏覽:984
linuxip動態獲取 瀏覽:240
cs6保存圖片程序錯誤 瀏覽:701
吻戲劇大全美國 瀏覽:839
血腥大尺度電影 瀏覽:885
桌面突然多了一個文件夾刪不掉 瀏覽:126
自動獲得已打開文件的文件名 瀏覽:781
麥德龍app能注冊嗎 瀏覽:843

友情鏈接