找回密码
 立即注册

QQ登录

只需一步,快速开始

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

分享一个单片机可调闹铃 程序+仿真

[复制链接]
跳转到指定楼层
楼主
ID:83006 发表于 2015-9-12 22:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
可以显示年月日、时间、闹铃,并可调。
自己也是刚学单片机,自己弄出这个不是很好,希望有大神能够指正我做这个是否还有某些考虑不到位的地方!

13定时器实验.rar

185.91 KB, 下载次数: 50, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的积分奖励!

查看全部评分

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

使用道具 举报

沙发
ID:1 发表于 2015-9-12 23:01 | 只看该作者
楼主的程序:
  1. #include<reg51.h>
  2. #include<INTRINS.H>

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit key1=P1^0;
  6. sbit key2=P1^1;
  7. sbit key3=P1^2;
  8. sbit key4=P1^3;
  9. sbit key5=P1^4;
  10. sbit key6=P1^5;
  11. sbit key7=P1^6;
  12. sbit key8=P1^7;

  13. sbit buzzer=P2^5;  //蜂鸣器端口
  14. sbit lcd_RS = P2^0; //1602数据/命令选择端(H:数据寄存器L:指令寄存器)
  15. sbit lcd_RW = P2^1; //1602读/写选择端
  16. sbit lcd_E  = P2^2;//1602使能信号端

  17. uchar time0[]="CLOCK 23:58";
  18. uchar mark1[]="2015-01-01";
  19. uchar mark2[]="  SET   UP  ";
  20. uchar code tab[]={'0','1','2','3','4','5','6','7','8','9'};//液晶显示
  21. uchar code tab2[]={0x08,0x14,0x0A,0x15,0x0A,0x14,0x08,0x10};  //有闹铃声响开关标示显示
  22. uchar alarm_on;   //闹铃声响级
  23. uchar sound_on;   //闹铃发声标示
  24. uchar display_alarm;                   //显示闹铃标示
  25. uchar num=0;

  26. uchar flag_clock,flag_alarm,flag_year;  //时钟/闹铃设置模式标示

  27. uchar second,minute,hour;                  //秒,分,时
  28. uint nian,yue,ri;    //年月日
  29. uchar alarm_h,alarm_m;                         //闹铃的时,分
  30. uchar clock[11];                           //时间
  31. uchar alarm[11];                          //闹铃
  32. uint year[10];                                  //年月日

  33. void delay1(uint t)//短延时函数
  34. {
  35.         while(t--);
  36. }
  37. void delay2(uint t) //长延时函数
  38. {
  39.         uint x,y;
  40.         for(x=t;x>0;x--)
  41.                 for(y=110;y>0;y--);
  42. }

  43. void WriteCommand(uchar com)                 //写入指令
  44. {
  45.         delay2(5);//操作前短暂延时,保证信号稳定
  46.         lcd_E=0;
  47.         lcd_RS=0;
  48.         lcd_RW=0;

  49.         P3=com;
  50.         lcd_E=1;
  51.         delay2(5);
  52.         lcd_E=0;
  53. }

  54. void WriteData(uchar dat)        //写数据
  55. {
  56.         delay2(5);  //操作前短暂延时,保证信号稳定
  57.         lcd_E=0;
  58.         lcd_RS=1;
  59.         lcd_RW=0;

  60.         P3=dat;
  61.         lcd_E=1;
  62.         delay2(5);
  63.         lcd_E=0;
  64. }

  65. void handle_time()                //显示时间
  66. {
  67.         uchar i;
  68.         clock[0]='C';
  69.         clock[1]='L';
  70.         clock[2]='O';
  71.         clock[3]='C';
  72.         clock[4]='K';
  73.         clock[5]=0x20;//显示为空
  74.         clock[6]=tab[hour/10];
  75.         clock[7]=tab[hour%10];
  76.         clock[8]=0x3a;           //显示冒号
  77.         clock[9]=tab[minute/10];
  78.         clock[10]=tab[minute%10];
  79.         WriteCommand(0x80+0x03);//光标指向第1行
  80.         for(i=0;i<11;i++)// 显示
  81.         {
  82.                 WriteData(clock[i]);
  83.                 delay2(10);
  84.         }
  85. }

  86. void handle_year() //显示年月日
  87. {
  88.          uchar i;
  89.          year[0]=tab[nian/1000];
  90.          year[1]=tab[(nian%1000)/100];
  91.          year[2]=tab[((nian%1000)%100)/10];
  92.          year[3]=tab[((nian%1000)%100)%10];
  93.          year[4]='-';
  94.          year[5]=tab[yue/10];
  95.          year[6]=tab[yue%10];
  96.          year[7]='-';
  97.          year[8]=tab[ri/10];
  98.          year[9]=tab[ri%10];
  99.          WriteCommand(0x80+0x43); //第2行
  100.          for(i=0;i<10;i++)
  101.          {
  102.                    WriteData(year[i]);
  103.                   delay2(10);
  104.          }
  105. }


  106. void InitLcd1602()                        //lcd1602初始化
  107. {
  108.         uchar i;
  109.         delay2(15);
  110.         WriteCommand(0x38); //display mode
  111.         WriteCommand(0x38); //display mode
  112.         WriteCommand(0x38); //display mode
  113.         WriteCommand(0x06); //显示光标移动位置
  114.         WriteCommand(0x0c); //显示开及光标设置
  115.         WriteCommand(0x01); //显示清屏
  116.         WriteCommand(0x80+0x03);//光标指向第一行
  117.         for(i=0;i<11;i++)// 显示
  118.         {
  119.                 WriteData(time0[i]);
  120.                 delay2(10);
  121.         }
  122.         WriteCommand(0x80+0x43);//将光标移到第二行
  123.         for(i=0;i<10;i++)// 显示
  124.         {
  125.                 WriteData(mark1[i]);
  126.                 delay2(10);
  127.         }
  128. }


  129. void handle_alarm()                   //显示闹钟
  130. {
  131.         uchar i;
  132.         alarm[0]='A';
  133.         alarm[1]='L';
  134.         alarm[2]='A';
  135.         alarm[3]='R';
  136.         alarm[4]='M';
  137.         alarm[5]=0x20;//显示为空
  138.         alarm[6]=tab[alarm_h/10];
  139.         alarm[7]=tab[alarm_h%10];
  140.         alarm[8]=0x3a;           //显示冒号
  141.         alarm[9]=tab[alarm_m/10];
  142.         alarm[10]=tab[alarm_m%10];
  143.         WriteCommand(0x80+0x03);//光标指向第1行第一个字符
  144.         for(i=0;i<11;i++)// 显示
  145.         {
  146.                 WriteData(alarm[i]);
  147.                 delay2(10);
  148.         }
  149. }

  150. void clock_set_up()      //时钟设置模式
  151. {
  152.         while(flag_clock)
  153.         {
  154.                 uchar i;
  155.                 WriteCommand(0x80+0x43);
  156.                 for(i=0;i<11;i++)// 显示
  157.                 {
  158.                         WriteData(mark2[i]);
  159.                         delay2(10);
  160.                 }               
  161.                 if(key1==0)                         //时++
  162.                 {
  163.                         delay2(5);//延时消抖
  164.                         if(key1==0)
  165.                         {
  166.                                 hour++;
  167.                                 if(hour==24)
  168.                                 {
  169.                                         hour=0;
  170.                                 }
  171.                         }
  172.                         while(!key1);//松手检测
  173.                 }
  174.                 if(key2==0)
  175.                 {
  176.                          delay2(5);//延时消抖
  177.                         if(key2==0)
  178.                         {
  179.                                 if(hour!=0)                  //时减
  180.                                 hour--;
  181.                         }
  182.                         while(!key2);//松手检测
  183.                 }
  184.                 if(key3==0)                                   //分++
  185.                 {
  186.                         delay2(5);
  187.                         if(key3==0)
  188.                         {
  189.                                 minute++;
  190.                                 if(minute==60)
  191.                                 {
  192.                                         minute=0;
  193.                                         hour++;
  194.                                         if(hour==24)
  195.                                         {
  196.                                                 hour=0;
  197.                                         }
  198.                                 }
  199.                         }
  200.                         while(!key3);
  201.                 }
  202.                 if(key4==0)                                   //分--
  203.                 {
  204.                         delay2(5);
  205.                         if(key4==0)
  206.                         {
  207.                                 if(minute!=0)
  208.                                 minute--;
  209.                         }
  210.                         while(!key4);
  211.                 }
  212.                 handle_time();                //显示时间
  213.                 if(key7==0)                   //结束时钟设置
  214.                 {
  215.                          delay2(5);//延时消抖
  216.                         while(!key7);//松手检测
  217.                         flag_clock=0;
  218.                 }
  219.         }
  220. }

  221. void alarm_set_up()                  //闹铃设置模式
  222. {
  223.         while(flag_alarm)
  224.         {
  225.                 uchar i;
  226.                 WriteCommand(0x80+0x43);
  227.                 for(i=0;i<11;i++)// 显示
  228.                 {
  229.                         WriteData(mark2[i]);
  230.                         delay2(10);
  231.                 }
  232.                 if(key1==0)                                         //时++
  233.                 {
  234.                         delay2(5);//延时消抖
  235.                         if(key1==0)
  236.                         {
  237.                                 alarm_h++;
  238.                                 if(alarm_h==24)
  239.                                 {
  240.                                         alarm_h=0;
  241.                                 }
  242.                         }
  243.                         while(!key1);//松手检测
  244.                 }
  245.                 if(key2==0)                           //时--
  246.                 {
  247.                         delay2(5);
  248.                         if(key2==0)
  249.                         {
  250.                                 if(alarm_h!=0)
  251.                                 alarm_h--;
  252.                         }
  253.                         while(!key2);
  254.                 }
  255.                 if(key3==0)                   //分++
  256.                 {
  257.                          delay2(5);//延时消抖
  258.                         if(key3==0)
  259.                         {
  260.                                 alarm_m++;
  261.                                 if(alarm_m==60)
  262.                                 {
  263.                                         alarm_m=0;
  264.                                         alarm_h++;
  265.                                         if(alarm_h==24)
  266.                                         {
  267.                                                 alarm_h=0;
  268.                                         }
  269.                                 }
  270.                         }
  271.                         while(!key3);//松手检测
  272.                 }
  273.                 if(key4==0)                         //分--
  274.                 {
  275.                         delay2(5);
  276.                         if(key4==0)
  277.                         {
  278.                                 if(alarm_m!=0)
  279.                                 alarm_m--;
  280.                         }
  281.                         while(!key4);
  282.                 }
  283.                 handle_alarm();           //显示闹铃
  284.                 if(key7==0)                 //结束闹铃设置
  285.                 {
  286.                         delay2(5);//延时消抖
  287.                         while(!key7);//松手检测
  288.                         flag_alarm=0;
  289.                 }
  290.         }       
  291. }

  292. void alarm_sound()                          //声响
  293. {
  294.                 buzzer=0;
  295.                 delay2(50);
  296.                 buzzer=1;
  297.                 delay2(50);
  298.                 buzzer=0;
  299.                 delay2(50);
  300.                 buzzer=1;
  301.                 delay2(50);
  302.                 buzzer=0;
  303.                 delay2(50);
  304. }

  305. void year_set_up()    //key4年月日设置
  306. {
  307.         while(flag_year)
  308.         {
  309.             uchar i;
  310.                 WriteCommand(0x80+0x03);
  311.                 for(i=0;i<11;i++)// 显示
  312.                 {
  313.                         WriteData(mark2[i]);
  314.                         delay2(10);
  315.                 }
  316.                 if(key1==0)                                //年+
  317.                 {
  318.                         delay2(5);
  319.                         if(key1==0)
  320.                         {
  321.                                 nian++;
  322.                         }
  323.                         while(!key1);
  324.                 }
  325.                 if(key2==0)                           //年--
  326.                 {
  327.                         delay2(5);
  328.                         if(key2==0)
  329.                         {
  330.                                 if(key2==0)
  331.                                 nian--;
  332.                         }
  333.                         while(!key2);
  334.                 }
  335.                 if(key3==0)                                //月+
  336.                 {
  337.                         delay2(5);
  338.                         if(key3==0)
  339.                         {
  340.                                 yue++;
  341.                                 if(yue==13)
  342.                                         yue=1;
  343.                         }
  344.                         while(!key3);
  345.                 }
  346.                 if(key4==0)                           //月--
  347.                 {
  348.                         delay2(5);
  349.                         if(key4==0)
  350.                         {
  351.                                 yue--;
  352.                                 if(yue==0)
  353.                                         yue=1;
  354.                         }
  355.                         while(!key4);
  356.                 }
  357.                 if(key5==0)                                         //日++
  358.                 {
  359.                         delay2(5);
  360.                         if(key5==0)
  361.                         {
  362.                                 if(yue==2||yue==4||yue==6||yue==9||yue==11)
  363.                                 {
  364.                                         ri++;
  365.                                         if(yue==2)
  366.                                         {
  367.                                                 if(ri==29)
  368.                                                 {
  369.                                                         if((nian%4==0&&nian%100!=0)||(nian%400==0));//闰年
  370.                                                         else                                 //平年
  371.                                                                 ri=1;
  372.                                                 }
  373.                                                 if(ri==30)
  374.                                                         ri=1;
  375.                                         }
  376.                                         if(ri==31)
  377.                                                 ri=1;
  378.                                 }
  379.                                 else
  380.                                 {
  381.                                         ri++;
  382.                                         if(ri==32)
  383.                                                 ri=1;
  384.                                 }
  385.                         }
  386.                         while(!key5);
  387.                 }
  388.                 if(key6==0)                                 //日—-
  389.                 {
  390.                         delay2(5);
  391.                         if(key6==0)
  392.                         {
  393.                                 ri--;
  394.                                 if(ri==0)
  395.                                         ri=1;
  396.                         }
  397.                         while(!key6);
  398.                 }
  399.                 handle_year();
  400.                 if(key7==0)
  401.                 {
  402.                         delay2(5);
  403.                         if(key7==0)
  404.                                 flag_year=0;
  405.                         while(!key7);
  406.                 }
  407.         }
  408. }

  409. void key7_set_up()                 //K7开关闹铃
  410. {
  411.         uchar i;
  412.         alarm_on++;
  413.         if(alarm_on==2)
  414.         {
  415.                 alarm_on=0;
  416.         }
  417.         if(alarm_on==1)
  418.         {
  419.                 sound_on=1;
  420.                 WriteCommand(0x40);//写入自定义字符
  421.                 for(i=0;i<8;i++)
  422.                 {
  423.                         WriteData(tab2[i]);
  424.                 }
  425.                 WriteCommand(0x80+0x40);//显示自定义字符
  426.                 WriteData(0x00);
  427.                 delay2(10);
  428.         }
  429.         if(alarm_on==0)
  430.         {
  431.                 sound_on=0;
  432.                 buzzer=1;
  433.                 WriteCommand(0x80+0x40);//显示闹铃标示为空
  434.                 WriteData(0x20);
  435.                 delay2(10);
  436.         }       
  437. }
  438.                                                           
  439. void main()
  440. {
  441.         TMOD=0x10;
  442.         IE=0x88;
  443.         TH1=0x3c;
  444.         TL1=0xb0;
  445.         TR1=1;
  446.         nian=2015;
  447.         yue=1;
  448.         ri=1;
  449.         hour=23;         //初始时间
  450.         minute=58;
  451.         second=0;
  452.         display_alarm=0;  //开机不显示闹铃
  453.         alarm_h=0;          // 初始闹铃
  454.         alarm_m=0;
  455.         alarm_on=0;
  456.         sound_on=1;          //开机默认无声响
  457.         InitLcd1602();
  458.         while(1)
  459.         {
  460.                 uchar i;
  461.                 handle_year();
  462.                 handle_time();
  463.                 if(key1==0)                                //进入时钟设置模式
  464.                 {
  465.                         delay2(5);//延时消抖
  466.                         while(!key1);//松手检测
  467.                         flag_clock=1;                                       
  468.                         clock_set_up();
  469.                 }
  470.                 if(key2==0)                                                //设置闹铃模式
  471.                 {                       
  472.                         delay2(5);//延时消抖
  473.                         while(!key2);//松手检测
  474.                         flag_alarm=1;
  475.                         alarm_set_up();
  476.                 }
  477.                 if(key3==0)                           //显示闹铃,
  478.                 {
  479.                         delay2(5);//延时消抖
  480.                         while(!key3);//松手检测
  481.                         display_alarm=1;
  482.                         while(display_alarm)
  483.                         {
  484.                                 handle_alarm();
  485.                                 if(key7==0)
  486.                                 {
  487.                                         delay2(5);
  488.                                         if(key7==0)
  489.                                                 display_alarm=0;
  490.                                         while(!key7);                                       
  491.                                 }
  492.                         }
  493.                 }
  494.                 if(key4==0)                          //设置年月日模式
  495.                 {                                       
  496.                         delay2(5);
  497.                         while(!key4);
  498.                         flag_year=1;
  499.                         year_set_up();
  500.                 }
  501.                 if(key7==0)                                                 //闹铃开关启
  502.                 {
  503.                         delay2(5);
  504.                         while(!key7);
  505.                         key7_set_up();
  506.                 }
  507.                 if((hour==alarm_h)&&(minute==alarm_m))                //闹铃时间是否到了
  508.                 {
  509.                         if(sound_on==1)
  510.                         {
  511.                                 sound_on=0;
  512.                                 alarm_sound();
  513.                         }
  514.                 }

  515.         }
  516. }

  517. void ti_func() interrupt 3
  518. {
  519.         TH1=0x3c;
  520.         TL1=0xb0;
  521.         if(num<20)
  522.         {
  523.                 num=num+1;
  524.         }
  525.         if(num==20)                   //num为20时1S时间到
  526.         {
  527.                 num=0;
  528.                 second=second+1;
  529.                 if(second==60)         //1分钟时间到
  530.                 {
  531.                         second=0;
  532.                         minute=minute+1;
  533.                         if(minute==60)           //1小时时间到
  534.                         {
  535.                                 minute=0;
  536.                                 hour=hour+1;
  537.                                 if(hour==24)   //  24小时到
  538.                                 {
  539.                                         hour=0;
  540.                                         ri++;
  541.                                         if(yue==2||yue==4||yue==6||yue==9||yue==11)
  542.                                         {
  543.                                                 if(yue==2)
  544.                                                 {
  545.                                                         if(ri==29)
  546.                                                         {
  547.                                                                 if((nian%4==0&&nian%100!=0)||(nian%400==0));//闰年
  548.                                                                 else
  549.                                                                 {
  550.                                                                         ri=1;
  551.                                                                         yue++;
  552.                                                                 }       
  553.                                                         }
  554.                                                         if(ri==30)
  555.                                                         {
  556.                                                                 ri=1;
  557.                                                                 yue++;
  558.                                                         }
  559.                                                 }
  560.                                                 if(ri==31)
  561.                                                 {
  562.                                                         ri=1;
  563.                                                         yue++;
  564.                                                 }
  565.                                         }
  566.                                         else
  567.                                         {
  568.                                                 if(ri==32)
  569.                                                 {
  570.                                                         ri=1;
  571.                                                         yue++;
  572.                                                         if(yue==13)
  573.                                                         {
  574.                                                                 nian++;
  575.                                                                 yue=1;
  576.                                                         }
  577.                                                 }
  578.                                         }
  579.                                 }
  580.                         }

  581.                 }
  582.         }
  583. }
复制代码
回复

使用道具 举报

板凳
ID:90023 发表于 2015-9-13 17:04 | 只看该作者
很好,有机会试试
回复

使用道具 举报

地板
ID:420610 发表于 2018-11-4 17:42 | 只看该作者
有仿真电路图吗
回复

使用道具 举报

5#
ID:709315 发表于 2020-3-19 11:01 | 只看该作者
你好 我下载了为什么打不开仿真图啊?是文件损坏了吗?
回复

使用道具 举报

6#
ID:812792 发表于 2020-8-10 15:32 | 只看该作者
请问这个代码我要是在keil里面运行选STC15可以么
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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