第十届蓝桥杯单片机组省赛赛题

other.c

#include <other.h>

void close_perl(void)
{
	P0 = 0xff;
	P2 = P2&0x1f|0x80;
	P2 = P2&0x1f;
	
	P0 = 0x00;
	P2 = P2&0x1f|0xa0;
	P2 = P2&0x1f;
}

void Delay2ms(void)
{
	unsigned char i, j;
	i = 22;
	j = 128;
	do
	{
		while (--j);
	} while (--i);
}

unsigned char	seg_tran(unsigned int number)
{
	unsigned char date;
	switch(number)
	{
		case	0	:	date = 	0xc0	;	break;
		case	1	:	date = 	0xf9	;	break;
		case	2	:	date = 	0xa4	;	break;
		case	3	:	date = 	0xb0	;	break;
		case	4	:	date = 	0x99	;	break;
		case	5	:	date = 	0x92	;	break;
		case	6	:	date = 	0x82	;	break;
		case	7	:	date = 	0xf8	;	break;
		case	8	:	date = 	0x80	;	break;
		case	9	:	date = 	0x90	;	break;
		case	10	:	date = 	0xbf	;	break;//-
		case	11	:	date = 	0xc6	;	break;//c
		case	12	:	date = 	0x8c	;	break;//p
		case	13	:	date = 	0x86	;	break;//e
		case	14	:	date = 	0xc7	;	break;//L
		case 	15	:	date = 	0xc8	;	break;//a
		case 	16	:	date = 	0x8e	;	break;//F
		case 	17	:	date = 	0xc1	;	break;//U
		case 	18	:	date = 	0xff	;	break;//U
	}
	return date;
}

void seg_disp(unsigned int adr,unsigned int number)
{
	unsigned char seg_adr[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
	
	P2 = P2&0x1f|0xe0;
	P2 = P2&0x1f;
	P0 = seg_adr[adr];
	
	P2 = P2&0x1f|0xc0;
	P2 = P2&0x1f;
	P0 = seg_tran(number);
	
	P2 = P2&0x1f|0xe0;
	P2 = P2&0x1f;
}

void seg_disp_f(unsigned int adr,unsigned int number)
{
	unsigned char seg_adr[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
	
	P2 = P2&0x1f|0xe0;
	P2 = P2&0x1f;
	P0 = seg_adr[adr];
	
	P2 = P2&0x1f|0xc0;
	P2 = P2&0x1f;
	P0 = seg_tran(number)&0x7f;
	
	P2 = P2&0x1f|0xe0;
	P2 = P2&0x1f;
}

int key_scan(void)
{
	int key_mark;
	if(P30 == 0)	key_mark = 7;
	else if(P31 == 0)	key_mark = 6;
	else if(P32 == 0)	key_mark = 5;
	else if(P33 == 0)	key_mark = 4;
	return key_mark;
}

void time_init(void)
{
	TMOD = 0x16;
	
	TL0 = 0xff;
	TH0 = 0xff;
	
	TH1 = (65535 - 50000 + 1)/256;
	TL1 = (65535 - 50000 + 1)%256;

	TF0 = 0;	
	TR0 = 1;	
	ET0 = 1;
	TF1 = 0;	
	TR1 = 1;	
	ET1 = 1;
	
	EA = 1; 
}

other.h

#ifndef __OTHER_H_
#define __OTHER_H_

# include <stc15f2k60s2.h>

void close_perl(void);
void Delay2ms(void);
unsigned char  seg_tran(unsigned int number);
void seg_disp(unsigned int adr,unsigned int number);
void seg_disp_f(unsigned int adr,unsigned int number);
int key_scan(void);
void time_init(void);

#endif

iic.c

void dac_pcf(unsigned char dac)
{
	IIC_Start();
	
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x43);
	IIC_WaitAck();
	IIC_SendByte(dac);
	IIC_WaitAck();
	
	IIC_Stop();
}

unsigned char adc_pcf(void)
{
	unsigned char adc;
	
	IIC_Start();
	
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x43);
	IIC_WaitAck();
	
	IIC_Start();
	
	IIC_SendByte(0x91);
	IIC_WaitAck();
	adc = IIC_RecByte();
	IIC_WaitAck();
	
	IIC_Stop();
	
	return adc;
}

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 dac_pcf(unsigned char dac);
unsigned char adc_pcf(void);

#endif

main.c

#include <other.h>
#include <iic.h>

#define uchar unsigned char 
#define uint unsigned int
#define Led1	0x01
#define Led2	0x02
#define Led3	0x04
#define Led4	0x08
#define Led5	0x10

uchar key_old;
uchar show_mode;
uint frequence;
uint timer0_up;
uint timer1_up;

uchar dac;
uint dac_100;
float dac_f;
	
uchar adc;
uint adc_100;
float adc_f;

bit dac_mode;
bit led_mode;
bit seg_mode;

void seg_pro(void)
{
	uchar key_vol,key_down;
	
	key_vol = key_scan();
	key_down = key_vol&(key_vol^key_old);
	key_old = key_vol;
	
	switch(key_down)
	{
		case 4:
			show_mode++;
			if(show_mode == 2)	show_mode = 0;
		break;
		
		case 5:  
			dac_mode = ~dac_mode;
		break;
		
		case 6:
			led_mode = ~led_mode;
		break;
		
		case 7:
			seg_mode = ~seg_mode;
		break;
	}
}

void key_pro(void)
{ 
	dac_pcf(dac);
	adc = adc_pcf();
	adc_f = (float)adc/255*5.00;
	adc_100 = adc_f*100;
	
	if(seg_mode == 0)
	{
		switch(show_mode)
		{
			case 1:
				seg_disp(0,16); Delay2ms();
				if(frequence > 10000)	seg_disp(3,frequence/10000);	Delay2ms();
				if(frequence > 1000)	seg_disp(4,frequence%10000/1000);	Delay2ms();
				if(frequence > 100)	seg_disp(5,frequence%1000/100);	Delay2ms();
				if(frequence > 10)	seg_disp(6,frequence%100/10);	Delay2ms();
				seg_disp(7,frequence%10);	Delay2ms();
			break;
			
			case 0:
				seg_disp(0,17);	Delay2ms();
				seg_disp_f(5,adc_100/100);	Delay2ms();
				seg_disp(6,adc_100%100/10);	Delay2ms();
				seg_disp(7,adc_100%10);	Delay2ms();
			break;
		}
		
		if(dac_mode == 1)	dac = adc;
		else	dac = 102;
	}
	else	
	{
		seg_disp(0,18);	Delay2ms();
		seg_disp(1,18);	Delay2ms();
		seg_disp(2,18);	Delay2ms();
		seg_disp(3,18);	Delay2ms();
		seg_disp(4,18);	Delay2ms();
		seg_disp(5,18);	Delay2ms();
		seg_disp(6,18);	Delay2ms();
		seg_disp(7,18);	Delay2ms();
	}
	
}

void led_pro(void)
{
	if(led_mode == 0)
	{
		P0 = 0xff;
		
		switch(show_mode)
		{
			case 0:
				P0 = P0&(~Led1);
				P0 = P0|(Led2);
				P2 = P2&0x1f|0x80;
				P2 = P2&0x1f;
			break;
			
			case 1:
				P0 = P0&(~Led2);
				P0 = P0|(Led1);
				P2 = P2&0x1f|0x80;
				P2 = P2&0x1f;
			break;
		}
		
		if((adc_f < 1.5)||(	(adc_f >= 2.5)&&(adc_f < 3.5))	)
		{
				P0 = P0|(Led3);
				P2 = P2&0x1f|0x80;
				P2 = P2&0x1f;
		}
		else
		{
				P0 = P0&(~Led3);
				P2 = P2&0x1f|0x80;
				P2 = P2&0x1f;
		}	
		
		if((frequence < 1000)||(	(frequence >= 5000)&&(frequence < 10000))	)
		{
				P0 = P0|(Led4);
				P2 = P2&0x1f|0x80;
				P2 = P2&0x1f;
		}
		else
		{
				P0 = P0&(~Led4);
				P2 = P2&0x1f|0x80;
				P2 = P2&0x1f;
		}	
		
		if(dac_mode == 1)
		{
			P0 = P0&(~Led5);
			P2 = P2&0x1f|0x80;
			P2 = P2&0x1f;
		}
		else
		{
			P0 = P0|(Led5);
			P2 = P2&0x1f|0x80;
			P2 = P2&0x1f;
		}
		
	}
	else	
	{
		close_perl();
	}
}

void main(void)
{
	close_perl();
	time_init();
	while(1)
	{
		seg_pro();
		key_pro();
		led_pro();
	}
}

void timer0(void) interrupt 1
{
	timer0_up ++;
}

void timer1(void) interrupt 3
{
	timer1_up ++;
	if(timer1_up == 20)
	{
		frequence = timer0_up;
		timer0_up = 0;
		timer1_up = 0;
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值