收藏 分销(赏)

基于单片机的智能数字闹钟程序代码--毕业设计.doc

上传人:仙人****88 文档编号:8223072 上传时间:2025-02-08 格式:DOC 页数:30 大小:95.50KB 下载积分:10 金币
下载 相关 举报
基于单片机的智能数字闹钟程序代码--毕业设计.doc_第1页
第1页 / 共30页
基于单片机的智能数字闹钟程序代码--毕业设计.doc_第2页
第2页 / 共30页


点击查看更多>>
资源描述
基于单片机的智能数字闹钟程序代码   main.c #include <reg51.h> #include <intrins.h> #include <yf.h>    unsigned char clock_data[4]; sbit speaker  = P2^4;//  蜂鸣器 sbit bell = P2^2;   //铃响 bit bell_on=0; bit key_ok=0; unsigned char bell_time=0x20; uchar week_clock_set; #define FIRST_ADDR 0 //定义全局变量 unsigned char yy,mo,dd,xq,hh,mm,ss;//  定义时间映射全局变量(专用寄存器) uchar j; /****************************************************************************/ //函数声明 extern  unsigned char read_clock(unsigned char ord); extern void lcdwc(unsigned char cmdcode); extern void hzkdis(unsigned char code *s); extern void hzkdis2(unsigned char *s); extern char Read_One_Byte(unsigned char addr); extern void Write_One_Byte(unsigned char addr,unsigned char thedata); void lcm_w_ss(void); extern void lcdreset(void); extern void Init_DS18B20(void); extern char gotkey(); extern void Init_1302(void); extern unsigned int ReadTemperature(void); extern void write_clock(unsigned char ord, unsigned char dd); extern void disp_hz(uchar x,uchar *c_str,uchar w); extern void delay(unsigned int t); void new_time(void); void read_clockss(x);   //void lcm_w_temp(void) ; void read_clockS(void) {  ss = read_clock(0x81);//读取秒数据  mm = read_clock(0x83);//读取分钟数据  hh = read_clock(0x85);//小时  dd = read_clock(0x87);//日  mo = read_clock(0x89);//月  xq = read_clock(0x8b);//星期  yy = read_clock(0x8d);//年 } /*void Set_time(unsigned char sel){ //根据选择调整的相应项目加1并写入DS1302   signed char address,item;   signed char max,mini;     if(sel==7)  {address=0x80; max=0;mini=0;}     //秒   if(sel==6)  {address=0x82; max=59;mini=0;}    //分钟   if(sel==5)  {address=0x84; max=23;mini=0;}    //小时   if(sel==3)  {address=0x86; max=31;mini=1;}    //日   if(sel==2)  {address=0x88; max=12;mini=1;}    //月   if(sel==1)  {address=0x8c; max=99; mini=0;}    //年   if(sel==4)  {address=0x8a; max=7;mini=1;}    //星期      //读取1302某地址上的数值转换成10进制赋给item    item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;   if(KEY_Y == 0){    item++;//数加 1     }   if(KEY_N== 0){    item--;//数减 1    }   if(item>max) item=mini;//查看数值有效范围      if(item<mini) item=max;              write_clock(0x8e,0x00);//允许写操作   write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302   write_clock(0x8e,0x80);//写保护,禁止写操作   // updata (); //刷新数据  // lcm_w_mm();//刷新 分  }   */ void DelayM(unsigned int a){//延时函数 1MS/次    unsigned char i;   while( --a != 0){      for(i = 0; i < 125; i++);  //一个 ; 表示空语句,CPU空转。   }          //i 从0加到125,CPU大概就耗时1毫秒 }   /*****************************************************************************/ //向LCM中填写 年 数据 void lcm_w_yy(void) { // if (read_clock(0x8d) != yy) {         unsigned char str[2];      str[2]=0;   yy = read_clock(0x8d);   lcdwc(0x83+FIRST_ADDR);   hzkdis("20");         lcdwc(0x84+FIRST_ADDR);   str[0]=(yy/16+0x30);   str[1]=(yy%16+0x30);         hzkdis2(str);   hzkdis2("年");   }  /*****************************************************************************/ //向LCM中填写 月 数据 void lcm_w_mo(void){ // if(read_clock(0x89) != mo){     unsigned char str[2];  str[2]=0;  // lcm_w_test(0,0x90);   lcdwc(0x90+FIRST_ADDR) ;    if(mo/16 != 0){    str[0]=mo/16+0x30;    } //十位消隐    else{str[0]=0x20 ;}//同上     str[1]=mo%16+0x30;    hzkdis2(str);      lcdwc(0x91+FIRST_ADDR);            hzkdis("月");  } /*****************************************************************************/ //星期处理并送入LCM的指定区域 void lcm_w_xq(void){  unsigned char sel;  unsigned char str[2];  str[2]=0;  //if(read_clock(0x8b) != xq){  //xq = read_clock(0x8b);  sel = (read_clock(0x8b))%16; //字节低4位的BCD码放入sel     lcdwc(0x97+FIRST_ADDR);//写入指定区域(97H 第二行第8个字)  if(sel==7)  {hzkdis("日");}    //    if(sel==6)  {hzkdis("六");}    //    if(sel==5)  {hzkdis("五");}    //    if(sel==4)  {hzkdis("四");}    //    if(sel==3)  {str[0]=0xc8;str[1]=0xfd;hzkdis2(str)/*lcm_w_test(1,0xc8);lcm_w_test(1,0xfd)*/;} //此指令等于lcm_w_word("三"); 因为“三”的内码失效。    if(sel==2)  {hzkdis("二");}    //    if(sel==1)  {hzkdis("一");}    //星期一    lcdwc(0x95+FIRST_ADDR);  hzkdis("星期") ;  //} } /*****************************************************************************/ //向LCM中填写 日 数据 void lcm_w_dd(void){       unsigned char str[2]   ;  str[2]=0; // if(read_clock(0x87) != dd){   dd = read_clock(0x87);      lcdwc(0x92+FIRST_ADDR);      if(dd/16 != 0){str[0]=(dd/16)+0x30;} //十位消隐    else{str[0]=0x20;}//同上    str[1]=dd%16+0x30;           hzkdis2(str);     lcdwc(0x93+FIRST_ADDR);   hzkdis("日");          } //} /*****************************************************************************/ //向LCM中填写 小时 数据 void lcm_w_hh(void){     unsigned char str[2] ;  str[2]=0;  if(read_clock(0x85) != hh){   //hh = read_clock(0x85);    if (hh > 0x07 && hh < 0x22 /*&& w == 0*/){    // beep = 0; led_r = 0;     DelayM(100);    // beep = 1; led_r = 1;    }   }      lcdwc(0x88+FIRST_ADDR);   str[0]=hh/16+0x30;   str[1]=hh%16+0x30;   hzkdis2(str); } //} /*****************************************************************************/ //向LCM中填写 分钟 数据 void lcm_w_mm(void){     unsigned char   str[2];  str[2]=0;  if(read_clock(0x83) != mm){     mm = read_clock(0x83);   /*if( w == 0){        days();    //节日显示    updata (); //刷新数据   }*/      } /* lcm_w_test(0,0x89);   lcm_w_test(1,0x3a);   //":"  lcm_w_test(1,(mm/16)+0x30);  lcm_w_test(1,mm%16+0x30);  lcm_w_test(1,0x2e);  //"."*/  lcdwc(0x89+FIRST_ADDR);  hzkdis(":");  str[0]=(mm/16)+0x30;  str[1]= mm%16+0x30;  hzkdis2(str);  hzkdis(":");    } /*****************************************************************************/ //向LCM中填写 秒 数据 void lcm_w_ss(void) {  unsigned char str[2] ;  str[2]=0; // if(read_clock(0x81) != ss)  //判断是否需要更新   /*ss = read_clock(0x81); //更新数据   lcm_w_test(0,0x8b);  //秒值在LCM上的写入位置   lcm_w_test(1,(ss/16)+0x30); //写十位     lcm_w_test(1,ss%16+0x30); //写个位   led_b = ~led_b;    //背光闪烁   lcm_w_mm();//刷新 分       */      //lcm_w_mm();      ss=read_clock(0x81);   lcdwc(0x8b+FIRST_ADDR);   str[0]=ss/16+0x30;   str[1]=ss%16+0x30;   hzkdis2(str); } lcm_w_temp(void) {      //unsigned char  str1[4];    uchar str[2];    unsigned int i=0;      unsigned char a=0,b=0,c=0;   uchar temp=28;     i=ReadTemperature();//读温度并送显   /* a=i/100;  str1[3]=a+0x30;  str1[2]=0x2e;  str1[1]=(i/10-a*10)+0x30;  str1[0]=(i-a*100-b*10)+0x30;  //lcm_w_test(1,c+0x30); //小位1位    //lcm_w_word("℃"); //度C // str1[0]=(i/100)%10+0x30;   // str1[1]=((i%100)/10)+0x30; // str1[2]=(i%10)+0x30;*/     str[0]=temp/10+0x30;   str[1]=temp%10+0x30;   lcdwc(0x8e+FIRST_ADDR);    hzkdis2(str);  lcdwc(0x8f+FIRST_ADDR);     hzkdis("℃"); } /*****************************************************************************/ //刷新数据 void updata (void) {   lcm_w_hh();//刷新 小时    lcm_w_dd();//刷新 日   lcm_w_xq();//更新星期值    lcm_w_mo();//刷新 月   lcm_w_yy();//刷新 年         lcm_w_mm();   lcm_w_ss();   lcm_w_temp(); }   //初始化界面 void restlib() {    lcdwc(0x80+FIRST_ADDR);    hzkdis("校园打铃系统");    lcdwc(0x90+FIRST_ADDR);    hzkdis("初始化...");    lcdwc(0x88+FIRST_ADDR);    hzkdis("姚辉虎");    lcdwc(0x98+FIRST_ADDR);    hzkdis(""); } /*void  rj1lib() { unsigned char str[2];  lcdwc(0x80+FIRST_ADDR);     str[0]=yy/10+0x30;  str[1]=yy%10+0x30;  hzkdis("20");  hzkdis2(str);  hzkdis("年");     lcdwc(0x90+FIRST_ADDR) ;  if(mo/16 != 0){  str[0]=mo/16+0x30;  } //十位消隐  else{str[0]=0x20 ;}//同上   str[1]=mo%16+0x30;  hzkdis2(str);    lcdwc(0x91+FIRST_ADDR);  hzkdis("月");     lcdwc(0x92+FIRST_ADDR);  if(dd/16 != 0){str[0]=(dd/16)+0x30;} //十位消隐  else{str[0]=0x20;}//同上  str[1]=dd%16+0x30;   hzkdis2(str);  lcdwc(0x93+FIRST_ADDR);  hzkdis("日");  lcdwc(0x88+FIRST_ADDR);     str[0]=hh/16+0x30;  str[1]=hh%16+0x30;  hzkdis2(str);  lcdwc(0x89+FIRST_ADDR);  hzkdis(":");  str[0]=(mm/16)+0x30;  str[1]= mm%16+0x30;  hzkdis2(str);     lcdwc(0x81+FIRST_ADDR); }    /*------------------------------------------------ ------------------------------------------------*/     /*  //不同按键实现不同功能  void gongneng(int gotkeys)  {   int gn,gn10,gn0 ;    gn=gotkeys;    switch(gn)     {  case 0:  DelayM(2000);gn0=gotkey();if(gn0==0){ lcdreset();restlib();Init_DS18B20();Init_1302();DelayM(3000); cxjmlib();}break;  //长按系统初始化;     case 10: lcdreset();       lcdwc(0x80+FIRST_ADDR); hzkdis("1.设置时间");     lcdwc(0x90+FIRST_ADDR); hzkdis("2.设置闹时");  lcdwc(0x88+FIRST_ADDR); hzkdis("3.系统初始化");   lcdwc(0x79+FIRST_ADDR); hzkdis("");      tt:gn10=gotkey();   //  if (gn10!=16) goto tt; tt1:gn10=gotkey();   //  if (gn10==16) goto tt;    switch(gn10)  {  case 1:       {      lcdreset();  read_clockS(); rj1lib(); tt2:    gn10=gotkey();         if (gn10!=16) goto tt2;     tt3:    gn10=gotkey();         if (gn10==16) goto tt2;  switch(gn10)  {  case 0:  break;  case 1:  break;  case 2:  break;  case 3:  break;  case 4:  break;  case 5:  break;  case 6:  break;  case 7:  break;  case 8:  break;  case 9:  break;  default:goto tt3;  }        break;     }     case 2:   lcdreset();read_clockS();naozhonglib(); tt4:    gn10=gotkey();         if (gn10!=16) goto tt4 ;     gn10=gotkey();         if (gn10==16) goto tt4;                   break;  case 3:   lcdreset();rj3lib();                 tt6:    gn10=gotkey();         if (gn10!=16) goto tt6;     gn10=gotkey();         if (gn10==16) goto tt6;              if(gn10==10)   //键值为10就初始化系统      {       lcdreset();restlib();Init_DS18B20();Init_1302();DelayM(3000); cxjmlib();       }       if(gn10==11)  // 键值为11取消初始化,返回程序主界面;       {        lcdreset();cxjmlib();        }   break; tt8:    gn10=gotkey();         if (gn10!=16) goto tt8 ;     gn10=gotkey();         if (gn10==16) goto tt8 ;                       break;  }    default: goto tt1;                               }                         }   */ void read_clockss(x) {  hh=Read_One_Byte(x*4+0x20);  mm=Read_One_Byte(x*4+0x21);  ss=Read_One_Byte(x*4+0x22);  week_clock_set=Read_One_Byte(x*4+0x23); } void Write_clockss(x) {  Write_One_Byte(x*4+0x20,hh);  Write_One_Byte(x*4+0x21,mm);  Write_One_Byte(x*4+0x22,ss);  Write_One_Byte(x*4+0x23,week_clock_set); } /* bit cmp_clock()     //每分钟检测一次 {  unsigned char a1;  for (a1=0;a1<32;a1++)  {   read_clockss(a1);   //acc0 = a1*4+0x20  ...acc1 ...acc2 ...acc3   if ((hh==clock_data[0]) && (mm==clock_data[1])) { return 1; }  }  return 0; }*/ //unsigned char yy,mo,dd,xq,hh,mm,ss;//  定义时间映射全局变量(专用寄存器) void clr_xs() {     lcdwc(0x80+FIRST_ADDR); hzkdis("        ");        lcdwc(0x90+FIRST_ADDR); hzkdis("        ");     lcdwc(0x88+FIRST_ADDR); hzkdis("        ");      lcdwc(0x98+FIRST_ADDR); hzkdis("        "); }   void disp_set_clock() {         unsigned char sel;      uchar str[2];      str[2]=0;      lcdwc(0x91+FIRST_ADDR);       str[0]=yy/16+0x30;      str[1]=yy%16+0x30;      hzkdis2(str);       hzkdis2("年");      str[0]=mo/16+0x30;      str[1]=mo%16+0x30;      hzkdis2(str);       hzkdis2("月");      str[0]=dd/16+0x30;      str[1]=dd%16+0x30;      hzkdis2(str);       hzkdis2("日");            lcdwc(0x89+FIRST_ADDR);       str[0]=hh/16+0x30;      str[1]=hh%16+0x30;      hzkdis2(str);       hzkdis2("时");      str[0]=mm/16+0x30;      str[1]=mm%16+0x30;      hzkdis2(str);       hzkdis2("分");      str[0]=ss/16+0x30;      str[1]=ss%16+0x30;      hzkdis2(str);       hzkdis2("秒");    //  lcdwc(0x98+FIRST_ADDR);                                        sel = (read_clock(0x8b))%16; //字节低4位的BCD码放入sel                     lcdwc(0x9c+FIRST_ADDR);//写入指定区域(97H 第二行第8个字)                  if(sel==7)  {hzkdis("07");}    //                    if(sel==6)  {hzkdis("06");}    //                    if(sel==5)  {hzkdis("05");}    //                    if(sel==4)  {hzkdis("04");}    //                    if(sel==3)  {hzkdis("03");}   //                    if(sel==2)  {hzkdis("02");}    //                    if(sel==1)  {hzkdis("01");}    //星期一                     lcdwc(0x9a+FIRST_ADDR);                  hzkdis("星期") ;     } void disp_clock_set() {      uchar str[2];      str[2]=0;      lcdwc(0x89+FIRST_ADDR);       str[0]=hh/16+0x30;      str[1]=hh%16+0x30;      hzkdis2(str);       hzkdis2("时");      str[0]=mm/16+0x30;      str[1]=mm%16+0x30;      hzkdis2(str);       hzkdis2("分"); /*     str[0]=ss/16+0x30;      str[1]=ss%16+0x30;      hzkdis2(str);       hzkdis2("秒");  */           // week_clock_set    //  lcdwc(0x98+FIRST_ADDR);     //  hzkdis2(" ");       } /*bit set_xs_1_flicker(uchar x,bit y)   //修改数据标志 {        uchar a,str[2];   str[1]=0x1e;   bit flicker=0;   key_ok=1;   while (gotkey()!=16) {} xs_fl0: while(1)   { for  (a=0;a<20;a++)    //    {     delay(500);           if (gotkey()!=16) goto xs_fl1;      key_ok=0;    } xs_fl1:  lcdwc(x+FIRST_ADDR);     if (flicker) { hzkdis2("_"); }    else { str[0]=0x31; str[1]=0x1e; hzkdis2(str); }    flicker = ~flicker;    a=gotkey();    if ( (a<10) && (key_ok==0)){key_ok=1; y=a*16+(y%16); goto xs_lf2;}       if (a==0x0b) return(y);    if(a==10)return(y);    if(a==13)    {        lcdwc(x+FIRST_ADDR);      str[0]=y/16+0x30; str[1]=y%16+0x30; hzkdis2(str);      return(y);    }    if(a==14) goto xs_lf2;      } }           */ uchar set_xs_flicker(uchar x,y)   //修改数据标志 {        uchar a,str[2];   bit flicker=0;   key_ok=1;   while (gotkey()!=16) {} xs_fl0: while(1)   { for  (a=0;a<20;a++)    {     delay(500);           if (gotkey()!=16) goto xs_fl1;      key_ok=0;    } xs_fl1:  lcdwc(x+FIRST_ADDR);     if (flicker) { hzkdis2("_"); }    else { str[0]=y/16+0x30; str[1]=y%16+0x30; hzkdis2(str); }    flicker = ~flicker;    a=gotkey();    if ( (a<10) && (key_ok==0)){key_ok=1; y=a*16+(y%16); goto xs_lf2;}       if (a==0x0b) return(y);    if(a==10)return(y);    if(a==13)    {        lcdwc(x+FIRST_ADDR);      str[0]=y/16+0x30; str[1]=y%16+0x30; hzkdis2(str);      return(y);    }    if(a==14) goto xs_lf2;      } xs_lf2:  while(1)   { for  (a=0;a<20;a++)    {     delay(500);      if (gotkey()!=16) goto xs_fl3;      key_ok=0;    } xs_fl3:     lcdwc(x+FIRST_ADDR);     if (flicker)     {      str[0]=y/16+0x30;     str[1]=0x5f;     hzkdis2(str);    }    else { str[0]=y/16+0x30; str[1]=y%16+0x30; hzkdis2(str); }    flicker = ~flicker;    a=gotkey();    if ( (a<10) && (key_ok==0))    {      key_ok=1;     y=(y/16)*16+a;         lcdwc(x+FIRST_ADDR);      str[0]=y/16+0x30; str[1]=y%16+0x30; hzkdis2(str);     return(y);    }    if (a==0x0b) return(y);    if(a==10) return(y);    if(a==13) goto xs_fl0;           if(a==14)     {        lcdwc(x+FIRST_ADDR);      str[0]=y/16+0x30; str[1]=y%16+0x30; hzkdis2(str);      return(y);    }   } }       void xs_pls()                     {  clr_xs();  lcdwc(0x91+FIRST_ADDR); hzkdis("设置已经保存");  delay(10000); } void set_clock() {      while(1)   {      l
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 小学其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服