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

📄 _ds12c887

📁 DS12c887电子时钟详细教程仿真
💻
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   DS12C887                                                              09/03/2012 17:38:53 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          
  22          char code table[]=" 20  -  -  ";    
  23          uchar code table1[]="    00:00:00";   //       :  :  
  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:38:53 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          //******************************************************************
 111          void init()
 112          {
 113   1              uchar num;
 114   1                 EA=1;//开总中断
 115   1                 EX1=1;//开外部中断1
 116   1                 IT1=1;//外部中断下降沿触发
 117   1                 flag1=0; t0_num=0;s1num=0;week=1;
C51 COMPILER V7.50   DS12C887                                                              09/03/2012 17:38:53 PAGE 3   

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

 180          void read_alarm()
 181          {amiao=read_ds(1);
 182   1       afen=read_ds(3);
 183   1       ashi=read_ds(5);
 184   1      }
 185          
 186          //******************************************************************              
 187                               //按键程序
 188          void keyscan()
 189          {  //**********************************************************
 190   1            //按任意键取消闹钟报警
 191   1              if(flag_ri==1)
 192   1              {
 193   2                 if((s1==0)||(s2==0)||(s3==0)||(s4==0))//按任意键取消闹钟报警
 194   2                    {    delayms(5);
 195   3                            if((s1==0)||(s2==0)||(s3==0)||(s4==0))
 196   3                             {  while(!(s1&&s2&&s3&&s4));di();
 197   4                                flag_ri=0;
 198   4                             }
 199   3                    }
 200   2              }       
 201   1         //**********************************************************      
 202   1          if(s1==0)                     //如果功能按键1按下
 203   1              {
 204   2                      delayms(5);               //去抖动
 205   2                      if(s1==0)
 206   2                      {                       
 207   3                              while(!s1);   //等待松手
 208   3                              s1num++;    //记下次数
 209   3                              di();           //蜂鸣器响
 210   3                           //********************************************************
 211   3                      if(flag1==1) //设置闹铃为1时才对s1num调整,只调秒,分,时
 212   3                          {
 213   4                             if(s1num>3)      
 214   4                                     { s1num=1;
 215   5                                     }
 216   4                          }
 217   3                          //***************************************************************
 218   3                      flag=1;         //在调整时间时标志位flag为1,不进行正常操作
 219   3                      switch(s1num)
 220   3                              {

⌨️ 快捷键说明

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