资讯详情

蓝桥杯的被圈钱之旅(一):第十三届第一场(电子类)

痛苦的蓝桥杯之旅,被无限圈钱后,或者决定写自己的博客,一个是帮助自己在明年圈钱的路上更进一步,另一个是与你分享进步。

二、题目展示

三、 代码展示

一、矩阵键盘key.c

#include "key.h" #include "delay.h" #include "temp.h" #include "timer.h" unsigned char key_sign=0; unsigned char mode_dis=0; extern  int temp_set; unsigned char mode_cfg=0;//0 温度 1 时间 unsigned char K13_mode=0; /*******矩阵键盘*******/ //行 sbit L1 = P4^4; sbit L2 = P4^2; sbit L3 = P3^5; sbit L4 = P3^4; // sbit H1 = P3^0; sbit H2 = P3^1; sbit H3 = P3^2; sbit H4 = P3^3;   void key_scan() {  L1=L2=L3=L4=H1=H2=H4=1;H3=0;  if(L1==0)  {Delay100us();if(L1==0)key_sign=5;while(!L1);}//s5  if(L2==0)  {Delay100us();if(L2==0)key_sign=9;while(!L2);}//s9  if(L3==0)    {   Delay100us();   if(L3==0)    {   key_sign=13;   mode_cfg^=1;   }   while(!L3);}//s13  if(L4==0)    {   Delay100us();   if(L4==0)   {    key_sign=17;   }   while(!L4)   {     K13_mode=1;   }  }//s17  L1=L2=L3=L4=H1=H2=H3=1;H4=0;  if(L1==0)  {Delay100us();if(L1==0)key_sign=4;while(!L1);}//s4  if(L2==0)  {Delay100us();if(L2==0)key_sign=8;while(!L2);}//s8  if(L3==0)  {     Delay100us();   if(L3==0)   {    key_sign=12;    mode_dis=mode_dis 1;    if(mode_dis>=3)    {     mode_dis=0;    }   }   while(!L3);  }  //s12   if(L4==0)  {Delay100us();if(L4==0)key_sign=16;while(!L4);}//s16   if(key_sign==17&&mode_dis==2)   {    key_sign=0;    temp_set=temp_set-1;    if(temp_set<=10)    {     temp_set=10;    }   }   if(key_sign==16)   {    key_sign=0;    temp_set=temp_set 1;    if(temp_set>=99)    {     temp_set=99;    }   } }  

二、ds18b20温度传感器temp.c

#include "temp.h" int temp; int temp_set=23; int temp_int; int temp_float; float temp_all; extern unsigned char smgBuffer[10]; extern unsigned char font[10]; void read_temp() {  int tp;  int tl,th;  init_ds18b20();  Write_DS18B20(0xcc);//跳过ROM  Write_DS18B20(0x44)  init_ds18b20();  Write_DS18B20(0xcc);//跳过ROM  Write_DS18B20(0xbe);//读取温度  tl=Read_DS18B20();  th=Read_DS18B20();  tp=th<<8|tl;  temp=(tp>>2)*25;  temp_int=((temp/1000)*10 (temp/100));  temp_float=(temp/10)*10 (temp); } void temp_dis() {  smgBuffer[0]=0xc1;// 0011 1110  smgBuffer[1]=font[1];  smgBuffer[2]=0xff;  smgBuffer[3]=0xff;  smgBuffer[4]=0xff;  smgBuffer[5]=font[temp/1000];  smgBuffer[6]=font[temp/100]&0x7f;  smgBuffer[7]=font[temp_float/10]; // smgBuffer[6]=font[temp_float]; } void temp_set_dis() {  smgBuffer[0]=0xc1;// 0011 1110  smgBuffer[1]=font[3];  smgBuffer[2]=0xff;  smgBuffer[3]=0xff;  smgBuffer[4]=0xff;  smgBuffer[5]=0xff;  smgBuffer[6]=font[temp_set/10];  smgBuffer[7]=font[temp_set]; } 

三、DS1302时钟timer.c

#include "timer.h"  unsigned char code time_write_addr[8]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e}; unsigned char code time_read_addr[8]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d,0x8f}; unsigned char time[3]={0x43,0x59,0x23}; //miao fen shi  extern unsigned char smgBuffer[10]; extern unsigned char font[10]; void time_read() {  unsigned char i=3;  while(i--)  {   time[i]=Read_Ds1302_Byte(time_read_addr[i]);  } }  void time_write() {  unsigned char i=3;   Write_Ds1302_Byte(0x8E,0x00)  while(i--)  {   Write_Ds1302_Byte(time_write_addr[i],time[i]);  }  Write_Ds1302_Byte(0x8E,0x80) } void time_shi_dis() {  smgBuffer[0]=0xc1;//11  smgBuffer[1]=font[2];  smgBuffer[2]=0xff;  smgBuffer[3]=font[time[2]>>4];  smgBuffer[4]=font[time[2]&0x0f];  smgBuffer[5]=0xbf;//1011 1111  smgBuffer[6]=font[time[1]>>4];  smgBuffer[7]=font[time[1]&0x0f]; }  void time_fen_dis() {  smgBuffer[0]=0xc1;  smgBuffer[1]=font[2];  smgBuffer[2]=0xff;  smgBuffer[3]=font[time[1]>>4];  smgBuffer[4]=font[time[1]&0x0f];  smgBuffer[5]=0xbf;//1011 1111  smgBuffer[6]=font[(time[0]>>4)&0x07];  smgBuffer[7]=font[time[0]&0x0F]; } 

四、LED灯led.c

因为博主喜欢在这里使用bdata电影中寻址操作led,所以经常这样.c文件将混合一些定时器中断函数。例如,由于调查的重点是矩阵键盘的松开和响应,这里的博客作者更喜欢这个while判断方法,然后直接用中断来打断这里while循环操作,主函数while循环只放矩阵键盘。将其他工作交给定时器中断,以中断循环操作。

#include "sys.h" #include "ds1302.h" #include "delay.h" #include "key.h" #include "buffer.h" #include "led.h" #include "temp.h" #include "timer.h" unsigned char bdata led=0,out=0; sbit L1=led^0; sbit L2=led^1; sbit L3=led^2; sbit L4=led^3; sbit L5=led^4; sbit L6=led^5; sbit L7=led^6; sbit L8=led^7;  sbit relay=out^4; sbit buzz=out^6; // int L1_timing=0; int relay_tiing=0;
int L3_timing=0;
int L3_mode=0;
//
extern unsigned char time[3];
//
extern unsigned char mode_dis;
extern unsigned char mode_cfg;
//
extern int temp_set;
extern int temp_int;
//
extern unsigned char K13_mode;
extern unsigned char key_sign;
//
void led_dis()
{
	P2&=0x1f;
	P0=~led;
	P2|=Y4;
	P2&=0x1f;
}
//
void led_init()
{
	P2&=0x1f;
	P0=0xff;
	P2|=Y4;
	P2&=0x1f;
}
void out_init()
{
	P2&=0x1f;
	P0=0x00;
	P2|=Y5;
	P2&=0x1f;
}
void out_dis()
{
	P2&=0x1f;
	P0=out;
	P2|=Y5;
	P2&=0x1f;
}
//
void mode_dis_set()
{

	//mode_dis
		if(mode_dis==0)
		{
			temp_dis();
		}
		if(mode_dis==1&&K13_mode==0)
		{
			time_shi_dis();
		}
		if(K13_mode==1&&mode_dis==1)
		{
			time_fen_dis();
			K13_mode=0;
		}
		if(mode_dis==2)
		{
			temp_set_dis();
		}
		//mode_dis
		
		//LED_1
	if(time[0]==0x00&&time[1]==0x00)
		{
		L1_timing=5000;
		}
		//mode_cfg0&&LED2&&relay_temp
		if(mode_cfg==0)
		{
			L2=1;
			if(temp_int>=temp_set)
			{
			relay=1;
			}
			else
			{
				relay=0;
			}
		}
		if(mode_cfg==1)
		{
			L2=0;
		}
		//mode_cfg0
		//mode_cfg1
		if(mode_cfg==1)
		{
			if(time[0]==0x00&&time[1]==0x00)
			{
			relay_timing=5000;
			}
		}
		//mode_cfg1
}
//

void T0_irq() interrupt 1
{
	if(L1_timing)
	{
		L1=1;
		L1_timing--;
	}
	if(L1_timing==0)
	{
		L1=0;
	}
	if(mode_cfg==1)
	{
		if(relay_timing)
		{
			relay=1;
			L1_timing--;
		}
		if(relay_timing==0)
		{
			relay=0;
		}
	}
	if(relay==1)
	{
		L3_mode=100;
		if(L3_timing)
		{
			L3_timing--;
		}
		else if(L3_mode)
		{
			L3_timing=L3_mode;
			L3=~L3;
		}
	}
	if(relay==0)
	{
		L3=0;
	}
}


 void T1_iqr() interrupt 3
 {
		time_read();
		led_dis();
		out_dis();
		buffer_dis();
		read_temp();
		mode_dis_set();
 }



四、总结

这套题目难度适中,没有明显难点,属于中规中矩的一套赛题,唯一难度就在于矩阵键盘的松开响应问题。

这边我放个链接(资料里也有)

https://mp.weixin.qq.com/s?__biz=MzA4OTY0ODgyMA==&mid=2247485338&idx=1&sn=f5c8077a1f7e7f494b78c3850c9699f9&chksm=9016fc41a76175577403b1fc6a255ce07327c208bd37f4d9c29ceb849bf2ad330ed5bd06282a&mpshare=1&scene=23&srcid=0512g53zlkrWWUZo6R7BcIbi&sharer_sharetime=1652315486097&sharer_shareid=3dda951bb1566a8b6ceebed4345ef0c9#rd&ADUIN=1583833729&ADSESSION=1652510439&ADTAG=CLIENT.QQ.5887_.0&ADPUBNO=27211

标签: 温度传感器ne1617dsl6传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台