标题蓝桥杯单片机省赛——第三届(“自动售水机”设计任务书)
前言
使用的是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;
}
}
}