第三届蓝桥杯单片机设计与开发项目省赛试题:“自动售水机”设计任务书第三届蓝桥杯单片机设计与开发项目省赛试题

第三届蓝桥杯单片机设计与开发项目省赛试题

  • 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); } 
  • 版权声明:文章来源于网络采集,版权归原创者所有,均已注明来源,如未注明可能来源未知,如有侵权请联系管理员删除。

发表回复

后才能评论