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

本文介绍了一个基于单片机的系统,该系统集成了DS1302实时时钟模块和DS18B20温度传感器。通过按键操作,用户可以查看和调整时间,同时实时显示温度。程序中包含了时钟设置、温度读取、数码管显示和定时器功能。系统还实现了LED闪烁和数码管的闪烁效果,增强了用户交互体验。
摘要由CSDN通过智能技术生成

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

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

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

unsigned int k7 = 0;	 //S7的状态标识符
unsigned int k6 = 0;	 //S6的状态标识符
unsigned char clock[3] = {1,1,0};	  //闹钟时间,秒分时
unsigned int clock_f = 0;
unsigned char duanma[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};	  //段码
unsigned char write_DS1302_addr[7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};	 //写地址
unsigned char read_DS1302_addr[7] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};	 //读地址
unsigned char timer[7] = {80,89,35};	 //初始时间	 21年、周二、4月12日、23:59:50
unsigned int t_dat;   //温度
unsigned int smg_f = 0;		//数码管闪烁标识符
unsigned int led_f = 0;		//LED闪烁标识符
unsigned int count_clo = 0;
unsigned int count_smg = 0;

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

//======================timer[i]++和--函数=====================
unsigned char BCDtoTEN (unsigned char dat)
{
	dat = (dat /16) * 10 + (dat % 16);
	return dat;	
}

unsigned char Timeradd(unsigned char dat)
{
	dat = dat + 1;
	switch(dat)
	{
		case 10:
			dat = 16;break;			 //BCD的10
		case 26:
			dat = 32;break;			 //BCD的20
		case 42:
			dat = 48;break;			 //BCD的30
		case 58:
			dat = 64;break;			 //BCD的40
		case 74:
			dat = 80;break;			 //BCD的50
		case 90:
			dat = 96;break;			 //BCD的60
	}
	return dat;
}

unsigned char Timerminus(unsigned char dat)
{
	dat = dat - 1;
	switch(dat)
	{
		case 79:
			dat = 73;break;	   
		case 63:
			dat = 57;break;
		case 47:
			dat = 41;break;
		case 31:
			dat = 25;break;
		case 15:
			dat = 9;break;
		case -1:
			dat = 89;break;		
	}
	return dat;
}

//======================时钟函数===============================
void DS1302_confing()
{
  unsigned char n;
  Write_Ds1302_Byte(0x8e,0x00);
  for (n = 0;n < 3;n++)
  {
    Write_Ds1302_Byte(write_DS1302_addr[n],timer[n]);
  }
  Write_Ds1302_Byte(0x8e,0x80);
}

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

//======================温度函数===============================
void delay_tem(unsigned int t)
{
  while(t--);
}

void read_temperature()
{
  unsigned char LSB,MSB;
  init_ds18b20();
  Write_DS18B20(0xcc);
  Write_DS18B20(0x44);
  delay_tem(1000);

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

  t_dat = 0x0000;
  t_dat = MSB;
  t_dat <<= 8;
  t_dat = t_dat | LSB;
  if ((t_dat & 0xf800) == 0x0000)
  {
    t_dat >>= 4;
	//t_dat = t_dat * 10;
	//t_dat += (LSB & 0x0f) * 0.625;
  }
}

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

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

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

void display_smg1302()
{
  readtime();
  if ((k7 == 1 & smg_f == 1) | (k7 == 0) | (k7 == 2) | (k7 == 3))
  {
    display_smg(0,duanma[timer[2] / 16]);
    delay_smg(300);
    display_smg(1,duanma[timer[2] % 16]);
    delay_smg(300);
  }
  display_smg(2,duanma[16]);
  delay_smg(300);
  if ((k7 == 2 & smg_f == 1) | (k7 == 0) | (k7 == 1) | (k7 == 3))
  {
    display_smg(3,duanma[timer[1] / 16]);
    delay_smg(300);
    display_smg(4,duanma[timer[1] % 16]);
    delay_smg(300);
  }
  display_smg(5,duanma[16]);
  delay_smg(300);
  if ((k7 == 3 & smg_f == 1) | (k7 == 0) | (k7 == 2) | (k7 == 1))
  {
    display_smg(6,duanma[timer[0] / 16]);
    delay_smg(300);
    display_smg(7,duanma[timer[0] % 16]);
    delay_smg(300);
  }
  allsmg();
  delay_smg(300);
}

void display_smgclock()
{
  if ((smg_f == 1 & k6 == 1) | k6 == 2 | k6 == 3)
  {
  display_smg(0,duanma[clock[2] / 10]);
  delay_smg(300);
  display_smg(1,duanma[clock[2] % 10]);
  delay_smg(300);
  }
  display_smg(2,duanma[16]);
  delay_smg(300);
  if ((smg_f == 1 & k6 == 2) | k6 == 1 | k6 == 3)
  {
  display_smg(3,duanma[clock[1] / 10]);
  delay_smg(300);
  display_smg(4,duanma[clock[1] % 10]);
  delay_smg(300);
  }
  display_smg(5,duanma[16]);
  delay_smg(300);
  if ((smg_f == 1 & k6 == 3) | k6 == 1 | k6 == 2)
  {
  display_smg(6,duanma[clock[0] / 10]);
  delay_smg(300);
  display_smg(7,duanma[clock[0] % 10]);
  delay_smg(300);
  }
  allsmg();
  delay_smg(300);
}

void display_smg18B20()
{
  read_temperature();
  display_smg(0,0xff);
  delay_smg(300);
  display_smg(1,0xff);
  delay_smg(300);
  display_smg(2,0xff);
  delay_smg(300);
  display_smg(3,0xff);
  delay_smg(300);
  display_smg(4,0xff);
  delay_smg(300);
  display_smg(5,duanma[t_dat / 10]);
  delay_smg(300);
  display_smg(6,duanma[t_dat % 10]);
  delay_smg(300);
  display_smg(7,duanma[12]);
  delay_smg(300);
  allsmg();
  delay_smg(300);
}
//======================定时器=================================
void init_time()
{
  TMOD = 0x01;
  TH0 = (65535 - 10000) / 256;	//10ms
  TL0 =	(65535 - 10000) % 256;

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

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

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

  if (clock_f == 1)
  {
     count_clo++; 
  }
  if (count_clo % 20 == 0)
  {
	 if (led_f == 0)
	 {
	   led_f = 1;
	 }
	 else if (led_f == 1)
	 {
	   led_f = 0;
	 }
  }
  if (count_clo >= 500)
  {
	 count_clo = 0;
	 clock_f = 0;
	 led_f = 0;
  }
}

//======================按键相关函数===========================
void scankeys()
{
  if (S7 == 0)
  {
    if (k7 == 0)
	{
	  k7 = 1;
	}
	else if (k7 == 1)
	{
	  k7 = 2;
	}
	else if (k7 == 2)
	{
	  k7 = 3;
	}
	else if (k7 == 3)
	{
	  k7 = 0;
	}
	if (clock_f == 1)
	{
	  led_f = 0;
	  clock_f = 0;
	  count_clo = 0;
	}
	while (S7 == 0);
  }

  if (S6 == 0)
  {
    if (k6 == 0)
	{
	  k6 = 1;
	}
	else if (k6 == 1)
	{
	  k6 = 2;
	}
	else if (k6 == 2)
	{
	  k6 = 3;
	}
	else if (k6 == 3)
	{
	  k6 = 0;
	}
	if (clock_f == 1)
	{
	  led_f = 0;
	  clock_f = 0;
	  count_clo = 0;
	}
	while (S6 == 0);
  }

  if (S5 == 0)
  {
    if (k7 == 1)
	{
	  timer[2] = Timeradd(timer[2]);			
	  if (timer[2] >= 96)
	  {
		timer[2] = 0;
      }
	}
	else if (k7 == 2)
	{
	  timer[1] = Timeradd(timer[1]);			
	  if (timer[1] >= 96)
	  {
		timer[1] = 0;
      }
	}
	else if (k7 == 3)
	{
	  timer[0] = Timeradd(timer[0]);			
	  if (timer[0] >= 96)
	  {
		timer[0] = 0;
      }
	}
	if (k6 == 1)
	{
	  clock[2] ++;
	  if (clock[2] == 24)
	  {
	    clock[2] = 0;
	  }
	  display_smgclock();
	}
	else if (k6 == 2)
	{
	  clock[1] ++;
	  if (clock[1] == 61)
	  {
	    clock[1] = 0;
	  }
	  display_smgclock();
	}
	else if (k6 == 3)
	{
	  clock[0] ++;
	  if (clock[0] == 61)
	  {
	    clock[0] = 0;
	  }
	  display_smgclock();
	}
	if (clock_f == 1)
	{
	  led_f = 0;
	  clock_f = 0;
	  count_clo = 0;
	}
	while (S5 == 0);
  }

  if (S4 == 0)
  {
    if (k7 == 0 & k6 == 0)
	{
	  while(S4 == 0)
	  {
	    display_smg18B20();
	  }
	}
	if (k7 == 1)
	{
	  timer[2] = Timerminus(timer[2]);			
	  if (timer[2] == 89)
	  {
		timer[2] = 35;
	  }
	}
	else if (k7 == 2)
	{
	  timer[1] = Timerminus(timer[1]);
	}
	else if (k7 == 3)
	{
	  timer[0] = Timerminus(timer[0]);
	}
	if (k6 == 1)
	{
	  clock[2] --;
	  if (clock[2] < 0)
	  {
	    clock[2] = 23;
	  }
	  display_smgclock();
	}
	else if (k6 == 2)
	{
	  clock[1] --;
	  if (clock[1] < 0)
	  {
	    clock[1] = 60;
	  }
	  display_smgclock();
	}
	else if (k6 == 3)
	{
	  clock[0] --;
	  if (clock[0] < 0)
	  {
	    clock[0] = 60;
	  }
	  display_smgclock();
	}
	if (clock_f == 1)
	{
	  led_f = 0;
	  clock_f = 0;
	  count_clo = 0;
	}
	while (S4 == 0);
  }
}

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

//======================主函数=================================
void main()
{
  Initsystem();
  DS1302_confing();
  init_time();
  while(1)
  {
    scankeys();
    LEDrunning();
	if (k6 != 0)
	{
	  display_smgclock();
	}
	else 
	{
	  display_smg1302();
	}
  }
}
  • 10
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值