第五届蓝桥杯单片机设计与开发项目省赛试题

第五届蓝桥杯单片机设计与开发项目省赛试题:
“简易温度采集与控制装置”设计任务书
在这里插入图片描述在这里插入图片描述

  • 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 getwendu();
#endif
  • ds18b20.c

#include<reg52.h>
#include<ds18b20.h>
sbit DQ = P1^4;  //单总线接口

//单总线延时函数
void Delay_OneWire(unsigned int t)  
{
	unsigned char i;
	while(t--){
		for(i=0; i<8; i++);
	}
}

//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//从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(5);
	}
	return dat;
}

//DS18B20设备初始化
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    	initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}

unsigned char getwendu()
{
	unsigned char low,high,temp;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	
	low=Read_DS18B20();
	high=Read_DS18B20();
	
	temp=high<<4;
	temp=temp|(low>>4);
	
	return temp;
}
  • 主函数
#include<stc15f2k60s2.h>
#include<ds18b20.h>
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;

int yi,er,san,si,wu,liu,qi,ba,a,aa;
int shezhi=0,t=0,tt=0,flag=0,num,biaozhi=0,flagg; //flag 为闪烁标志位
uchar code smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
uchar temp;int jibie;
uchar tmax=30,tmin=20;//温度上下限
void shangdian();
void delay1ms(int ms);
void display1();
void display2();
void juzhen();
void Timer0Init(void);		//1毫秒@11.0592MHz
main()
{
	shangdian();

   Timer0Init();
	while(1) 
	{ juzhen();
	temp=getwendu();
		
		while(temp==85)
		{
			temp=getwendu();
		}
			if(flagg==1) //进入设置界面
			{  TR0=0;
	      if(biaozhi==1)
					er=num;
				else if(biaozhi==2)
					san=num;
				else if(biaozhi==3)
					qi=num;
				else if(biaozhi==4)
				{	ba=num;
					tmax=er*10+san;
					tmin=qi*10+ba;
					if(tmax<tmin)
					{
					P2=0X80;P0=~(0X02);
					}
					else
					{	P2=0X80;P0=0xff;
					
					}
				
				}
			
			}
    if(flagg==0) //退出设置界面
		{ TR0=1;
			yi=10;er=jibie;san=10;si=11;
	wu=11;liu=11;qi=temp/10;ba=temp%10;
			if(temp<tmin)//温度区间
		{ jibie=0;	
			tt=800;	TR0 = 1;
			P2=0XA0;P0=0X00;
		}
		else if((tmin<=temp)&&(temp<=tmax))
		{jibie=1;
     tt=400;TR0 = 1;
		P2=0XA0;P0=0X00;
			
		}
		else if(temp>tmax)
		{	jibie=2;
			tt=200;TR0 = 1;
    	P2=0XA0;P0=0X10;
     }}
		
		display1();
    display2();
	
	}

}
void Timer0Init(void)		//1毫秒@11.0592MHz 
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xCD;		//设置定时初值
	TH0 = 0xD4;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 0;		//定时器0开始计时
	ET0=1;
	EA=1;
}
void time0() interrupt 1
{
	t++;
	if(t==tt)
	{ 
		t=0;
		if(flag==0)
		{
		P2=0x80;
		P0=0xfe;
		flag=1;
		}
		else if(flag==1)
	{
		P2=0x80;
		P0=0xff;
		flag=0;
	}
	}
	if(t==900)//防止从800-400-200之间有漏洞
	{t=0;}	
}
void shangdian()
{
	P2=0XA0;P0=0X00;
	P2=0X80;P0=0XFF;
	P2=0XC0;P0=0XFF;
	P2=0XE0;P0=0XFF;
}
void delay1ms(int ms)
{
	int i;
	for(;ms>0;ms--)
	{
		for(i=845;i>0;i--)  ;
	}
}
void display1()
{
	P2=0XC0;P0=0X01;
	P2=0XE0;P0=smg[yi];
	delay1ms(1);
	P2=0XC0;P0=0X02;
	P2=0XE0;P0=smg[er];
	delay1ms(1);
	P2=0XC0;P0=0X04;
	P2=0XE0;P0=smg[san];
	delay1ms(1);
	P2=0XC0;P0=0X08;
	P2=0XE0;P0=smg[si];
	delay1ms(1);
}
void display2()
{
	P2=0XC0;P0=0X10;
	P2=0XE0;P0=smg[wu];
	delay1ms(1);
	P2=0XC0;P0=0X20;
	P2=0XE0;P0=smg[liu];
	delay1ms(1);
	P2=0XC0;P0=0X40;
	P2=0XE0;P0=smg[qi];
	delay1ms(1);
	P2=0XC0;P0=0X80;
	P2=0XE0;P0=smg[ba];
	delay1ms(1);
  P2=0XC0;P0=0X80;
	P2=0XE0;P0=0xff;
}
void juzhen()
{ uchar juzhen;
	P44=0;P42=1;P3=0X7F;
	juzhen=P3;
	juzhen=juzhen&0x0f;
	if(juzhen!=0x0f)
	{
		delay1ms(5);
	  juzhen=P3;
	  juzhen=juzhen&0x0f;		
		if(juzhen!=0x0f)
		{
			juzhen=P3;
			switch(juzhen)
			{
				case 0x7e:num=0;biaozhi++;break;
		     	case 0x7d:num=3;biaozhi++;break;
				case 0x7b:num=6;biaozhi++;break;
				case 0x77:num=9;biaozhi++;break;

			}
			while(juzhen!=0x0f)
			{
			juzhen=P3;
	    juzhen=juzhen&0x0f;
			}
		}
	}
	P44=1;P42=0;P3=0XbF;
	juzhen=P3;
	juzhen=juzhen&0x0f;
	if(juzhen!=0x0f)
	{
		delay1ms(5);
	  juzhen=P3;
	  juzhen=juzhen&0x0f;		
		if(juzhen!=0x0f)
		{
			juzhen=P3;
			switch(juzhen)
			{
				case 0xbe:num=1;biaozhi++;break;
		  	    case 0xbd:num=4;biaozhi++;break;
				case 0xbb:num=7;biaozhi++;break;
				case 0xb7:
					if(flagg==0) {flagg=1;
					yi=10;er=san=si=wu=11;liu=10;qi=ba=11;
					}
				else if(flagg==1) 
				{flagg=0; 					
				biaozhi=0;
				}
             break;//清除
			}
			while(juzhen!=0x0f)
			{
			juzhen=P3;
	    juzhen=juzhen&0x0f;
			}
		}
	}
	P44=1;P42=1;P3=0XdF;
	juzhen=P3;
	juzhen=juzhen&0x0f;
	if(juzhen!=0x0f)
	{
		delay1ms(5);
	  juzhen=P3;
	  juzhen=juzhen&0x0f;		
		if(juzhen!=0x0f)
		{
			juzhen=P3;
			switch(juzhen)
			{
				case 0xde:num=2;biaozhi++;break;
		  	case 0xdd:num=5;biaozhi++;break;
				case 0xdb:num=8;biaozhi++;break;
				case 0xd7:
				if(biaozhi==1)
				{
				er=11;biaozhi=0;
				}
				else if(biaozhi==2)
				{
				san=11;biaozhi=1;num=er;
				}
				else if(biaozhi==3)
				{
				qi=11;biaozhi=2;num=san;
				}
				else if(biaozhi==4)
				{
				ba=11;biaozhi=3;num=qi;
				}
		   break;
			}
			while(juzhen!=0x0f)
			{
			juzhen=P3;
	    juzhen=juzhen&0x0f;
			}
		}
	}	
}
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值