蓝桥杯省一之路02——第八届省赛真题——电子钟

本文详细介绍了参加蓝桥杯比赛时遇到的电子钟设计问题,涉及ds18b20温度传感器的使用,onewrie、smgshow、ds1302的控制,以及Timer和主函数的实现。关键在于利用DS1302的特殊读取方式模拟暂停功能,并通过定时器逻辑取反实现数码管闪烁。文章总结了编程过程中遇到的bug及教训,提醒在定义变量时要注意类型匹配和边界条件处理。
摘要由CSDN通过智能技术生成

1,ds18b20.c

#include "reg52.h"
#include "onewire.h"

void Conv_18B20()//开启温度转化
{
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
}
float Read_18B20()
{
	unsigned char LSB;
	unsigned char MSB;
	int t;
	float T;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	LSB=Read_DS18B20();
	MSB=Read_DS18B20();
	t=(MSB << 8) | LSB;
	T=t/16.0;
	return T;
}

温度测量在这一届中并不算难,只考了ds18b20的基本读温度,注意题目只要求读整数位,不要多读。题目要求按下S4显示温度,所有这里就没有在温度转化后延时5ms,因为在数码管显示的时候已经用到了延时,再延时只会让显示效果减速,如延时过高导致的闪烁。

2.onewrie.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
{
	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(50);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(50);
}

//从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(50);
	}
	return dat;
}

//DS18B20设备初始化
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(120);
  	DQ = 0;
  	Delay_OneWire(800);
  	DQ = 1;
  	Delay_OneWire(100); 
    initflag = DQ;     
  	Delay_OneWire(50);
  
  	return initflag;
}






考试会给,没啥好说的。

3.smgshow.c

#include "reg52.h"
void Delay(int t)
{
	while(t--);
}
void HC573(unsigned char channel, unsigned char dat)
{
	P0=dat;
	switch(channel)
	{
		case 4:
			P2=(P2 & 0x1f) | 0x80;//选通Y4C,LED
		  break;
		case 5:
			P2=(P2 & 0x1f) | 0xa0;//选通Y5C,蜂鸣器,继电器
		  break;
		case 6:
			P2=(P2 & 0x1f) | 0xc0;//选通Y6C,数码管位选
		  break;
		case 7:
			P2=(P2 & 0x1f) | 0xe0;//选通Y7C,数码管段码
		  break;
	}
	P2=(P2 & 0x1f) | 0x00;
}
void Display_SMG(unsigned char pos,unsigned char val)
{

	HC573(6,0x01<<pos);
	HC573
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值