基于51单片机的电子万年历毕业论文设计 下载本文

//-----------播放音乐---------------------------- 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)

3

{

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); // 启动温度转换 delay_18B20(100); // this message is wery important Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作

4

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 delay_18B20(100); L_18B20=ReadOneChar(); //读取低八位数据 H_18B20=ReadOneChar(); //读取高八位数据 zhengshu=L_18B20/16+H_18B20*16; //整数部分 xiaoshu_a=(L_18B20&0x0f)*10/16; //小数第一位 }

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

* 按键扫描 */

int8 scan_key(void) { int8 val=-1; if (KeyIn1 == 0) { val = 1; while (KeyIn1 == 0); } else if (KeyIn2 == 0) { val = 2; while (KeyIn2 == 0); } else if (KeyIn3 == 0) { val = 3; while (KeyIn3 == 0); } //if (val > 0) //buzzer_sound(); return val; } /*

* 主界面框架 */

void main_frame(void)

5

{ play32(80, 2, 10); play32(32, 2, 10); play8(16, 0, S_xie); play8(40, 0, S_xie); // play8(96, 0, RH);

// play8(120, 0, S_percent); play8(120, 6, S_du); } /*

* 主界面 */

void main_show(bit refresh) {

uint8 lunar[2]; if (refresh) read_time((uint8 *)&time); // 时间 if (refresh || (time.sec != tmp_time.sec)) // 秒更新 { tmp_time.sec = time.sec; // 温湿度

play8_num(104, 6,zhengshu); //温度显示 play32_num(96, 2, time.sec); } if (refresh) main_frame(); if (refresh || (time.min != tmp_time.min)) // 分更新 { if (!refresh) flag = 0; tmp_time.min = time.min; play32_num(48, 2, time.min); } if (refresh || (time.hour != tmp_time.hour)) // 时更新 { if ((!refresh)&&(Clock_flag)) alarm_sound(); tmp_time.hour = time.hour; play32_num(0, 2, time.hour);

6