ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【蓝桥杯-单片机省赛】第十届

2022-04-20 22:33:53  阅读:207  来源: 互联网

标签:count led 21 smgdat void else 蓝桥 单片机 省赛


1.主函数main.c

#include "stc15f2k60s2.h"
#include "hc138.h"
#include "smg.h"
#include "key.h"
#include "fre.h"
#include "iic.h"

extern unsigned char flag_500ms;
extern bit swit;
extern bit dac_out;
extern bit led_swi;
extern bit smg_swi;

long count = 0;//频率读取
unsigned int adc = 0;//rb2 电压读取
unsigned char led[6]={0,0,0,0,0,0};

void swit_fun(void);
void dispay_fun(void);
void dac_fun(void);
void led_fun(void);


void main(void)	{
	all_init();
	Timer2Init();
	Timer0Init();
	while(1)	{
	
		BIN();
		swit_fun();
		dispay_fun();//界面切换
		dac_fun();//DAC 输出
		led_fun();
		
	}
}
void led_fun(void)	{
	
  if (led_swi == 1)	{
			hc138(4);
			P0 = 0xff;
			P2 &= 0x1f;			
	}	
	else if (led_swi == 0)	{
		
		/*--------- L1 与 L2----------*/
			if (swit == 0)	{//ADC L1
//				hc138(4);
//				P0 = 0xfe;
//				P2 &= 0x1f;
				
				/*----L3-----*/
				if ((adc>=150 && adc < 250) || adc>350)
					led[3] = 1;
				else led[3] = 0;
				
				/*-----L5--------*/
				if (dac_out == 0)//2.0v
					led[5]=0;
				else led[5]=1;
				
				if (led[3] == 1 && led[5] == 1){
					hc138(4);
					P0 = ~0x15;
					P2 &= 0x1f;					
				}
				else if (led[3] == 0 && led[5] == 1)	{
					hc138(4);
					P0 = ~0x11;
					P2 &= 0x1f;					
				}
				else if (led[3] == 1 && led[5] == 0)	{
					hc138(4);
					P0 = ~0x05;
					P2 &= 0x1f;								
				}
				else {
					hc138(4);
					P0 = 0xfe;
					P2 &= 0x1f;		
				}					
			}
			else if (swit == 1)	{//L2

				/*----L4-----*/
				if ((count>=1000 && count < 5000) || count>10000)
					led[4] = 1;
				else led[4] = 0;	

				if (led[4] == 1)	{
					hc138(4);
					P0 = ~0x0a;
					P2 &= 0x1f;					
				
				}
				else {
					hc138(4);
					P0 = ~0x02;
					P2 &= 0x1f;					
				
				}
			}



	}

	

}
void dac_fun(void)	{
	
	if (dac_out == 0) DAC(103);//2.0v
	else if (dac_out == 1) DAC(adc);
	
	
}
void swit_fun(void)	{

	if (swit == 0)	adc = ADC_read(3)*1.963;
	else {
		if (flag_500ms >= 250)	{
					count = Read_fre();
					count *= 2;
					flag_500ms = 0;
		}
	
	}
}

void dispay_fun(void)	{

	if (smg_swi == 1)	{
		
		smgdat[0] = 21;//U
		smgdat[1] = 21;
		smgdat[2] = 21;
		smgdat[3] = 21;
		smgdat[4] = 21;
		smgdat[5] = 21;
		smgdat[6] = 21;
		smgdat[7] = 21;	
	}
	else {
		if (swit == 0)	{
				//电压测量
				
				smgdat[0] = 23;//U
				smgdat[1] = 21;
				smgdat[2] = 21;
				smgdat[3] = 21;
				smgdat[4] = 21;
				smgdat[5] = adc /100 + 10;
				smgdat[6] = adc % 100 /10;
				smgdat[7] = adc % 10;				
				
			}
		else if (swit == 1)	{
				//频率测量
				if (flag_500ms >= 250)	{
					count = Read_fre();
					count *= 2;
					flag_500ms = 0;
				}
				smgdat[0] = 22;//F
				smgdat[2] = 21;
				smgdat[1] = 21;
				smgdat[6] = count % 100 /10;
				smgdat[7] = count % 10;
				if (count % 100000/ 10000 != 0)	{
					smgdat[2] = 21;
					smgdat[3] = count %100000/ 10000;
					smgdat[4] = count % 10000 /1000;
					smgdat[5] = count % 1000 /100;
				}
				else if (count % 10000 /1000 != 0)	{
					smgdat[2] = 21;
					smgdat[3] = 21;
					smgdat[4] = count % 10000 /1000;
					smgdat[5] = count % 1000 /100;		
				}
				else if (count % 1000 /100  != 0)	{
					smgdat[2] = 21;
					smgdat[3] = 21;
					smgdat[4] = 21;
					smgdat[5] = count % 1000 /100;			
				}
						
				
			}
	
	}

}


2.频率测量

#include "stc15f2k60s2.h"




void Timer0Init(void)		//100微秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	
	TMOD |= 0x04;
	TL0 = 0;		//设置定时初值
	TH0 = 0;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	
	TR0 = 0;		//定时器0开始计时
	
	EA = 1;
	ET0 = 0;
}


unsigned int Read_fre(void)	{

	unsigned int count_f = 0;
	TR0 = 0;
	count_f = (TH0<<8) | TL0;
	TH0 = 0;
	TL0 = 0;
	TR0 = 1;
	return count_f;
}

3. iic.c ADC和DAC

// ADC  数 模

unsigned char ADC_read(unsigned char channel)	{

	unsigned char temp;
	EA = 0;
	IIC_Start();
	IIC_SendByte(0x90);//写入
	IIC_WaitAck();
	IIC_SendByte(channel);// 1 光敏电阻  3 滑动变阻器
	IIC_WaitAck();
	
	IIC_Start();
	IIC_SendByte(0x91);//读
	IIC_WaitAck();
	temp = IIC_RecByte();
	IIC_WaitAck();
	IIC_Stop();
	EA = 1;
	return temp;
}

// DAC 数 模

void DAC(unsigned char dat)	{

	EA = 0;
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x40);
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();
	EA = 1;
}



4.key.c 按键

#include "stc15f2k60s2.h"
#include "hc138.h"

sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;

/*
界面切换
0 电压测量
1 频率测量
*/
bit swit = 0;

/*
	DAC 输出模式
	0 DAC=2.0
	1 DAC=VRB2
*/
bit dac_out = 0;

/*
	LED 指示
	0 开启
	1 关闭
*/
bit led_swi = 0;

/*
	数码管显示
	0 开启
	1 关闭
*/
bit smg_swi = 0;
void Delay5ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 59;
	j = 90;
	do
	{
		while (--j);
	} while (--i);
}


void BIN(void)	{

	if (S7 == 0)	{
		Delay5ms();
		if (S7 == 0)	{
		
			if	(smg_swi == 0)	smg_swi = 1;
			else if (smg_swi == 1) smg_swi = 0;
			
		}
		while(!S7);
	}
	else if (S6 == 0)	{
		Delay5ms();
		if (S6 == 0)	{
		
			if	(led_swi == 0)	led_swi = 1;
			else if (led_swi == 1) led_swi = 0;
			
		}
		while(!S6);
	}
	else if (S5 == 0)	{
		Delay5ms();
		if (S5 == 0)	{
		
			if	(dac_out == 0)	dac_out = 1;
			else if (dac_out == 1) dac_out = 0;
			
		}
		while(!S5);
	}
	else if (S4 == 0)	{
		Delay5ms();
		if (S4 == 0)	{
			
			if	(swit == 0)	swit = 1;
			else if (swit == 1) swit = 0;
			
		}
		while(!S4);
	}
}

5.数码管显示 smg.c

#include "stc15f2k60s2.h"
#include "hc138.h"

unsigned char smgdat[8]={21,21,21,21,21,21,21,21};
unsigned char code SMG[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
						  0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
						  0xbf,0xff,~0x71,~0x3e};
//												F			U
unsigned char POS;
unsigned char flag_500ms = 0;

void Timer2Init(void)		//2毫秒@12.000MHz
{
	AUXR |= 0x04;		//定时器时钟1T模式
	T2L = 0x40;		//设置定时初值
	T2H = 0xA2;		//设置定时初值
	AUXR |= 0x10;		//定时器2开始计时


	/*后加的部分*/
	EA=1;
	IE2|=0x04;
}
void display(unsigned char pos,dat){

	hc138(6);P0=0x01<<pos;P2&=0x1f;
	hc138(7);P0=dat; P2&=0x1f;
}

void T2_Display()interrupt 12
{
	hc138(6);P0=0x00;
	display(POS,SMG[smgdat[POS]]);
	if(++POS==8)POS=0;
	flag_500ms++;
}


标签:count,led,21,smgdat,void,else,蓝桥,单片机,省赛
来源: https://www.cnblogs.com/harper-blogs/p/16172061.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有