栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

蓝桥杯第十二届省赛

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

蓝桥杯第十二届省赛

百度网盘

链接:https://pan.baidu.com/s/1tdegixZ8Trn-TVWZLQ5TbA 
提取码: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.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;
}

 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

12.c//程序运行代码

#include 
#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;

uint temp=0;//温度
uchar P_data=25;//温度参数
uint A_data=0;//Vdac数值
uchar DAC_modo=1;//DAC模式
uchar key4_flag1=0;
uchar key5_flag1=0;
uchar key8_flag1=0;
uchar key9_flag1=0;

uchar code smg_duan[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc6,0x8c,0x88};


void select_138(uchar x);//138选择
void close_all();//关闭外设
void delay(uint x);//延迟函数
void rd_temperature(void);//读温度
void smg_bit(uchar pos,uchar num);//数码管显示一位
void smg_bit1(uchar pos,uchar num);//数码管显示一位(带小数点)
void all_smg(uchar x);//控制所有数码管
void display_C();//显示温度
void display_P();//显示温度参数
void display_A();//显示电压
void PCF8591();//传DA输出
void key_scan();//按键扫描
void display();//总显示
void LED_running();//LED运行

void main()
{
	close_all();
	while(1)
	{
		rd_temperature();
		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;
	select_138(0);
}

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


//============读取温度========
void rd_temperature(void)
{
	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;
	temp=temp1*100+0.5;/
	a=temp/1000;        //十位
	b=temp%1000/100;    //个位
	c=temp%100/10;      //第一位小数
	d=temp%10;          //第二位小数
	smg_bit(0,10);
	delay(500);
	smg_bit(4,a);
	delay(500);
	smg_bit1(5,b);     //smg_bit1(uchar pos,uchar num);带小数点
	delay(500);
	smg_bit(6,c);
	delay(500);
	smg_bit(7,d);
	delay(500);
	all_smg(0xff);
}

void display_P()
{
	smg_bit(0,11);
	delay(500);
	smg_bit(6,P_data/10);
	delay(500);
	smg_bit(7,P_data%10);
	delay(500);
	all_smg(0xff);
}

void display_A()
{
	if(DAC_modo==1)
	{
		if(temp=2000)&&(temp<4000))
		{
			A_data=(temp*3)/20-200;
		}
		if(temp>=4000)
		{
			A_data=400;
		}
	}
	smg_bit(0,12);
	delay(500);
	smg_bit1(5,A_data/100);
	delay(500);
	smg_bit(6,A_data%100/10);
	delay(500);
	smg_bit(7,A_data%10);
	delay(500);
	all_smg(0xff);
}

//=============PCF8591=======
void PCF8591()
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x40);
	IIC_WaitAck();
	IIC_SendByte(A_data);
	IIC_WaitAck();
	IIC_Stop();
}

//=============按键============
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==2)
			{
				DAC_modo++;
				if(DAC_modo==3)
				{
					DAC_modo=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)%3;
			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)
			{
				P_data++;
				if(P_data==100)
				{
					P_data=99;
				}
			}
			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)
			{
				P_data--;
				if(P_data==-1)
				{
					P_data=0;
				}
			}
			while(!P3_3){display();LED_running();};
		}
	}
}

//========总显示========
void display()
{
	if(key4_flag1==0)
	{
		display_C();
	}
	if(key4_flag1==1)
	{
		display_P();
	}
	if(key4_flag1==2)
	{
		display_A();
	}
}

//===========LED=========
void LED_running()
{
	select_138(4);
	if(DAC_modo==1)
	{
		L1=0;
	}
	else
	{
		L1=1;
	}
	
	if(key4_flag1==0)
	{
		L2=0;
	}
	else
	{
		L2=1;
	}
	
	if(key4_flag1==1)
	{
		L3=0;
	}
	else
	{
		L3=1;
	}
	
	if(key4_flag1==2)
	{
		L4=0;
	}
	else
	{
		L4=1;
	}
	select_138(0);
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/737869.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号