蓝桥杯学习笔记 单片机CT107D 第十四届省赛

碎碎念:这一届可真难啊...,模块用的多逻辑还复杂

一.题目要求

二.代码实现

这一届换了新的驱动代码,为节省篇幅,驱动代码就不在这篇文章里给了,详情可参考这篇文章。

蓝桥杯学习笔记 单片机CT107D 新驱动代码的使用._蓝桥杯单片机给的底层驱动怎么使用-CSDN博客 main.c

#include <STC15F2K60S2.H>
#include "iic.h"
#include "ds1302.h"
#include "onewire.h"
sbit C1=P4^4;
sbit C2=P4^2;
sbit R1=P3^2;
sbit R2=P3^3;
code unsigned char SMG_Nodot[] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
code unsigned char SMG_Dot[] =
{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned char hour,min,sec;
unsigned char SMG_Mode=1;
unsigned char SMG_Mode_temp;
unsigned char huixian_Mode=1;
unsigned char T_smg;
float T;
unsigned char T_max;
unsigned int  T_sum;
unsigned int T_aver;
unsigned char T_smg;
unsigned char T_pre;
bit shidu_Flag=1;
unsigned char shidu;
unsigned char shidu_pre;
unsigned char shidu_max;
unsigned int shidu_aver;
unsigned int shidu_sum;
unsigned char Chufa_times;
unsigned char T_param=30;
unsigned char DAC_Value;
unsigned char DAC_Value_temp;
bit Chufa_Flag;
unsigned int count_times;
unsigned int count_f;
unsigned int dat_f;
unsigned int fre_times;
bit Key_Flag=0;
unsigned char Key_times;
unsigned char LED_Mode=0xff;
bit alarm_Flag;
bit Flash_Flag;
unsigned char Flash_times;
void Delay_SMG(unsigned int t)
{
	while(t--);
}
void SelectHC573(unsigned char channel,unsigned char dat)
{
	P0=dat;
	switch(channel)
	{
		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;
		case 0:
			P2=(P2&0x1f)|0x00;
		break;
	}
	P2=(P2&0x1f)|0x00;
}
void SMG_Display(unsigned char pos,unsigned char dat)
{
	SelectHC573(6,0x01<<(pos-1));
	SelectHC573(7,dat);
	Delay_SMG(500);
	SelectHC573(6,0x01<<(pos-1));
	SelectHC573(7,0xff);
}
void Display_Dynamic()
{
	if(SMG_Mode==1)
	{
		SMG_Display(1,SMG_Nodot[hour/16]);
		SMG_Display(2,SMG_Nodot[hour%16]);
		SMG_Display(3,0xbf);
		SMG_Display(4,SMG_Nodot[min/16]);
		SMG_Display(5,SMG_Nodot[min%16]);
		SMG_Display(6,0xbf);
		SMG_Display(7,SMG_Nodot[sec/16]);
		SMG_Display(8,SMG_Nodot[sec%16]);
	}
	if(SMG_Mode==2&&huixian_Mode==1)
	{
		SMG_Display(1,SMG_Nodot[12]);
		SMG_Display(3,SMG_Nodot[T_max/10]);
		SMG_Display(4,SMG_Nodot[T_max%10]);
		SMG_Display(5,0xbf);
		SMG_Display(6,SMG_Nodot[T_aver/100]);
		SMG_Display(7,SMG_Dot[T_aver%100/10]);
		SMG_Display(8,SMG_Nodot[T_aver%10]);
	}
	if(SMG_Mode==2&&huixian_Mode==2)
	{
		SMG_Display(1,0x89);
		SMG_Display(3,SMG_Nodot[shidu_max/10]);
		SMG_Display(4,SMG_Nodot[shidu_max%10]);
		SMG_Display(5,0xbf);
		SMG_Display(6,SMG_Nodot[shidu_aver/100]);
		SMG_Display(7,SMG_Dot[shidu_aver%100/10]);
		SMG_Display(8,SMG_Nodot[shidu_aver%10]);
	}
	if(SMG_Mode==2&&huixian_Mode==3)
	{
		SMG_Display(1,SMG_Nodot[15]);
		SMG_Display(2,SMG_Nodot[Chufa_times/10]);
		SMG_Display(3,SMG_Nodot[Chufa_times%10]);
		SMG_Display(4,SMG_Nodot[hour/16]);
		SMG_Display(5,SMG_Nodot[hour%16]);
		SMG_Display(6,0xbf);
		SMG_Display(7,SMG_Nodot[min/16]);
		SMG_Display(8,SMG_Nodot[min%16]);
	}
	if(SMG_Mode==3)
	{
		SMG_Display(1,0x8c);
		SMG_Display(7,SMG_Nodot[T_param/10]);
		SMG_Display(8,SMG_Nodot[T_param%10]);
	}
	if(SMG_Mode==4)
	{
		SMG_Display(1,SMG_Nodot[14]);
		SMG_Display(4,SMG_Nodot[T_smg/10]);
		SMG_Display(5,SMG_Nodot[T_smg%10]);
		SMG_Display(6,0xbf);
		if(shidu_Flag==1)
		{
			SMG_Display(7,SMG_Nodot[shidu/10]);
			SMG_Display(8,SMG_Nodot[shidu%10]);
		}
		if(shidu_Flag==0)
		{
			SMG_Display(7,SMG_Nodot[10]);
			SMG_Display(8,SMG_Nodot[10]);
		}
	}
}
void Timer1Init(void)		//10??@12.000MHz
{
	AUXR &= 0xBF;		//?????12T??
	TMOD = 0x06;		//???????
	TL1 = 0xF0;		//??????
	TH1 = 0xD8;		//??????
	TF1 = 0;		//??TF1??
	TR1 = 1;		//???1????
	EA=1;
	ET1=1;
}

void Timer0Init()
{
	TH0=0xff;
	TL0=0xff;
	TR0=1;
	ET0=1;
}
void Timer1_Service() interrupt 3
{
	fre_times++;
	if(fre_times==100)
	{
		dat_f=count_f;
		count_f=0;
		fre_times=0;
	}
	if(Chufa_Flag==1)
	{
		count_times++;
		if(count_times==300)
		{
			Chufa_Flag=0;
			SMG_Mode=SMG_Mode_temp;
			count_times=0;
		}
	}
	if(Key_Flag==1)
	{
		Key_times++;
	}
	if(alarm_Flag==1)
	{
		Flash_times++;
		if(Flash_times==10)
		{
			Flash_times=0;
			Flash_Flag=~Flash_Flag;
			if(Flash_Flag==1)
			{
				LED_Mode&=0xf7;
				SelectHC573(4,LED_Mode);
			}
			if(Flash_Flag==0)
			{
				LED_Mode|=0x08;
				SelectHC573(4,LED_Mode);
			}
		}
	}
}
void Timer0_service() interrupt 1
{
	count_f++;
}
void DS1302_Config()
{
	Write_Ds1302_Byte(0x8e,0x00);
	Write_Ds1302_Byte(0x84,0x13);
	Write_Ds1302_Byte(0x82,0x02);
	Write_Ds1302_Byte(0x80,0x05);
	Write_Ds1302_Byte(0x8e,0x80);
}
void DS1302_Read()
{
	hour=Read_Ds1302_Byte(0x85);
	min=Read_Ds1302_Byte(0x83);
	sec=Read_Ds1302_Byte(0x81);
}
void ADC_Read()
{
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x01);
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	DAC_Value=I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
}
void DS18B20_Read_temp()
{
	unsigned char MSB,LSB;
	unsigned int temp;
	init_ds18b20();
	Display_Dynamic();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Display_Dynamic();
	
	init_ds18b20();
	Display_Dynamic();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	LSB=Read_DS18B20();
	MSB=Read_DS18B20();
	Display_Dynamic();
	temp=MSB<<8|LSB;
	T=temp*0.0625;
	T_smg=T;
}
void shidu_Caculate()
{
	float k;
	k=80.0/1800.0;
	if(dat_f<200||dat_f>2000)
	{
		shidu_Flag=0;
	}
	if(dat_f>=200&&dat_f<=2000)
	{
		shidu=k*(dat_f-200)+10;
		shidu_Flag=1;
	}
}
void Chufa_control()
{
	SMG_Mode_temp=SMG_Mode;
	ADC_Read();
	if(DAC_Value<80&&DAC_Value_temp>80)
	{
		Chufa_Flag=1;
		SMG_Mode=4;
		if(shidu_Flag==1)
		{
			Chufa_times++;
			T_sum+=T_smg*10;
			shidu_sum+=shidu*10;
			T_aver=T_sum/Chufa_times;
			shidu_aver=shidu_sum/Chufa_times;
			if(T_smg>T_max)
			{
				T_max=T_smg;
			}
			if(shidu>shidu_max)
			{
				shidu_max=shidu;
			}
			if(T_smg>T_param)
			{
				alarm_Flag=1;
			}
			if(T_smg<T_param)
			{
				alarm_Flag=0;
				LED_Mode|=0x08;
				SelectHC573(4,LED_Mode);
			}
			if(shidu>shidu_pre&&T_smg>T_pre&&Chufa_times>=2)
			{
				LED_Mode&=0xdf;
				SelectHC573(4,LED_Mode);
			}
			if(shidu<shidu_pre||T_smg<T_pre)
			{
				LED_Mode|=0x20;
				SelectHC573(4,LED_Mode);
			}
			shidu_pre=shidu;
			T_pre=T_smg;
		}
		if(shidu_Flag==0)
		{
			LED_Mode&=0xef;
			SelectHC573(4,LED_Mode);
		}
		if(shidu_Flag==1)
		{
			LED_Mode|=0x10;
			SelectHC573(4,LED_Mode);
		}
		while(Chufa_Flag==1)
		{
			Display_Dynamic();
		}
	}
	DAC_Value_temp=DAC_Value;
}
void Scan_Key()
{
	C1=0;C2=1;
	R1=R2=1;
	if(R1==0)
	{
		Delay_SMG(500);
		if(R1==0)
		{
			if(SMG_Mode==2)
			{
				switch(huixian_Mode)
				{
					case 1:
						huixian_Mode=2;
					break;
					case 2:
						huixian_Mode=3;
					break;
					case 3:
						huixian_Mode=1;
					break;
				}
			}
		}
		while(R1==0)
		{
			Display_Dynamic();
		}
	}
	if(R2==0)
	{
		Delay_SMG(500);
		if(R2==0)
		{
			switch(SMG_Mode)
			{
				case 1:
					SMG_Mode=2;
					huixian_Mode=1;
				break;
				case 2:
					SMG_Mode=3;
				break;
				case 3:
					SMG_Mode=1;
				break;
			}
		}
		while(R2==0)
		{
			Display_Dynamic();
		}
	}
	C1=1;C2=0;
	R1=R2=1;
	if(R1==0)
	{
		Delay_SMG(500);
		if(R1==0)
		{
			if(SMG_Mode==3)
			{
				if(T_param>0)
				{
					T_param--;
				}
			}
			if(SMG_Mode==1)
			{
				Key_Flag=1;
				while(R1==0)
				{
					Display_Dynamic();
					DS1302_Read();
				}
				Key_Flag=0;
				if(Key_times>200)
				{
					Chufa_times=0;
					T_sum=0;
					shidu_sum=0;
					T_aver=0;
					shidu_aver=0;
					Key_times=0;
					T_max=0;
					shidu_max=0;
				}
				if(Key_times<=200)
				{
					Key_times=0;
				}
			}
		}
		while(R1==0)
		{
			Display_Dynamic();
			DS1302_Read();
		}	
	}
	if(R2==0)
	{
		Delay_SMG(500);
		if(R2==0)
		{
			if(SMG_Mode==3)
			{
				if(T_param<99)
				{
					T_param++;
				}
			}
		}
		while(R2==0)
		{
			Display_Dynamic();
			DS1302_Read();
		}	
	}
}
void LED_Control()
{
	if(SMG_Mode==1)
	{
		LED_Mode=(LED_Mode|0x07)&0xfe;
		SelectHC573(4,LED_Mode);
	}
	if(SMG_Mode==2)
	{
		LED_Mode=(LED_Mode|0x07)&0xfd;
		SelectHC573(4,LED_Mode);
	}
	if(SMG_Mode==3)
	{
		LED_Mode=(LED_Mode|0x07)&0xfb;
		SelectHC573(4,LED_Mode);
	}
}
void Sys_Init()
{
	SelectHC573(4,0xff);
	SelectHC573(5,0x00);
	Timer0Init();
	Timer1Init();
	DS1302_Config();
}
void main()
{
	Sys_Init();
	while(1)
	{
		Display_Dynamic();
		Chufa_control();
		DS1302_Read();
		DS18B20_Read_temp();
		shidu_Caculate();
		LED_Control();
		Scan_Key();
	}
}
  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
数码管是一种常见的数字显示器件,可以用于显示各种数字、字母等字符。在单片机应用中,数码管通常用于显示计数器、计时器、温度、湿度等实时数据。 数码管的种类有很多,包括共阳数码管、共阴数码管、共阳共阴混合数码管等。其中,共阳数码管是最常见的一种,也是本文所涉及的数码管类型。 单片机控制数码管的原理是通过对数码管的各个管脚进行控制,使其显示相应的数字或字符。数码管的控制方式有两种,即静态显示和动态显示。 静态显示是指将要显示的数字或字符的每一位分别输出到数码管的每个管脚上,然后使其保持不变,从而实现显示效果。静态显示的缺点是需要使用大量的I/O口,且不能灵活地改变显示内容。 动态显示是指将要显示的数字或字符的每一位依次输出到数码管的每个管脚上,并在短时间内快速切换下一个数字或字符,从而形成连续的显示效果。动态显示的优点是可以使用较少的I/O口,且可以灵活地改变显示内容。 以下是一个简单的动态显示数码管的实现示例: 1. 定义数码管的引脚 ```c #define DIG_PORT P2 // 数码管位选端口 #define DIG_COM 0x00 // 数码管位选端口初始值 #define LED_PORT P0 // 数码管段选端口 ``` 2. 定义数码管显示的数字或字符 ```c unsigned char code ledChar[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; ``` 3. 实现数码管动态显示函数 ```c void display(unsigned char i) { unsigned char j, k; for (j = 0; j < 8; j++) { DIG_PORT = DIG_COM | (1 << j); // 选择数码管位(从左到右) for (k = 0; k < 100; k++); // 延时,视情况可调整 LED_PORT = ledChar[i]; // 显示数码管上的数字或字符 } } ``` 4. 调用数码管动态显示函数 ```c int main() { unsigned char i = 0; while (1) { display(i % 10); // 显示数字 i 的个位数 i++; } return 0; } ``` 以上就是一个简单的数码管动态显示的实现示例。需要注意的是,数码管的控制方式和具体实现方法可能因不同的硬件平台和编程语言而有所不同。因此,在具体应用中需要根据实际情况进行适当的调整和修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值