蓝桥杯单片机第八届省赛

链接:https://pan.baidu.com/s/1SfFwhBzYGNrWeZoG306yFg 
提取码:2022

可以直接从百度网盘下载或者将下列代码复制粘贴,其中有蓝桥杯提供的底层代码,有修改的已经标注在开头。

题目

 

onewire.h//蓝桥杯底层代码加上函数声明,同时去掉 unsigned char rd_temperature(void);

#ifndef __ONEWIRE_H
#define __ONEWIRE_H
 
//unsigned char rd_temperature(void);  //删除该声明,后面写一个新函数
 
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void); 
 
#endif

 onewire.c//蓝桥杯底层代码由于频率不同改变延迟时间,变为原来12倍

#include "reg52.h"
 
sbit DQ = P1^4;  //单总线接口
 
//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
	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(5*12);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5*12);
}
 
//从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*12);
	}
	return dat;
}
 
//DS18B20设备初始化
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12*12);
  	DQ = 0;
  	Delay_OneWire(80*12);
  	DQ = 1;
  	Delay_OneWire(10*12); 
    initflag = DQ;     
  	Delay_OneWire(5*12);
  
  	return initflag;
}

ds1302.h//蓝桥杯底层代码,没有改变

#ifndef __DS1302_H
#define __DS1302_H
 
void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
#endif

ds1302.c//蓝桥杯底层代码,没有改变

/*
  程序说明: DS1302驱动程序
  软件环境: Keil uVision 4.10 
  硬件环境: CT107单片机综合实训平台 8051,12MHz
  日    期: 2011-8-9
*/
 
#include <reg52.h>
#include <intrins.h>
 
sbit SCK=P1^7;		
sbit SDA=P2^3;		
sbit RST = P1^3;   // DS1302复位												
 
void Write_Ds1302(unsigned  char temp) 
{
	unsigned char i;
	for (i=0;i<8;i++)     	
	{ 
		SCK=0;
		SDA=temp&0x01;
		temp>>=1; 
		SCK=1;
	}
}   
 
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
{
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
 	RST=1; 	_nop_();  
 	Write_Ds1302(address);	
 	Write_Ds1302(dat);		
 	RST=0; 
}
 
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
 	unsigned char i,temp=0x00;
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
 	RST=1;	_nop_();
 	Write_Ds1302(address);
 	for (i=0;i<8;i++) 	
 	{		
		SCK=0;
		temp>>=1;	
 		if(SDA)
 		temp|=0x80;	
 		SCK=1;
	} 
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
	SCK=1;	_nop_();
	SDA=0;	_nop_();
	SDA=1;	_nop_();
	return (temp);			
}

8.c//运行代码

#include <reg52.h>
#include "ds1302.h"
#include "onewire.h"

#define uchar unsigned char
#define uint unsigned int

sbit ch138_A=P2^5;
sbit ch138_B=P2^6;
sbit ch138_C=P2^7;
sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;
sbit L1 = P0^0;

uchar K7=0,K6=0,K5=0,K4=0;
uchar code ds1302_read[]={0x81,0x83,0x85};
uchar code ds1302_write[]={0x80,0x82,0x84};
uchar timer[]={0x55,0x59,0x23};//时间初始化秒、分、时23(点):59:55
uchar clock[]={0,0,0};//秒、分、时
uint count = 0;	//定时器计数
uchar code smg_duan[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0x9c,0xc6};//数码管段
bit smg_f=1;//数码管闪烁
bit led_k=0;//led灯开关
bit led_f=0;//led闪烁
uint led_c=0;//定时器计led数
uchar tempeture_final=0;
uchar flag1=0;//温度符号,1为负、0为正
uchar rd_temperature_time=1;//读温度时间
uchar temperature_final=0;//读温度

void select_138(uchar x);
void close_all();
void key_scan();
void delay(uint x);
void SetDS1302 ();
void ReadDS1302 ();
void t0_init();
void smg_display(uchar pos,uchar num);
void display_time();
void display_temperature();
unsigned char rd_temperature(void);
void led_running();

void main()
{
	close_all();
	SetDS1302 ();
	t0_init();
	while (1)
	{	
		ReadDS1302 ();
		key_scan();
		display_time();
		led_running();
	}
}

//==========138选择=========
void select_138(uchar x)
{
	switch(x)
	{
		case 0:ch138_C=0;ch138_B=0;ch138_A=0;break;
		case 4:ch138_C=1;ch138_B=0;ch138_A=0;break;
		case 5:ch138_C=1;ch138_B=0;ch138_A=1;break;
		case 6:ch138_C=1;ch138_B=1;ch138_A=0;break;
		case 7:ch138_C=1;ch138_B=1;ch138_A=1;break;
	}
}

//=========关闭外设===========
void close_all()
{
	select_138(4);
	P0=0XFF;
	select_138(5);
	P0=0X00;
	select_138(0);
}

//========按键处理=============
void key_scan()
{
	if(S7==0)
	{
		delay(100);
		if(S7==0)
		{
			if(led_k==1)
			{
				led_k = 0;
				led_c = 0;
				led_f = 0;
			}
			while(!S7){ReadDS1302 ();display_time();led_running();}
			K7=(K7+1)%4;
		}
	}
	if(S6==0)
	{
		delay(100);
		if(S6==0)
		{
			if(led_k==1)
			{
				led_k = 0;
				led_c = 0;
				led_f = 0;
			}
			while(!S6){ReadDS1302 ();display_time();led_running();}
			K6=(K6+1)%4;
		}
	}
	if(S5==0)
	{
		delay(100);
		if(S5==0)
		{
			if(led_k==1)
			{
				led_k = 0;
				led_c = 0;
				led_f = 0;
			}
			while(!S5){ReadDS1302 ();display_time();led_running();}
			if(K7==1)
			{
				timer[2]++;
			}
			if(K7==2)
			{
				timer[1]++;
			}
			if(K7==3)
			{
				timer[0]++;
			}
			if(K6==1)
			{
				clock[2]++;
			}
			if(K6==2)
			{
				clock[1]++;
			}
			if(K6==3)
			{
				clock[0]++;
			}
			SetDS1302 ();
		}
	}
	
	if(S4==0)
	{
		delay(100);
		if(S4==0)
		{
			if(led_k==1)
			{
				led_k = 0;
				led_c = 0;
				led_f = 0;
			}
			if((K6!=0)||(K7!=0))
			{
				while(!S4){ReadDS1302 ();display_time();led_running();}
				if(K7==1)
				{
					timer[2]--;
				}
				if(K7==2)
				{
					timer[1]--;
				}
				if(K7==3)
				{
					timer[0]--;
				}
				if(K6==1)
				{
					clock[2]--;
				}
				if(K6==2)
				{
					clock[1]--;
				}
				if(K6==3)
				{
					clock[0]--;
				}
				SetDS1302 ();
			}
			if(K6==0&&K7==0)
			{
				while(!S4){display_temperature();led_running();}
			}
		}
	}
}

//=======延迟函数============
void delay(uint x)
{
	while(x--);
}

//======DS1302相关===========
void SetDS1302 ()
{
	uchar i;

	Write_Ds1302_Byte(0x8e,0x00);
	for (i = 0;i<=2;i++)
	{
		Write_Ds1302_Byte(ds1302_write[i],timer[i]);
	}
	Write_Ds1302_Byte(0x8e,0x80);
}

void ReadDS1302 ()
{
	uchar i;

	for (i = 0;i<=2;i++)
	{
		timer[i] = Read_Ds1302_Byte(ds1302_read[i]);
	}	
}

//==============定时器============
void t0_init()
{
	TMOD=0X01;
	EA=1;ET0=1;TR0=1;
	TH0=(65536-10000)/256;
	TL0=(65536-10000)%256;
}

void t0() interrupt 1
{
	TH0=(65536-10000)/256;
	TL0=(65536-10000)%256;
	count++;
	if(count==100)
	{
		smg_f=~smg_f;
		count=0;
	}
	if (led_k == 1)
	{
		led_c ++;
		if (led_c % 20 == 0)
		{
			led_f = ~led_f;
			if (led_c >= 500)
			{
				led_k = 0;
				led_c = 0;
				led_f = 0;
			}	
		}	
	}
}
//============数码管相关=========
void smg_display(uchar pos,uchar num)
{
	ch138_C=1;
	ch138_B=1;
	ch138_A=0;
	P0=(0x01<<pos);
	ch138_C=1;
	ch138_B=1;
	ch138_A=1;
	P0=smg_duan[num];
}

void display_time()
{
	if(K6==0)
	{
		if( (K7==0) || ((K7==1)&&(smg_f==1)) || (K7==2) || (K7==3) )
		{
			smg_display(0,timer[2]/16);
			delay(500);
			smg_display(1,timer[2]%16);
			delay(500);
		}
			smg_display(2,10);
			delay(500);
		if( (K7==0) || (K7==1) || ((K7==2)&&(smg_f==1)) || (K7==3) )
		{
			smg_display(3,timer[1]/16);
			delay(500);
			smg_display(4,timer[1]%16);
			delay(500);
		}
			smg_display(5,10);
			delay(500);
		if( (K7==0) || (K7==1) || (K7==2) || ((K7==3)&&(smg_f==1)) )
		{
			smg_display(6,timer[0]/16);
			delay(500);
			smg_display(7,timer[0]%16);
			delay(500);
		}
	}
	else if(K6!=0)
	{
		K7=0;
		if(clock[0]==60)
		{
			clock[0]=0;
			clock[1]++;
		}
		if(clock[1]==60)
		{
			clock[1]=0;
			clock[2]++;
		}
		if(clock[2]==24)
		{
			clock[2]=0;
		}
		if(clock[0]==-1)
		{
			clock[1]--;
			clock[0]=59;
		}
		if(clock[1]==-1)
		{
			clock[2]--;
			clock[1]=59;
		}
		if(clock[2]==-1)
		{
			clock[2]=23;
		}
		
		if( (K6==0) || ((K6==1)&&(smg_f==1)) || (K6==2) || (K6==3) )
		{
			smg_display(0,clock[2]/10);
			delay(500);
			smg_display(1,clock[2]%10);
			delay(500);
		}
			smg_display(2,10);
			delay(500);
		if( (K6==0) || (K6==1) || ((K6==2)&&(smg_f==1)) || (K6==3) )
		{
			smg_display(3,clock[1]/10);
			delay(500);
			smg_display(4,clock[1]%10);
			delay(500);
		}
			smg_display(5,10);
			delay(500);
		if( (K6==0) || (K6==1) || (K6==2) || ((K6==3)&&(smg_f==1)) )
		{
			smg_display(6,clock[0]/10);
			delay(500);
			smg_display(7,clock[0]%10);
			delay(500);
		}
	}
	
	select_138(6);
	P0=0x00;
	select_138(7);
	P0=0xff;
	select_138(0);
}

void display_temperature()
{
	uchar a=0,b=0;
	temperature_final=rd_temperature();
	a=temperature_final/100;
	b=temperature_final%100/10;
	if(flag1==1)
	{
		smg_display(3,10);
		delay(500);
	}
	smg_display(4,a);
	delay(500);
	smg_display(5,b);
	delay(500);
	smg_display(6,11);
	delay(500);
	smg_display(7,12);
	delay(500);
	select_138(6);
	P0=0x00;
	select_138(7);
	P0=0xff;
	delay(100);
	select_138(0);
}

//===============DS18B20========
unsigned char rd_temperature(void)
{
	uchar i=0;
	unsigned int temp;
	float temperature;
    unsigned char low,high;
  
  	init_ds18b20();
  	Write_DS18B20(0xCC);
  	Write_DS18B20(0x44); 
  	i=200;
	while(i)
	{
		i--;
	}

  	init_ds18b20();
  	Write_DS18B20(0xCC);
  	Write_DS18B20(0xBE); 

  	low = Read_DS18B20(); 
  	high = Read_DS18B20(); 
	
	temp = high;
	temp <<= 8;
	temp |= low;
	if((high&0xf8)==0xf8)
	{
		flag1=1;
		temp=(~temp)+1;
	}
	else
	{
		flag1=0;
	}
	temperature = temp*0.0625;
	temperature*=10;
	
  	return temperature;
}

//============led============
void led_running()
{
	if( ((timer[0]/16*10+timer[0]%16) ==clock[0]) && ((timer[1]/16*10+timer[1]%16) ==clock[1]) && ((timer[2]/16*10+timer[2]%16) ==clock[2]))
	{
		led_k=1;
	}
	if (led_f == 1)
	{
		select_138(4);
		L1 = 0;	
		select_138(0);
	}
	else if (led_f == 0)
	{
		select_138(4);
		L1 = 1;	
		select_138(0);
	}
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值