⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _ds12c887

📁 DS12c887电子时钟详细教程仿真
💻
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   ___DS12C887                                                           09/03/2012 17:35:06 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE ___DS12C887
OBJECT MODULE PLACED IN ---DS12C887.OBJ
COMPILER INVOKED BY: F:\keil\keil2\英文版keil2\程序\C51\BIN\C51.EXE ---DS12C887.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<reg52.h>
   2          #include<intrins.h>
   3          #define uint unsigned int
   4          #define uchar unsigned char
   5          sbit lcdrs=P2^4;
   6          sbit lcden=P2^6;
   7          sbit s1=P3^0;  //功能键
   8          sbit s2=P3^1;  //增大键
   9          sbit s3=P3^2;  //减小键
  10          sbit s4=P3^6;  //闹铃查看键
  11          sbit beep=P2^3;//蜂鸣器
  12          sbit dscs=P1^4;
  13          sbit dsas=P1^5;
  14          sbit dsrw=P1^6;
  15          sbit dsds=P1^7;
  16          sbit dsirq=P3^3; //中断
  17          
  18          bit flag1,flag_ri;//定义标志位    flag1设置闹铃
  19          uchar count,s1num,flag,t0_num;
  20          char miao,shi,fen,year,month,day,week,amiao,afen,ashi;
  21          char code table[]=" 20  -  -  ";  //   20  -  -     
  22          
  23          uchar code table1[]="      :  :  ";   //       :  :  
  24          //******************************************************************
  25                            //函数声明
  26          void write_ds(uchar,uchar); uchar read_ds(uchar);void set_time();
  27          void read_alarm();void set_alarm(uchar,uchar,uchar); 
  28          //******************************************************************
  29                             
  30          void delayms(uint z)            //延时毫秒的程序
  31          {
  32   1              uint x,y;
  33   1              for(x=z;x>0;x--)
  34   1              for(y=112;y>0;y--);
  35   1      }
  36          void di()
  37          {       
  38   1              beep=0;
  39   1              delayms(100);
  40   1              beep=1;
  41   1      }
  42          //******************************************************************
  43                     //LCD1602程序
  44          //******************************************************************
  45          void write_cmd(uchar cmd)
  46          {
  47   1              lcden=0;
  48   1              lcdrs=0;
  49   1              P0=cmd;
  50   1              _nop_();
  51   1              lcden=1;
  52   1              delayms(1);
  53   1              lcden=0;
  54   1          _nop_();
  55   1      }
C51 COMPILER V7.50   ___DS12C887                                                           09/03/2012 17:35:06 PAGE 2   

  56          void write_dat(uchar dat)
  57          {
  58   1              lcden=0;
  59   1              lcdrs=1;
  60   1              P0=dat;
  61   1          _nop_();
  62   1              lcden=1;
  63   1              delayms(1);
  64   1              lcden=0;
  65   1              _nop_();
  66   1      }
  67          void lcdint()
  68          {
  69   1              lcden=0;
  70   1              write_cmd(0x38);   // 显示模式设置      
  71   1              write_cmd(0x0c);   //开显示,不显示光标,不闪烁
  72   1              write_cmd(0x06);   //写一个字符后地址加1,屏幕不移
  73   1              write_cmd(0x01);        //清屏
  74   1              delayms(1);
  75   1      }
  76          //lcd显示程序
  77          //******************************************************************
  78          void write_sfm(uchar add,char date)              //写时间,2位一起写
  79          {
  80   1              char shi,ge;
  81   1              shi=date/10;ge=date%10;
  82   1              write_cmd(0xc0+add);
  83   1              write_dat(0x30+shi);
  84   1              write_dat(0x30+ge);             
  85   1      }       
  86          void write_nyr(uchar add,char date)//年月日
  87          {
  88   1              char shi,ge;
  89   1              shi=date/10;ge=date%10;
  90   1              write_cmd(0x80+add);
  91   1              write_dat(0x30+shi);
  92   1              write_dat(0x30+ge);
  93   1      }
  94          void write_week(char we)//星期
  95          {
  96   1              write_cmd(0x80+12);
  97   1              switch(we)
  98   1              {
  99   2                      case 1: write_dat('M');write_dat('O');write_dat('N');break;
 100   2                      case 2: write_dat('T');write_dat('U');write_dat('E');break;
 101   2                      case 3: write_dat('W');write_dat('E');write_dat('D');break;
 102   2                      case 4: write_dat('T');write_dat('H');write_dat('U');break;
 103   2                      case 5: write_dat('F');write_dat('R');write_dat('I');break;
 104   2                      case 6: write_dat('S');write_dat('A');write_dat('T');break;
 105   2                      case 7: write_dat('S');write_dat('U');write_dat('N');break;
 106   2              }
 107   1      }
 108          //******************************************************************
 109          //******************************************************************
 110          void init()
 111          {
 112   1              uchar num;
 113   1              EA=1;//开总中断
 114   1              EX1=1;//开外部中断1
 115   1              IT1=1;//外部中断下降沿触发
 116   1              flag1=0; t0_num=0;s1num=0;week=1;
 117   1              write_ds(0x0A,0x20);//打开振荡器
C51 COMPILER V7.50   ___DS12C887                                                           09/03/2012 17:35:06 PAGE 3   

 118   1              write_ds(0x0B,0x26);//设置24小时模式,数据二进制格式,开启闹铃中断
 119   1              set_time();//设置上电默认时间,调试的时候用
 120   1              lcdint();
 121   1              write_cmd(0x80);
 122   1              for(num=0;num<15;num++)
 123   1                      {
 124   2                              write_dat(table[num]);
 125   2                      }
 126   1              write_cmd(0xc0);
 127   1              for(num=0;num<11;num++)
 128   1                      {
 129   2                              write_dat(table1[num]);
 130   2                      }
 131   1      }
 132          //******************************************************************                
 133                      //DS12C887程序
 134          //******************************************************************
 135          void write_ds(uchar add,uchar date)//写12c887函数
 136          {
 137   1              dscs=0;
 138   1              dsas=1;
 139   1              dsds=1;
 140   1              dsrw=1;
 141   1              P0=add;  //写地址
 142   1              dsas=0;
 143   1              dsrw=0;
 144   1              P0=date;  //写数据
 145   1              dsrw=1;
 146   1              dsas=1;
 147   1              dscs=1; 
 148   1      }
 149          uchar read_ds(uchar add) //读12c887
 150          {
 151   1              uchar ds_date;
 152   1              dsas=1;
 153   1              dsds=1;
 154   1              dsrw=1;
 155   1              dscs=0;
 156   1              P0=add;
 157   1              dsas=0;
 158   1              dsds=0;
 159   1              P0=0xff;
 160   1              ds_date=P0;
 161   1              dsds=1;
 162   1              dsas=1;
 163   1              dscs=1;
 164   1              return ds_date; 
 165   1      }
 166          void set_time()  //初始化
 167          {
 168   1              write_ds(0,0);  //秒
 169   1              write_ds(1,10); //秒闹铃
 170   1              write_ds(2,34); //分钟  
 171   1              write_ds(3,34); //分钟闹铃
 172   1              write_ds(4,15); //小时
 173   1              write_ds(5,15); //小时闹铃
 174   1              write_ds(6,5);  //星期
 175   1              write_ds(7,20); //日
 176   1              write_ds(8,5);  //月
 177   1              write_ds(9,11); //年
 178   1      } 
 179          void read_alarm()
C51 COMPILER V7.50   ___DS12C887                                                           09/03/2012 17:35:06 PAGE 4   

 180          {
 181   1              amiao=read_ds(1);
 182   1              afen=read_ds(3);
 183   1              ashi=read_ds(5);
 184   1      }
 185          //******************************************************************              
 186                               //按键程序
 187          void keyscan()
 188          {    //**********************************************************
 189   1            //按任意键取消闹钟报警
 190   1              if(flag_ri==1)
 191   1              {
 192   2                      if((s1==0)||(s2==0)||(s3==0)||(s4==0))//按任意键取消闹钟报警
 193   2                      {
 194   3                              delayms(5);
 195   3                              if((s1==0)||(s2==0)||(s3==0)||(s4==0))
 196   3                              {
 197   4                                      while(!(s1&&s2&&s3&&s4));di();
 198   4                                      flag_ri=0;
 199   4                              }
 200   3                      }
 201   2              }
 202   1            //********************************************************** 
 203   1              if(s1==0)                         //如果功能按键1按下
 204   1              {
 205   2                      delayms(5);                //去抖动
 206   2                      if(s1==0)
 207   2                      {                       
 208   3                              while(!s1);               //等待松手
 209   3                              s1num++;                        //记下次数
 210   3                              di();                     //蜂鸣器响
 211   3                               //********************************************************
 212   3                              if(flag1==1)      //设置闹铃为1时才对s1num调整,只调秒,分,时
 213   3                              {
 214   4                                      if(s1num>3)     
 215   4                                      {
 216   5                                              s1num=1;
 217   5                                      }
 218   4                              }
 219   3                              //********************************************************
 220   3                              flag=1;         //在调整时间时标志位flag为1,不进行正常操作
 221   3                              switch(s1num)
 222   3                              {
 223   4                                      case 1:write_cmd(0xc0+10); write_cmd(0x0f);break;  //按一下秒钟 指针显示闪烁
 224   4                                      case 2:write_cmd(0xc0+7); break;
 225   4                                      case 3:write_cmd(0xc0+4); break;
 226   4                                      case 4:write_cmd(0x80+12); break;
 227   4                                      case 5:write_cmd(0x80+9); break;
 228   4                                      case 6:write_cmd(0x80+6); break;
 229   4                                      case 7:write_cmd(0x80+3); break;
 230   4                                      default:                         //用default可以解决s1num跑飞
 231   4                                              s1num=0;
 232   4                                              write_cmd(0x0c);  //按了8次关闪烁,flag=0,退出调整,显示时间
 233   4                                              flag=0;
 234   4                                              write_ds(0,miao);  //将调整后的时间写入ds12c887
 235   4                                              write_ds(2,fen);
 236   4                                              write_ds(4,shi);
 237   4                                              write_ds(6,week);
 238   4                                              write_ds(7,day);
 239   4                                              write_ds(8,month);
 240   4                                              write_ds(9,year);
 241   4                                              break;
C51 COMPILER V7.50   ___DS12C887                                                           09/03/2012 17:35:06 PAGE 5   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -