蓝桥杯单片机11届省赛程序题

历时半个多月,在家苦练这么久,终于把11届省赛程序题做出来了,不枉我这十几天寒假过的那么枯燥无味。

sys.c

#ifndef _SYS_H_
#define _SYS_H_

#include <STC15F2K60S2.H>
#include <intrins.h>

sbit s4 = P3^3;
sbit s5 = P3^2;
sbit s6 = P3^1;
sbit s7 = P3^0;

#define uchar unsigned char
#define uint unsigned int

extern unsigned char T_Max,T_Min,T_Max_p,T_Min_p;
extern unsigned char InterFace;
extern unsigned char stat_led;

//sys.c
void Delay(unsigned int ms);
void Select_74H138(unsigned char channel);
void Init_System();
//void Timer0Init();
void Work_Led(unsigned char dat);
//nixie.c
void DisplayAlone(unsigned char pos,value);
void Display_Temp();
void Display_P();
void DisplaySMG();
void Work_DAC();

//key.c
void KeyScan();


#endif

nixie.c

#include <sys.h>
#include <onewire.h>
#include <iic.h>

//uchar code Nixie[] = {0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90,
//											0X40, 0X79, 0X24, 0X30, 0X19, 0X12, 0X02, 0X78, 0X00, 0X10, 0XBF, 0XFF};
0-9 0.-9. - 熄灭
uchar code Nixie[] = {0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90, 0XC6, 0X8C};		

uchar T_Max = 30,T_Min = 20,T_Max_p = 30,T_Min_p = 20;
//uchar InterFace = 0;
uint temp;
											
void DisplayAlone(uchar pos,value)
{
	Select_74H138(7);
	P0 = 0XFF;
	Select_74H138(6);
	P0 = _crol_(0X01,pos);
	Select_74H138(7);
	P0 = Nixie[value];
	Delay(1);
	Select_74H138(0);
}

void Display_Temp()
{
//	temp = Temper_Get();
	DisplayAlone(0,10);
	DisplayAlone(6,temp / 10);
	DisplayAlone(7,temp % 10);
	Select_74H138(7);
	P0 = 0XFF;
}

void Display_P()
{
	DisplayAlone(0,11);
	DisplayAlone(3,T_Max / 10);
	DisplayAlone(4,T_Max % 10);
	DisplayAlone(6,T_Min / 10);
	DisplayAlone(7,T_Min % 10);
	Select_74H138(7);
	P0 = 0XFF;
}

void DisplaySMG()
{
	temp = Temper_Get();
	switch(InterFace)
	{
		case 0: Display_Temp(); break;
		case 1: Display_P(); break;
	}
}

void Work_DAC()
{		 
//	if(T_Max > T_Min)
//	{
		if(temp > T_Max)
		{
			stat_led = (stat_led | 0xf7) & 0xfe;
			Work_Led(stat_led);
			DAC_Out(204);
		}
	  if(temp < T_Max && temp > T_Min)
		{
			stat_led = (stat_led | 0xf7) & 0xfd;
			Work_Led(stat_led);
			DAC_Out(153);
		}
		if(temp < T_Min)
		{
			stat_led = (stat_led | 0xf7) & 0xfb;
			Work_Led(stat_led);
			DAC_Out(102);
		}
//	}
	
}

key.c

#include <sys.h>

uchar InterFace = 0;
bit stat_s5 = 0;

void KeyScan()
{
	if(s4 == 0)
	{
		Delay(5);
		InterFace = (InterFace + 1) % 2;
		if(InterFace)
		{
			T_Max_p = T_Max;
			T_Min_p = T_Min;
		}		
		else
		{
			stat_s5 = 0;
			if(T_Max <= T_Min)
			{
//				stat_led = 0xf7;
				T_Max = T_Max_p;
				T_Min = T_Min_p;
				stat_led = 0xff;
			}		
//			else
//			{
//				stat_led = 0xff;
//			}				
		}
		while(s4 == 0)
			DisplaySMG();
	}
	if(s5 == 0)
	{
		Delay(5);
		if(InterFace)
		{
			stat_s5 = ~stat_s5;
		}
		while(s5 == 0)
			DisplaySMG();
	}
	if(s6 == 0)
	{
		Delay(5);
		if(stat_s5)
		{
			if(T_Max < 100)
			T_Max++;
		}		
		else
		{
			if(T_Min < 100)
			T_Min++;
		}
		while(s6 == 0)
			DisplaySMG();
		if(T_Max <= T_Min)
		{
			stat_led = 0xf7;
		}
		else
		{
			stat_led = 0xff;
		}	
	}
	if(s7 == 0)
	{
		Delay(5);
		if(stat_s5)
		{
			if(T_Max >= 0)
				T_Max--;
		}
		else
		{
			if(T_Min >= 0)
				T_Min--;
		}
		while(s7 == 0)
			DisplaySMG();
		if(T_Max <= T_Min)
		{
			stat_led = 0xf7;
		}
		else
		{
			stat_led = 0xff;
		}	
	}
}

ds18b20.c

#include <onewire.h>

void Delay_us(uint us)//延时1us
{
	do{
		_nop_();
		_nop_();
		_nop_();
	}while(us--);
}

bit DS18B20_Init()
{
	bit i;
	DQ = 0;//读写之前都要将该引脚拉低
	Delay_us(500);
	DQ = 1;//释放总线
	Delay_us(50);
	i = DQ;//读取DQ的值
	Delay_us(100);
	DQ = 1;
	return i;
}

void Write_DS18B20(uchar dat)
{
	uchar i; 
	for(i = 0; i < 8; i++)
	{
		DQ = 0;
		Delay_us(2);
		DQ = dat & 0x01;//从最低位开始传送
		Delay_us(100);
		DQ = 1;//释放总线,准备下一次数据的写入
		dat >>= 1;
	}
}

uchar Read_DS18B20()
{
	uchar i,j,dat;
	for(i = 0; i < 8; i++)
	{
		DQ = 0;
		Delay_us(1);
		DQ =1;
		j = DQ;
		Delay_us(100);
		DQ = 1;//释放总线,准备下一次数据的写入
		dat = (j <<7) | (dat >> 1);
	}
	return dat;
}

uint Temper_Get()
{
	uchar MSB,LSB;
	uint temp;
	DS18B20_Init();
	Write_DS18B20(0XCC);
	Write_DS18B20(0X44);
	Delay_us(500);
	DS18B20_Init();
	Write_DS18B20(0XCC);
	Write_DS18B20(0XBE);
	LSB = Read_DS18B20();
	MSB = Read_DS18B20();
	DS18B20_Init();
	temp = MSB & 0X0F;
	temp <<= 8;
	temp |= LSB;
	temp = temp * 0.0625;
	return temp;
}

pcf8591.c

#include <iic.h>
#include <onewire.h>
#include <sys.h>

void DAC_Out(uchar dat)
{
	IIC_Start();
	IIC_SendByte(0X90);//写数据
	IIC_WaitAck();
	IIC_SendByte(0X40);//允许D/A输出
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();
}

iic.c

#include <iic.h>

void somenop()
{
	_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();
	_nop_();
}	

void IIC_Start()
{
	SDA = 1;
	SCL = 1;
	somenop();
	SDA = 0;
	somenop();
	SCL = 0;
}

void IIC_Stop()
{
	SDA = 0;
	SCL = 1;
	somenop();
	SDA = 1;
}

void IIC_Ack(bit i)//应答位控制(主机发送应答)
{
	if(i)
		SDA = 0;
	else
		SDA = 1;
	somenop();
	SCL = 1;
	somenop();
	SCL = 0;
	SDA = 1;
	somenop();
}

bit IIC_WaitAck()//等待应答(读从机应答)
{
	SDA = 1;
	somenop();
	SCL = 1;
	somenop();
	if(SDA)
	{
		SCL = 0;
		IIC_Stop();
		return 0;
	}
	else
	{
		SCL = 0;
		return 1;
	}
}

void IIC_SendByte(uchar dat)//通过IIC总线发送数据
{
	uchar i;
	for(i = 0; i < 8; i++)
	{
		if(dat & 0x80)
			SDA = 1;
		else
			SDA = 0;
		somenop();
		SCL = 1;
		dat <<= 1;
		somenop();
		SCL = 0;
	}
}

uchar IIC_RecByte()//从IIC总线上接收数据
{
	uchar i,dat;
	for(i = 0; i < 8; i++)
	{
		SCL = 1;
		somenop();
		dat <<= 1;
		if(SDA)
			dat |= 0x01;
		SCL = 0;
		somenop();
	}
	return dat;
}

main.c

#include <sys.h>
#include <onewire.h>
#include <iic.h>

//void Timer0Init();
uchar stat_led = 0xff;

void main()
{
	Init_System();
//	Timer0Init();
	while(1)
	{
		KeyScan();
		DisplaySMG();
		Work_DAC();
		DisplaySMG();
	}
}

sys.h

#ifndef _SYS_H_
#define _SYS_H_

#include <STC15F2K60S2.H>
#include <intrins.h>

sbit s4 = P3^3;
sbit s5 = P3^2;
sbit s6 = P3^1;
sbit s7 = P3^0;

#define uchar unsigned char
#define uint unsigned int

extern unsigned char T_Max,T_Min,T_Max_p,T_Min_p;
extern unsigned char InterFace;
extern unsigned char stat_led;

//sys.c
void Delay(unsigned int ms);
void Select_74H138(unsigned char channel);
void Init_System();
//void Timer0Init();
void Work_Led(unsigned char dat);
//nixie.c
void DisplayAlone(unsigned char pos,value);
void Display_Temp();
void Display_P();
void DisplaySMG();
void Work_DAC();

//key.c
void KeyScan();


#endif

iic.h

#ifndef _IIC_H_
#define _IIC_H_

#include <STC15F2K60S2.H>
#include <intrins.h>

sbit SDA = P2^1;
sbit SCL = P2^0;

#define uchar unsigned char
	
//iic.c
void somenop();
void IIC_Start();
void IIC_Stop();
void IIC_Ack(bit i);
bit IIC_WaitAck();
void IIC_SendByte(unsigned char dat);
unsigned char IIC_RecByte();

at24c02.c
//void Write_AT24C02(unsigned char addr,dat);
//unsigned char Read_AT24C02(unsigned char addr);
//pcf8591.c
void DAC_Out(unsigned char dat);
//void Work_DAC();

#endif

onewire.h

#ifndef _ONEWIRE_H_
#define _ONEWIRE_H_

#include <STC15F2K60S2.H>
#include <intrins.h>

sbit DQ = P1^4;

#define uchar unsigned char
#define uint unsigned int
//#define ulong unsigned long
	
//ds18b20.c
void Delay_us(unsigned int us);
bit DS18B20_Init();
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20();
unsigned int Temper_Get();


#endif

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wu小燕呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值