找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5131|回复: 0
打印 上一主题 下一主题
收起左侧

用单片机定时器做时钟,蜂鸣器做闹钟的程序问题

[复制链接]
跳转到指定楼层
楼主
ID:439374 发表于 2018-12-4 19:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是用时钟显示和定时器一起用,我的思想是:通过时间显示来表示定到几点钟闹铃(蜂鸣器)响,在时钟显示程序里加如定时器计时,当计时到我要的时间(例如一分钟后或一个小时后闹铃响),但定时器不能计时一个小时,我觉得可能是我这种做闹钟的想法错了。求大神指点。

//通过设计TIME[7]中的数来设置时间,定时器定时了50ms,当过50s时,闹铃响起‘
  1. #include"reg52.h"
  2. #include"Ds1302.h"
  3. typedef unsigned char u8;
  4. typedef unsigned int u16;

  5. sbit LSA=P2^2;
  6. sbit LSB=P2^3;
  7. sbit LSC=P2^4;
  8. sbit K1=P3^1;
  9. sbit K2=P3^0;
  10. sbit K3=P3^2;
  11. sbit K4=P3^3;
  12. sbit beep=P1^5;

  13. void delay(u16 i)
  14. {
  15.         while(i--);
  16. }
  17. u8 disp[8];
  18. u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  19. void Init()
  20. {
  21.         TMOD=0X10;
  22.         TH1=0xd8;
  23.         TL1=0xf0;
  24.         ET1=1;
  25.         EA=1;
  26.         TR1=1;
  27. }

  28. void Datapros()
  29. {
  30.         Ds1302ReadTom();
  31.         disp[0]=smgduan[TIME[2]/16];
  32.         disp[1]=smgduan[TIME[2]&0X0F];
  33.         disp[2]=0X40;
  34.         disp[3]=smgduan[TIME[1]/16];
  35.         disp[4]=smgduan[TIME[1]&0X0F];
  36.         disp[5]=0X40;
  37.         disp[6]=smgduan[TIME[0]/16];
  38.         disp[7]=smgduan[TIME[0]&0X0F];
  39. }

  40. void Digdisplay()
  41. {
  42.         u8 i;
  43.         for(i=0;i<8;i++)
  44.         {
  45.                 switch(i)         
  46.                 {
  47.                         case(0):
  48.                                 LSA=0;LSB=0;LSC=0; break;
  49.                         case(1):
  50.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  51.                         case(2):
  52.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  53.                         case(3):
  54.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  55.                         case(4):
  56.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  57.                         case(5):
  58.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  59.                         case(6):
  60.                                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  61.                         case(7):
  62.                                 LSA=1;LSB=1;LSC=1; break;//显示//发送数据
  63.                  
  64.                 }
  65.                 P0=disp[7-i];
  66.                 delay(100);        
  67.                 P0=0x00;         
  68.         }               
  69. }

  70. void Ds1302Stop()
  71. {
  72.         u8 a;
  73.         if(0==K1)
  74.         {
  75.                 a=0;
  76.                 delay(1000);
  77.                 while(!a)
  78.                 {
  79.                         Digdisplay();
  80.                         if(0==K2)
  81.                          {
  82.                                  a=1;
  83.                          }
  84.                 }
  85.         }
  86. }

  87. void Into() interrupt 3
  88. {
  89.          u8 a;
  90.          static u16 i;
  91.          TH1=0xd8;
  92.          TL1=0xf0;
  93.          i++;
  94.          if(1000==i)//
  95.          {
  96.                  while(!a)
  97.                 {
  98.                          beep=~beep;
  99.                         delay(2000);
  100.                         if(0==K3)
  101.                         {
  102.                                 a=1;
  103.                         }
  104.                 }
  105.          }
  106. }

  107. void main()
  108. {
  109.     Ds1302Init();
  110.         Init();
  111.         while(1)
  112.         {
  113.                 Datapros();
  114.                 Digdisplay();
  115.                 Ds1302Stop();
  116.         }
  117. }
  118. //Ds1302.c
  119. #include"Ds1302.h"
  120. uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
  121. uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};


  122. uchar TIME[7] = {0, 0, 0, 0x07, 0x05, 0x06, 0x16};

  123. void Ds1302Write(uchar addr,uchar dat)
  124. {
  125.         uchar n;
  126.         RST=0;
  127.         _nop_();
  128.         SCLK=0;
  129.         _nop_();
  130.         RST=1;
  131.         _nop_();
  132.         for(n=0;n<8;n++)
  133.         {
  134.                 DSIO=addr&0x01;
  135.                 addr>>=1;
  136.                 SCLK=1;
  137.                 _nop_();
  138.                 SCLK=0;
  139.                 _nop_();
  140.         }
  141.         for(n=0;n<8;n++)
  142.         {
  143.                 DSIO=dat&0x01;
  144.                 dat>>=1;
  145.                 SCLK=1;
  146.                 _nop_();
  147.                 SCLK=0;
  148.                 _nop_();
  149.         }
  150.         RST=0;
  151.         _nop_();
  152. }
  153. uchar Ds1302Read(uchar addr)
  154. {
  155.         uchar n,dat,dat1;
  156.         RST=0;
  157.         _nop_();
  158.         SCLK=0;
  159.         _nop_();
  160.         RST=1;
  161.         _nop_();
  162.    for(n=0;n<8;n++)
  163.    {
  164.                 DSIO=addr&0x01;
  165.                 addr>>=1;
  166.                 SCLK=1;
  167.                 _nop_();
  168.                 SCLK=0;
  169.                 _nop_();
  170.         }
  171.         for(n=0;n<8;n++)
  172.         {
  173.                  dat=DSIO;
  174.                  dat1=(dat1>>1)|(dat<<7);
  175.                  SCLK=1;
  176.                  _nop_();
  177.                  SCLK=0;
  178.                  _nop_();
  179.         }
  180.         RST=0;
  181.         _nop_();
  182.         SCLK=1;
  183.         _nop_();
  184.         DSIO=0;
  185.         _nop_();
  186.         DSIO=1;
  187.         _nop_();
  188.         return dat1;
  189. }

  190. void Ds1302Init()
  191. {
  192.         uchar n;
  193.         Ds1302Write(0x8e,0x00);
  194.         for(n=0;n<7;n++)
  195.         {
  196.                 Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
  197.         }
  198.         Ds1302Write(0x8e,0x80);

  199. }
  200. void Ds1302ReadTom()
  201. {
  202.         uchar n;
  203.         for(n=0;n<7;n++)
  204.         {
  205.                 TIME[n]=Ds1302Read(READ_RTC_ADDR[n]);
  206.         }
  207. }

  208. //Ds1302.h
  209. #ifndef _Ds1302_h
  210. #define _Ds1302_h

  211. #include"reg52.h"
  212. #include"intrins.h"

  213. #ifndef uchar
  214. #define uchar unsigned char
  215. #endif

  216. #ifndef uint
  217. #define uint unsigned int
  218. #endif


  219. sbit DSIO=P3^4;
  220. sbit RST=P3^5;
  221. sbit SCLK=P3^6;

  222. void Ds1302Write(uchar addr,uchar dat);
  223. uchar Ds1302Read(uchar addr);
  224. void Ds1302Init() ;
  225. void Ds1302ReadTom();

  226. extern uchar TIME[7];




  227. #endif
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表