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

程序代码:

main.c

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

sfr P4=0xc0;
sbit L1=P3^0;
sbit L2=P3^1;
sbit L3=P3^2;
sbit L4=P3^3;

sbit R1=P4^4;
sbit R2=P4^2;
sbit R3=P3^5;
sbit R4=P3^4;

void HC573(unsigned char channel,unsigned char value);
void Nixie(unsigned char column,unsigned char value);
void Delay(unsigned int x);
void System_initial();
void Display_All();

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 voltage=0;//电压
float T_voltage=0;//电压计算
unsigned char voltage_para=30;//电压参数
unsigned char Mode=0;
unsigned char Cnt=0;//计数参数
unsigned char Cnt_falg=0;//计数判断标志位
unsigned char LED1_Flag=0;//LED1标志位
unsigned char LED1=0;//控制LED1开关
unsigned char LED_Stat=0xff;//LED总控制位
unsigned int Count=0;//计数
unsigned char Invaild=0;//记录无效按键
//写入24c02
void Wriet_24C02(unsigned char Address,unsigned char Data)
{
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(Address);
	I2CWaitAck();
	I2CSendByte(Data);
	I2CWaitAck();
	I2CStop();
}
//读取24c02
unsigned char Read_24C02(unsigned char Address)
{
	unsigned char temp;
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(Address);
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0xa1);
	I2CWaitAck();
	temp=I2CReceiveByte();
	I2CWaitAck();
	return temp;
}

//电压读取
void Read_PCF8591()
{
	unsigned char temp;
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x43);
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	temp=I2CReceiveByte();
	I2CWaitAck();
	I2CStop();
	T_voltage=temp*(5.0/255);
	voltage=T_voltage*100;
}
//电压显示
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_voltage_para()
{
	Nixie(1,0x8c);
	Nixie(2,0xff);
	Nixie(3,0xff);
	Nixie(4,0xff);
	Nixie(5,0xff);
	Nixie(6,Array_pot[voltage_para/10%10]);
	Nixie(7,Array[voltage_para%10]);
	Nixie(8,Array[0]);
}
//计数页面
void Display_count()
{
	Nixie(1,0xc8);
	Nixie(2,0xff);
	Nixie(3,0xff);
	Nixie(4,0xff);
	Nixie(5,0xff);
	Nixie(6,Array[Cnt/100%10]);
	Nixie(7,Array[Cnt/10%10]);
	Nixie(8,Array[Cnt%10]);
}
//计数增加判断
void Count_ctrl()
{
	if(voltage>((int)(voltage_para)*10))
	{
		Cnt_falg=1;
	}
	if((Cnt_falg==1)&&(voltage<((int)(voltage_para)*10)))
	{
		Cnt++;
		Cnt_falg=0;
	}
}
//按键扫描
void Key_Scan()
{
	L4=0;
	L1=L2=L3=1;
	R1=R2=R3=R4=1;
	if(R3==0)
	{
		if(Mode==0)Mode=1;
		else if(Mode==1){Mode=2;Wriet_24C02(0x00,voltage_para);Delay(10);}
		else if(Mode==2)Mode=0;
		Invaild=0;
		while(R3==0){Display_All();}
	}
	else if(R4==0)
	{
		if(Mode==1)
		{
			if(voltage_para==50)
			{
				voltage_para=0;
			}
			voltage_para+=5;
			Invaild=0;
		}
		else 
		{
			Invaild++;
		}
		while(R4==0){Display_All();}
	}
	L3=0;
	L1=L2=L4=1;
	R1=R2=R3=R4=1;
	if(R3==0)
	{
		if(Mode==2){Cnt=0;Invaild=0;}
		else Invaild++;
		while(R3==0){Display_All();}
	}
	else if(R4==0)
	{
		if(Mode==1)
		{
			if(voltage_para==0)
			{
				voltage_para=50;
			}
			voltage_para-=5;
			Invaild=0;
		}
		else
		{
			Invaild++;
		}
		while(R4==0){Display_All();}
	}
}
//总显示函数
void Display_All()
{
	if(Mode==0)
	{
		Display_voltage();
	}
	else if(Mode==1)
	{
		Display_voltage_para();
	}
	else if(Mode==2)
	{
		Display_count();
	}
}
//灯光控制
void LED_RUN()
{
	if(voltage<((int)(voltage_para)*10))
	{
		LED1_Flag=1;
		TR0=1;
	}
	else if((voltage>((int)(voltage_para)*10)))
	{
		LED1=0;
		LED1_Flag=0;
		TR0=0;
		Count=0;
	}
	if(LED1==1)
	{
		LED_Stat=P0&0xfe;
		HC573(4,LED_Stat);
	}
	else if(LED1==0)
	{
		LED_Stat=P0|0x01;
		HC573(4,LED_Stat);
	}
	if(Cnt%2==1)
	{
		LED_Stat=P0&0xFd;
		HC573(4,LED_Stat);
	}
	else 
	{
		LED_Stat=P0|0x02;
		HC573(4,LED_Stat);
	}
	if(Invaild>=3)
	{
		LED_Stat=P0&0xfb;
		HC573(4,LED_Stat);
	}
	else
	{
		LED_Stat=P0|0x04;
		HC573(4,LED_Stat);
	}
}
void Time0_Init()
{
	TMOD=0x01;
	TH0=(65535-50000)/256;
	TL0=(65535-50000)%256;
	TF0=0;
	ET0=1;
	EA=1;
}
void main()
{
	System_initial();
	while(1)
	{
		Key_Scan();
		Read_PCF8591();
		Display_All();
		Count_ctrl();
		LED_RUN();
	}
}
void Time0() interrupt 1
{
	TH0=(65535-50000)/256;
	TL0=(65535-50000)%256;
	Count++;
	if(Count>100)
	{
		if(LED1_Flag==1)
		{
			LED1=1;
		}
		else 
		{
			LED1=0;
		}
		Count=0;
		TR0=0;
	}
}

void System_initial()
{
	HC573(5,0x00);
	HC573(4,0xff);
	voltage_para=Read_24C02(0x00);
	Time0_Init();
}

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.h

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


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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

brepot

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

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

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

打赏作者

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

抵扣说明:

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

余额充值