考前没用过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;
}