蓝桥杯单片机第十一届国赛

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

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

题目

 

 

 

 

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

#ifndef _IIC_H
#define _IIC_H
 
void IIC_Start(void); 
void IIC_Stop(void);  
bit IIC_WaitAck(void);  
void IIC_SendAck(bit ackbit); 
void IIC_SendByte(unsigned char byt); 
unsigned char IIC_RecByte(void); 
 
#endif

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

#include "reg52.h"
#include "intrins.h"
 
#define DELAY_TIME 5
 
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
 
//总线引脚定义
sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */
 
void IIC_Delay(unsigned char i)
{
    do{_nop_();}
    while(i--);        
}
//总线启动条件
void IIC_Start(void)
{
    SDA = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;	
}
 
//总线停止条件
void IIC_Stop(void)
{
    SDA = 0;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}
 
//发送应答
void IIC_SendAck(bit ackbit)
{
    SCL = 0;
    SDA = ackbit;  					// 0:应答,1:非应答
    IIC_Delay(DELAY_TIME);
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SCL = 0; 
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}
 
//等待应答
bit IIC_WaitAck(void)
{
    bit ackbit;
	
    SCL  = 1;
    IIC_Delay(DELAY_TIME);
    ackbit = SDA;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    return ackbit;
}
 
//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
    unsigned char i;
 
    for(i=0; i<8; i++)
    {
        SCL  = 0;
        IIC_Delay(DELAY_TIME);
        if(byt & 0x80) SDA  = 1;
        else SDA  = 0;
        IIC_Delay(DELAY_TIME);
        SCL = 1;
        byt <<= 1;
        IIC_Delay(DELAY_TIME);
    }
    SCL  = 0;  
}
 
//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
    unsigned char i, da;
    for(i=0; i<8; i++)
    {   
    	SCL = 1;
	IIC_Delay(DELAY_TIME);
	da <<= 1;
	if(SDA) da |= 1;
	SCL = 0;
	IIC_Delay(DELAY_TIME);
    }
    return da;    
}

 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);			
}

11.c//运行代码

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

#define uchar unsigned char
#define uint unsigned int

sfr P4=0xc0;

sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P4_2=P4^2;
sbit P4_4=P4^4;
sbit L1=P0^0;
sbit L2=P0^1;
sbit L3=P0^2;
sbit L4=P0^3;
sbit L5=P0^4;
sbit L6=P0^5;
sbit L7=P0^6;
sbit L8=P0^7;

uchar key4_flag1=0;
uchar key5_flag1=0;
uchar key8_flag1=0;
uchar key9_flag1=0;

uint C_data=0;
uint E_data=0;
uchar E_flag1=1;
uchar shuju_flag1=1;//数据界面标志(哪一个界面)
uchar P_flag1=1;//参数界面标志(哪一个界面)
uchar P_data1=17;
uchar P_data2=25;
uchar P_data3=4;
uchar L3_flag1=0;
uint T0_count=0;

uchar code smg_duan[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xc6,0x86,0x8c};
	
uchar code DS1302_W[]={0x80,0x82,0x84};
uchar code DS1302_R[]={0x81,0x83,0x85};
uchar DS1302_T[]={0x50,0x59,0x16};//时间16:59:50

void select_138(uchar x);
void close_all();
void delay(uchar x);

void smg_bit(uchar pos,uchar num);
void smg_bit1(uchar pos,uchar num);
void smg_all(uchar x);
void display_T();
void display_C();
void display_E();
void display_P1();
void display_P2();
void display_P3();

void SetDS1302 ();
void ReadDS1302 ();
void rd_temperature();
void read_E();
void key_scan();
void display();
void LED_running();
void T_init();

void main()
{
	close_all();
	SetDS1302 ();
	T_init();
	while(1)
	{
		ReadDS1302 ();
		
		rd_temperature();
		
		read_E();
		
		if(E_flag1==1)
		{
			TR0=1;
		}
		
		if(E_flag1==0)
		{
			TR0=0;
			L3_flag1=0;
		}
		
		key_scan();
		
		display();
		
		LED_running();
	}
}

//========138选择===========
void select_138(uchar x)
{
	switch(x)
	{
		case 0:P2=(P2&0X1F)|0x00;
						break;
		case 4:P2=(P2&0X1F)|0x80;
						break;
		case 5:P2=(P2&0X1F)|0xa0;
						break;
		case 6:P2=(P2&0X1F)|0xc0;
						break;
		case 7:P2=(P2&0X1F)|0xe0;
						break;
	}
}

//==========关外设=========
void close_all()
{
	select_138(4);
	P0=0xff;
	select_138(5);
	P0=0x00;
}

//===========延迟========
void delay(uchar x)
{
	while(x--){};
}

//=========数码管=========
void smg_bit(uchar pos,uchar num)
{
	select_138(7);
	P0=0xff;
	select_138(6);
	P0=(0x01<<pos);
	select_138(7);
	P0=smg_duan[num];
}

void smg_bit1(uchar pos,uchar num)//小数
{
	select_138(7);
	P0=0xff;
	select_138(6);
	P0=(0x01<<pos);
	select_138(7);
	P0=(smg_duan[num]&0x7f);
}

void smg_all(uchar x)
{
	select_138(6);
	P0=0xff;
	select_138(7);
	P0=x;
}

void display_T()
{
	smg_bit(0,DS1302_T[2]/16);
	delay(500);
	smg_bit(1,DS1302_T[2]%16);
	delay(500);
	smg_bit(2,10);
	delay(500);
	smg_bit(3,DS1302_T[1]/16);
	delay(500);
	smg_bit(4,DS1302_T[1]%16);
	delay(500);
	smg_bit(5,10);
	delay(500);
	smg_bit(6,DS1302_T[0]/16);
	delay(500);
	smg_bit(7,DS1302_T[0]%16);
	delay(500);
	smg_all(0xff);
}

void display_C()
{
	uchar a,b,c;
	a=C_data/100;
	b=C_data%100/10;
	c=C_data%10;
	smg_bit(0,11);
	delay(500);
	smg_bit(5,a);
	delay(500);
	smg_bit1(6,b);
	delay(500);
	smg_bit(7,c);
	delay(500);
	smg_all(0xff);
}

void display_E()
{
	smg_bit(0,12);
	delay(500);
	smg_bit1(2,E_data/100);
	delay(500);
	smg_bit(3,E_data%100/10);
	delay(500);
	smg_bit(4,E_data%10);
	delay(500);
	smg_bit(7,E_flag1);
	delay(500);
	smg_all(0xff);
}

void display_P1()
{
	smg_bit(0,13);
	delay(500);
	smg_bit(1,1);
	delay(500);
	smg_bit(6,P_data1/10);
	delay(500);
	smg_bit(7,P_data1%10);
	delay(500);
	smg_all(0xff);
}

void display_P2()
{
	smg_bit(0,13);
	delay(500);
	smg_bit(1,2);
	delay(500);
	smg_bit(6,P_data2/10);
	delay(500);
	smg_bit(7,P_data2%10);
	delay(500);
	smg_all(0xff);
}

void display_P3()
{
	smg_bit(0,13);
	delay(500);
	smg_bit(1,3);
	delay(500);
	smg_bit(7,P_data3);
	delay(500);
	smg_all(0xff);
}

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

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

void ReadDS1302 ()
{
	uchar i;

	for (i = 0;i<=2;i++)
	{
		DS1302_T[i] = Read_Ds1302_Byte(DS1302_R[i]);
	}	
}

//=========DS18B20===========
void rd_temperature()
{
	float temp1=0;
	uchar high=0,low=0;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	delay(200);	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	low=Read_DS18B20();
	high=Read_DS18B20();
	temp1=(high<<8)|low;
	temp1=temp1*0.0625;
	C_data=temp1*10+0.5;
}

//========光敏电阻==========
void read_E()
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x41);
	IIC_WaitAck();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	E_data=IIC_RecByte(); 
	IIC_SendAck(1);
	IIC_Stop();
	E_data=E_data*1.961;
	if(E_data<=250)
	{
		E_flag1=1;
	}
	else
	{
		E_flag1=0;
	}
}

//============按键============
void key_scan()
{
	P3=0XFF;P4_2=1;P4_4=1;
	P4_4=0;
	if(P3_2==0)//5
	{
		delay(100);
		if(P3_2==0)
		{
			if(key4_flag1==0)
			{
				shuju_flag1++;
				if(shuju_flag1==4)
				{
					shuju_flag1=1;
				}
			}
			
			if(key4_flag1==1)
			{
				P_flag1++;
				if(P_flag1==4)
				{
					P_flag1=1;
				}
			}
			
			while(!P3_2){display();LED_running();};
		}
	}
	
	P3=0XFF;P4_2=1;P4_4=1;
	P4_4=0;
	if(P3_3==0)//4
	{
		delay(100);
		if(P3_3==0)
		{
			key4_flag1=(key4_flag1+1)%2;
			P_flag1=1;
			shuju_flag1=1;
			while(!P3_3){display();LED_running();};
		}
	}
	
	P3=0XFF;P4_2=1;P4_4=1;
	P4_2=0;
	if(P3_2==0)//9
	{
		delay(100);
		if(P3_2==0)
		{
			if(key4_flag1==1)
			{
				if(P_flag1==1)
				{
					P_data1=(P_data1+1)%24;
				}
				
				if(P_flag1==2)
				{
					P_data2=(P_data2+1)%100;
				}
				
				if(P_flag1==3)
				{
					P_data3=P_data3+1;
					if(P_data3==9)
					{
						P_data3=4;
					}
				}
			}
			while(!P3_2){display();LED_running();};
		}
	}
	
	P3=0XFF;P4_2=1;P4_4=1;
	P4_2=0;
	if(P3_3==0)//8
	{
		delay(100);
		if(P3_3==0)
		{
			if(key4_flag1==1)
			{
				if(P_flag1==1)
				{
					P_data1--;
					if(P_data1==-1)
					{
						P_data1=23;
					}
				}
				
				if(P_flag1==2)
				{
					P_data2--;
					if(P_data2==-1)
					{
						P_data2=99;
					}
				}
				
				if(P_flag1==3)
				{
					P_data3--;
					if(P_data3==-1)
					{
						P_data3=8;
					}
				}
			}
			while(!P3_3){display();LED_running();};
		}
	}
}

//=====总显示======
void display()
{
	if(key4_flag1==0)
	{
		if(shuju_flag1==1)
		{
			display_T();
		}
		if(shuju_flag1==2)
		{
			display_C();
		}
		if(shuju_flag1==3)
		{
			display_E();
		}
	}
	
	if(key4_flag1==1)
	{
		if(P_flag1==1)
		{
			display_P1();
		}
		
		if(P_flag1==2)
		{
			display_P2();
		}
		
		if(P_flag1==3)
		{
			display_P3();
		}
	}
}

//==========LED=======
void LED_running()
{
	uint hour=DS1302_T[2]/16*10+DS1302_T[2]%16;
	float temperture=C_data/100*10+C_data%100/10+C_data%10*0.1;
	select_138(4);
	if(P_data1<8)
	{
		if((hour>=P_data1)&&(hour<8))
		{
			L1=0;
		}
		else
		{
			L1=1;
		}
	}
	
	if(P_data1>=8)
	{
		if(((hour>=P_data1)&&(hour<23))||(hour<8))
		{
			L1=0;
		}
		else
		{
			L1=1;
		}
	}
	
	if(P_data2>temperture)
	{
		L2=0;
	}
	else
	{
		L2=1;
	}
	
	if(P_data3==4)
	{
		L4=0,L5=L6=L7=L8=1;
	}
	if(P_data3==5)
	{
		L5=0,L4=L6=L7=L8=1;
	}
	if(P_data3==6)
	{
		L6=0,L5=L4=L7=L8=1;
	}
	if(P_data3==7)
	{
		L7=0,L5=L6=L4=L8=1;
	}
	if(P_data3==8)
	{
		L8=0,L5=L6=L7=L4=1;
	}
	
	if(L3_flag1==1)
	{
		L3=0;
	}
	else
	{
		L3=1;
	}
}

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

void t0() interrupt 1
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	T0_count++;
	if(T0_count==60)
	{
		T0_count=0;
		TR0=0;
		L3_flag1=1;
	}
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值