蓝桥杯单片机第3届省赛_自动售水机

本文介绍了参与蓝桥杯第三届省赛的自动售水机项目,涉及单片机编程,包括timer、smg、key、adc及main等模块的代码实现。

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

timer.c

#include <timer.h>

void Timer0Init(void)  //1毫秒@11.0592MHz
{
 AUXR |= 0x80;  //定时器时钟1T模式
 TMOD &= 0xF0;  //设置定时器模式
 TL0 = 0xCD;  //设置定时初值
 TH0 = 0xD4;  //设置定时初值
 TF0 = 0;  //清除TF0标志
 TR0 = 1;  //定时器0开始计时
 EA=ET0=1;
}

timer.h

#ifndef _TIMER_H_
#define _TIMER_H_

#include <STC15F2K60S2.H>
void Timer0Init(void); 

#endif

smg.c

#include <smg.h>

uchar code smgduan[21]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90,0xff,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};	
//后面加的是小数的显示

uchar dspbuf[8]={10,10,10,10,10,10,10,10};

void smg_display(void)
{
  static uchar i=0;
  
  XBYTE[0XE000]=0XFF;		//这是MM编辑模式
  XBYTE[0XC000]=1<<i;
  XBYTE[0XE000]=smgduan[dspbuf[i]];
 
 if(++i == 8)
 
 i=0;
}

smg.h

#ifndef _SMG_H_
#define _SMG_H_

#include <STC15F2K60S2.H>
#include <absacc.h>

#define uchar unsigned char
#define uint unsigned int

void smg_display(void);
extern uchar dspbuf[8];

#endif

key.c

#include <key.h>

uchar key_sum;
uchar k7_press;
uchar k6_press;

void key_read(void)
{
 static uchar k7_time=0,k6_time=0;
 key_sum=0;

 if(k7==0)
 {
  k7_time++;
  
  if(k7_time==1)
  {
    key_sum=7;
  }
  if(k7_time>=20)
  {
    k7_time=1;
   key_sum=0;
  }
 }
 else
  k7_time=0;
  
  if(k6==0)
 {
   k6_time++;
  if(k6_time==1)
  {
    key_sum=6;
  }
  if(k6_time>=20)
  {
    k6_time=1;
   key_sum=0;
  }
 }
 else
  k6_time=0;
}

void key_control(void)
{
  if(key_sum==7)
    k7_press=1;

 if(key_sum==6)
    k6_press=1;
}

key.h

#ifndef _KEY_H_
#define _KEY_H_

#include <STC15F2K60S2.H>

#define uchar unsigned char
#define uint unsigned int

sbit k7=P3^0;
sbit k6=P3^1;

void key_read(void);
void key_control(void);

extern uchar k7_press;
extern uchar k6_press;

#endif

adc.c

#include <adc.h>
#include "intrins.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_();}    

//总线引脚定义
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;
}

//等待应答
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 adc_read(void)
{
 unsigned char dat=0; 
 
 IIC_Start();
 IIC_SendByte(0X90);
 IIC_WaitAck();
 IIC_SendByte(0X03);
 IIC_WaitAck(); 
 
 IIC_Start();
 IIC_SendByte(0X91);
 IIC_WaitAck();
 dat=IIC_RecByte(); 
 IIC_Stop();
 
 return dat;
}

adc.h

#ifndef _ADC_H_
#define _ADC_H_

#include <STC15F2K60S2.H>

unsigned char adc_read(void);

#endif

main.c

#include <timer.h>
#include <smg.h>
#include <key.h>
#include <adc.h>
#include <absacc.h>

#define uchar unsigned char
#define uint unsigned int

uchar flag_key;
uchar flag_adc;
uchar adc_dat;
uchar flag_smg;
uchar flag_relay;
uchar flag_water_count;
uint water_sum;
uint water_price;

void bee_init(void)
{
  XBYTE[0XA000]=0X00;
}
void relay_on(void)
{
  XBYTE[0XA000]=0X10;
}
void relay_off(void)
{
  XBYTE[0XA000]=0X00;
}
void led1_on(void)
{
  XBYTE[0X8000]=0X7F;
}
void led1_off(void)
{
  XBYTE[0X8000]=0XFF;
}

void main()
{
 bee_init();
 Timer0Init(); 
 adc_init(0x01);	//选中光敏电阻
  while(1)
 {
/************key*************/ 
 if(flag_key==1)
 {
   flag_key=0;
   key_read();
   key_control();
 }
 if(k7_press==1)
 {
  k7_press=0;
  flag_smg=1;
  flag_relay=1;
 }
 else if(k6_press==1)
  {
  k6_press=0;
  flag_smg=0;
  flag_relay=0;
 }
/************adc*************/
 if(flag_adc==1)	//200ms读一次
 {               
   flag_adc=0;
   adc_dat=adc_read();
 }
 
 if(adc_dat<=63) 	//(1.25/5)*255
   led1_on();
 else if(adc_dat>63)
  led1_off();
  
/************realy*************/
 if(flag_relay==1)
   relay_on();
 else
   relay_off();

/************water*************/
  if(flag_relay==1)
 {
    if(flag_water_count==1)
    {
      flag_water_count=0;
      water_sum+=1;
      water_price=water_sum/2;
  
     if(water_sum==9999)
     {
      flag_relay=0;
      flag_smg=0;
     }
   }
 }
 
/************smg*************/
  if(flag_smg==1)
  {
   dspbuf[0]=10;
   dspbuf[1]=11;
   dspbuf[2]=5;
   dspbuf[3]=0;
   dspbuf[4]=water_sum/1000;
   dspbuf[5]=(water_sum%1000/100+11);	//小数
   dspbuf[6]=water_sum%100/10;
   dspbuf[7]=water_sum%10;
  }
  else if(flag_smg==0)
  {
   dspbuf[0]=10;
   dspbuf[1]=11;
   dspbuf[2]=5;
   dspbuf[3]=0;
   dspbuf[4]=water_price/1000;
   dspbuf[5]=(water_price%1000/100+11);
   dspbuf[6]=water_price%100/10;
   dspbuf[7]=water_price%10;
  }
 }
}

void timer0_isr() interrupt 1
{
  static uchar flag_key_time=0;
  static uchar flag_adc_time=0;
  static uchar flag_water_count_time=0; 
  
 if(++flag_key_time==30)
 {
   flag_key_time=0;
   flag_key=1;
 }
 
  if(++flag_adc_time==200)
 {
   flag_adc_time=0;
   flag_adc=1;
 }
 
 if(++flag_water_count_time==100)
 {
   flag_water_count_time=0;
   flag_water_count=1;
 }
 
 smg_display();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值