蓝桥杯第十一届单片机模拟题参考程序

#include "main.h"
#include "ds1302.h"
#include "onewire.h"
#include "iic.h"

#define _138 P2
#define HC573_CLEAR {_138=_138&0X1F;}
#define HC573_U6_EN {_138=_138&0X1F|0X80;HC573_CLEAR;}
#define HC573_U7_EN {_138=_138&0X1F|0XE0;HC573_CLEAR;}
#define HC573_U8_EN {_138=_138&0X1F|0XC0;HC573_CLEAR;}
#define HC573_U9_EN {_138=_138&0X1F|0XA0;HC573_CLEAR;}

#define Enable 1
#define Disble 0

#define N_BUZZ P06
#define BUZZ(state) {N_BUZZ=state;HC573_U9_EN;}

#define LED P0
#define LED1 P00
#define LED2 P01
#define LED3 P02
#define LED4 P03
#define LED5 P04
#define LED6 P05
#define LED7 P06
#define LED8 P07

#define NIXIE P0
#define NULL 200

#define NIXIE_CLEAR 	{for (i=0;i<8;i++) NixieDisp[i]=NULL;}

#define _ 10
#define C 12
#define E 13
#define P 14
#define POINT 20

#define DATA_DISP 1
#define PARAM_DISP 0

#define TIME 1
#define TEMPER 2
#define LLED 3

#define LED1_PIN 0
#define LED2_PIN 1
#define LED3_PIN 2
#define LED4_PIN 3
#define LED5_PIN 4
#define LED6_PIN 5
#define LED7_PIN 6
#define LED8_PIN 7


uint8 NixieDisp[8];

void Timer1Init(void);
uint8 KBD_Scan(void);
void PCF8591_Init(uint8 ch);
uint8 PCF8591_Conversion(void);


//bit CheckLED3=1;		//1 需要检测
uint8 LEDBit=0xff;
bit LED_State=1;		//暗

void main(void)
{
	uint8 time[3];
	uint8 i;
	uint8 KeyVal;
	bit DataORParam=DATA_DISP;
	uint8 TimeOrTemperOrLED=TIME;
	float TemperVal;
	uint8 u8AD_ConverVal;
	float fLED_Val;
	
	/* 参数 */
	char LLEDParam=4;
	char TimeParam=17;
	char TemperParam=25;
	
	char TempLLEDParam=LLEDParam;
	char TempTimeParam=TimeParam;
	char TempTemperParam=TemperParam;
	
	BUZZ(Disble);
	LED=0xff;HC573_U6_EN;
	PCF8591_Init(1);
	DS1302_SetTime(16,59,50);
	NIXIE_CLEAR;
	Timer1Init();
	
	while(1)
	{
		KeyVal=KBD_Scan();
		if (KeyVal==4) 
		{
			DataORParam=!DataORParam;		//显示or数据界面切换
			TimeOrTemperOrLED=TIME;
			if (DataORParam==DATA_DISP)
			{
				LLEDParam=TempLLEDParam;TimeParam=TempTimeParam;TemperParam=TempTemperParam;
			}
			
			NIXIE_CLEAR;
		}
		if (KeyVal==5)
		{
			TimeOrTemperOrLED++;
			if (TimeOrTemperOrLED>LLED)	TimeOrTemperOrLED=TIME;
			NIXIE_CLEAR;
		}
		
		DS1302_ReadTime(time);							//采样
		TemperVal=DS18B20_ReadTemper();
		u8AD_ConverVal=PCF8591_Conversion();
		
		if (TemperVal<(float)TemperParam) {LEDBit &= ~(1<<LED2_PIN);}
		else  {LEDBit |= 1<<LED2_PIN;}
		
		if (*(time+0)>=TimeParam || *(time+0)<=8) {LEDBit &= ~(1<<LED1_PIN);}
		else {LEDBit |= 1<<LED1_PIN;}
		
		fLED_Val=5.0f*(float)u8AD_ConverVal/255.0;		//亮度值
		if (fLED_Val>1.0) LED_State=0;		//亮
		else LED_State=1;		//暗

		LEDBit|=0xf8;		//关闭指示灯
		if (LED_State==1)
		{
			LEDBit &= ~(1<<(LLEDParam-1));
		}
		
		if (DataORParam==DATA_DISP)
		{
			switch (TimeOrTemperOrLED)
			{
				case TIME:
				{
					*(NixieDisp+7)=*(time+2)%10;
					*(NixieDisp+6)=*(time+2)/10%10;
					*(NixieDisp+5)=_;
					*(NixieDisp+4)=*(time+1)%10;
					*(NixieDisp+3)=*(time+1)/10%10;
					*(NixieDisp+2)=_;
					*(NixieDisp+1)=*(time+0)%10;
					*(NixieDisp+0)=*(time+0)/10%10;						
				}
					break;
				case TEMPER:
				{
					*(NixieDisp+0)=C;
					*(NixieDisp+6)=(uint16)TemperVal%10+POINT;
					*(NixieDisp+5)=(uint16)TemperVal/10%10;
					TemperVal*=10;
					*(NixieDisp+7)=(uint16)TemperVal%10;					
				}
					break;
				case LLED:
				{
					*(NixieDisp+7)=LED_State;
					
					*(NixieDisp+0)=E;
					*(NixieDisp+2)=(uint16)fLED_Val%10+POINT;
					fLED_Val*=10;
					*(NixieDisp+3)=(uint16)fLED_Val%10;
					fLED_Val*=10;
					*(NixieDisp+4)=(uint16)fLED_Val%10;	
					
					Delay(100);
				}
					break;
				default:
					break;
			}	//switch (TimeOrTemperOrLED)
			
		}
		else //参数页面
		{
			switch (TimeOrTemperOrLED)
			{
				case TIME:
				{
					if (KeyVal==8) TempTimeParam--;
					if (KeyVal==9) TempTimeParam++;
					
					if (TempTimeParam<0) TempTimeParam=23;
					if (TempTimeParam>23) TempTimeParam=0;
					
					*(NixieDisp+0)=P;
					*(NixieDisp+1)=1;
					
					*(NixieDisp+6)=TempTimeParam/10;
					*(NixieDisp+7)=TempTimeParam%10;
				}
					break;
				case TEMPER:
				{
					if (KeyVal==8) TempTemperParam--;
					if (KeyVal==9) TempTemperParam++;
					
					if (TempTemperParam<0) TempTemperParam=99;
					if (TempTemperParam>99) TempTemperParam=0;

					*(NixieDisp+0)=P;
					*(NixieDisp+1)=2;

					*(NixieDisp+6)=TempTemperParam/10;
					*(NixieDisp+7)=TempTemperParam%10;
				}
					break;
				case LLED:
				{
					if (KeyVal==8) TempLLEDParam--;
					if (KeyVal==9) TempLLEDParam++;

					if (TempLLEDParam<4) TempLLEDParam=8;
					if (TempLLEDParam>8) TempLLEDParam=4;
					
					
					*(NixieDisp+0)=P;
					*(NixieDisp+1)=3;

					*(NixieDisp+6)=TempLLEDParam/10;
					*(NixieDisp+7)=TempLLEDParam%10;
				}
					break;
				default:
					break;
			}	//switch (TimeOrTemperOrLED)
			
		}	//else //参数页面
		
	}	//while(1)
}	//main()


#define UCOL1 P44
#define UCOL2 P42
#define UROM1 P32
#define UROM2 P33

uint8 scan(void)
{
	UCOL1=0;UCOL2=1;
	UROM1=UROM2=1;
	if (UROM1==0) {Delay(10);if (UROM1==0) return 5;}
	if (UROM2==0) {Delay(10);if (UROM2==0) return 4;}
	
	UCOL1=1;UCOL2=0;
	UROM1=UROM2=1;
	if (UROM1==0) {Delay(10);if (UROM1==0) return 9;}
	if (UROM2==0) {Delay(10);if (UROM2==0) return 8;}	
	
	return 0;
}

uint8 KBD_Scan(void)
{
	static bit press=1;
	uint8 keyval=scan();
	if (keyval && press)
	{
		press=0;
		return keyval;
	}
	else if (keyval==0) press=1;
	return 0;
}

void Timer1Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0xBF;		//定时器时钟12T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x30;		//设置定时初值
	TH1 = 0xF8;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
	EA = 1;
	ET1 = 1;
}

code uint8 table[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0xbf,			//-
0x7f,			//.
0xC6,			//C
0x86,			//E
0x8c,			//P
0xff,0xff,0xff,0xff,0xff,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
};

void Timer1(void) interrupt 3		//2ms
{
	static uint8 offset=0;
	static uint16 LTime=0,MTime=0;
	NIXIE=0xff;HC573_U7_EN;
	if (*(NixieDisp+offset)!=NULL)
	{
		NIXIE=0x01<<offset;HC573_U8_EN;
		NIXIE=table[NixieDisp[offset]];HC573_U7_EN;
	}
	offset++;
	if (offset>7) offset=0;
	LED=LEDBit;HC573_U6_EN;
	
	if (LED_State==0)		//亮
	{
		LTime=0;
		MTime++;
		if (MTime>=1500) {MTime=0;LEDBit|=1<<LED3_PIN;}
	}
	else
	{
		MTime=0;
		LTime++;
		if (LTime>=1500) {LTime=0;LEDBit &= ~(1<<LED3_PIN);}
	}
}

#define SlaveAddrW 0x90
#define SlaveAddrR 0x91

void PCF8591_Init(uint8 ch)
{
	IIC_Start();
	IIC_SendByte(SlaveAddrW);
	IIC_WaitAck();
	IIC_SendByte(ch);
	IIC_WaitAck();
	IIC_Stop();
}

uint8 PCF8591_Conversion(void)
{
	uint8 temp=0;
	IIC_Start();
	IIC_SendByte(SlaveAddrR);
	IIC_WaitAck();
	temp=IIC_RecByte();
	IIC_SendAck(0);
	temp=IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();
	return temp;
}



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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值