飞道的博客

第七届蓝桥杯单片机省赛----程序题

252人阅读  评论(0)






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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场