久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3905|回復: 3
打印 上一主題 下一主題
收起左側

帶詳細注釋的單片機鬧鐘程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:102668 發表于 2016-1-16 05:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include<reg52.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 fmq=P3^3;//鬧鐘
  9. uchar code table[]={0xc0,0xf9,0xa4,//數碼管顯示的數值
  10. 0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,
  11. 0x40,0x79,0x24,//帶小數點的數值
  12. 0x30,0x19,0x12,0x02,0x78,0x00,0x10};
  13. void jia();   //函數聲明
  14. void jian();
  15. uchar table_1[6]; //定義數組,數組內含有6個數值
  16. uchar table_2[6];
  17. uchar shi=23,fen=59,miao=50; //顯示初始值
  18. uchar shi1,fen1,miao1,shi2,fen2,miao2,shi3,fen3,miao3;//定義全局變量
  19. uchar flag,flag1,cnt,count;//定義全局變量
  20. void delay(uchar i)  //延時函數,用于動態掃描數碼管
  21. {
  22.      uchar x,y;
  23.      for(x=i;x>0;x--)
  24.           for(y=110;y>0;y--);
  25. }
  26. void init()   //初始化函數
  27. {
  28.      TMOD=0X01; //工作方式1
  29.      TH0=(65536-50000)/256; //定時時間為:50ms
  30.      TL0=(65536-50000)%256;
  31.      ET0=1;     //打開定時器
  32.      EA=1;    //開總中斷
  33.      TR0=1;    //啟動定時器
  34. }
  35. void display()  //顯示子函數,用于顯示時間數值
  36. {
  37.      uchar i,j;
  38.      table_1[0]=miao%10;  //分離秒的各位與十位
  39.      table_1[1]=miao/10;
  40.      table_1[2]=fen%10+11;  //分離分的各位與十位
  41.      table_1[3]=fen/10;
  42.      table_1[4]=shi%10+11; //分離時的各位與十位
  43.      table_1[5]=shi/10;
  44.      j=0x7f;    //從秒到時的掃描(位選)
  45.      for(i=0;i<6;i++)
  46.      {
  47.       P2=j;
  48.       P0=table[table_1[i]];//顯示數值
  49.       delay(10);
  50.       j=_cror_(j,1);//循環右移
  51.      }
  52. }
  53. void display_1() //顯示子函數,用于顯示定時時間
  54. {
  55.      uchar i,j;
  56.      table_2[0]=miao2%10;  //以下含義同上
  57.      table_2[1]=miao2/10;
  58.      table_2[2]=fen2%10+11;
  59.      table_2[3]=fen2/10;
  60.      table_2[4]=shi2%10+11;
  61.      table_2[5]=shi2/10;
  62.      j=0x7f;
  63.      for(i=0;i<6;i++)
  64.      {
  65.           P2=j;
  66.           P0=table[table_2[i]];
  67.           delay(10);
  68.           j=_cror_(j,1);
  69.      }
  70. }
  71. void shijian() //時間子函數
  72. {
  73.      if(flag>=20)  //判斷是否到一秒
  74.      {
  75.           flag=0;  //到了,則標志位清零
  76.           miao++;  //秒加1
  77.           if(miao>=60) //判斷秒是否到60s
  78.           {
  79.                miao=0;//到了,則清零
  80.                fen++; //分加1
  81.                if(fen>=59) //以下含義同上
  82.                {
  83.                     fen=0;
  84.                     shi++;
  85.                     if(shi>23)
  86.                          shi=0;
  87.                }
  88.           }
  89.      }
  90. }
  91. void key_scan() //鍵盤掃描子函數
  92. {
  93.      uchar i;   //定義局部變量
  94.      if(key1==0)
  95.      {
  96.           while(!key1)  //防止掉顯
  97.           {
  98.                if(cnt==0||cnt==1||cnt==2||cnt==3||cnt==4||cnt==8)
  99.                {
  100.                     display();
  101.                }
  102.                if(cnt==5||cnt==6||cnt==7)
  103.                {
  104.                     display_1();
  105.                }
  106.           }
  107.           cnt++; //記下按鍵key1按下的次數
  108.           if(cnt==1) //第一次按下,停止計數
  109.           TR0=0;
  110.           if(cnt==2)   //第二次按下
  111.           {
  112.                miao1=miao; //保存秒的數值
  113.                miao=99;//顯示99,表示可以調節秒的數值了
  114.                for(i=0;i<100;i++)
  115.                 display(); //顯示99
  116.                miao=miao1; //恢復前一刻秒的數值
  117.           }
  118.           if(cnt==3) //以下含義同上
  119.           {
  120.                fen1=fen;
  121.                fen=99;
  122.                for(i=0;i<100;i++)
  123.                     display();
  124.                fen=fen1;
  125.           }
  126.           if(cnt==4)
  127.           {
  128.                shi1=shi;
  129.                shi=99;
  130.                for(i=0;i<100;i++)
  131.                     display();
  132.                shi=shi1;
  133.           }
  134.           if(cnt==5)
  135.           {
  136.                miao1=miao2;
  137.                miao2=88;
  138.                for(i=0;i<100;i++)
  139.                     display_1();
  140.                miao2=miao1;
  141.           }
  142.           if(cnt==6)
  143.           {
  144.                fen1=fen2;
  145.                fen2=88;
  146.                for(i=0;i<100;i++)
  147.                     display_1();
  148.                fen2=fen1;
  149.           }
  150.           if(cnt==7)
  151.           {
  152.                shi1=shi2;
  153.                shi2=88;
  154.                for(i=0;i<100;i++)
  155.                     display_1();
  156.                shi2=shi1;
  157.           }
  158.           if(cnt==8) //第八次按下
  159.           {
  160.                TR0=1;  //開始計數
  161.                cnt=0; //按下次數清零
  162.           }
  163.      }
  164.      if(key2==0)   //判斷key2是否按下
  165.      {
  166.           while(!key2)  //防止掉顯
  167.           {
  168.                if(cnt==0||cnt==1||cnt==2||cnt==3||cnt==4||cnt==8)
  169.                {
  170.                     display();
  171.                }
  172.                if(cnt==5||cnt==6||cnt==7)
  173.                {
  174.                     display_1();
  175.                }
  176.           }
  177.           jia();//調用加1的子函數
  178.      }
  179.      if(key3==0)  //判斷key3是否按下
  180.      {
  181.           while(!key3)  //防止掉顯
  182.           {
  183.                if(cnt==0||cnt==1||cnt==2||cnt==3||cnt==4||cnt==8)
  184.                {
  185.                     display();
  186.                }
  187.                if(cnt==5||cnt==6||cnt==7)
  188.                {
  189.                     display_1();
  190.                }
  191.           }
  192.           jian(); //調用減1子函數
  193.      }
  194. }
  195. void jia()   //加1子函數
  196. {
  197.      if(cnt==2) //判斷key1按下的次數是否為2
  198.      {
  199.           miao++; //是,則秒加1
  200.           if(miao>59) //判斷秒是否大于59,是,則秒清零
  201.                miao=0;
  202.      }
  203.      if(cnt==3) //以下含義同上
  204.      {
  205.           fen++;
  206.           if(fen>59)
  207.                fen=0;
  208.      }
  209.      if(cnt==4)
  210.      {
  211.           shi++;
  212.           if(shi>23)
  213.                shi=0;
  214.      }
  215.      if(cnt==5)
  216.      {
  217.           miao2++;
  218.           if(miao2>59)
  219.                miao2=0;
  220.      }
  221.      if(cnt==6)
  222.      {
  223.           fen2++;
  224.           if(fen2>59)
  225.                fen2=0;
  226.      }
  227.      if(cnt==7)
  228.      {
  229.           shi2++;
  230.           if(shi2>23)
  231.                shi2=0;
  232.      }
  233. }
  234. void jian()    //減1子函數
  235. {
  236.      if(cnt==2) //判斷key1按下的次數是否為2,是則秒減1
  237.      {
  238.           miao--;
  239.           if(miao==255)  //判斷秒是否減到255,是,則秒清零
  240.                miao=59;
  241.      }
  242.      if(cnt==3)
  243.      {
  244.           fen--;
  245.           if(fen==255)
  246.                fen=59;
  247.      }
  248.      if(cnt==4)
  249.      {
  250.           shi--;
  251.           if(shi==255)
  252.                shi=23;
  253.      }
  254.      if(cnt==5)
  255.      {
  256.           miao2--;
  257.           if(miao2==255)
  258.                miao2=59;
  259.      }
  260.      if(cnt==6)
  261.      {
  262.           fen2--;
  263.           if(fen2==255)
  264.                fen2=59;
  265.      }
  266.      if(cnt==7)
  267.      {
  268.           shi2--;
  269.           if(shi2==255)
  270.                shi2=23;
  271.      }
  272. }
  273. void clock() //鬧鈴子函數
  274. {
  275.      if(miao2==miao) //顯判斷秒的數值是否相等
  276.           if(fen2==fen)  //是,在判斷分是否相等
  277.                if(shi2==shi) //是,再判斷時是否相等
  278.                {
  279.                     flag1=0; //是,則標志位,flag1清零
  280.                     while(!(flag1==100))  //判斷flag1是否到100
  281.                     {
  282.                          fmq=0;  //沒有,則,繼續驅動蜂鳴器響,時間約為:5s
  283.                          shijian(); //調用時間子函數
  284.                          display(); //調用顯示子函數  
  285.                     }
  286.                     fmq=1;//關閉蜂鳴器
  287.                }
  288. }
  289. void main()
  290. {
  291.      init();//調用初始化子函數
  292.      while(1)
  293.      {
  294.           key_scan(); //調用鍵盤掃描子函數
  295.           shijian(); //時間子函數
  296.           clock(); //鬧鐘子函數
  297.           //顯示子函數
  298.           if(cnt==0||cnt==1||cnt==2||cnt==3||cnt==4||cnt==8)
  299.           {
  300.                display();
  301.           }
  302.           if(cnt==5||cnt==6||cnt==7)
  303.           {
  304.                display_1();
  305.           }
  306.      }
  307. }
  308. void time0() interrupt 1 //定時器0
  309. {
  310.      TH0=(65536-50000)/256; //初值50ms
  311.      TL0=(65536-50000)%256;
  312.      flag++;   //標志位
  313.      flag1++;
  314. }
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:99525 發表于 2016-1-21 10:51 | 只看該作者
這個注釋比較詳細了
回復

使用道具 舉報

板凳
ID:47652 發表于 2016-4-21 10:24 | 只看該作者
有清晰的注解太好了
回復

使用道具 舉報

地板
ID:312846 發表于 2018-5-6 22:58 | 只看該作者
你這個是無源的蜂鳴器嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 9色网站 | 日韩精品中文字幕一区二区三区 | 亚洲国产成人精品久久久国产成人一区 | 人操人免费视频 | 欧美激情一区 | 一区二区三区在线 | 国产一区二区精品在线 | 国产91久久久久蜜臀青青天草二 | 一级全黄视频 | 国产精品视频999 | 国产精品国产三级国产aⅴ中文 | 久久99精品国产自在现线小黄鸭 | 国产人成精品一区二区三 | 中文字幕国产一区 | 中文字幕一区二区三区四区五区 | 日日碰狠狠躁久久躁96avv | 一级黄色片在线看 | 中文字幕在线观看国产 | 91视频在线| 亚洲一区二区久久久 | 国产在线视频一区二区董小宛性色 | 久久久久se | 久久久久国产精品一区二区 | 在线观看国产视频 | 亚洲精品一区二区三区在线 | 亚洲国产一区二区三区 | 国产成人精品免高潮在线观看 | 亚洲精品字幕 | 婷婷色国产偷v国产偷v小说 | 日韩欧美视频 | 久久久久久成人 | 精久久 | 亚洲国产精品成人 | 夏同学福利网 | 日韩不卡一二区 | 国产综合精品一区二区三区 | 在线视频a | 亚洲欧美日韩久久 | 国产成人99久久亚洲综合精品 | 自拍偷拍第1页 | 欧美综合国产精品久久丁香 |