《蓝桥杯单片机》第十届第一场省赛程序设计题+答案

历程源码:

main.c

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

void smg_show();
void led_kong();

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

unsigned int V_smg=0;
unsigned char V=0,mode=1;
unsigned char mode_Vda=1,Vda=1;
unsigned char led_state=0xff,led_kai=1;
unsigned int mai_c=0,hz=0;
unsigned char count=0;
unsigned char smg_kai=1;

unsigned char code smg_nodot[]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,
~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};
unsigned char code smg_dot[]={~0xBF,~0x86,~0xDB,~0xCF,~0xE6,~0xED,~0xFD,~0x87,~0xFF,~0xEF,~0x46};

void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(--xms)
	{
		i = 12;
		j = 169;
		do
		{
			while (--j);
		} while (--i);
	}
}

void HC138(unsigned char Y,dat)
{
	P0=dat;
	switch(Y)
	{
		case 4:
			P2=(P2&0x1f)|0x80;
		break;
		case 5:
			P2=(P2&0x1f)|0xa0;
		break;
		case 6:
			P2=(P2&0x1f)|0xc0;
		break;
		case 7:
			P2=(P2&0x1f)|0xe0;
		break;
		case 0:
			P2=(P2&0x1f)|0x00;
		break;
	}
	P2=(P2&0x1f)|0x00;
}

void read_pcf8591_rb2()
{
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x43);
	I2CWaitAck();
	I2CStop();
	
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	V=I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	
	V_smg=V*100*(5.0/255);
}

void read_pcf8591_da(unsigned char da)
{
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x43);
	I2CWaitAck();
	I2CSendByte(da);
	I2CWaitAck();
	I2CStop();
}

void init_T()
{
	TMOD=0X16;
	
	TH0=0XFF;
	TL0=0XFF;
	
	TH1=(65535-50000)/256;
	TH1=(65535-50000)%256;
	
	EA=1;
	ET0=1;
	ET1=1;
	
	TR0=1;
	TR1=1;
}

void T0_ZD()	interrupt 1
{
	mai_c++;
}

void T1_ZD() 	interrupt 3
{
	TH1=(65535-50000)/256;
	TH1=(65535-50000)%256;
	count++;
	if(count==20)
	{
		hz=mai_c;
		mai_c=0;
		count=0;
	}	
}

void scankeys()
{
	if(S4==0)
	{
		Delay(10);
		if(S4==0)
		{
			if(mode==1)
				mode=2;
			else
				mode=1;
		}
		while(S4==0)
			smg_show();
	}
	if(S5==0)
	{
		Delay(10);
		if(S5==0)
		{
			if(mode_Vda==1)
				mode_Vda=2;
			else
				mode_Vda=1;
			if(mode_Vda==1)
			{
				read_pcf8591_rb2();
				Vda=V_smg;
				read_pcf8591_da(Vda*51);
			}				
			else if(mode_Vda==2)
			{
				Vda=2;
				read_pcf8591_da(V*51);
			}
		}
		while(S5==0)
		{
			smg_show();
			led_kong();
		}
	}
	if(S6==0)
	{
		Delay(10);
		if(S6==0)
		{
			if(led_kai==1)
				led_kai=0;
			else if(led_kai==0)
				led_kai=1;
		}
		while(S6==0)
		{
			smg_show();
			led_kong();
		}
	}
	if(S7==0)
	{
		Delay(10);
		if(S7==0)
		{
			if(smg_kai==1)
				smg_kai=2;
			else if(smg_kai==2)
				smg_kai=1;
		}
		while(S7==0)
		{
			led_kong();
			smg_show();
		}
	}
}

void led_kong()
{
	if(led_kai==1)
	{
		if(V_smg<150||(V_smg>=250&&V_smg<350))//led3
		{
			led_state|=0x04;
			HC138(4,led_state);
		}
		else
		{
			led_state&=~0x04;
			HC138(4,led_state);
		}
		if(mode_Vda==2)
		{
			led_state|=0x10;
			HC138(4,led_state);
		}
		else
		{
			led_state&=~0x10;
			HC138(4,led_state);
		}
		if(hz<1000||(hz>=5000&&hz<10000))
		{
			led_state&=~0x08;
			HC138(4,led_state);
		}
		else
		{
			led_state|=0x08;
			HC138(4,led_state);
		}
		if(mode==1)
		{
			led_state&=~0x01;
			HC138(4,led_state);
		}
		else
		{
			led_state|=0x01;
			HC138(4,led_state);
		}
		if(mode==2)
		{
			led_state&=~0x02;
			HC138(4,led_state);
		}
		else
		{
			led_state|=0x02;
			HC138(4,led_state);
		}
	}
	if(led_kai==0)
	{
		led_state=0xff;
		HC138(4,led_state);
	}
}

void smg(unsigned char wei,shu)
{
	HC138(6,0x01<<wei);
	HC138(7,shu);
	Delay(2);
	HC138(6,0xff);
	HC138(7,0xff);
}

void smg_show()
{
	if(smg_kai==1)
	{
		switch(mode)
			{
				case 1:
					if(hz)
					{
						smg(0,smg_nodot[15]);
					if(hz>9999)
						smg(3,smg_nodot[hz/10000%10]);
					if(hz>999)
						smg(4,smg_nodot[hz/1000%10]);
					if(hz>99)
						smg(5,smg_nodot[hz/100%10]);
					if(hz>9)
						smg(6,smg_nodot[hz/10%10]);
						smg(7,smg_nodot[hz%10]);
					break;
					case 2:
						smg(0,0xc1);
						smg(5,smg_dot[V_smg/100]);
						smg(6,smg_nodot[V_smg/10%10]);
						smg(7,smg_nodot[V_smg%10]);
					}
				break;
			}
	}
	if(smg_kai==2)
	{
		HC138(6,0xff);
		HC138(7,0xff);
	}
}

void init_sys()
{
	HC138(0,0x00);
	HC138(4,0xff);
	HC138(5,0x00);
	HC138(6,0xff);
	HC138(7,0xff);
}

void main()
{
	init_sys();
	init_T();
	while(1)
	{
		scankeys();
		led_kong();
		read_pcf8591_rb2();
		smg_show();
	}
}

iic.c

/*	#   I2C代码片段说明
	1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
	2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
		中对单片机时钟频率的要求,进行代码调试和修改。
*/

#define DELAY_TIME	5
#include <STC15F2K60S2.H>
#include <intrins.H>

#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1

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

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);
void I2CSendAck(unsigned char ackbit);

#endif

注意:

1.上电时有些板子数码管显示的hz可能是0,在数码管之前过滤一下即可:

2.为什么没写大于10万hz时数码管的显示?

一位频率最大值在13000左右,根本不可能达到十万,所以我就没有写,想写也可以加上,只需要再定义个变量接一下即可,因为我们定义的hz为int型,不能超过65535.

3.调用iic文件时一定要先完善文件一般出错在iic.c的开头处:

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值