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

第三屆藍橋杯單片機設計與開發項目省賽試題:“自動售水機”設計任務書在這裏插入圖片描述

在這裏插入圖片描述

  • iic.h
//iic.h  (ad轉換用到)
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 Delay10us();		//@11.0592MHz
unsigned int duquad(unsigned char add);
  • iic.c
//iic.c
#include<iic.h>
#include "reg52.h"
#include "intrins.h"
//有的板子ad讀取值不能達到255,這是因爲stc15運行速度
//比51快8~12倍,所以把下面的somenop延時擴大8倍即可
#define somenop {_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 Delay10us()		//@11.0592MHz
{
	unsigned char i;
	_nop_();
	i = 25;
	while (--i);
}
unsigned int duquad(unsigned char add)
{ unsigned int ad;
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_Stop;
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	Delay10us();
	ad=IIC_RecByte();
	IIC_Stop;
	return ad;
}
	
  • 主文件
#include<stc15f2k60s2.h>
#include<iic.h>

typedef unsigned int uint;
typedef unsigned char uchar;
sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;
uint yi,er,san,si,wu,liu,qi,ba;
uint t,chushui,jiaqian,qiehuan;
uint add;
uchar code smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x7f};
void shangdian();
void delay1ms(int ms);
void keypros();
void display1();
void display2();
void Timer0Init(void);		//1毫秒@11.0592MHz
main()
{  shangdian();
	 Timer0Init();	
	 yi=er=san=si=wu=liu=qi=ba=10;
 while(1)
 {
	 add=duquad(0x01);
	 if(add<64)
	 {
	  P2=0X80;P0=~(0X01);
	 }
	 else 
	 {
	  P2=0X80;P0=0Xff;
	 }
		
	
	 if(qiehuan==1){yi=10;er=0;san=5;si=0; 
	 wu=chushui/1000;
	 liu=chushui%1000/100;
	 qi=chushui%100/10;
	 ba=chushui%10; display1();
     display2();}
	 
	 if(qiehuan==2)   
	 {
	 yi=10;er=0;san=5;si=0; //0500-0050//990-0099//1000 0100//1200-0120  775-00.775
	 wu=jiaqian/10000;  
	 liu=jiaqian%10000/1000;
	 qi=jiaqian%10000%1000/100;
	 ba=jiaqian%10000%1000%100/10;
	 display1();
     display2();} 
     keypros();
 
 }

}
void Timer0Init(void)		//1毫秒@11.0592MHz
{
	AUXR |= 0x80;		//定時器時鐘1T模式
	TMOD &= 0xF0;		//設置定時器模式
	TL0 = 0xCD;		//設置定時初值
	TH0 = 0xD4;		//設置定時初值
	TF0 = 0;		//清除TF0標誌
	TR0 = 0;		//定時器0開始計時
	ET0=1;EA=1;
}
void time() interrupt 1
{
	t++;
	if(t==100)
	{ chushui++;
		t=0;
		if(chushui==9999)
		{
			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)
		{ 
		    qiehuan=1;
			TR0 = 1;	
		    P2=0XA0;P0=0X10;
		}
		while(!s7) ;}
		if(s6==0)
	{
	    delay1ms(5);
		if(s6==0)
		{	TR0 = 0;qiehuan=2;	
	     	P2=0XA0;P0=0X00;
		    jiaqian=chushui*5; //擴大1000倍 0.5-0500-0050 //又縮小了10倍
			chushui=0;
		}
		while(!s6) ;}
	
}
void display1()
{   P2=0XC0;P0=0X01;
	P2=0XE0;P0=smg[yi];
	delay1ms(1);
	P2=0XC0;P0=0X02;
	P2=0XE0;P0=smg[er]&0x7f;
	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]&0x7f;
	delay1ms(1);
	P2=0XC0;P0=0X40;
	P2=0XE0;P0=smg[qi];
	delay1ms(1);
	P2=0XC0;P0=0X80;
	P2=0XE0;P0=smg[ba];
	delay1ms(1);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章