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://blog.csdn.net/qq_45385706/article/details/115179694
查看评论