第十届蓝桥杯测频率测电压

题目:

在这里插入图片描述在这里插入图片描述在这里插入图片描述

总结:

考前没用过NE555测频,所以这部分直接凉凉。

死亡flag: 这次考完以后再去学超声波,串口,测频。

以后还是准备万全比较好。

另外感谢小默haa的代码:第十届蓝桥杯省赛再现(编程部分)
没有这个我可能还是对NE555一头雾水,
测频部分对我来说讲的十分清晰,真的十分感谢。

代码:

main.c

******************************************************************************
* 文件名:测频率测电压
* 描  述:
* 作  者:思索与猫
* 日  期:  19/3/26
* 备  注: 
*         
******************************************************************************
#include<stc15f2k60s2.h>
#include<sys.h>

bit flag_ad,flag_fre;

void main()
{
		CloseFucker();
		pcf859_init();
		Timer1Init();
		Timer0Init();
		while(1)
		{
				if(flag_da == 0&&flag_ad == 1)   //读取AD
				{
						flag_ad = 0;
						volt = (uint)read_pcf859();
						volt = volt/255.0f*500;      //先除后乘最高值可以转化到500
				}
				else if(flag_da == 1)
				{
						volt = 200;
				}
				
				if(flag_fre == 1)    //500ms读取1次频率
				{
						flag_fre = 0;
						TR0 = 0;                //计数器关闭
						Fre = TH0*256+TL0;      //高八位+低八位
						Fre *= 2;               //500ms乘2等于1S
						TH0 = TL0 = 0;          //清零
						TR0 = 1;                //计数器再次启动
				}
				
				if(flag_da == 0)                 //L5灯控制
				{
						led_dat &= 0xef;						
				}
				else if(flag_da == 1)
				{
						led_dat |= 0x10;
				}
				
				if(volt<150)	led_dat &= 0xfb;              //L3灯控制
				else if(volt<250)	led_dat |= 0x04;
				else if(volt<350) led_dat &= 0xfb;
				else led_dat |= 0x04;
				
				if(Fre<1000)	led_dat &= 0xf7;        	  //L4灯控制
				else if(Fre<5000)	led_dat |= 0x08;
				else if(Fre<10000) led_dat &= 0xf7;
				else led_dat |= 0x08;
				
				KeyDriver();
				ShowNumber();
		}
}

sys.h

#ifndef __SYS_H_
#define __SYS_H_

#include<stc15f2k60s2.h>
#include<iic.h>

typedef unsigned char uchar;
typedef unsigned int  uint;                                                                                                                                      
//初始
void Timer0Init();
void Timer1Init();
void CloseFucker();
//显示
void Display();
void ShowNumber();
void ShowLed(uchar temp);
//驱动
void KeyDriver();
void KeyAction(uchar key_value);
void KeyScan();

extern bit mode,flag_led,flag_smg,flag_ad,flag_da,flag_fre;
extern uint volt, Fre;
extern uchar led_dat;

#endif

sys.c

#include<sys.h>
uchar led_dat = 0x01;
void Timer1Init(void)		//2ms@12.000MHz
{
		AUXR &= 0xBF;		
		TMOD &= 0x0F;		
		TL1 = 0x30;		
		TH1 = 0xF8;		
		TF1 = 0;		
		TR1 = 1;		
		ET1 = 1;
		EA = 1;
}


void Timer0Init()     //定时器1
{
		AUXR &= 0x7F;	
		TMOD = 0x04;     //计数器模式
		TL0 = 0;         //初值为0
		TH0 = 0;
		TF0 = 0;
		TR0 = 1;
}

void T1_time() interrupt 3
{
		static uint count_ad = 0,count_fre = 0;
		TL1 = 0x30;		
		TH1 = 0xF8;	
		KeyScan();
		Display();
	
		if(++count_ad >= 200)
		{
				count_ad = 0;
				flag_ad = 1;
		}
	
		if(++count_fre >= 250)
		{
				count_fre = 0;
				flag_fre = 1;
		}
		
		if(flag_led == 1)
		{
				ShowLed(led_dat);
		}
		else 
		{
				ShowLed(0x00);
		}
}

void CloseFucker()
{
		P2 = P2&0x1f|0xa0;
		P0 = 0xaf;
		P2 = P2&0x1f;
}

display.c

#include<sys.h>

uchar code duan[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
										 0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x00,0x40,0x71,0x3e};
										//20black,21-,22F,23U
uchar disbuf[8];

uint volt,Fre;	 
										 
void Display()
{
		static uchar index = 0;
		P2 = P2&0x1f|0xe0;
		P0 = 0xff;
		P2 = P2&0x1f;
	
		P2 = P2&0x1f|0xc0;
		P0 = 1<<index;
		P2 = P2&0x1f;
	
		P2 = P2&0x1f|0xe0;
		P0 = ~duan[disbuf[index]];
		P2 = P2&0x1f;
	
		index++;
		index &= 0x07;
}

void ShowNumber()
{
		if(flag_smg == 1)
		{
				if(mode == 0)      //电压显示
				{
						disbuf[0] = 23;
						disbuf[1] = 20;
						disbuf[2] = 20;
						disbuf[3] = 20;
						disbuf[4] = 20;
						disbuf[5] = volt/100+10;
						disbuf[6] = volt/10%10;
						disbuf[7] = volt%10;
				}
				else if(mode == 1)       //频率显示
				{
						disbuf[0] = 22;
						disbuf[1] = 20;
						disbuf[2] = 20;
						if(Fre/10000 == 0)
						{
								disbuf[3] = 20;
						}							
						else
						{
								disbuf[3] = Fre/10000;
						}
						
						if(disbuf[3] == 20&&Fre/1000%10 == 0)
						{
								disbuf[4] = 20;
						}
						else
						{
								disbuf[4] = Fre/1000%10;
						}
						
						if(disbuf[4] == 20&&Fre/100%10 == 0)
						{
								disbuf[5] = 20;
						}
						else
						{
								disbuf[5] = Fre/100%10;
						}
						
						if(disbuf[5] == 20&&Fre/10%10 == 0)
						{
								disbuf[6] = 20;
						}
						else
						{
								disbuf[6] = Fre/10%10;
						}
						 
						disbuf[7] = Fre%10;
				}
		}
		else
		{
				disbuf[0] = 20;
				disbuf[1] = 20;
				disbuf[2] = 20;
				disbuf[3] = 20;
				disbuf[4] = 20;
				disbuf[5] = 20;
				disbuf[6] = 20;
				disbuf[7] = 20;
		}
		

}

void ShowLed(uchar temp)
{
		P2 = P2&0x1f|0x80;
		P0 = ~temp;
		P2 = P2&0x1f;		
}

key.c

#include<sys.h>

sbit Key_In_1 = P3^0;
sbit Key_In_2 = P3^1;
sbit Key_In_3 = P3^2;
sbit Key_In_4 = P3^3;

uchar KeySta[4] = {1, 1, 1, 1};
uchar KeyCodeMap[4] = {7, 6, 5, 4};

bit mode,flag_led = 1,flag_smg = 1,flag_da = 1;

void KeyDriver()
{
		uchar i = 0;
		static uchar KeyBack[4] = {1, 1, 1, 1};
		
		for(i=0; i<4; i++)
		{
				if(KeySta[i] != KeyBack[i])
				{
						if(KeySta[i] == 1)
						{
								KeyAction(KeyCodeMap[i]);
						}
				}
				KeyBack[i] = KeySta[i];
		}
}

void KeyAction(uchar key_value)
{
		if(key_value == 4)    //切换模式
		{
				mode = ~mode;
				if(mode == 0)
				{
						led_dat |= 0x01;
						led_dat &= 0xfd;
				}
				else if(mode == 1)
				{
						led_dat |= 0x02;
						led_dat &= 0xfe;
				}
		}
		else if(key_value == 5)      //开关DA
		{
				flag_da = ~flag_da;
		}
		else if(key_value == 6)     //开关LED
		{
				flag_led = ~flag_led;
		}
		else if(key_value == 7)     //开关数码管
		{
				flag_smg = ~flag_smg;
		}
}

void KeyScan()
{
		uchar i = 0;
		static uchar KeyBuf[4] = {0xff, 0xff, 0xff, 0xff};
		
		KeyBuf[0] = KeyBuf[0]<<1|Key_In_1;
		KeyBuf[1] = KeyBuf[1]<<1|Key_In_2;
		KeyBuf[2] = KeyBuf[2]<<1|Key_In_3;
		KeyBuf[3] = KeyBuf[3]<<1|Key_In_4;
		
		for(i=0; i<8; i++)
		{
				if(KeyBuf[i] == 0xff)
				{
						KeySta[i] = 1;
				}
				else if(KeyBuf[i] == 0x00)
				{
						KeySta[i] = 0;
				}
				else 
				{
						;
				}
		}
}

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); 

void Delay5us();
void pcf859_init();
unsigned char read_pcf859();
#endif

iic.c

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

#define DELAY_TIME 5

#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
#define IIC_Delay(DELAY_TIME) Delay5us()


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

void Delay5us()		//@12.000MHz
{
	unsigned char i;

	_nop_();
	_nop_();
	i = 12;
	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;  				
    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;
}

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;  
}

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;    
}

void pcf859_init()
{
		IIC_Start();
		IIC_SendByte(0x90);
		IIC_WaitAck();
		IIC_SendByte(0x03);
		IIC_WaitAck();
		IIC_Stop();
}

unsigned char read_pcf859()
{
		unsigned char dat;
		IIC_Start();
		IIC_SendByte(0x91);
		IIC_WaitAck();
		dat = IIC_RecByte();
		IIC_WaitAck();
		IIC_SendAck(0);
		IIC_Stop();
		return dat;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值