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

题目:

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

总结:

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

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

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

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

代码:

main.c

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

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
#include

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
uchar led_dat = 0x01;
void Timer1Init(void)		//[email protected]
{
		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

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<

key.c

#include

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

你可能感兴趣的:(蓝桥杯单片机,蓝桥杯单片机,蓝桥杯,NE555,测频,单片机)