51单片机项目,多功能桌面可调电源--省一

部分请参考我的一篇51单片机环境监测项目

  1. 创意设计

1.1 电源掌控者——更懂你的口袋电源

我们身边都有哪些电源?手机、电脑、无线键鼠、外接硬盘、NAS、USBHub?又或者是独立声卡、麦克风、5V适配器、12V适配器等特殊专用电源?它们一个个的占用我们的背包空间,增加我们的出行负担。

有没有一种电源,它占用的空间小,轻便,同时能用从小巧的空间创造出巨大的价值?

电源掌控者——多功能桌面可调电源,它提供上至50V,下至1.2V稳定直流输出,满足日常生活中绝大部分供电需求;它采用模块化设计,轻松装进您的口袋,不为您的日常生活“增负”;它提供多种智能功能,为您的幸福生活贡献自己的一份力……

1.2关于桌面可调电源现有解决方案、产品及应用场景研究报告

《了不起的比尔盖茨》中提到“没有最好,只有更好。我们尽力的去把我们的作品去做到最好,但我们也知道这世上有太多比我们更好的方案、产品、应用方向…

一方面我们通过查阅文献学习新的研究方向,新的应用领域。经过不断的查看资料,我们其实还有很多可以进步的地方,其中一些则通过一些小的修改即可。团队首先发现能够继续优化电路设计,减少电路间的干扰进而优化电源稳定性,提高电源安全性。继续下探最低电压,即可为一些低电压设备供电。增加一些安全限制,添加些特殊输出接口即可应用于各大中高学校实验室中。增加数字电流表即可应用于电子维修领域中。

团队深知,几个人的力量绝大多数情况下无法与市面上成熟产品抗衡。我们研究已经成熟的产品,从中学习他们的优点并发现它们的不足。目前可调电源可以分为两大阵营,以HT3000PF系列为代表的“巨无霸”型,以ToolkitRc P200为代表的“小巧”型。巨无霸电源通常体积较大,学习成本高。小巧型的电源所需要的放置面积更小,交互界面更简单,但性能不强。出团队以200为参考。ToolkitRc P200输出接口少,它不能同时给多个设备供电,但现代用电器随处可见。并且团队觉得输出功率可以做到进一步提升。

此外团队也对某些场景进行了实际调研。桌面可调电源主要可以应用在家居、公司、实验室等场景。目前越来越多的人们对自己的居住环境有了更高的要求。拥有一个桌面可调电源就能更好满足人们对于居住环境要整洁、方便等需求。一个公司,每一位员工都有自己的用电设备,但大多数工位面积有限,不能满足多台设备同时供电的需求,桌面可调电源能在此环境下大展身手。实验室则是可调电源的理想应用场景,只要有实验室一定有可调电源的身影。因此桌面可调电源也非常适合实验室,更小的安放面积还你桌面整洁,多路,多接口同时输出,满足多样的供电需求。一个小小的电源就能满足大多数产品研发工程中的供电需求。

在这个处处有电的时代,如何以方便的形式满足人们多样化的供电需求是团队所思考的。一个功能强大的可调电源或许就是很好的解决方案,团队将继续深入研究,为提高供电幸福感而努力。

1.3 主要创意

  1. 上至50V,下至1.2V无极可调直流输出,满足各种供电需求。
  2. 模块化设计,极致的小巧,极致的轻便。
  3. 过流过压过载保护,一切仅为让“我”变得更安全。
  4. PM2.5监测报警、甲醛监测报警、燃气监测报警,周围安不安全“我”比你更清楚。
  5. 照明灯带,LED小夜灯,音乐播放,您的舒适生活由“我”来创造。
  1. 作品方案(实现思路和方案

一个1.2V-50V的可调电源,要有体积小,重量轻、智能等特点,采用模块化设计。

2.1设计思路:

采用可调电源+功能板两大类同步开发的工作模式,同步开发。

  • 可调电源
    1. 电池仓

电池仓使可调电源具有离电工作的能力,摆脱电源线。

三节18650大容量锂电池用作能源贮存,两个插针(可换其他接口)对外部设备供电,一个航模接口对可调模块供电。配备开关和工作状态指示灯。

    1. 可调电源

采用开关电源升降压方案,两路输出(可扩展)。自设印刷电路提高工作稳定性,电路中增加稳压芯片滤波电容电感。采用两组七段数码管显示各路输出电压。使用温度传感器检测工作温度。4种不同输出端口。配备保护报警电路(过压、过热、过流等)。

  • 智能板(部分)
    1. 中央处理电路

采用STC单片机处理各路输入数据并做出输出响应。

    1. 温湿度监测

DHT11数字温湿度传感器,电阻式干湿元件,NTC测温元件。

    1. PM2.5监测

GP2Y1014UOF 光学粉尘传感器。红外发光二极管+光电晶体管,通过感应空气中灰尘反射光检测空气质量。

    1. 甲醛监测

SGP30 电化学电池,通过内部器皿材料与空气气体分子发生化学反应引起电流变化,测量空气中CO2和甲醛浓度。

    1. LED灯带智能照明。

STM32+触摸感应板+LED灯带。STM32芯片中储存自设样式,用户触摸两个触摸板改变照明样式和亮度。

    1. 报警电路

STC处理器处理输入数据后,如需报警则给蜂鸣器发出信号进行警报。

   2.2集成设计

采用电路板+集成IC(已定功能)/万能版+自搭电路(正在开发功能)两种实现方案。

可调电源部分,采用第一种方案。实现更小,更轻,更稳定。将自设电路印刷在PCB板上大大增加了美观程度,减少表面线路。

多功能板采用第二种方案,方便对后续功能的开发及快速调试。

  1. 作品实现过程

          

                

细节处理:在XL6019、XL4015 VIN和GND端并联22uF电解电容增强电路稳定性;在VOUT和GND间串联10uH电感,减少输出纹波;在VOUT和GND间并联快速恢复二极管,防止输出端发生反向电压。

送电流程:将输入电源AC/DC经过整流、滤波得到一个平稳直流输入电压。控制器根据负载、输入电压等精确控制开关元件的开关时间和占空比,保证准确稳定输出电压。

输出电压经过电容电感滤波,减少高频噪声等并纯净稳定的输出电压至负载。技术总结:使用高效开关调制技术,实现高转换效率、小体积、轻量化、高性能等优势。团队结合自设电路在高效的基础上增强其输出稳定性,降低输出纹波,做到高效安全稳定。

                                

                ​​​​​​​        ​​​​​​​        

                         多输入可调电源原理图

                                电池仓原理图

                          51单片机最小系统板原理图

多功能可调电源原理可以去立创开源广场上看,我们也是仿照着佬开源的项目做的。

主要创新点

4.1 可调电源

  1. 多种输入/出方式

可调电源配备4种输入接口,任意一根线就能驱动其工作,简便易用。电源自带两路(可扩展)输出,同时对多个设备供电。

可调电源包括Type-c输入接口、航模接口、DC接口等

  1. 1.2V-50V宽直流高精无极输出

精确到小数点后两位的可调电源能满足绝大部分日用电子产品/小型实验设备以及电动机等需可变电压特殊设备的供电需求。

宽输出电压:通过可变电位器,运用开关电源原理,团队将可调电源电压输出电压扩展至1.2V-50V。配合保护电路可以在确保安全的前提下,将可调电源的输出电压扩展至1.2V-50V,满足不同设备的供电需求。

高精无极变压:团队同运用开关电源,精确控制在不同电压下的占空比,实现0.02V精度的无极调压,精确控制输出电压满足转速调整等特殊需求。

  1. 自设电路

团队自画稳压、滤波、反向电压保护等电路,在95%高转化率的基础上实现更加稳定、安全、纯净的供电输出,保护受电设备。

通过原创电路设计严格要求电路中线路的曲度,避免因内径与外径相差过大而对输出产生影响。

团队通过一系列的稳压,滤波措施,运用合适的电容(22uF)、电感实现高效滤波,运用稳压芯片,并在原本输出电路的基础上额外增加输出电压稳定性。

产品不仅由对外受电设备的保护,还有对产品本身的保护措施,如运用快速回复二极管防止外部设备破坏产品。

4.2 智能板(部分)

  1. 多彩LED照明灯带

LED灯带+STM32组合实现一条灯带多种效果,支持亮度调节、流水灯、呼吸灯、花样灯等多种照明方式。

常亮模式提供大范围照明,为用户驱散黑暗;流水灯模式则会让灯珠按照一定的顺序和频率一次亮起熄灭形成流水般的运动效果,为使用者带来无限的活力;呼吸灯则会让灯带的亮度逐渐亮起、熄灭,像呼吸一样,让使用者放松身心;花样灯是指灯带能显示不同颜色和图案,为生活增添一份乐趣。

  1. PM2.5粉尘监测

产品具有GP2Y1014AUOF光学粉尘传感器,能够通过光学传感系统来感应灰尘,检测空气中的灰尘颗粒,并测量空气质量,做出报警动作。

  1. CO2、甲醛监测

产品具有SGP30室内空气质量监测器,使用电化学技术测量室内CO2和可挥发有机物浓度,做出报警动作。

  1. MP3音乐播放

产品具有MP3解码模块及扬声器,可以通过Micro SD卡储存播放的歌曲,并通过该模块播放。

团队运用音频解码芯片、控制芯片及3W扬声器组成了一个音乐播放系统,用户可以根据自身喜好播放喜欢的音乐,并通过其控制面板,进行暂停、播放等动作。

  1. LED小夜灯

团队将光敏电阻与LED结合起来,通过光敏电阻检测环境光,单片机对检测到的数据进行处理,当环境光低于一定值时激活LED小夜灯。用户可以通过其在夜间获得柔和的灯光。

  1. 作品展示与说明

  • 产品概况
    1. 电池仓

可以在没有外接电源的情况下,作为可调电源的应急供电电源,又可以直接为其他满足供电条件的用电设备进行供电。

        1. 供电插针
        2. 航模供电接口
        3. 电池仓工作开关
        4. 电池盒(可装载三节18650高容量蓄电池)
        5. 工作状态指示灯
        6. PCB顶板
        7. 支撑铜柱(可拆卸)

    1. 可调模块

可调电源能满足多样化的供电需求,上至50V下至1.2V的无极调压供电,能给各种不同的设备供电。

        1. 升压电压指示器
        2. 降压电压指示器
        3. 红色升压旋钮
        4. 蓝色降压旋钮
        5. 航模接口电源输入接口
        6. DC电源输入接口
        7. 笔记本电源输入接口
        8. Typec电源输入接口
        9. 升压输出插针
        10. 降压输出插针
        11. 温度信息传输导线
        12. 单片机供电导线
        13. SS856二极管
        14. 发光二极管

    1. 多功能板

多功能模块不仅能为人们带来黑暗中的光亮,还能时刻提醒人们注意时间,为使用者唱首驱散阴霾的歌……

        1. 51单片机中央控制板
        2. LCD1602显示屏
        3. 7805稳压模块
        4. DS18B20温度传感器
        5. 有源蜂鸣器
        6. 无源蜂鸣器
        7. LED小夜灯
        8. 3W音频放大器
        9. 8欧阻抗扬声器
        10. MP3解码模块
        11. 光敏电阻传感器
        12. DS1302时钟芯片模块
        13. 独立按键X4

  • 功能介绍
    1. 电池仓:

将电池仓通过供电插针、导线或航模供电接口与其他用电设备链接,打开电池仓开关,工作状态指示灯亮起,即可为其他设备供电

      1. 供电插针
        1. 通过导线将插针与其他器件进行连接直接给器件进行供电
      2. 航模供电接口
        1. 与对应的航模受电接口链接为受电电器进行供电
      3. PCB顶板与铜柱

逆时针旋开PCB顶盖上的铜柱,取下PCB顶盖

    1. 可调电源

通过多种接口与电源连接,既可作为电源,进行工作

旋转升压/降压旋钮,输出电压随即上升/下降,升压/降压电源指示其数值增大/减小。将受电设备与通过导线与升压输出插针/降压输出插针链接,既可以相应的电压为受电设备供电

      1. 航模接口电源输入接口
        1. 演示效果:将航模接口电源线公口插入航模接口电源输入接口即可通过航模接口为可调电源供电
      2. DC电源输入接口
      3. 笔记本电源输入接口
      4. Typec电源输入接口
      5. 升压输出插针
        1. 演示效果:将升压输出插针通过导线与受电设备链接,即可以相应的电压为受电设备供电
        2. 使用说明:旋转升压旋钮,调至相应电压并将导线一端插入升压输出插针,另一端插到受电设备的供电接口上
      6. 降压输出插针
      7. 温度信息传输导线
        1. 将温度信息传输导线与单片机IO口链接即可传输可调电源工作温度信息,如可调电源温度过高即进行报警。
      8. 单片机供电导线
        1. 将棕色正极供电导线插入单片机正极插针,黑色负极供电导线插入单片机负极
    1. 多功能板

多功能板可以提供多种功能小夜灯、温度显示与报警、时间显示、计时器、音乐解码与播放等

      1. 51单片机中央控制板
      2. MP3解码模块
        1. 插入存储卡,多功能板工作时,默认开始播放音乐。按下P/Mod键暂停/开始播放音乐。短按next/U++键播放下一首。长按next/U++增大音量,状态指示灯常亮。短按Prev/U—播放上一首.长安Prev/U—减小音量.
      3. 独立按键
          1. 日期编辑:按下按键一进入日期编辑模式,按下按键2切换处于编辑状态的时间单位,按下按键三增加数值,按下按键四减小数值,再次按下按键一退出日期编辑模式。
          2. 秒表模式:按键2进入秒表模式,按下按键三暂停计时,按下按键四计时清零,按下按键2返回初始界面。
          3. 蜂鸣器音乐播放:按下按键3播放音乐,再次按下停止播放
          4. 温度报警阈值编辑模式:按下按键1移动处于编辑状态的位数,按下按键2增大数值,按下按键三减小数值。

CO2数值由411变为769,蜂鸣器报警,测试通过

需要工程文件和文档请私聊我

代码区

#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"
#include "Key.h"
#include "Timer0.h"
#include "LEDandBuzz.h"
#include "wendu.h"
#include "Delay.h"
#include "dingshi.h"
#include "wendu1.h"
#include "DS18B20.h"
#include "yinyue.h"

#define DS1302_HOUR			0x84
sbit Buzzer=P3^2;
unsigned char KeyNum,MODE,TimeSetSelect,TimeSetFlashFlag,TIME;
unsigned char TC=13,TD=0,i;
unsigned char Sec,Min,Hour;
extern unsigned int code FreqTable[];
extern unsigned char FreqSelect,TH[3],TL[3];
extern float T,TE,THH,TLL;
float x,y;

void TimeShow(void)//时间显示功能
{
	DS1302_ReadTime();//读取时间
	LCD_ShowNum(1,1,DS1302_Time[0],2);//显示年
	LCD_ShowNum(1,4,DS1302_Time[1],2);//显示月
	LCD_ShowNum(1,7,DS1302_Time[2],2);//显示日
	LCD_ShowNum(2,1,DS1302_Time[3],2);//显示时
	LCD_ShowNum(2,4,DS1302_Time[4],2);//显示分
	LCD_ShowNum(2,7,DS1302_Time[5],2);//显示秒
}

void TimeSet(void)//时间设置功能
{
	if(KeyNum==2)//按键2按下
	{
		TimeSetSelect++;//设置选择位加1
		TimeSetSelect%=6;//越界清零
	}
	if(KeyNum==3)//按键3按下
	{
		DS1302_Time[TimeSetSelect]++;//时间设置位数值加1
		if(DS1302_Time[0]>99){DS1302_Time[0]=0;}//年越界判断
		if(DS1302_Time[1]>12){DS1302_Time[1]=1;}//月越界判断
		if( DS1302_Time[1]==1 || DS1302_Time[1]==3 || DS1302_Time[1]==5 || DS1302_Time[1]==7 || 
			DS1302_Time[1]==8 || DS1302_Time[1]==10 || DS1302_Time[1]==12)//日越界判断
		{
			if(DS1302_Time[2]>31){DS1302_Time[2]=1;}//大月
		}
		else if(DS1302_Time[1]==4 || DS1302_Time[1]==6 || DS1302_Time[1]==9 || DS1302_Time[1]==11)
		{
			if(DS1302_Time[2]>30){DS1302_Time[2]=1;}//小月
		}
		else if(DS1302_Time[1]==2)
		{
			if(DS1302_Time[0]%4==0)
			{
				if(DS1302_Time[2]>29){DS1302_Time[2]=1;}//闰年2月
			}
			else
			{
				if(DS1302_Time[2]>28){DS1302_Time[2]=1;}//平年2月
			}
		}
		if(DS1302_Time[3]>23){DS1302_Time[3]=0;}//时越界判断
		if(DS1302_Time[4]>59){DS1302_Time[4]=0;}//分越界判断
		if(DS1302_Time[5]>59){DS1302_Time[5]=0;}//秒越界判断
	}
	if(KeyNum==4)//按键3按下
	{
		DS1302_Time[TimeSetSelect]--;//时间设置位数值减1
		if(DS1302_Time[0]<0){DS1302_Time[0]=99;}//年越界判断
		if(DS1302_Time[1]<1){DS1302_Time[1]=12;}//月越界判断
		if( DS1302_Time[1]==1 || DS1302_Time[1]==3 || DS1302_Time[1]==5 || DS1302_Time[1]==7 || 
			DS1302_Time[1]==8 || DS1302_Time[1]==10 || DS1302_Time[1]==12)//日越界判断
		{
			if(DS1302_Time[2]<1){DS1302_Time[2]=31;}//大月
			if(DS1302_Time[2]>31){DS1302_Time[2]=1;}
		}
		else if(DS1302_Time[1]==4 || DS1302_Time[1]==6 || DS1302_Time[1]==9 || DS1302_Time[1]==11)
		{
			if(DS1302_Time[2]<1){DS1302_Time[2]=30;}//小月
			if(DS1302_Time[2]>30){DS1302_Time[2]=1;}
		}
		else if(DS1302_Time[1]==2)
		{
			if(DS1302_Time[0]%4==0)
			{
				if(DS1302_Time[2]<1){DS1302_Time[2]=29;}//闰年2月
				if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
			}
			else
			{
				if(DS1302_Time[2]<1){DS1302_Time[2]=28;}//平年2月
				if(DS1302_Time[2]>28){DS1302_Time[2]=1;}
			}
		}
		if(DS1302_Time[3]<0){DS1302_Time[3]=23;}//时越界判断
		if(DS1302_Time[4]<0){DS1302_Time[4]=59;}//分越界判断
		if(DS1302_Time[5]<0){DS1302_Time[5]=59;}//秒越界判断
	}
	//更新显示,根据TimeSetSelect和TimeSetFlashFlag判断可完成闪烁功能
	if(TimeSetSelect==0 && TimeSetFlashFlag==1){LCD_ShowString(1,1,"  ");}
	else {LCD_ShowNum(1,1,DS1302_Time[0],2);}
	if(TimeSetSelect==1 && TimeSetFlashFlag==1){LCD_ShowString(1,4,"  ");}
	else {LCD_ShowNum(1,4,DS1302_Time[1],2);}
	if(TimeSetSelect==2 && TimeSetFlashFlag==1){LCD_ShowString(1,7,"  ");}
	else {LCD_ShowNum(1,7,DS1302_Time[2],2);}
	if(TimeSetSelect==3 && TimeSetFlashFlag==1){LCD_ShowString(2,1,"  ");}
	else {LCD_ShowNum(2,1,DS1302_Time[3],2);}
	if(TimeSetSelect==4 && TimeSetFlashFlag==1){LCD_ShowString(2,4,"  ");}
	else {LCD_ShowNum(2,4,DS1302_Time[4],2);}
	if(TimeSetSelect==5 && TimeSetFlashFlag==1){LCD_ShowString(2,7,"  ");}
	else {LCD_ShowNum(2,7,DS1302_Time[5],2);}
}

void wendu_Init()
{

	if(KeyNum==1)
	{
		i++;
		i%=3;
		if(TC!=0&&TD==0)
		{
			TC++;
		}
		if(TC==0&&TD!=0)
		{
			TD++;
		}
		if(TC==15)
		{
			 TC=16;
		}
		if(TC>16)
		{
			TC=0;TD=13;			
		}
		if(TD==15)
		{
			 TD=16;
		}
		if(TD>16)
		{
			TD=0;TC=13;			
		}
		
	}
	if(KeyNum==2)
	{
		if(TC!=0)
			TH[i]++;
		if(TD!=0)
			TL[i]++;
	}
	if(KeyNum==3)
	{
		if(TC!=0)
			TH[i]--;
		if(TD!=0)
			TL[i]--;
	}

	if(TC==13 && TimeSetFlashFlag==1){LCD_ShowString(1,13," ");}
	else {LCD_ShowNum(1,13,TH[0],1);}
	if(TC==14 && TimeSetFlashFlag==1){LCD_ShowString(1,14," ");}
	else {LCD_ShowNum(1,14,TH[1],1);}
	if(TC==16 && TimeSetFlashFlag==1){LCD_ShowString(1,16," ");}
	else {LCD_ShowNum(1,16,TH[2],1);}
	if(TD==13 && TimeSetFlashFlag==1){LCD_ShowString(2,13," ");}
	else {LCD_ShowNum(2,13,TL[0],1);}
	if(TD==14 && TimeSetFlashFlag==1){LCD_ShowString(2,14," ");}
	else {LCD_ShowNum(2,14,TL[1],1);}
	if(TD==16 && TimeSetFlashFlag==1){LCD_ShowString(2,16," ");}
	else {LCD_ShowNum(2,16,TL[2],1);}


}

void main()
{
	P1_0=0;
	LCD_Init();
	DS1302_Init();
	Timer0Init();
	Timer2_Init();
	DS18B20_Init1();
	DS18B20_Init();
	dingshi_Init();
	LCD_ShowString(1,1,"  -  -  ");//静态字符初始化显示
	LCD_ShowString(2,1,"  :  :  ");
	if(DS1302_ReadByte(DS1302_HOUR))
	{
		TimeShow();
	}
	else
	{
	DS1302_SetTime();//设置时间
	}
	while(1)
	{
		LED_Init();
		Buzz();
		KeyNum=Key();//读取键码
		if(KeyNum==1)//按键1按下
		{
			if(MODE==0){MODE=1;TimeSetSelect=0;TR0=1;ET0=1;}//功能切换
			else if(MODE==1){MODE=0;DS1302_SetTime();ET0=0;TR0=0;}
		}
		if(KeyNum==2)
		{
			if(MODE==0)
			{MODE=2;}
			else if(MODE==2)
			{MODE=3;TR1=1;ET1=1;}
			else if(MODE==3)
			{MODE=0;TR1=0;ET1=0;}
		}
		if(KeyNum==3)
		{
			if(MODE==0)
			{
				MODE=4;ET2=1;
			}
			else if(MODE==4)
			{MODE=0;ET2=0;}
		
		}
		if(KeyNum==4)
		{
			if(MODE==0)
			{
				MODE=5;TR0=1;ET0=1;TimeSetFlashFlag=0;
				LCD_ShowNum(1,13,TH[0],1);
				LCD_ShowNum(1,14,TH[1],1);
				LCD_ShowNum(1,16,TH[2],1);
				LCD_ShowNum(2,13,TL[0],1);
				LCD_ShowNum(2,14,TL[1],1);
				LCD_ShowNum(2,16,TL[2],1);
				LCD_ShowChar(1,12,'+');	//显示负号
				LCD_ShowChar(2,12,'-');	//显示负号
				LCD_ShowChar(1,15,'.');		//显示小数点
				LCD_ShowChar(2,15,'.');		//显示小数点
			}
			else if(MODE==5)
			{MODE=0;TR0=0;ET0=0;}
		}
		switch(MODE)//根据不同的功能执行不同的函数
		{
			case 0:TimeShow();DS18B20_T();
			DS18B20_T1();break;
			case 1:TimeSet();DS18B20_T();
			DS18B20_T1();break;
			case 2:dingshi();DS18B20_T();
			DS18B20_T1();break;
			case 3:if(KeyNum==3){TR1=0;ET1=0;}if(KeyNum==4){TR1=0;Hour=0;Min=0;Sec=0;}dingshi();DS18B20_T();
			DS18B20_T1();break;
			case 4:yinyue();break;
			case 5:wendu_Init();break;
		}
	}
}

void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	x=TE;y=T;
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	T0Count++;
	if(T0Count>=500)//每500ms进入一次
	{
		T0Count=0;
		TimeSetFlashFlag=!TimeSetFlashFlag;//闪烁标志位取反
	}
}

void Timer1_Routine() interrupt 3
{
	static unsigned int T0Count1;
	x=TE;y=T;
	TL1 = 0x18;		//设置定时初值
	TH1 = 0xFC;		//设置定时初值
	T0Count1++;
	if(T0Count1>=1000)	//定时器分频,1s
	{
		T0Count1=0;
		Sec++;			//1秒到,Sec自增
		if(Sec>=60)
		{
			Sec=0;		//60秒到,Sec清0,Min自增
			Min++;
			if(Min>=60)
			{
				Min=0;	//60分钟到,Min清0,Hour自增
				Hour++;
				if(Hour>=24)
				{
					Hour=0;	//24小时到,Hour清0
				}
			}
		}
	}
}
void Timer2_Routine() interrupt 5
{
	if(FreqTable[FreqSelect])	//如果不是休止符
	{
		x=TE;y=T;
		/*取对应频率值的重装载值到定时器*/
		TL2 = FreqTable[FreqSelect]%256;		//设置定时初值
		TH2 = FreqTable[FreqSelect]/256;		//设置定时初值
		Buzzer=!Buzzer;	//翻转蜂鸣器IO口
		TF2=0;
	}
}

//以下代码请建立其他.c文件和.h文件方可使用!!!
//以下代码请建立其他.c文件和.h文件方可使用!!!
//以下代码请建立其他.c文件和.h文件方可使用!!!
//以下代码请建立其他.c文件和.h文件方可使用!!!
//以下代码请建立其他.c文件和.h文件方可使用!!!
//以下代码请建立其他.c文件和.h文件方可使用!!!


//LCD1602.H 代码 
//#ifndef __LCD1602_H__
//#define __LCD1602_H__

用户调用函数:
//void LCD_Init();
//void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
//void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
//void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
//void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
//void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
//void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);

//#endif

//LCD1602.c 代码 
//#include <REGX52.H>

引脚配置:
//sbit LCD_RS=P2^6;
//sbit LCD_RW=P2^5;
//sbit LCD_EN=P2^7;
//#define LCD_DataPort P0

函数定义:
///**
//  * @brief  LCD1602延时函数,12MHz调用可延时1ms
//  * @param  无
//  * @retval 无
//  */
//void LCD_Delay()
//{
//	unsigned char i, j;

//	i = 2;
//	j = 239;
//	do
//	{
//		while (--j);
//	} while (--i);
//}

///**
//  * @brief  LCD1602写命令
//  * @param  Command 要写入的命令
//  * @retval 无
//  */
//void LCD_WriteCommand(unsigned char Command)
//{
//	LCD_RS=0;
//	LCD_RW=0;
//	LCD_DataPort=Command;
//	LCD_EN=1;
//	LCD_Delay();
//	LCD_EN=0;
//	LCD_Delay();
//}

///**
//  * @brief  LCD1602写数据
//  * @param  Data 要写入的数据
//  * @retval 无
//  */
//void LCD_WriteData(unsigned char Data)
//{
//	LCD_RS=1;
//	LCD_RW=0;
//	LCD_DataPort=Data;
//	LCD_EN=1;
//	LCD_Delay();
//	LCD_EN=0;
//	LCD_Delay();
//}

///**
//  * @brief  LCD1602设置光标位置
//  * @param  Line 行位置,范围:1~2
//  * @param  Column 列位置,范围:1~16
//  * @retval 无
//  */
//void LCD_SetCursor(unsigned char Line,unsigned char Column)
//{
//	if(Line==1)
//	{
//		LCD_WriteCommand(0x80|(Column-1));
//	}
//	else if(Line==2)
//	{
//		LCD_WriteCommand(0x80|(Column-1+0x40));
//	}
//}

///**
//  * @brief  LCD1602初始化函数
//  * @param  无
//  * @retval 无
//  */
//void LCD_Init()
//{
//	LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
//	LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关
//	LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动
//	LCD_WriteCommand(0x01);//光标复位,清屏
//}

///**
//  * @brief  在LCD1602指定位置上显示一个字符
//  * @param  Line 行位置,范围:1~2
//  * @param  Column 列位置,范围:1~16
//  * @param  Char 要显示的字符
//  * @retval 无
//  */
//void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
//{
//	LCD_SetCursor(Line,Column);
//	LCD_WriteData(Char);
//}

///**
//  * @brief  在LCD1602指定位置开始显示所给字符串
//  * @param  Line 起始行位置,范围:1~2
//  * @param  Column 起始列位置,范围:1~16
//  * @param  String 要显示的字符串
//  * @retval 无
//  */
//void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
//{
//	unsigned char i;
//	LCD_SetCursor(Line,Column);
//	for(i=0;String[i]!='\0';i++)
//	{
//		LCD_WriteData(String[i]);
//	}
//}

///**
//  * @brief  返回值=X的Y次方
//  */
//int LCD_Pow(int X,int Y)
//{
//	unsigned char i;
//	int Result=1;
//	for(i=0;i<Y;i++)
//	{
//		Result*=X;
//	}
//	return Result;
//}

///**
//  * @brief  在LCD1602指定位置开始显示所给数字
//  * @param  Line 起始行位置,范围:1~2
//  * @param  Column 起始列位置,范围:1~16
//  * @param  Number 要显示的数字,范围:0~65535
//  * @param  Length 要显示数字的长度,范围:1~5
//  * @retval 无
//  */
//void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
//{
//	unsigned char i;
//	LCD_SetCursor(Line,Column);
//	for(i=Length;i>0;i--)
//	{
//		LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');
//	}
//}

///**
//  * @brief  在LCD1602指定位置开始以有符号十进制显示所给数字
//  * @param  Line 起始行位置,范围:1~2
//  * @param  Column 起始列位置,范围:1~16
//  * @param  Number 要显示的数字,范围:-32768~32767
//  * @param  Length 要显示数字的长度,范围:1~5
//  * @retval 无
//  */
//void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
//{
//	unsigned char i;
//	unsigned int Number1;
//	LCD_SetCursor(Line,Column);
//	if(Number>=0)
//	{
//		LCD_WriteData('+');
//		Number1=Number;
//	}
//	else
//	{
//		LCD_WriteData('-');
//		Number1=-Number;
//	}
//	for(i=Length;i>0;i--)
//	{
//		LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');
//	}
//}

///**
//  * @brief  在LCD1602指定位置开始以十六进制显示所给数字
//  * @param  Line 起始行位置,范围:1~2
//  * @param  Column 起始列位置,范围:1~16
//  * @param  Number 要显示的数字,范围:0~0xFFFF
//  * @param  Length 要显示数字的长度,范围:1~4
//  * @retval 无
//  */
//void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
//{
//	unsigned char i,SingleNumber;
//	LCD_SetCursor(Line,Column);
//	for(i=Length;i>0;i--)
//	{
//		SingleNumber=Number/LCD_Pow(16,i-1)%16;
//		if(SingleNumber<10)
//		{
//			LCD_WriteData(SingleNumber+'0');
//		}
//		else
//		{
//			LCD_WriteData(SingleNumber-10+'A');
//		}
//	}
//}

///**
//  * @brief  在LCD1602指定位置开始以二进制显示所给数字
//  * @param  Line 起始行位置,范围:1~2
//  * @param  Column 起始列位置,范围:1~16
//  * @param  Number 要显示的数字,范围:0~1111 1111 1111 1111
//  * @param  Length 要显示数字的长度,范围:1~16
//  * @retval 无
//  */
//void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
//{
//	unsigned char i;
//	LCD_SetCursor(Line,Column);
//	for(i=Length;i>0;i--)
//	{
//		LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');
//	}
//}

//DS1302.H
//#ifndef __DS1302_H__
//#define __DS1302_H__

外部可调用时间数组,索引0~6分别为年、月、日、时、分、秒、星期,设置为有符号的便于<0的判断
//extern char DS1302_Time[];

//void DS1302_Init(void);
//void DS1302_WriteByte(unsigned char Command,Data);
//unsigned char DS1302_ReadByte(unsigned char Command);
//void DS1302_SetTime(void);
//void DS1302_ReadTime(void);

//#endif

//DS1302.C
//#include <REGX52.H>

引脚定义
//sbit DS1302_SCLK=P2^2;
//sbit DS1302_IO=P2^1;
//sbit DS1302_CE=P2^0;

寄存器写入地址/指令定义
//#define DS1302_SECOND		0x80
//#define DS1302_MINUTE		0x82
//#define DS1302_HOUR			0x84
//#define DS1302_DATE			0x86
//#define DS1302_MONTH		0x88
//#define DS1302_DAY			0x8A
//#define DS1302_YEAR			0x8C
//#define DS1302_WP			0x8E

时间数组,索引0~6分别为年、月、日、时、分、秒、星期,设置为有符号的便于<0的判断
//char DS1302_Time[]={23,4,1,13,49,0,0};

///**
//  * @brief  DS1302初始化
//  * @param  无
//  * @retval 无
//  */
//void DS1302_Init(void)
//{
//	DS1302_CE=0;
//	DS1302_SCLK=0;
//}

///**
//  * @brief  DS1302写一个字节
//  * @param  Command 命令字/地址
//  * @param  Data 要写入的数据
//  * @retval 无
//  */
//void DS1302_WriteByte(unsigned char Command,Data)
//{
//	unsigned char i;
//	DS1302_CE=1;
//	for(i=0;i<8;i++)
//	{
//		DS1302_IO=Command&(0x01<<i);
//		DS1302_SCLK=1;
//		DS1302_SCLK=0;
//	}
//	for(i=0;i<8;i++)
//	{
//		DS1302_IO=Data&(0x01<<i);
//		DS1302_SCLK=1;
//		DS1302_SCLK=0;
//	}
//	DS1302_CE=0;
//}

///**
//  * @brief  DS1302读一个字节
//  * @param  Command 命令字/地址
//  * @retval 读出的数据
//  */
//unsigned char DS1302_ReadByte(unsigned char Command)
//{
//	unsigned char i,Data=0x00;
//	Command|=0x01;	//将指令转换为读指令
//	DS1302_CE=1;
//	for(i=0;i<8;i++)
//	{
//		DS1302_IO=Command&(0x01<<i);
//		DS1302_SCLK=0;
//		DS1302_SCLK=1;
//	}
//	for(i=0;i<8;i++)
//	{
//		DS1302_SCLK=1;
//		DS1302_SCLK=0;
//		if(DS1302_IO){Data|=(0x01<<i);}
//	}
//	DS1302_CE=0;
//	DS1302_IO=0;	//读取后将IO设置为0,否则读出的数据会出错
//	return Data;
//}

///**
//  * @brief  DS1302设置时间,调用之后,DS1302_Time数组的数字会被设置到DS1302中
//  * @param  无
//  * @retval 无
//  */
//void DS1302_SetTime(void)
//{
//	DS1302_WriteByte(DS1302_WP,0x00);
//	DS1302_WriteByte(DS1302_YEAR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);//十进制转BCD码后写入
//	DS1302_WriteByte(DS1302_MONTH,DS1302_Time[1]/10*16+DS1302_Time[1]%10);
//	DS1302_WriteByte(DS1302_DATE,DS1302_Time[2]/10*16+DS1302_Time[2]%10);
//	DS1302_WriteByte(DS1302_HOUR,DS1302_Time[3]/10*16+DS1302_Time[3]%10);
//	DS1302_WriteByte(DS1302_MINUTE,DS1302_Time[4]/10*16+DS1302_Time[4]%10);
//	DS1302_WriteByte(DS1302_SECOND,DS1302_Time[5]/10*16+DS1302_Time[5]%10);
//	DS1302_WriteByte(DS1302_DAY,DS1302_Time[6]/10*16+DS1302_Time[6]%10);
//	DS1302_WriteByte(DS1302_WP,0x80);
//}

///**
//  * @brief  DS1302读取时间,调用之后,DS1302中的数据会被读取到DS1302_Time数组中
//  * @param  无
//  * @retval 无
//  */
//void DS1302_ReadTime(void)
//{
//	unsigned char Temp;
//	Temp=DS1302_ReadByte(DS1302_YEAR);
//	DS1302_Time[0]=Temp/16*10+Temp%16;//BCD码转十进制后读取
//	Temp=DS1302_ReadByte(DS1302_MONTH);
//	DS1302_Time[1]=Temp/16*10+Temp%16;
//	Temp=DS1302_ReadByte(DS1302_DATE);
//	DS1302_Time[2]=Temp/16*10+Temp%16;
//	Temp=DS1302_ReadByte(DS1302_HOUR);
//	DS1302_Time[3]=Temp/16*10+Temp%16;
//	Temp=DS1302_ReadByte(DS1302_MINUTE);
//	DS1302_Time[4]=Temp/16*10+Temp%16;
//	Temp=DS1302_ReadByte(DS1302_SECOND);
//	DS1302_Time[5]=Temp/16*10+Temp%16;
//	Temp=DS1302_ReadByte(DS1302_DAY);
//	DS1302_Time[6]=Temp/16*10+Temp%16;
//}


//DELAY.H
//#ifndef __DELAY_H__
//#define __DELAY_H__

//void Delay(unsigned int xms);

//#endif


//DELAY.C
//void Delay(unsigned int xms)
//{
//	unsigned char i, j;
//	while(xms--)
//	{
//		i = 2;
//		j = 239;
//		do
//		{
//			while (--j);
//		} while (--i);
//	}
//}


//KEY.H
//#ifndef __KEY_H__
//#define __KEY_H__

//unsigned char Key();

//#endif

//KEY.C
//#include <REGX52.H>
//#include "Delay.h"

///**
//  * @brief  获取独立按键键码
//  * @param  无
//  * @retval 按下按键的键码,范围:0~4,无按键按下时返回值为0
//  */
//unsigned char Key()
//{
//	unsigned char KeyNumber=0;
//	
//	if(P3_7==0){Delay(20);while(P3_7==0);Delay(20);KeyNumber=1;}
//	if(P3_6==0){Delay(20);while(P3_6==0);Delay(20);KeyNumber=2;}
//	if(P3_5==0){Delay(20);while(P3_5==0);Delay(20);KeyNumber=3;}
//	if(P3_4==0){Delay(20);while(P3_4==0);Delay(20);KeyNumber=4;}
//	
//	return KeyNumber;
//}



//TIMER.H
//#ifndef __TIMER0_H__
//#define __TIMER0_H__

//void Timer0Init(void);
//void Timer1Init();
//void Timer2_Init(void);
//#endif


//TIMER.C
//#include <REGX52.H>

///**
//  * @brief  定时器0初始化,1毫秒@12.000MHz
//  * @param  无
//  * @retval 无
//  */
//void Timer0Init(void)
//{
//	TMOD &= 0xF0;		//设置定时器模式
//	TMOD |= 0x01;		//设置定时器模式
//	TL0 = 0x66;		//设置定时初值
//	TH0 = 0xFC;		//设置定时初值
//	TF0 = 0;		//清除TF0标志
//	TR0 = 0;		//定时器0开始计时
//	ET0=0;
//	EA=1;
//	PT0=1;
//}

//void Timer1Init(void)
//{
//	TMOD &= 0x0F;		
//	TMOD |= 0x10;		
//	TL1 = 0x66;		
//	TH1 = 0xFC;		
//	TF1 = 0;		
//	TR1 = 0;
//	ET1=0;
//	EA=1;
//	PT1=0;
//}

//void Timer2_Init(void)        
//{
//    T2MOD = 0;    //初始化模式寄存器
//    T2CON = 0;    //初始化控制寄存器
//    TL2 = 0x66;    //设置定时初值
//    TH2 = 0xFC;    //设置定时初值
//    ET2=0;
//    EA=1;
//    PT2=0;
//    TR2=0;        //定时器2开始计时
//}
///*定时器中断函数模板
//void Timer0_Routine() interrupt 1
//{
//	static unsigned int T0Count;
//	TL0 = 0x18;		//设置定时初值
//	TH0 = 0xFC;		//设置定时初值
//	T0Count++;
//	if(T0Count>=1000)
//	{
//		T0Count=0;
//		
//	}
//}
//*/


//DS18B20.H
//#ifndef __DS18B20_H__
//#define __DS18B20_H__

//void DS18B20_ConvertT(void);
//float DS18B20_ReadT(void);

//#endif

//DS18B20.C
//#include <REGX52.H>
//#include "OneWire.h"

DS18B20指令
//#define DS18B20_SKIP_ROM			0xCC
//#define DS18B20_CONVERT_T			0x44
//#define DS18B20_READ_SCRATCHPAD 	0xBE

///**
//  * @brief  DS18B20开始温度变换
//  * @param  无
//  * @retval 无
//  */
//void DS18B20_ConvertT(void)
//{
//	OneWire_Init();
//	OneWire_SendByte(DS18B20_SKIP_ROM);
//	OneWire_SendByte(DS18B20_CONVERT_T);
//}

///**
//  * @brief  DS18B20读取温度
//  * @param  无
//  * @retval 温度数值
//  */
//float DS18B20_ReadT(void)
//{
//	unsigned char TLSB,TMSB;
//	int Temp;
//	float T;
//	OneWire_Init();
//	OneWire_SendByte(DS18B20_SKIP_ROM);
//	OneWire_SendByte(DS18B20_READ_SCRATCHPAD);
//	TLSB=OneWire_ReceiveByte();
//	TMSB=OneWire_ReceiveByte();
//	Temp=(TMSB<<8)|TLSB;
//	T=Temp/16.0;
//	return T;
//}


//OneWire.h
//#ifndef __ONEWIRE_H__
//#define __ONEWIRE_H__

//unsigned char OneWire_Init(void);

//void OneWire_SendByte(unsigned char temp);
//unsigned char OneWire_ReceiveByte(void);

//#endif

//OneWire.c
//#include <REGX52.H>

引脚定义
//sbit OneWire_DQ=P1^2;

///**
//  * @brief  单总线初始化
//  * @param  无
//  * @retval 从机响应位,0为响应,1为未响应
//  */
//unsigned char OneWire_Init(void)
//{
//	unsigned char i;
//	unsigned char AckBit;
//	OneWire_DQ=1;
//	OneWire_DQ=0;
//	i =230;while (--i);		//Delay 500us
//	OneWire_DQ=1;
//	i = 32;while (--i);			//Delay 70us
//	AckBit=OneWire_DQ;
//	i = 230;while (--i);		//Delay 500us
//	return AckBit;
//}

///**
//  * @brief  单总线发送一位
//  * @param  Bit 要发送的位
//  * @retval 无
//  */
//void OneWire_SendBit(unsigned char Bit)
//{
//	unsigned char i;
//	OneWire_DQ=0;
//	i = 4;while (--i);			//Delay 10us
//	OneWire_DQ=Bit;
//	i = 22;while (--i);			//Delay 50us
//	OneWire_DQ=1;
//}

///**
//  * @brief  单总线接收一位
//  * @param  无
//  * @retval 读取的位
//  */
//unsigned char OneWire_ReceiveBit(void)
//{
//	unsigned char i;
//	unsigned char Bit;
//	OneWire_DQ=0;
//	i = 2;while (--i);			//Delay 5us
//	OneWire_DQ=1;
//	i = 2;while (--i);			//Delay 5us
//	Bit=OneWire_DQ;
//	i = 22;while (--i);			//Delay 50us
//	return Bit;
//}

///**
//  * @brief  单总线发送一个字节
//  * @param  Byte 要发送的字节
//  * @retval 无
//  */
//void OneWire_SendByte(unsigned char Byte)
//{
//	unsigned char i;
//	for(i=0;i<8;i++)
//	{
//		OneWire_SendBit(Byte&(0x01<<i));
//	}
//}

///**
//  * @brief  单总线接收一个字节
//  * @param  无
//  * @retval 接收的一个字节
//  */
//unsigned char OneWire_ReceiveByte(void)
//{
//	unsigned char i;
//	unsigned char Byte=0x00;
//	for(i=0;i<8;i++)
//	{
//		if(OneWire_ReceiveBit()){Byte|=(0x01<<i);}
//	}
//	return Byte;
//}


//wendu.h
//#ifndef  __WENDU_h__
//#define  __WENDU_h__

//void DS18B20_Init();
//void DS18B20_T();

//#endif

//wendu.c
//#include <REGX52.H>
//#include "LCD1602.h"
//#include "DS18B20.h"
//#include "Delay.h"

//float T;
//extern float x,y;


//void DS18B20_Init()
//{
//	DS18B20_ConvertT();		//上电先转换一次温度,防止第一次读数据错误
//	Delay(1000);			//等待转换完成
//	
//}
//void DS18B20_T()
//{
//	if(x==0&&y==0)
//	{
//		DS18B20_ConvertT();	//转换温度
//		T=DS18B20_ReadT();	//读取温度
//		if(T<0)				//如果温度小于0
//		{
//			LCD_ShowChar(2,12,'-');	//显示负号
//			T=-T;			//将温度变为正数
//		}
//		else				//如果温度大于等于0
//		{
//			LCD_ShowChar(2,12,'+');	//显示正号
//		}
//		LCD_ShowNum(2,13,T,2);		//显示温度整数部分
//		LCD_ShowChar(2,15,'.');		//显示小数点
//		LCD_ShowNum(2,16,(unsigned long)(T*10000)%10000,4);//显示温度小数部分
//	}
//	else
//	{
//		if(y<0)				//如果温度小于0
//		{
//			LCD_ShowChar(2,12,'-');	//显示负号
//			y=-y;			//将温度变为正数
//		}
//		else				//如果温度大于等于0
//		{
//			LCD_ShowChar(2,12,'+');	//显示正号
//		}
//		LCD_ShowNum(2,13,y,2);		//显示温度整数部分
//		LCD_ShowChar(2,15,'.');		//显示小数点
//		LCD_ShowNum(2,16,(unsigned long)(y*10000)%10000,4);//显示温度小数部分
//		y=0;
//	}
//	
//}

//LEDandBuzzer.h
//#ifndef  __LEDandBuzz_h__
//#define  __LEDandBuzz_h__

//void LED_Init();
//void Buzz();
//#endif

//LEDandBuzzer.c
//#include <REGX52.H>
//#include "Delay.h"
//#define LED   P1_0

//extern float T;
//unsigned char TH[3]={4,5,3},TL[3]={2,0,2};
//float THH,TLL;
//void LED_Init()
//{
//	if(P2_4==0)
//	{
//		LED=0;
//	}
//	else
//	{
//		LED=1;
//	
//	}
//}

//void Buzz()
//{
//	THH=TH[0]*10+TH[1]+TH[2]/10.0;
//	TLL=TL[0]*10+TL[1]+TL[2]/10.0;
//	if(T<125&&T>-55)
//	{
//		if((T>THH)||(T<-TLL))
//		{
//			P2_3=0;
//			Delay(50);
//			P2_3=1;
//			Delay(50);
//		}
//		else
//		{
//			P2_3=1;
//		}
//	}

//}


//dingshi.h
//#ifndef  __dingshi_h__
//#define  __dingshi_h__

//void dingshi_Init();
//void dingshi();
//#endif


//dingshi.c
//#include <REGX52.H>
//#include "LCD1602.h"
//#include "Timer0.h"
//extern unsigned char Sec,Min,Hour;

//void dingshi_Init()
//{
//	Timer1Init();	
//	LCD_ShowString(1,1,"Clock:");	//上电显示静态字符串
//	LCD_ShowString(2,1,"  :  :");
//}
//void dingshi()
//	{
//		LCD_ShowNum(2,1,Hour,2);	//显示时分秒
//		LCD_ShowNum(2,4,Min,2);
//		LCD_ShowNum(2,7,Sec,2);
//	}


//DS18B20-1.H
//#ifndef __DS18B20_H__
//#define __DS18B20_H__

//void DS18B20_ConvertT1(void);
//float DS18B20_ReadT1(void);

//#endif

//DS18B20-1.C
//#include <REGX52.H>
//#include "OneWire1.h"

DS18B20指令
//#define DS18B20_SKIP_ROM			0xCC
//#define DS18B20_CONVERT_T			0x44
//#define DS18B20_READ_SCRATCHPAD 	0xBE

///**
//  * @brief  DS18B20开始温度变换
//  * @param  无
//  * @retval 无
//  */
//void DS18B20_ConvertT1(void)
//{
//	OneWire_Init1();
//	OneWire_SendByte1(DS18B20_SKIP_ROM);
//	OneWire_SendByte1(DS18B20_CONVERT_T);
//}

///**
//  * @brief  DS18B20读取温度
//  * @param  无
//  * @retval 温度数值
//  */
//float DS18B20_ReadT1(void)
//{
//	unsigned char TLSB,TMSB;
//	int Temp;
//	float T1;
//	OneWire_Init1();
//	OneWire_SendByte1(DS18B20_SKIP_ROM);
//	OneWire_SendByte1(DS18B20_READ_SCRATCHPAD);
//	TLSB=OneWire_ReceiveByte1();
//	TMSB=OneWire_ReceiveByte1();
//	Temp=(TMSB<<8)|TLSB;
//	T1=Temp/16.0;
//	return T1;
//}


//OneWire1.h
//#ifndef __ONEWIRE_H__
//#define __ONEWIRE_H__

//unsigned char OneWire_Init1(void);

//void OneWire_SendByte1(unsigned char temp);
//unsigned char OneWire_ReceiveByte1(void);

//#endif

//OneWire1.c
//#include <REGX52.H>

引脚定义
//sbit OneWire_DQ=P1^1;

///**
//  * @brief  单总线初始化
//  * @param  无
//  * @retval 从机响应位,0为响应,1为未响应
//  */
//unsigned char OneWire_Init1(void)
//{
//	unsigned char i;
//	unsigned char AckBit;
//	OneWire_DQ=1;
//	OneWire_DQ=0;
//	i =230;while (--i);		//Delay 500us
//	OneWire_DQ=1;
//	i = 32;while (--i);			//Delay 70us
//	AckBit=OneWire_DQ;
//	i = 230;while (--i);		//Delay 500us
//	return AckBit;
//}

///**
//  * @brief  单总线发送一位
//  * @param  Bit 要发送的位
//  * @retval 无
//  */
//void OneWire_SendBit1(unsigned char Bit)
//{
//	unsigned char i;
//	OneWire_DQ=0;
//	i = 4;while (--i);			//Delay 10us
//	OneWire_DQ=Bit;
//	i = 22;while (--i);			//Delay 50us
//	OneWire_DQ=1;
//}

///**
//  * @brief  单总线接收一位
//  * @param  无
//  * @retval 读取的位
//  */
//unsigned char OneWire_ReceiveBit1(void)
//{
//	unsigned char i;
//	unsigned char Bit;
//	OneWire_DQ=0;
//	i = 2;while (--i);			//Delay 5us
//	OneWire_DQ=1;
//	i = 2;while (--i);			//Delay 5us
//	Bit=OneWire_DQ;
//	i = 22;while (--i);			//Delay 50us
//	return Bit;
//}

///**
//  * @brief  单总线发送一个字节
//  * @param  Byte 要发送的字节
//  * @retval 无
//  */
//void OneWire_SendByte1(unsigned char Byte)
//{
//	unsigned char i;
//	for(i=0;i<8;i++)
//	{
//		OneWire_SendBit1(Byte&(0x01<<i));
//	}
//}

///**
//  * @brief  单总线接收一个字节
//  * @param  无
//  * @retval 接收的一个字节
//  */
//unsigned char OneWire_ReceiveByte1(void)
//{
//	unsigned char i;
//	unsigned char Byte=0x00;
//	for(i=0;i<8;i++)
//	{
//		if(OneWire_ReceiveBit1()){Byte|=(0x01<<i);}
//	}
//	return Byte;
//}


//wendu1.h
//#ifndef  __WENDU1_h__
//#define  __WENDU1_h__

//void DS18B20_Init1();
//void DS18B20_T1();

//#endif

//wendu1.c
//#include <REGX52.H>
//#include "LCD1602.h"
//#include "DS18B20-1.h"
//#include "Delay.h"

//float TE;
//extern float x,y;

//void DS18B20_Init1()
//{
//	DS18B20_ConvertT1();		//上电先转换一次温度,防止第一次读数据错误
//	Delay(1000);			//等待转换完成
//	LCD_ShowString(1,10,"T:");
//	LCD_ShowString(2,10,"T:");
//}
//void DS18B20_T1()
//{
//	if(x==0&&y==0)
//	{
//		DS18B20_ConvertT1();	//转换温度
//		TE=DS18B20_ReadT1();	//读取温度
//		if(TE<0)				//如果温度小于0
//		{
//			LCD_ShowChar(1,12,'-');	//显示负号
//			TE=-TE;			//将温度变为正数
//		}
//		else				//如果温度大于等于0
//		{
//			LCD_ShowChar(1,12,'+');	//显示正号
//		}
//		LCD_ShowNum(1,13,TE,2);		//显示温度整数部分
//		LCD_ShowChar(1,15,'.');		//显示小数点
//		LCD_ShowNum(1,16,(unsigned long)(TE*10000)%10000,4);//显示温度小数部分
//	}
//	else
//	{
//			if(x<0)				//如果温度小于0
//		{
//			LCD_ShowChar(1,12,'-');	//显示负号
//			x=-x;			//将温度变为正数
//		}
//		else				//如果温度大于等于0
//		{
//			LCD_ShowChar(1,12,'+');	//显示正号
//		}
//		LCD_ShowNum(1,13,x,2);		//显示温度整数部分
//		LCD_ShowChar(1,15,'.');		//显示小数点
//		LCD_ShowNum(1,16,(unsigned long)(x*10000)%10000,4);//显示温度小数部分
//		x=0;
//	}
//	
//}


//yinyue.h
//#ifndef  __YINYUE_h__
//#define  __YINYUE_h__

//void yinyue();

//#endif


//yinyue.c
//#include <REGX52.H>
//#include "Delay.h"
蜂鸣器端口定义
//sbit Buzzer=P3^2;

播放速度,值为四分音符的时长(ms)
//#define SPEED	500

音符与索引对应表,P:休止符,L:低音,M:中音,H:高音,下划线:升半音符号#
//#define P	0
//#define L1	1
//#define L1_	2
//#define L2	3
//#define L2_	4
//#define L3	5
//#define L4	6
//#define L4_	7
//#define L5	8
//#define L5_	9
//#define L6	10
//#define L6_	11
//#define L7	12
//#define M1	13
//#define M1_	14
//#define M2	15
//#define M2_	16
//#define M3	17
//#define M4	18
//#define M4_	19
//#define M5	20
//#define M5_	21
//#define M6	22
//#define M6_	23
//#define M7	24
//#define H1	25
//#define H1_	26
//#define H2	27
//#define H2_	28
//#define H3	29
//#define H4	30
//#define H4_	31
//#define H5	32
//#define H5_	33
//#define H6	34
//#define H6_	35
//#define H7	36

索引与频率对照表
//unsigned int code FreqTable[]={
//	0,
//	63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,
//	64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,
//	65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283,
//};

乐谱
//unsigned char code Music[]={
//	//音符,时值,
//	M2,2,
//	L7,2,
//	M1,2,
//	L6,2,
//	M2,2,
//	L7,2,
//	M1,2,
//	L6,2,
//	
//	M2,2,
//	L7,2,
//	M1,2,
//	L6,2,
//	M2,2,
//	L7,2,
//	M1,2,
//	L6,2,
//	
//	M2,2,
//	L7,2,
//	M1,2,
//	L6,2,
//	M2,2,
//	L7,2,
//	M1,2,
//	L6,2,
//	
//	M2,2,
//	L7,2,
//	M1,2,
//	L6,2,
//	M2,2,
//	L7,2,
//	M1,2,
//	L6,2,
//	
//	M2,2,
//	L7,2,
//	M1,2,
//	L6,2,
//	M2,2,
//	L7,2,
//	M1,2,
//	L6,2,
//	
//  M3,4+4,
//	P,4,
//	P,1,
//	M1,1,
//	M2,1,
//	M1,1,
//	
//	M3,4+4,
//	P,3,
//	M2,1,
//	M1,1,
//	M2,1,
//	M3,1,
//	
//	L6,3,
//	M1,1,
//	L6,3,
//	M1,1,
//	L6,3,
//	M1,1,
//	M2,2,
//	M1,2,
//	
//	L7,4+4,
//	P,4,
//	P,4,
//	
//	M3,4+4,
//	P,4,
//	P,1,
//	M1,1,
//	M2,1,
//	M1,1,
//	
//	M3,4+4,
//	P,3,
//	M2,1,
//	M1,1,
//	M2,1,
//	M3,1,
//	
//	

//	


//	
//	
//	0xFF	//终止标志
//};



//unsigned char FreqSelect,MusicSelect,MusicSelect1;

//void yinyue()
//{
//		if(Music[MusicSelect]!=0xFF)	//如果不是停止标志位
//		{
//			FreqSelect=Music[MusicSelect];	//选择音符对应的频率
//			MusicSelect++;
//			Delay(SPEED/4*Music[MusicSelect]);	//选择音符对应的时值
//			MusicSelect++;
//			TR2=0;
//			Delay(1);	//音符间短暂停顿
//			TR2=1;
//		}
//		else
//		{
//		TR2=0;
//		}
//}

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一月千帆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值