蓝桥杯单片机第十届省赛程序(reg52.h)

示例代码:

main.c

#include <REG52.H>
#include "IIC.h"

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

void HC573(unsigned char channel,unsigned char value);
void Nixie(unsigned char column,unsigned char value);
void Delay(unsigned int x);
void System_init();
void Display_Frequency();

unsigned char code Array[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
unsigned char code Array_pot[]={0x40,0x79,0X24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned int Frequency=0;//频率采集
unsigned int F=0;//频率
unsigned char temp=0;//记录电压参数
unsigned int Count=0;//定时器计数
unsigned int Voltage=0;//电压采集
float T_V=0;//电压计算
unsigned char Mode=0;
unsigned char DAC_Mode=0;
unsigned char LED_Stat=0xff;//led控制
unsigned char LED=0;//led总开关
unsigned char nixie=0;//数码管开关

//读取电压
void PCF8591_Read()
{
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x43);
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	temp=I2CReceiveByte();
	I2CWaitAck();
	I2CStop();
	T_V=temp*(5.0/255);
	Voltage=T_V*100;
}
//DAC输出
void Send_DAC(unsigned char Data)
{
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x43);
	I2CWaitAck();
	I2CSendByte(Data);
	I2CWaitAck();
	I2CStop();
}
//电压显示
void Display_Voltage()
{
	Nixie(1,0xc1);
	Nixie(2,0xff);
	Nixie(3,0xff);
	Nixie(4,0xff);
	Nixie(5,0xff);
	Nixie(6,Array_pot[Voltage/100%10]);
	Nixie(7,Array[Voltage/10%10]);
	Nixie(8,Array[Voltage%10]);
}
//总显示函数
void Display_All()
{
	if(Mode==0)
	{
		Display_Voltage();
	}
	else if(Mode==1)
	{
		Display_Frequency();
	}
}
//按键扫描
void Key_Scan()
{
	if(S4==0)
	{
		if(Mode==0)Mode=1;
		else if(Mode==1)Mode=0;
		while(S4==0){Display_All();}
	}
	if(S5==0)
	{
		if(DAC_Mode==0)DAC_Mode=1;
		else if(DAC_Mode==1)DAC_Mode=0;
		while(S5==0){Display_All();}
	}
	if(S6==0)
	{
		if(LED==0)LED=1;
		else if(LED==1)LED=0;
		while(S6==0){Display_All();}
	}
	if(S7==0)
	{
		if(nixie==0)nixie=1;
		else if(nixie==1)nixie=0;
		while(S7==0){Display_All();}
	}
}
//LED灯光控制
void LED_Ctrl()
{
	if(LED==0)
	{
		if(Mode==0)
		{
			LED_Stat=P0&0xFE;
			HC573(4,LED_Stat);
			if((Voltage<150)||((Voltage<350)&&(Voltage>=250)))
			{
				LED_Stat=P0|0x04;
				HC573(4,LED_Stat);
			}
			else if((Voltage>=350)||((Voltage<250)&&(Voltage>=150)))
			{
				LED_Stat=P0&0xfb;
				HC573(4,LED_Stat);
			}
		}
		else if(Mode==1)
		{
			LED_Stat=P0&0xFD;
			HC573(4,LED_Stat);
			if((F<1000)||((F<10000)&&(F>=5000)))
			{
				LED_Stat=P0|0x08;
				HC573(4,LED_Stat);
			}
			else if((F>=10000)||((F<5000)&&(F>=1000)))
			{
				LED_Stat=P0&0xF7;
				HC573(4,LED_Stat);
			}
		}
		if(DAC_Mode==0)
		{
			LED_Stat=P0|0x10;
			HC573(4,LED_Stat);
		}
		else if(DAC_Mode==1)
		{
			LED_Stat=P0&0xef;
			HC573(4,LED_Stat);
		}
	}
	else if(LED==1)
	{
		LED_Stat=P0|0xff;
		HC573(4,LED_Stat);
	}
}
void Time_init()
{
	TMOD=0x16;
	TH0=0xFF;
	TL0=0xFF;
	TH1=(65535-50000)/256;
	TL1=(65535-50000)%256;
	ET0=1;ET1=1;
	TF0=0;TF1=0;
	TR0=1;TR1=1;
	EA=1;
}
//频率显示页面
void Display_Frequency()
{
	Nixie(1,Array[15]);
	Nixie(2,0xff);
	Nixie(3,0xff);
	if(F>99999)Nixie(4,Array[F/100000%10]);
	if(F>9999)Nixie(4,Array[F/10000%10]);
	if(F>999)Nixie(5,Array[F/1000%10]);
	if(F>99)Nixie(6,Array[F/100%10]);
	if(F>9)Nixie(7,Array[F/10%10]);
	Nixie(8,Array[F%10]);
}

//关闭所以数码管
void Display_Off()
{
	P0=0xff;
	P2=0xC0;
	P2=0xE0;
}
void main()
{
	System_init();
	Time_init();
	while(1)
	{
		Key_Scan();
		PCF8591_Read();
		if(DAC_Mode==0)
		{
			Send_DAC(102);
		}
		else if(DAC_Mode==1)
		{
			Send_DAC(temp);
		}
		LED_Ctrl();
		if(nixie==0)
		{
			Display_All();
		}
		else if(nixie==1)
		{
			Display_Off();
		}
	}
}

void Time0() interrupt 1
{
	Frequency++;
}

void Time1() interrupt 3
{
	TH1=(65535-50000)/256;
	TL1=(65535-50000)%256;
	Count++;
	if(Count>20)
	{
		F=Frequency;
		Frequency=0;
		Count=0;
	}
}

void System_init()
{
	HC573(5,0x00);
	HC573(4,0xff);
}

void HC573(unsigned char channel,unsigned char value)
{
	P2=(0x1f&P2)|0x00;
	P0=value;
	switch(channel)
	{
		case 4:P2=(0x1f&P2)|0x80;break;
		case 5:P2=(0x1f&P2)|0xa0;break;
		case 6:P2=(0x1f&P2)|0xc0;break;
		case 7:P2=(0x1f&P2)|0xe0;break;
		case 0:P2=(0x1f&P2)|0x00;break;
	}
	P2=(0x1f&P2)|0x00;
}
void Delay(unsigned int x)
{
	unsigned char i,j;
	while(x--)
	{
		i=11;
		j=190;
		do
		{
			while(--j);
		}while(--i);
	}
}
void Nixie(unsigned char column,unsigned char value)
{
	HC573(6,0x01<<(column-1));
	HC573(7,value);
	Delay(1);
	HC573(6,0x01<<(column-1));
	HC573(7,0xff);
}

IIC.c

#include "reg52.h"
#include "intrins.h"

sbit sda=P2^1;
sbit scl=P2^0;

#define DELAY_TIME	5

//
static void I2C_Delay(unsigned char n)
{
    do
    {
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();		
    }
    while(n--);      	
}

//
void I2CStart(void)
{
    sda = 1;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 0;
	I2C_Delay(DELAY_TIME);
    scl = 0;    
}

//
void I2CStop(void)
{
    sda = 0;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 1;
	I2C_Delay(DELAY_TIME);
}

//
void I2CSendByte(unsigned char byt)
{
    unsigned char i;
	
    for(i=0; i<8; i++){
        scl = 0;
		I2C_Delay(DELAY_TIME);
        if(byt & 0x80){
            sda = 1;
        }
        else{
            sda = 0;
        }
		I2C_Delay(DELAY_TIME);
        scl = 1;
        byt <<= 1;
		I2C_Delay(DELAY_TIME);
    }
	
    scl = 0;  
}

//
unsigned char I2CReceiveByte(void)
{
	unsigned char da;
	unsigned char i;
	for(i=0;i<8;i++){   
		scl = 1;
		I2C_Delay(DELAY_TIME);
		da <<= 1;
		if(sda) 
			da |= 0x01;
		scl = 0;
		I2C_Delay(DELAY_TIME);
	}
	return da;    
}

//
unsigned char I2CWaitAck(void)
{
	unsigned char ackbit;
	
    scl = 1;
	I2C_Delay(DELAY_TIME);
    ackbit = sda; 
    scl = 0;
	I2C_Delay(DELAY_TIME);
	
	return ackbit;
}

//
//void I2CSendAck(unsigned char ackbit)
//{
//    scl = 0;
//    sda = ackbit; 
//	I2C_Delay(DELAY_TIME);
//    scl = 1;
//	I2C_Delay(DELAY_TIME);
//    scl = 0; 
//	sda = 1;
//	I2C_Delay(DELAY_TIME);
//}

IIC.h

#ifndef __IIC_H_
#define __IIC_H_

void I2CStart(void);
void I2CStop(void);
void I2CSendByte(unsigned char byt);
unsigned char I2CReceiveByte(void);
unsigned char I2CWaitAck(void);

#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

brepot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值