第四屆藍橋杯單片機設計與開發項目省賽試題

第四屆藍橋杯單片機設計與開發項目省賽試題:
“模擬智能灌溉系統”設計任務書

在這裏插入圖片描述
在這裏插入圖片描述

  • ds1302.h
#ifndef __DS1302_H
#define __DS1302_H
void Write_Ds1302_Byte(unsigned  char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );
void xie();
void read1302();
extern unsigned char shizhong[3];
#endif
  • ds1302.c
#include <reg52.h>
#include <intrins.h>
#include <ds1302.h>
sbit SCK=P1^7;		
sbit SDA=P2^3;		
sbit RST= P1^3;   // DS1302復位												
unsigned char shi[3]={0,30,8};
unsigned char shizhong[3];

void Write_Ds1302_Byte(unsigned  char temp) 
{
	unsigned char i;
	for (i=0;i<8;i++)     	
	{ 
		SCK=0;
		SDA=temp&0x01;
		temp>>=1; 
		SCK=1;
	}
}   

void Write_Ds1302(unsigned char address,unsigned char dat)     
{ unsigned char num;
	
 	RST=0;
	_nop_();
 	SCK=0;
	_nop_();
 	RST=1;	
   	_nop_();  
 	Write_Ds1302_Byte(address);
	
	num=(dat/10<<4)|(dat%10);
	
 	Write_Ds1302_Byte(num);		
 	RST=0; 
}

unsigned char Read_Ds1302 ( unsigned char address )
{
 	unsigned char i,temp=0x00;
	unsigned char dat1,dat2;
 	RST=0;
	_nop_();
 	SCK=0;
	_nop_();
 	RST=1;
	_nop_();
 	Write_Ds1302_Byte(address);
 	for (i=0;i<8;i++) 	
 	{		
		SCK=0;
		temp>>=1;	
 		if(SDA)
 		temp|=0x80;	
 		SCK=1;
	} 
  SDA=0;
	
	dat1=temp/16;
	dat2=temp%16;
	temp=dat1*10+dat2;
	RST=0;
	_nop_();
 	RST=0;
	SCK=0;
	_nop_();
	SCK=1;
	_nop_();
	SDA=0;
	_nop_();
	SDA=1;
	_nop_();
	return temp;			
}
void xie()
{ unsigned char add;
	int i;
	add=0x80;
	Write_Ds1302(0x8e,0x00);
	for(i=0;i<3;i++)
	{
		Write_Ds1302(add,shi[i]);
		add=add+2;
}
	Write_Ds1302(0x8e,0x80);
}
void read1302()
{
unsigned char add;
	int i;
	add=0x81;
	Write_Ds1302(0x8e,0x00);
	for(i=0;i<3;i++)
	{
		shizhong[i]=Read_Ds1302(add);
		add=add+2;
}
	Write_Ds1302(0x8e,0x80);
}
  • 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); 
unsigned char getad(unsigned char add);
void xieeeprom(unsigned char add,unsigned char date);
unsigned char readeeprom(unsigned char add);


#endif
  • iic.c
#include<icc.h>
#include "reg52.h"
#include "intrins.h"

#define somenop {_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;
}
unsigned char getad(unsigned char add)
{ unsigned char ad;
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
  ad=IIC_RecByte();
	IIC_Stop();
	return ad;

}
void xieeeprom(unsigned char add,unsigned char date)
{
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_SendByte(date);
	IIC_WaitAck();
	IIC_Stop();

}
unsigned char readeeprom(unsigned char add)
{ unsigned char eeprom;
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_Stop();
	
   IIC_Start();
	IIC_SendByte(0xa1);
	IIC_WaitAck();
	eeprom=IIC_RecByte();
	IIC_Stop();
	return eeprom;

}

  • 主函數
#include<stc15f2k60s2.h>
#include<icc.h>
#include<ds1302.h>
typedef unsigned char uchar;
typedef unsigned int uint;

int yi,er,san,si,wu,liu,qi,ba,a;
sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;
uchar ad;int dakai=0;
int fazhi=50,zhuangtai=0,tixing=0;//0 自動 1 手動
uchar code smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
void shangdian();
void delay1ms(int ms);
void keypros();
void display1();
void display2();

main()
{
	shangdian();
  xie();
	fazhi=readeeprom(2);
	delay1ms(5);
	if(fazhi==0)
	{
	xieeeprom(2,50);
		delay1ms(5);		
	fazhi=readeeprom(1);
		delay1ms(5);
	}
	
	P2=0X80;P0=~(0X01);
	while(1)
	{ ad=getad(0x03);
	  ad=ad*0.39;
		read1302();
		
	   keypros();
		if(a%2==0){
		yi=shizhong[2]/10;er=shizhong[2]%10;san=10;
		si=shizhong[1]/10;wu=shizhong[1]%10;liu=11;
		qi=ad/10;ba=ad%10;
		}
		 display1();
		 display2();

	if((zhuangtai%2==0)&&(a%2==0))//自動
		{
	if(ad<fazhi)
	{P2=0XA0;P0=0X10;
	}
	else
	{
		P2=0XA0;P0=0X00;
	}
}
	if(zhuangtai%2==1)//手動
	{
	if((dakai==1)&&(ad<fazhi)&&(tixing%2==0))//打開提醒
	 {P2=0XA0;P0=0X50;}
	 else if((dakai==2)&&(ad<fazhi)&&(tixing%2==0))//打開提醒
	 {P2=0XA0;P0=0X40;}	 
	 else if((dakai==1)&&(ad>=fazhi)&&(tixing%2==0))//打開提醒
	 {P2=0XA0;P0=0X10;}
	 else if((dakai==2)&&(ad>=fazhi)&&(tixing%2==0))//打開提醒
	 {P2=0XA0;P0=0X00;}
   else if((dakai==1)&&(tixing%2==1))//打開提醒
	 {P2=0XA0;P0=0X10;}	
	  else if((dakai==2)&&(tixing%2==1))//打開提醒
	 {P2=0XA0;P0=0X00;}
  
	 else	if((ad<fazhi)&&(tixing%2==0))//打開提醒
	{
		P2=0XA0;P0=0X40;
	}	
	else if((ad<fazhi)&&(tixing%2==1))//關閉提醒
	{
		P2=0XA0;P0=0X00;
	}	
	else if((ad>=fazhi)&&(tixing%2==0))//關閉提醒
	{
		P2=0XA0;P0=0X00;
	}	
}
}
}
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 keypros()
{
	if(s7==0)
	{
		delay1ms(5);
		if(s7==0)
		{
			zhuangtai++;
			if(zhuangtai%2==0)
			{
				P2=0X80;P0=~(0X01);
			}
			if(zhuangtai%2==1)
			{
				P2=0X80;P0=~(0X02);
			}		
		}
		while(!s7) ;
		
	}
	if(s6==0)
	{
		delay1ms(5);
		if(s6==0)
		{	
			if(zhuangtai%2==0)
			{  a++;//1 進入調整
				yi=er=10;san=si=wu=liu=11;qi=fazhi/10;ba=fazhi%10;
					P2=0XA0;P0=0X00;     
			}
			if((a%2==0)&&(zhuangtai%2==0))
			{
			xieeeprom(2,fazhi);
				delay1ms(5);
			}
			if(zhuangtai%2==1)
			{tixing++;				
			}
		}
		while(!s6) ;		
	}
	if(s5==0)
	{
		delay1ms(5);
		if(s5==0)
		{
			if((zhuangtai%2==0)&&(a%2==1))
			{
				fazhi++;
				qi=fazhi/10;ba=fazhi%10;
				if(fazhi==99)
					fazhi=98;
			}
			if(zhuangtai%2==1) //手動
			{ 
				dakai=1}
			
		}
		while(!s5) ;
		
	}
	if(s4==0)
	{
		delay1ms(5);
		if(s4==0)
		{
			if((zhuangtai%2==0)&&(a%2==1))
			{
				fazhi--;
				qi=fazhi/10;ba=fazhi%10;
				if(fazhi==0)
					fazhi=1;

			}
			if(zhuangtai%2==1) //手動
			{
				dakai=2;
			}
		}
		while(!s4) ;
	}}
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章