蓝桥杯单片机省赛——第三届(“自动售水机”设计任务书)

标题蓝桥杯单片机省赛——第三届(“自动售水机”设计任务书)

前言

使用的是HL-1c51学习板,纯新手,有不成熟的地方还望包涵.

1.按键控制单元

设定按键 S7 为出水控制按键,当 S7 按下后,售水机持续出水(继电器接通,指示灯 L10 点亮)。设定按键 S6 为停水控制按键,当 S6 按下后,停止出水(继电器断,指示灯 L10 熄灭)。

按键扫描

unsigned char  keyscan16()
{
	P3=0x0F;
	temp=P3;
	if(temp !=0x0F)
	{
		Delay10ms();
		temp=P3;
		if(temp !=0x0F)
		{
			switch(temp)
			{
				case 0x0E: row = 0;break;
				case 0x0D: row = 1;break;
				case 0x0B: row = 2;break;
				case 0x07: row = 3;break;
			}
		}
	}
	P3=0xF0;
	temp=P3;
	if(temp!=0xF0)
	{
		Delay10ms();
		temp=P3;
		if(temp!=0xF0)
		{
			switch(temp)
			{
				case 0xE0: col = 1;break;
				case 0xD0: col = 2;break;
				case 0xB0: col = 3;break;
				case 0x70: col = 4;break;
			}
		}
	}
	
	while(temp!=0xF0)
	{
		P3=0xF0;
		temp=P3;
	}
	keyvalue=row*4+col;
	row=0;col=0;
	return keyvalue;
}

实现按键具体功能

void key()
{
	sum=keyscan16();
	value_s=sec+(min*100);
	
	if(value_s==999)
	{
		TR0=0;
		LED0=1;
		value_a=(value_s*100)*0.05;
		si=value_a%1000/100;wu=value_a%100/10;liu=value_a%10;
	}
	
	
	if(sum==7)
	{
		TR0=1;
		LED0=0;
		ds_1=50;
		yi=0;er=ds_1%100/10;san=ds_1%10;
		if(si==9 && wu==9 && liu==9)
		{
			TR0=0;
			LED0=1;
		}
		flag=1;
		bit_flag1=1;
	}
	//if(sum==7) flag=~flag;
	if(sum==6)
	{
		LED0=1;
		bit_flag2=1;
		ds_1=50;
		TR0=0;
		yi=0;er=ds_1%100/10;san=ds_1%10;
		value_a=(value_s*100)*0.05;
		si=value_a%1000/100;wu=value_a%100/10;liu=value_a%10;
	}
}

本模块其他内容(延迟,变量,位定义)

#include <reg51.h>
#include <intrins.h>
#include "xianshi.h"



sbit LED0=P1^0;

unsigned char temp,row,col,keyvalue,sum=0,ds_1,keystate;
unsigned int value_a;
unsigned int value_s;
bit flag,bit_flag1,bit_flag2;

void Delay10ms()		//@11.0592MHz
{
	unsigned char data i, j;

	i = 18;
	j = 235;
	do
	{
		while (--j);
	} while (--i);
}

2.数码管显示单元

#include <reg51.h>
#include <intrins.h>
#include "anjian.h"





unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
unsigned char table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x00};
unsigned char yi=10,er=10,san=10,si=10,wu=10,liu=10;
unsigned char time,sec=90,min=9;

sbit WM=P2^7;
sbit DM=P2^6;


void Delay1ms()		//@11.0592MHz
{
	unsigned char data i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}

void display()
{
	WM=1;
	DM=0;
	P0=0xFE;
	WM=0;
	P0=0x00;
	DM=1;
	if(bit_flag1==1||bit_flag2==7) P0=table1[yi];
	else	P0=table[yi];
	Delay1ms();

	WM=1;
	DM=0;
	P0=0xFD;
	WM=0;
	P0=0x00;
	DM=1;
	P0=table[er];
	Delay1ms();

	WM=1;
	DM=0;
	P0=0xFB;
	WM=0;
	P0=0x00;
	DM=1;
	P0=table[san];
	Delay1ms();

	WM=1;
	DM=0;
	P0=0xF7;
	WM=0;
	P0=0x00;
	DM=1;
	if(bit_flag1==1||bit_flag2==1)	P0=table1[si];
	else	P0=table[si];
	Delay1ms();
	
	WM=1;
	DM=0;
	P0=0xEF;
	WM=0;
	P0=0x00;
	DM=1;
	P0=table[wu];
	Delay1ms();

	WM=1;
	DM=0;
	P0=0xDF;
	WM=0;
	DM=1;
	P0=table[liu];
	Delay1ms();
}


void Init_Timer0()
{
	TR0=1;
	TMOD &= 0xF0;
	TMOD |= 0x01;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	EA=1;
	ET0=1;
}

void Time0() interrupt 1
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;

	time++;
	if(time==20)
	{
		time=0;
		sec++;
		if(sec>=100)
		{
			sec=0;
			min++;
			if(min>=10)
			{
				min=0;
			}
		}
	}
	if(flag==1){si=min%10;wu=sec/10;liu=sec%10;}
}

3.AD转换

#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_();}    

#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1


sbit SDA = P2^0; 
sbit SCL = P2^1; 


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;
}


bit IIC_WaitAck(void)
{
	SDA = 1;
	somenop;
	SCL = 1;
	somenop;
	if(SDA)    
	{   
		SCL = 0;
		IIC_Stop();
		return 0;
	}
	else  
	{ 
		SCL = 0;
		return 1;
	}
}


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;
	}
}


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 AD_read(unsigned char add)
{
	unsigned char temp;
	
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	temp=IIC_RecByte();
	IIC_Stop();
	
	return temp;
}


unsigned char EEPROM_read(unsigned char add)
{
	unsigned char temp;
	
	IIC_Start();
	IIC_SendByte(0XA0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0XA1);
	IIC_WaitAck();
	temp=IIC_RecByte();
	IIC_Stop();
	
	return temp;
}

void EEPROM_write(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();
}

4.主函数

#include <reg51.h>
#include <intrins.h>
#include "anjian.h"
#include "xianshi.h"
#include "iic.h"

sbit LED1=P1^1;
unsigned char read=0;


void main()
{ 
	Init_Timer0();
	while(1)
	{
			
			display();
			key();
			read=AD_read(0x00);
			if(read<64)
			{
				LED1=1;
			}
			else 
			{
				LED1=0;
			}
		}
}
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值