第十一屆藍橋杯 單片機設計與開發省賽試題

第十一屆藍橋杯 單片機設計與開發 省賽
在昨天舉辦了第一波11屆藍橋杯比賽,第2波大概在10月份左右,看了看比賽題目,這次題目對於我來說,程序設計題簡單,客觀題全靠蒙!
本次比賽涉及:
1.數碼管顯示
2.矩陣按鍵
3.AD
4.AT24C02
5. LED
6.定時器

進入正題,先看一下程序設計題目:在這裏插入圖片描述在這裏插入圖片描述

在這裏插入圖片描述

  • 猜到了這次考試肯定考矩陣鍵盤,只不過他沒有考全部的,只考了後兩列,用電位器模擬電壓輸入和AT24C02都用到了 IIC,定時器用的是定時器0 , 代碼功能全部實現

  • iic.h

#ifndef _IIC_H
#define _IIC_H

//函數聲明
void IIC_Start(void); 
void IIC_Stop(void);  
void IIC_Ack(bit ackbit); 
void IIC_SendByte(unsigned char byt); 
bit IIC_WaitAck(void);  
unsigned char IIC_RecByte(void); 
void a24c02xie(unsigned char add,unsigned char dat);
unsigned char a24c02read(unsigned char add);
int getad(unsigned char add);
#endif
  • iic.c
/*
  程序說明: IIC總線驅動程序
  軟件環境: Keil uVision 4.10 
  硬件環境: CT107單片機綜合實訓平臺 8051,12MHz
  日    期: 2011-8-9
*/

#include "reg52.h"
#include "intrins.h"
#include<iic.h>
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}    


#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1

//總線引腳定義
sbit SDA = P2^1;  /* 數據線 */
sbit SCL = P2^0;  /* 時鐘線 */


//總線啓動條件
void IIC_Start(void)
{
	SDA = 1;
	SCL = 1;
	somenop;
	SDA = 0;
	somenop;
	SCL = 0;	
}

//總線停止條件
void IIC_Stop(void)
{
	SDA = 0;
	SCL = 1;
	somenop;
	SDA = 1;
}

//應答位控制
void IIC_Ack(bit ackbit)
{
	if(ackbit) 
	{	
		SDA = 0;
	}
	else 
	{
		SDA = 1;
	}
	somenop;
	SCL = 1;
	somenop;
	SCL = 0;
	SDA = 1; 
	somenop;
}

//等待應答
bit IIC_WaitAck(void)
{
	SDA = 1;
	somenop;
	SCL = 1;
	somenop;
	if(SDA)    
	{   
		SCL = 0;
		IIC_Stop();
		return 0;
	}
	else  
	{ 
		SCL = 0;
		return 1;
	}
}

//通過I2C總線發送數據
void IIC_SendByte(unsigned char byt)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{   
		if(byt&0x80) 
		{	
			SDA = 1;
		}
		else 
		{
			SDA = 0;
		}
		somenop;
		SCL = 1;
		byt <<= 1;
		somenop;
		SCL = 0;
	}
}

//從I2C總線上接收數據
unsigned char IIC_RecByte(void)
{
	unsigned char da;
	unsigned char i;
	
	for(i=0;i<8;i++)
	{   
		SCL = 1;
		somenop;
		da <<= 1;
		if(SDA) 
		da |= 0x01;
		SCL = 0;
		somenop;
	}
	return da;
}

void a24c02xie(unsigned char add,unsigned char dat)
{
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_SendByte(dat);	
  IIC_WaitAck();
	IIC_Stop();
}
unsigned char a24c02read(unsigned char add)
{
	unsigned char dat;
	
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	
	IIC_Start();
	IIC_SendByte(0xa1);
	IIC_WaitAck();
	dat=IIC_RecByte();	
  IIC_Stop();
	return dat;

}
int getad(unsigned char add)
{
	int dat;
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	dat=IIC_RecByte();	
  IIC_Stop();
	dat=dat*1.961;
	return dat;

}


  • main.c
#include<stc15f2k60s2.h>
#include<iic.h>

typedef unsigned int uint;
typedef unsigned char uchar;

int yi,er,san,si,wu,liu,qi,ba;

uchar code smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc1,0x8c,0xc8,0xff,
0xc0&0x7f,0xf9&0x7f,0xa4&0x7f,0xb0&0x7f,0x99&0x7f,0x92&0x7f,0x82&0x7f,0xf8&0x7f,0x80&0x7f,0x90&0x7f};

int dianya,jishu,diancp,jiemian,flag,t,tt,liang,wuxiao,flagg,wuu;
void delay1ms(int ms);
void display1();
void display2();
void shangdian();
void Timer0Init(void)	;	//1毫秒@12.000MHz
void juzhen();
main()
{
	shangdian();
	Timer0Init();
	diancp=a24c02read(0);
	diancp=diancp*10;
	while(1)
	{
		juzhen();
		dianya=getad(0x03);
		if(jiemian==0)//數據界面
		{
			yi=10;er=san=si=wu=13;liu=dianya/100+14;qi=dianya%100/10;ba=dianya%10;
		}
		else if(jiemian==1)//參數界面
		{
		  yi=11;er=san=si=wu=13;liu=diancp/100+14;qi=diancp%100/10;ba=diancp%10;
		}
		else if(jiemian==2)//計數界面
		{
			yi=12;er=san=si=wu=liu=13;qi=jishu/10;ba=jishu%10;

		}
	
	  if(dianya>diancp)
		{
		  flag=1;
			t=tt=0;
			TR0=0;
			liang=0;
			flagg=0;
			
		}
		else if(dianya<diancp)
		{
			
			TR0=1;
			flagg=1;
		
		}
		
		if((flag==1)&&(flagg==1))
		{
			jishu++;
			flag=0;
			flagg=0;
		}

				
		if((liang==0)&&(jishu%2==0)&&(wuu==0))
		{
			 P2=0X80;P0=0XFF;	
		}
		else if((liang==0)&&(jishu%2==0)&&(wuu==1))
		{
			 P2=0X80;P0=~(0X04);
		}
		else if((liang==0)&&(jishu%2==1)&&(wuu==0))
	  {
			P2=0X80;P0=~(0X02);
		}
		else if((liang==0)&&(jishu%2==1)&&(wuu==1))
	{  P2=0X80;P0=~(0X04|0x02);
		}
		else if((liang==1)&&(jishu%2==0)&&(wuu==0))
			{P2=0X80;P0=~(0X01);
		}
		else if((liang==1)&&(jishu%2==0)&&(wuu==1))
			{P2=0X80;P0=~(0X01|0x04);
		}
		else if((liang==1)&&(jishu%2==1)&&(wuu==0))
			{P2=0X80;P0=~(0X01|0x02);
				
		}
		else if((liang==1)&&(jishu%2==1)&&(wuu==1))
			{ P2=0X80;P0=~(0X01|0x02|0x04);
		}
	 display1();
   display2();
	
	}
	
	

}
void shangdian()
{
	P2=0XA0;P0=0X00;
	P2=0X80;P0=0XFF;
	P2=0XC0;P0=0XFF;
	P2=0XE0;P0=0XFF;
}
void delay1ms(int ms)
{
	int i;
	for(;ms>0;ms--)
	{
		for(i=845;i>0;i--) ;
	
	}

}
void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x80;		//定時器時鐘1T模式
	TMOD &= 0xF0;		//設置定時器模式
	TL0 = 0x20;		//設置定時初值
	TH0 = 0xD1;		//設置定時初值
	TF0 = 0;		//清除TF0標誌
	TR0 = 0;		//定時器0開始計時
	EA=1;
	ET0=1;
}
void time0() interrupt 1
{
	t++;
	if(t==1000)
	{ t=0;
		tt++;
	  if(tt==5)
		{
			liang=1;

		}
	
	}


}

void display1()
{
	P2=0XC0;P0=0X01;
	P2=0XE0;P0=smg[yi];
	delay1ms(1);
	P2=0XC0;P0=0X02;
	P2=0XE0;P0=smg[er];
	delay1ms(1);	
	P2=0XC0;P0=0X04;
	P2=0XE0;P0=smg[san];
	delay1ms(1);
	P2=0XC0;P0=0X08;
	P2=0XE0;P0=smg[si];
	delay1ms(1);
}
void display2()
{
	P2=0XC0;P0=0X10;
	P2=0XE0;P0=smg[wu];
	delay1ms(1);
	P2=0XC0;P0=0X20;
	P2=0XE0;P0=smg[liu];
	delay1ms(1);	
	P2=0XC0;P0=0X40;
	P2=0XE0;P0=smg[qi];
	delay1ms(1);
	P2=0XC0;P0=0X80;
	P2=0XE0;P0=smg[ba];
	delay1ms(1);
	P2=0XC0;P0=0X80;
	P2=0XE0;P0=0xff;	
}
void juzhen()
{
	uchar temp;
		
P44=1;P42=1;P3=0XdF;
	temp=P3;
	temp=temp&0x0f;
	if(temp!=0x0f)
	{
		delay1ms(5);
		temp=P3;
		temp=temp&0x0f;
		if(temp!=0x0f)
		{
			temp=P3;
			switch(temp)
			{
			
				case 0xdb:
				if(jiemian==2){
				wuu=0;
				jishu=0;}
				else {
					wuxiao++;
					if(wuxiao==3)
					{	wuu=1;
				    wuxiao=0;
				}}
				break;
				case 0xd7:
					wuu=0;
				jiemian++;
				if(jiemian==2)
				{ 
				  a24c02xie(0,diancp/10);
					delay1ms(5);
					
				}
				if(jiemian==3) jiemian=0;
				break;

			}
			while(temp!=0x0f)
			{
				temp=P3;
		    temp=temp&0x0f;			
			}
		
		}
	
	}

P44=1;P42=1;P3=0XeF;
	temp=P3;
	temp=temp&0x0f;
	if(temp!=0x0f)
	{
		delay1ms(5);
		temp=P3;
		temp=temp&0x0f;
		if(temp!=0x0f)
		{
			temp=P3;
			switch(temp)
			{
				
				case 0xeb:
					if(jiemian==1){
						wuu=0;
				diancp=diancp-50;
         if(diancp==-50)
				 {
				  diancp=500;
				 }}
				else {wuxiao++;
					if(wuxiao==3)
					{wuu=1;wuxiao=0;}
				}
				break;
				case 0xe7: 
				if(jiemian==1){	
					wuu=0;
				diancp=diancp+50;
         if(diancp==550)
				 {
				  diancp=0;
				 }}
				else {wuxiao++;
					if(wuxiao==3)
					{	wuu=1;
				wuxiao=0;}}
				break;

			}
			while(temp!=0x0f)
			{
				temp=P3;
		    temp=temp&0x0f;			
			}
		
		}
	
	}

}

















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章