第14届蓝桥杯省赛模拟题1程序

题目要求:

 

 代码段:

 main.c:

#include "main.h"

uchar LED_buff=0xff,ULN_buff=0x00,SEG_buff[8];
uchar mode = 0;
uint ult_temp_jl,ult_temp_cs=30;
uchar uart_buff[];
void main()
{
	Sys_Init();
	Timer2_Init();
	Ultrasonic_Timer0Init();
	UartInit();
//	SendString("I am OK\r\n");
	while(1)
	{
		/*****每100ms执行一次*****/
		if(Task_100ms)
		{
			Task_100ms=0;
			Dis_ctrl();
		}
		/*****每200ms执行一次*****/
		if(Task_200ms)
		{
			Task_200ms=0;
			if(ult_temp_jl>ult_temp_cs)
			{
				if((LED_buff&0x04)==0x00)
				{
					Display_Led(2,1);
				}
				else
				{
					Display_Led(2,0);
				}
			}
			else
			{
				Display_Led(2,1);
			}
		}
		/*****每500ms执行一次*****/
		if(Task_500ms)
		{
			Task_500ms=0;
		}
		/*****每1s执行一次*****/
		if(Task_1s)
		{
			Task_1s=0;
			ult_temp_jl=Wave_Recv();
		};
		Key_ctrl();
	}

}
void Key_ctrl()									//KRY
{
	switch(Keynum)//长短按
	{
		case 0x01:
			mode++;mode=mode%2;
			Keynum=Keynum&0x80;
		break;		//短按松开有效
		case 0x02:
			if(mode==0)
			{
				ult_temp_cs=ult_temp_jl;
			}
			Keynum=Keynum&0x80;
		break;
		case 0x03:
			if(mode==1)
			{
				ult_temp_cs=ult_temp_cs+10;
			}
			Keynum=Keynum&0x80;
		break;
		case 0x04:
			if(mode==1)
			{
				if(ult_temp_cs>=10)
					ult_temp_cs=ult_temp_cs-10;
				else if(ult_temp_cs<10)
					ult_temp_cs=0;
			}
			Keynum=Keynum&0x80;
		break;
		case 0x0B:
			Display_Relay(1);
			printf("Distance:%dcm\r\n",ult_temp_jl);
//				SendString(uart_buff);
				Keynum=Keynum&0x80;
		break;		//短按松开有效
//		case 0x41:Keynum=Keynum&0x80;break;												//长按松开有效
//		case 0x42:Keynum=Keynum&0x80;break;
//		case 0x43:Keynum=Keynum&0x80;break;
		case 0x4B:Display_Relay(0);Keynum=Keynum&0x80;break;
		default:break;
	}
}
void Dis_ctrl()
{
	switch (mode)
  {
  	case 0:Dis_Ult_jl();Display_Led(0,0);Display_Led(1,1);
  		break;
		case 1:Dis_Ult_cs();Display_Led(0,1);Display_Led(1,0);
  		break;
  	default:
  		break;
  }
}
void Dis_Ult_jl()
{
	SEG_buff[0]=25;
	SEG_buff[1]=1;
	SEG_buff[2]=16;
	SEG_buff[3]=16;
	SEG_buff[4]=16;
	SEG_buff[5]=ult_temp_jl/100%10;
	SEG_buff[6]=ult_temp_jl/10%10;
	SEG_buff[7]=ult_temp_jl%10;
}
void Dis_Ult_cs()
{
	SEG_buff[0]=25;
	SEG_buff[1]=2;
	SEG_buff[2]=16;
	SEG_buff[3]=16;
	SEG_buff[4]=16;
	SEG_buff[5]=ult_temp_cs/100%10;
	SEG_buff[6]=ult_temp_cs/10%10;
	SEG_buff[7]=ult_temp_cs%10;
}

main.h:

#ifndef __MAIN_H_
#define __MAIN_H_

#define uchar unsigned char
#define uint unsigned int

#define Y0 P2=(P2&0X1F)|0X00;
#define Y1 P2=(P2&0X1F)|0X20;
#define Y2 P2=(P2&0X1F)|0X40;
#define Y3 P2=(P2&0X1F)|0X60;
#define Y4 P2=(P2&0X1F)|0X80;
#define Y5 P2=(P2&0X1F)|0XA0;
#define Y6 P2=(P2&0X1F)|0XC0;
#define Y7 P2=(P2&0X1F)|0XE0;

#include "STC15F2K60S2.H"
#include "ui.h"
#include "ult.h"
#include "uart.h"
#include "intrins.h"
#include "stdio.h"

extern uchar LED_buff,ULN_buff,SEG_buff[8],E2P_buff[];
extern uint ult_temp_jl,ult_temp_cs;
void Dis_ctrl();
void Key_ctrl();
void Dis_Ult_jl();
void Dis_Ult_cs();


#endif

ui.c

#include "ui.h"
/*************  本地常量声明    **************/
uchar t_display[]={                       //标准字库
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black  -     H    J    20K   L   N    o   P    25U     t    G    Q    r   M    y
    0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
    0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

uint T2ms_cnt,Task_100ms,Task_200ms,Task_500ms,Task_1s;
void Timer2_Init(void)		//2毫秒@12.000MHz
{
	AUXR |= 0x04;			//定时器时钟1T模式
	T2L = 0x40;				//设置定时初始值
	T2H = 0xA2;				//设置定时初始值
	AUXR |= 0x10;			//定时器2开始计时
	IE2 |= 0x04;			//使能定时器2中断
	EA = 1;
}
uchar seg_cnt;
uchar Keynum,Key_temp,key_cnt;
void Timer2_Isr(void) interrupt 12
{
	/**********每2ms执行一次**********/
	Display_Seg(seg_cnt,SEG_buff[seg_cnt]);
	seg_cnt++;
	if(seg_cnt>=8)
	{
		LED_Screen();			//传输LED数据
		ULN_Screen();			//传输ULN数据
		seg_cnt=0;
	}
	T2ms_cnt++;
	if(T2ms_cnt%50==0)
	{
		Task_100ms=1;
	}
	if(T2ms_cnt%100==0)
	{
		Task_200ms=1;	
	}
	if(T2ms_cnt%250==0)
	{
		Task_500ms=1;
	}
	if(T2ms_cnt%500==0)
	{
		Task_1s=1;
		T2ms_cnt=0;
	}
	
	Key_temp=Key_1x4();
	if(Key_temp!=0)
	{
		key_cnt++;
		if(key_cnt==20)
		{
			Keynum=Key_temp|0x80;
		}
		else if(key_cnt>120)
		{
			key_cnt=20;	
			Keynum=Key_temp|0xC0;
		}
	}
	else
	{
		key_cnt=0;
		Keynum=Keynum&0x7f;
	}
}
uchar Key_1x4()
{
	uchar hang=0,lie=0;
	P33 = 1; P34 = 0; P35 = 0; P42 = 0 ; P44 = 0;
	if(P33==0)
	{
		hang=1;
		P33 = 0; P34 = 1; P35 = 1; P42 = 1 ; P44 = 1;
		if(P44==0)
			lie=1;
		else if(P42==0)
			lie=2;
		else if(P35==0)
			lie=3;
		else if(P34==0)
			lie=4;
	}
	P32 = 1; P42 = 0;
	if(P32==0)
	{
		hang = 2;
		P32 = 0; P42 = 1;
		if(P42==0)
		{
			lie = 11;
		}
	}
	if(hang!=0 && lie!=0)
	{
		return ( lie );
	}
	else 
		return 0;

}
void ULN_Screen()
{
		Y5; P0=ULN_buff; Y0;
}
void Display_Buzzer(unsigned char sta)
{
	if(sta==1)
		ULN_buff |= 0x40;
	else
		ULN_buff &=~ 0x40;
}
void Display_Relay(unsigned char sta)
{
	if(sta==1)
		ULN_buff |= 0x10;
	else
		ULN_buff &=~ 0x10;
}
void LED_Screen()
{
		Y4; P0=LED_buff; Y0;
}
void Display_Led(uchar wei,uchar dat)
{ 	
	if(dat==0)
	{
		LED_buff=LED_buff & ~(1<<wei);
	}
	else
	{
		LED_buff=LED_buff | (1<<wei) ;
	}
}
void Display_Seg(uchar wei,uchar dat)
{
		Y7;	P0=0xff;	Y0;
		Y6;	P0=0X01<<wei;		Y0;
		Y7;	P0=~t_display[dat];		Y0;
}
void Sys_Init()
{
	Y4; P0=0XFF; Y0;
	Y5; P0=0X00; Y0;
	Y6; P0=0X00; Y0;
}

uart.c:

#include "uart.h"

uchar rec_buff = 0x00 ;
void UartInit(void)		//9600bps@12.000MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x40;		//定时器时钟1T模式
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0xC7;			//设置定时初始值
	TH1 = 0xFE;			//设置定时初始值
	ET1 = 0;			//禁止定时器中断
	ES = 1;
	EA = 1;
	TR1 = 1;			//定时器1开始计时
}
void Usart_Send_String( unsigned char *Usart_String )
{
	
	while(*Usart_String != '\0')
	{
		SBUF = *Usart_String;
		while(TI == 0);
		TI = 0;
		Usart_String++;
	}


}
void Sendbyte(uchar dat)
{
	SBUF = dat;
	while(TI == 0); //发送完成后置一跳出
	TI = 0;
}
void SendString(uchar *str)
{
	SBUF = *str;
	while(*str != '\0')
	{
		Sendbyte(*str++);
	}
	
}
void Uart_service() interrupt 4
{
	if(RI == 1)//接受中断标志位
	{
		rec_buff = SBUF;
		RI = 0;
	}
//	if(TI == 1)//发生中断标志位
//	{
//		TI = 0;
//	}
}

//重定向,否则无法使用printf函数
char putchar(char ch)
{	
	Sendbyte(ch);
  return ch;	
}

ult.c:

#include "ult.h"
void Ultrasonic_Timer0Init(void)
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x00;		//设置定时初值
	TH0 = 0x00;		//设置定时初值
	TF0 = 0;		//清除TF0标志

}


void Delay14us()		//@12.000MHz
{
	unsigned char i;
 
	_nop_();
	_nop_();
	i = 39;
	while (--i);
}
unsigned int Wave_Recv(void)
{
	uchar i;
	uint val;
	for(i=0;i<8;i++)
	{
		TX=1;
		Delay14us();
		TX=0;
		Delay14us();
	}
	TR0=1; 
  while((RX==1)&&(TF0==0));
	TR0=0;
	if(TF0==1)
	{
		val=999; TF0=0; 
		TH0=0x00; TL0=0x00;
	}
	if(RX==0)
	{
		val=(TH0<<8 |TL0)*0.017;
		TH0=0x00; TL0=0x00;
	}
	return val;

	
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值