【蓝桥杯单片机】第六届省赛


在这里插入图片描述

#include "reg52.h"
#include "onewire.h"
#include "absacc.h"
#include "ds1302.h"

sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;

unsigned char duanma[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
unsigned temp_time = 1;	 //间隔时间
unsigned char timer[3] = {0x50,0x59,0x23};	   //设定初始时间
unsigned char write_ds1302[7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};	
unsigned char read_da1302[7] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
unsigned char temp[10];	  //温度采集数据
unsigned int i = 0;            //温度采集顺序
unsigned int k4 = 0;	   //间隔时间切换标志位
unsigned int k5 = 0;	   //进入时钟
unsigned int k6 = 0;	   //温度采集显示标志位
unsigned int k6_6 = 0;	   //L1熄灭按键
unsigned int k7 = 0;	   //进入参数设置位
unsigned int k = 0;		   //采集温度标志位
unsigned int led_f = 0;		 //LED闪烁标志位
unsigned int smg_f = 0;		 //数码管闪烁标志位
unsigned int count = 0;		 //定时器计数
unsigned int count_smg = 0;     //smg定时器计数
unsigned int dat_f;         //温度

//=============================初始化函数===========================
void initsystem()
{
  XBYTE[0x8000] = 0xff;
  XBYTE[0xa000] = 0x00;
  XBYTE[0xc000] = 0xff;
  XBYTE[0xe000] = 0xff;
}

//=============================数码管函数===========================
void delay_smg(unsigned int t)
{
  while(t--);
}

void display_smg(unsigned char pos,unsigned char value)
{
  XBYTE[0xe000] = 0xff;
  XBYTE[0xc000] = 0x01 << pos;
  XBYTE[0xe000] = value;
}

void allsmg()
{
  XBYTE[0xc000] = 0xff;
  XBYTE[0xe000] = 0xff;
}

void display_smg_time()
{
  display_smg(0,duanma[timer[2] / 16]);
  delay_smg(500);
  display_smg(1,duanma[timer[2] % 16]);
  delay_smg(500);
  if (smg_f == 0)
  {
    display_smg(2,duanma[16]);
    delay_smg(500);
  }
  display_smg(3,duanma[timer[1] / 16]);
  delay_smg(500);
  display_smg(4,duanma[timer[1] % 16]);
  delay_smg(500);
  if (smg_f == 0)
  {
    display_smg(5,duanma[16]);
    delay_smg(500);
  }
  display_smg(6,duanma[timer[0] / 16]);
  delay_smg(500);
  display_smg(7,duanma[timer[0] % 16]);
  delay_smg(500);
  allsmg();
  delay_smg(500);
}

void display_smg_temp()
{
  display_smg(0,duanma[16]);
  delay_smg(500);
  display_smg(1,duanma[(i+1) / 10]);
  delay_smg(500);
  display_smg(2,duanma[(i+1) % 10]);
  delay_smg(500);
  display_smg(3,0xff);
  delay_smg(500);
  display_smg(4,0xff);
  display_smg(5,duanma[16]);
  delay_smg(500);
  display_smg(6,duanma[temp[i] / 10]);
  delay_smg(500);
  display_smg(7,duanma[temp[i] % 10]);
  delay_smg(500);
  allsmg();
  delay_smg(500);
}

void display_smg_limit()
{
  display_smg(0,0xff);
  delay_smg(500);
  display_smg(1,0xff);
  delay_smg(500);
  display_smg(2,0xff);
  delay_smg(500);
  display_smg(3,0xff);
  delay_smg(500);
  display_smg(4,0xff);
  display_smg(5,duanma[16]);
  delay_smg(500);
  display_smg(6,duanma[temp_time / 10]);
  delay_smg(500);
  display_smg(7,duanma[temp_time % 10]);
  delay_smg(500);
  allsmg();
  delay_smg(500);
}

//=============================LED相关函数==========================
void LEDrunning()
{
  if (led_f == 1)
  {
	XBYTE[0x8000] = 0xfe;
  }
  else if (led_f == 0)
  {
	XBYTE[0x8000] = 0xff;
  }
  
}

void read_temperature();
//=============================定时器===============================
void init_time()
{
  TMOD = 0x01;
  TH0 = (65535 - 10000) / 256;
  TL0 = (65535 - 10000)	% 256;

  EA = 1;
  ET0 = 1;
  TR0 = 1;
}

void servicetime()  interrupt 1
{
  TH0 = (65535 - 10000) / 256;
  TL0 = (65535 - 10000)	% 256;

  count_smg ++;
  if (count_smg == 100)
  {
    if (smg_f == 0)
	{
	  smg_f = 1;
	}
	else if (smg_f == 1)
	{
	  smg_f = 0;
	}
	if (k6_6 == 1)
	{
	  if (led_f == 0)
	  {
	    led_f = 1;
  	  }
	  else if (led_f == 1)
	  {
	    led_f = 0;
	  }
	}
	count_smg = 0;
  }

  if (k == 0)
  {
    count++;
    if (count % (100 * temp_time) == 0)
    {
      read_temperature();
	  temp[i] = dat_f;
	  i ++;
	  if (i > 10)
	  {
	    count = 0;
	    k = 1;
		k6_6 = 1;
		k6 = 1;
	    k7 = 1;
		led_f = 0;
	  }
    }
  }
}

//=============================实时时钟=============================
void write_time_ds1302()
{
  unsigned char n ;
  Write_Ds1302_Byte(0x8e,0x00);
  for (n = 0 ; n < 3 ; n ++)
  {
    Write_Ds1302_Byte(write_ds1302[n],timer[n]);
  }
  Write_Ds1302_Byte(0x8e,0x80);
}

void read_time_ds1302()
{
  unsigned char n ;
  for (n = 0;n < 3;n++)
  {
    timer[n] = Read_Ds1302_Byte(read_da1302[n]);
  }
}

//=============================温度传感器===========================
void read_temperature()
{
  unsigned char LSB,MSB;
  init_ds18b20();
  Write_DS18B20(0xcc);
  Write_DS18B20(0x44);
  delay_smg(1000);

  init_ds18b20();
  Write_DS18B20(0xcc);
  Write_DS18B20(0xbe);
  LSB = Read_DS18B20();
  MSB = Read_DS18B20();
  init_ds18b20();

  dat_f = 0x0000;
  dat_f = MSB;
  dat_f <<= 8;
  dat_f = dat_f | LSB;
  if ((dat_f & 0xf800) == 0x0000)
  {
    dat_f >>= 4;
  }
}

//=============================按键=================================
void scankeys()
{
  if (S4 == 0)
  {
    if (k4 == 0)
	{
	  k4 = 1;
	  temp_time = 5;
	}
	else if (k4 == 1)
	{
	  k4 = 2;
	  temp_time = 30;
	}
	else if (k4 == 2)
	{
	  k4 = 3;
	  temp_time = 60;
	}
	else if (k4 == 3)
	{
	  k4 = 0;
	  temp_time = 1;
	}
	while(S4 == 0);
  }

  if (S5 == 0)
  {
    if (k5 == 0)
	{
	  k5 = 1;
	  k7 = 1;
	  k = 0;
	  temp[9] = 0x00;
	}
	else if (k5 == 1)
	{
	  k5 = 0;
	}
	while(S5 == 0);
  }

  if (S6 == 0)
  {
    if (k6_6 == 1)
	{
	  k6_6 = 0;
	}

	i ++;
	if (i >= 10)
	{
	  i = 0;
	}
	while(S6 == 0);
  }

  if (S7 == 0)
  {
    if (k7 == 1)
	{
	  k7 = 0;
	  k6 = 0;
	  k5 = 0;
	}
	while(S7 == 0);
  }
}

//=============================主函数===============================
void main()
{
  initsystem();
  init_time();
  write_time_ds1302();
  while(1)
  {
  	LEDrunning();
	read_time_ds1302();
	scankeys();
	
	if (k6 == 1)
	{
	  display_smg_temp();
	}
	 else if (k5 == 1)
	{
	  display_smg_time();
	}
	else if (k7 == 0)
	{
	  display_smg_limit();
	}
	
  }
}
  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值