IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 蓝桥杯单片机第八届 电子表(定时器中断) -> 正文阅读

[嵌入式]蓝桥杯单片机第八届 电子表(定时器中断)

如果有用请点赞,还会继续更新的

题目:

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

思路:

通过Ds1302来实现 时间的控制,onewrie.c来读取温度,并且显示出来。按键的功能和判断已经很常规了,要注意的就是在延时的时候,数码管显示的函数依旧要工作。

源代码:

main.c

#include"reg52.h"
#include"intrins.h"
#include"onewire.h"
void LCD_display();
int i;
sfr AUXR=0x8e;
int count;
unsigned int temp;
int time_h=23,time_m=59,time_s=50;
int nao_h=0,nao_m=0,nao_s=0;
int key_4,key_5,key_6=0,key_7=0;
char code xianshi[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0xc6};
sbit S4=P3^3;
sbit S5=P3^2;
sbit S6=P3^1;
sbit S7=P3^0;
sbit L1=P0^7;
void Delay4ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = 44;
	j = 4;
	do
	{
		while (--j);
	} while (--i);
}

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

	i = 3;
	j = 35;
	do
	{
		while (--j);
	} while (--i);
}



void choose138(int n)
{
	switch(n)
	{
		case(0):P2=(P2&0x1f)|0x00;break;
		case(4):P2=(P2&0x1f)|0x80;break;
		case(5):P2=(P2&0x1f)|0xa0;break;
		case(6):P2=(P2&0x1f)|0xc0;break;
		case(7):P2=(P2&0x1f)|0xe0;break;
	}
}
void clean()
{
	choose138(4);
	P0=0xff;
	choose138(5);
	P0=0x00;

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

void serverTimer0Init() interrupt 1
{
	TL0 = 0x00;		//设置定时初始值
	TH0 = 0x28;		//设置定时初始值
	count++;
	if(count==200)
	{
		count=0;
		time_s++;
		if(time_s>=60)
		{
			time_s=0;
			time_m++;
			if(time_m>=60)
			{
				time_m=0;
				time_h++;
				if(time_h>=24)
				{
					time_h=0;
				}
			}
		}
	}
}
//-----------------------------------------------------------
//-----------------------------------------------------------nao zhong gong neng
int x,tongyi=1;
void Delay195ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	i = 130;
	j = 20;
	do
	{ LCD_display();
		while (--j);
	} while (--i);
}


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

	i = 54;
	j = 199;
	do
	{LCD_display();
		while (--j);
	} while (--i);
}


void naozhong(void)
{
	if(time_s==nao_s&&time_h==nao_h&&time_m==nao_m)
	{
		
		for(x=0;x<12;x++)
		{
			LCD_display();
			if(S4==0||S5==0||S6==0||S7==0)
				break;
			else
			{
				P0=0xff;
				choose138(4);
				L1=~L1;
				Delay195ms();
				choose138(4);
				P0=0xff;
				Delay195ms();
			}
		}
	}
}
//-----------------------------------------------------------
//-----------------------------------------------------------wen du
void Read_temp()
{
	char LSB,HSB;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Delay_OneWire(200);

	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	LSB=Read_DS18B20();
	HSB=Read_DS18B20();
	temp=HSB<<4;
	temp=temp|(LSB>>4);
}

//-----------------------------------------------------------
//-----------------------------------------------------------an jian
void an_jian(void)
{
	if(S7==0)
	{
		Delay5ms();
		if(S7==0)
		{
			key_7++;
			if(key_7==4)
			{
				key_7=0;
			}
		}
		while(!S7);
	}

	if(S6==0&&key_7==0)
	{
		Delay5ms();
		if(S6==0)
		{
			key_6++;
			if(key_6==4)
			{
				key_6=0;
			}
		}
		while(!S6);
	}


	//----------------------------
	if(key_7==1&&S5==0)
	{
		Delay5ms();
		if(S5==0)
		{
			time_h++;
			if(time_h==24)
			{
				time_h=0;
			}
		}
		while(!S5);
	}

	if(key_7==2&&S5==0)
	{
		Delay5ms();
		if(S5==0)
		{
			time_m++;
			if(time_m==60)
			{
				time_m=0;
			}
		}
		while(!S5);
	}

	if(key_7==3&&S5==0)
	{
		Delay5ms();
		if(S5==0)
		{
			time_m++;
			if(time_s==60)
			{
				time_s=0;
			}
		}
		while(!S5);
	}
	//----------------------------
	//----------------------------
	if(key_7==1&&S4==0)
	{
		Delay5ms();
		if(S4==0)
		{
			time_h--;
			if(time_h==-1)
			{
				time_h=24;
			}
		}
		while(!S4);
	}

	if(key_7==2&&S4==0)
	{
		Delay5ms();
		if(S4==0)
		{
			time_m--;
			if(time_m==-1)
			{
				time_m=60;
			}
		}
		while(!S4);
	}

	if(key_7==3&&S4==0)
	{
		Delay5ms();
		if(S4==0)
		{
			time_m--;
			if(time_s==-1)
			{
				time_s=0;
			}
		}
		while(!S4);
	}
	//----------------------------


	//----------------------------
	if(key_6==1&&S5==0)
	{
		Delay5ms();
		if(S5==0)
		{
			nao_h++;
			if(nao_h==24)
			{
				nao_h=0;
			}
		}
		while(!S5);
	}

	if(key_6==2&&S5==0)
	{
		Delay5ms();
		if(S5==0)
		{
			nao_m++;
			if(nao_m==60)
			{
				nao_m=0;
			}
		}
		while(!S5);
	}

	if(key_6==3&&S5==0)
	{
		Delay5ms();
		if(S5==0)
		{
			nao_s++;
			if(nao_s==60)
			{
				nao_s=0;
			}
		}
		while(!S5);
	}
	//----------------------------
	//----------------------------
	if(key_6==1&&S4==0)
	{
		Delay5ms();
		if(S4==0)
		{
			nao_h--;
			if(nao_h==-1)
			{
				nao_h=24;
			}
		}
		while(!S4);
	}

	if(key_6==2&&S4==0)
	{
		Delay5ms();
		if(S4==0)
		{
			nao_m--;
			if(nao_m==-1)
			{
				nao_m=59;
			}
		}
		while(!S4);
	}

	if(key_6==3&&S4==0)
	{
		Delay5ms();
		if(S4==0)
		{
			nao_s--;
			if(nao_s==-1)
			{
				nao_s=59;
			}
		}
		while(!S4);
	}
	//----------------------------
}
//-----------------------------------------------------------
//-----------------------------------------------------------smg xian_shi
void SMG_display(int wei,int dat)
{
	choose138(6);
	P0=0x80>>(wei-1);
	choose138(7);
	P0=xianshi[dat];
}
void LCD_display()
{
	if(key_6==0&&key_7==0&&S4==0)
	{
		Delay4ms();
		while(S4==0)
		{
			SMG_display(1,12);
			Delay200us();
			SMG_display(2,temp%10);
			Delay200us();
			SMG_display(3,temp/10);
			Delay200us();
			SMG_display(4,10);
			Delay200us();
			SMG_display(5,10);
			Delay200us();
			SMG_display(6,10);
			Delay200us();
			SMG_display(7,10);
			Delay200us();
			SMG_display(8,10);
			Delay200us();
		}
	}
	if(key_6==0&&key_7==0)
	{
		SMG_display(1,time_s%10);
		Delay200us();
		SMG_display(2,time_s/10);
		Delay200us();
		SMG_display(3,11);
		Delay200us();
		SMG_display(4,time_m%10);
		Delay200us();
		SMG_display(5,time_m/10);
		Delay200us();
		SMG_display(6,11);
		Delay200us();
		SMG_display(7,time_h%10);
		Delay200us();
		SMG_display(8,time_h/10);
		Delay200us();
	}

	//-------------------------
	if(key_6==0&&key_7==1)
	{
		i++;
			if(i<=70)
			{
				SMG_display(1,time_s%10);
				Delay200us();
				SMG_display(2,time_s/10);
				Delay200us();
				SMG_display(3,11);
				Delay200us();
				SMG_display(4,time_m%10);
				Delay200us();
				SMG_display(5,time_m/10);
				Delay200us();
				SMG_display(6,11);
				Delay200us();
				SMG_display(7,10);
				Delay200us();
				SMG_display(8,10);
				Delay200us();
			}
			else if(i>70&&i<140)
			{
				SMG_display(1,time_s%10);
				Delay200us();
				SMG_display(2,time_s/10);
				Delay200us();
				SMG_display(3,11);
				Delay200us();
				SMG_display(4,time_m%10);
				Delay200us();
				SMG_display(5,time_m/10);
				Delay200us();
				SMG_display(6,11);
				Delay200us();
				SMG_display(7,time_h%10);
				Delay200us();
				SMG_display(8,time_h/10);
				Delay200us();
			}
			else if(i>=70)
				i=0;
		
	}

	if(key_6==0&&key_7==2)
	{
		i++;
		if(i<=70)
		{
			SMG_display(1,time_s%10);
			Delay200us();
			SMG_display(2,time_s/10);
			Delay200us();
			SMG_display(3,11);
			Delay200us();
			SMG_display(4,10);
			Delay200us();
			SMG_display(5,10);
			Delay200us();
			SMG_display(6,11);
			Delay200us();
			SMG_display(7,time_h%10);
			Delay200us();
			SMG_display(8,time_h/10);
			Delay200us();
		}
		else if(i>70&&i<140)
		{
			SMG_display(1,time_s%10);
			Delay200us();
			SMG_display(2,time_s/10);
			Delay200us();
			SMG_display(3,11);
			Delay200us();
			SMG_display(4,time_m%10);
			Delay200us();
			SMG_display(5,time_m/10);
			Delay200us();
			SMG_display(6,11);
			Delay200us();
			SMG_display(7,time_h%10);
			Delay200us();
			SMG_display(8,time_h/10);
			Delay200us();
		}
		else if(i>=70)
			i=0;	
	}

	if(key_6==0&&key_7==3)
	{
		i++;
		if(i<=70)
		{
			SMG_display(1,10);
			Delay200us();
			SMG_display(2,10);
			Delay200us();
			SMG_display(3,11);
			Delay200us();
			SMG_display(4,time_m%10);
			Delay200us();
			SMG_display(5,time_m/10);
			Delay200us();
			SMG_display(6,11);
			Delay200us();
			SMG_display(7,time_h%10);
			Delay200us();
			SMG_display(8,time_h/10);
			Delay200us();
		}
		else if(i>70&&i<140)
		{
			SMG_display(1,time_s%10);
			Delay200us();
			SMG_display(2,time_s/10);
			Delay200us();
			SMG_display(3,11);
			Delay200us();
			SMG_display(4,time_m%10);
			Delay200us();
			SMG_display(5,time_m/10);
			Delay200us();
			SMG_display(6,11);
			Delay200us();
			SMG_display(7,time_h%10);
			Delay200us();
			SMG_display(8,time_h/10);
			Delay200us();
		}
		else if(i>=70)
			i=0;
	}
	//-------------------------
	if(key_7==0&&key_6==1)
	{		
		i++;
		if(i<=70)
		{
			SMG_display(1,nao_s%10);
			Delay200us();
			SMG_display(2,nao_s/10);
			Delay200us();
			SMG_display(3,11);
			Delay200us();
			SMG_display(4,nao_m%10);
			Delay200us();
			SMG_display(5,nao_m/10);
			Delay200us();
			SMG_display(6,11);
			Delay200us();
			SMG_display(7,10);
			Delay200us();
			SMG_display(8,10);
			Delay200us();
		}
		else if(i>70&&i<140)
		{
			SMG_display(1,nao_s%10);
			Delay200us();
			SMG_display(2,nao_s/10);
			Delay200us();
			SMG_display(3,11);
			Delay200us();
			SMG_display(4,nao_m%10);
			Delay200us();
			SMG_display(5,nao_m/10);
			Delay200us();
			SMG_display(6,11);
			Delay200us();
			SMG_display(7,nao_h%10);
			Delay200us();
			SMG_display(8,nao_h/10);
			Delay200us();
		}
		else if(i>=70)
			i=0;
	}

	if(key_7==0&&key_6==2)
	{
		i++;
		if(i<=70)
		{
			SMG_display(1,nao_s%10);
			Delay200us();
			SMG_display(2,nao_s/10);
			Delay200us();
			SMG_display(3,11);
			Delay200us();
			SMG_display(4,10);
			Delay200us();
			SMG_display(5,10);
			Delay200us();
			SMG_display(6,11);
			Delay200us();
			SMG_display(7,nao_h%10);
			Delay200us();
			SMG_display(8,nao_h/10);
			Delay200us();
		}
		else if(i>70&&i<140)
		{
			SMG_display(1,nao_s%10);
			Delay200us();
			SMG_display(2,nao_s/10);
			Delay200us();
			SMG_display(3,11);
			Delay200us();
			SMG_display(4,nao_m%10);
			Delay200us();
			SMG_display(5,nao_m/10);
			Delay200us();
			SMG_display(6,11);
			Delay200us();
			SMG_display(7,nao_h%10);
			Delay200us();
			SMG_display(8,nao_h/10);
			Delay200us();
		}
		else if(i>=70)
			i=0;
	}

	if(key_7==0&&key_6==3)
	{
		i++;
		if(i<=70)
		{
			SMG_display(1,10);
			Delay200us();
			SMG_display(2,10);
			Delay200us();
			SMG_display(3,11);
			Delay200us();
			SMG_display(4,nao_m%10);
			Delay200us();
			SMG_display(5,nao_m/10);
			Delay200us();
			SMG_display(6,11);
			Delay200us();
			SMG_display(7,nao_h%10);
			Delay200us();
			SMG_display(8,nao_h/10);
			Delay200us();
		}
		else if(i>70&&i<140)
		{
			SMG_display(1,nao_s%10);
			Delay200us();
			SMG_display(2,nao_s/10);
			Delay200us();
			SMG_display(3,11);
			Delay200us();
			SMG_display(4,nao_m%10);
			Delay200us();
			SMG_display(5,nao_m/10);
			Delay200us();
			SMG_display(6,11);
			Delay200us();
			SMG_display(7,nao_h%10);
			Delay200us();
			SMG_display(8,nao_h/10);
			Delay200us();
		}
		else if(i>=70)
			i=0;
	}
	//-------------------------
}
//-----------------------------------------------------------
void main()
{
	clean();
	Timer0Init();
	while(1)
	{
		LCD_display();
		an_jian();
		Read_temp();
		naozhong();
	}
}

onewire.c

/*
  程序说明: 单总线驱动程序
  软件环境: Keil uVision 4.10 
  硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机
  日    期: 2011-8-9
*/
#include "reg52.h"

sbit DQ = P1^4;  //单总线接口

//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
	t=t*12;
	while(t--);
}

//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

//DS18B20设备初始化
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}

onewire.h

#ifndef __ONEWIRE_H
#define __ONEWIRE_H

unsigned char rd_temperature(void);  //; ;
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);
#endif

**

码字不容易,点个赞再走!!!!

**

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-13 12:59:30  更:2021-12-13 13:01:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/29 10:40:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码