基于51单片机的电子万年历设计毕业论文设计 联系客服

发布时间 : 星期二 文章基于51单片机的电子万年历设计毕业论文设计更新完毕开始阅读847fed9c32d4b14e852458fb770bf78a64293a14

附录

电路原理图:

设计主程序:

/*

* 万年历 */

#include \#include \#include \#include \

#include \#include \

TIME time, tmp_time; ALARM alarm; bit Alarm_flag=0; bit Clock_flag=0; bit flag=0;

sbit DQ=P2^6; //DS18B20 pin

//-----------------18B20-----------------------

unsigned char L_18B20,H_18B20,zhengshu,shangwen,xiawen; unsigned int fg=0,xiaoshu_a;

//-----------------18B20---------------------- //-------------音乐----------------------------- uint8 code SONG_TONE[]= { 212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,129,169,190,119,119,126,159,142,159,0 };

uint8 code SONG_LONG[]= {

9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0 };

//------------------------------------------------------------

void delay(uint16 n) { while (n--); }

//************************************************************************/ // 函数: LCD_Delay() // 描述: 延时t ms函数 // 参数: t // 返回: 无

// 备注: 11.0592MHZ t=1延时时间约1ms // 版本: 2011/01/01 First version

//************************************************************************/ void Delay_nms(unsigned int t) { unsigned int i,j; for(i=0;i

}

/////////////////////////////////////////////////

//-----------播放音乐---------------------------- void PlayMusic() {

uint16 i =0,j,k; while(SONG_LONG[i]!=0||SONG_TONE[i]!=0) { for(j=0;j

///////////////////////////////////////////////// /*------DS18B20------*/

void delay_18B20(unsigned int i) { while(i--); }

/*DS18B20的复位脉冲 主机通过拉低单总线至少480us以产生复位脉冲 然后主机释放单总线并进入接收模式 此时单总线电平被拉高

DS18B20检测到上升沿后 延时15~60us,拉低总线60~240us产生应答脉冲 */ void Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ复位 delay_18B20(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay_18B20(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay_18B20(14); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20); }

/*写时隙 主机在写1时隙向DS18B20写入1,在写0时隙向DS18B20写入0 所有写时隙至少需要60us,且在两次写时隙之间至少需要1us的恢复时间 两种写时隙均以主机拉低总线开始

产生写1时隙:主机拉低总线后,必须在15us内释放总线,由上拉电阻拉回至高电平 产生写0时隙:主机拉低总线后,必须整个时隙保持低电平 */ void WriteOneChar(unsigned char dat) {

unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat>>=1; } }

/*所有读时隙至少60us 且两次独立的读时隙之间至少需要1us的恢复时间 每次读时隙由主机发起,拉低总线至少1us。

若传1,则保持总线高电平;若发送0,则拉低总线

传0时DS18B20在该时隙结束时释放总线,再拉回高电平状态,主机必须在读时隙开始后的15us内释放总线,并保持采样总线状态 */ unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4); }

return(dat); }

void read_18B20(void) { Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换