






main.c程式
#include<stc15f2k60s2.h>
#include "ds18b20.h"
#define uchar unsigned char //定義無符號字符型別uchar
#define uint unsigned int //定義無符號整型型別uint
uchar code tab[]={0xc0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF,0XC6};//數字0~9,“-”,“關”,“C”
uchar yi,er,san,si,wu,liu,qi,ba; //定義字符型變數yi,er,san,si,wu,liu,qi,ba,當作數碼管顯示控制變數
uchar wendu;
uchar feng_tai=1,xianshi=0,miao=0,shiwen=0,guan_led=0;
uint tt=0,zz=0;
uchar fen=0;
bit fla=0;
void delayms(int ms); //延時函式
void allinit(); //初始化函式
void keyscan(); //獨立按鍵函式
void display1(uchar yi,uchar er); //第一、二段數碼管函式
void display2(uchar san,uchar si); //第三、四段數碼管函式
void display3(uchar wu,uchar liu); //第五、六段數碼管函式
void display4(uchar qi,uchar ba); //第七、八段數碼管函式
void Timer0Init(void); //100微秒@11.0592MHz
void main()//主函式
{
allinit(); //初始化函式
Timer0Init();
while(1)
{
wendu=Tempget();
if(shiwen==0) //非室溫顯示頁面
{
yi=10;er=feng_tai;san=10;si=11;wu=0;liu=miao/100;qi=miao%100/10;ba=miao%10;
}
else if(shiwen==1) //室溫顯示頁面
{
yi=10;er=4;san=10;si=11;wu=11;liu=wendu/10;qi=wendu%10;ba=12;
}
if(miao>0) //倒計數未結束
{
if(feng_tai==1){P2=0X80;P0=0XFE;} //睡眠風狀態下L1點亮
else if(feng_tai==2){P2=0X80;P0=0XFD;} //自然風狀態下L2點亮
else if(feng_tai==3){P2=0X80;P0=0XFB;} //常風狀態下L3點亮
}
else {P2=0X80;P0=0XFF;fla=0;} //倒計數結束關閉所有LED燈
keyscan(); //獨立按鍵函式
display1(yi,er); //第一、二段數碼管函式
display2(san,si); //第三、四段數碼管函式
display3(wu,liu); //第五、六段數碼管函式
display4(qi,ba); //第七、八段數碼管函式
}
}
void keyscan()//獨立按鍵函式
{
if(P30==0) //判斷P30是否等于0
{
delayms(5); //延時5ms
if(P30==0) //再次判斷P30是否等于0
{
if(shiwen==0)shiwen=1; //判斷是否在非室溫頁面下,是的話按鍵后切換到室溫狀態下
else if(shiwen==1)shiwen=0; //判斷是否在室溫頁面下,是的話按鍵后切換到非室溫狀態下
}
while(!P30); //如果按鍵不松開,則一直回圈
}
else if(P31==0) //判斷P31是否等于0
{
delayms(5); //延時5ms
if(P31==0) //再次判斷P31是否等于0
{
miao=0;guan_led=1; //倒計數清零,LED全關
}
while(!P31); //如果按鍵不松開,則一直回圈
}
else if(P32==0) //判斷P32是否等于0
{
delayms(5); //延時5ms
if(P32==0) //再次判斷P32是否等于0
{
tt=0;guan_led=0; //定時器里的tt置零,打開LED燈標志位
if(miao==0)miao=60; //判斷倒計數是否為0,是的話把倒計數改為60
else if((miao>0)&&(fla==0)){miao=120;fla=1;} //判斷倒計數不為零,標志位fla為零,按鍵后倒計數改為120,標志位置1
else if(fla==1){miao=0;fla=0;} //判斷fla標志位是否位1,按鍵后倒計數清零,fla標志位置零
}
while(!P32); //如果按鍵不松開,則一直回圈
}
else if(P33==0) //判斷P33是否等于0
{
delayms(5); //延時5ms
if(P33==0) //再次判斷P33是否等于0
{
if(feng_tai==1){feng_tai=2;} //判斷此時是否在睡眠風狀態下,是的話按鍵后改為自然風狀態
else if(feng_tai==2){feng_tai=3;} //判斷此時是否在自然風狀態下,是的話按鍵后改為常風狀態
else if(feng_tai==3){feng_tai=1;} //判斷此時是否在常風狀態下,是的話按鍵后改為睡眠風狀態
}
while(!P33); //如果按鍵不松開,則一直回圈
}
}
void Timer0Init(void) //100微秒@11.0592MHz
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設定定時器模式
TL0 = 0xAE; //設定定時初值
TH0 = 0xFB; //設定定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
EA=1;ET0=1;
}
void time0() interrupt 1
{
if(++tt==11)tt=1;
if(miao>0)
{
if(feng_tai==1) //睡眠風狀態下,設定占空比20%
{
if(tt<3)P34=1;
else P34=0;
}
else if(feng_tai==2) //自然風狀態下,設定占空比30%
{
if(tt<4)P34=1;
else P34=0;
}
else if(feng_tai==3) //常風狀態下,,設定占空比70%
{
if(tt<8)P34=1;
else P34=0;
}
}
if(++zz==10000)//即1秒
{
zz=0; //zz清零,重新計數
if(miao>0)miao--; //秒減一
}
}
void delayms(int ms)//延時函式
{
uint i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}
void allinit()//初始化函式
{
P2=0XA0;P0=0X00; //關閉蜂鳴器繼電器
P2=0X80;P0=0XFF; //關閉所有LED燈
P2=0XC0;P0=0XFF; //選中所有數碼管段選
P2=0XFF;P0=0XFF; //關閉所有數碼管
}
void display1(uchar yi,uchar er)//第一、二段數碼管函式
{
P2=0XC0;P0=0X01; //選中第一個數碼管位選
P2=0XFF;P0=tab[yi]; //讓第一個數碼管顯示yi指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X02; //選中第二個數碼管位選
P2=0XFF;P0=tab[er]; //讓第一個數碼管顯示er指向的值
delayms(1); //延時1ms
}
void display2(uchar san,uchar si)//第三、四段數碼管函式
{
P2=0XC0;P0=0X04; //選中第s三個數碼管位選
P2=0XFF;P0=tab[san]; //讓第一個數碼管顯示san指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X08; //選中第四個數碼管位選
P2=0XFF;P0=tab[si]; //讓第一個數碼管顯示si指向的值
delayms(1); //延時1ms
}
void display3(uchar wu,uchar liu)//第五、六段數碼管函式
{
P2=0XC0;P0=0X10; //選中第五個數碼管位選
P2=0XFF;P0=tab[wu]; //讓第一個數碼管顯示wu指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X20; //選中第六個數碼管位選
P2=0XFF;P0=tab[liu]; //讓第一個數碼管顯示liu指向的值
delayms(1); //延時1ms
}
void display4(uchar qi,uchar ba)//第七、八段數碼管函式
{
P2=0XC0;P0=0X40; //選中第七個數碼管位選
P2=0XFF;P0=tab[qi]; //讓第一個數碼管顯示qi指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X80; //選中第八個數碼管位選
P2=0XFF;P0=tab[ba]; //讓第一個數碼管顯示ba指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X80; //選中第八個數碼管位選
P2=0XFF;P0=0XFF; //讓第八個數碼管熄滅
}
ds18b20.c程式
#include<stc15f2k60s2.h>
#include "ds18b20.h"
sbit DQ = P1^4; //單總線介面
//單總線延時函式
void Delay_OneWire(unsigned int t)
{
while(t--);
}
//通過單總線向DS18B20寫一個位元組
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(50);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(50);
}
//從DS18B20讀取一個位元組
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(50);
}
return dat;
}
//DS18B20設備初始化
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(120);
DQ = 0;
Delay_OneWire(800);
DQ = 1;
Delay_OneWire(100);
initflag = DQ;
Delay_OneWire(50);
return initflag;
}
unsigned char Tempget()
{
unsigned char temp,low,high;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
temp=high<<4;
temp|=(low>>4);
return temp;
}
ds18b20.h程式
#ifndef __DS18B20_H
#define __DS18B20_H
//單總線延時函式
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);
unsigned char Tempget();
#endif

第七屆藍橋杯單片機省賽作品演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280974.html
標籤:其他
下一篇:溫濕度傳感器DH11
