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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機萬年歷(含鬧鐘)思路分析及main.c內容(只給出main.c內容)

[復制鏈接]
跳轉到指定樓層
樓主
/*************************************************************************************
*                   實驗:萬年歷(DS1302、LCD1602、AT24C04的綜合應用)
* 步驟及現象:程序下載前,stc-isp選擇IRC頻率:12MHz,程序下載后,LCD1602顯示時間‘第一
*     行:“12:00:00     2”,第二行:"2019.01.01     0" ’。第一行最右側的2是周二
*     (有效范圍2000~2100年);第二行最右側0是關閉鬧鐘,若是1,則開啟鬧鐘,若是2,則
*     第一行顯示鬧鐘時間,而不是時鐘時間。鬧鐘開關及鬧鐘時間顯示的位選鍵是按鍵5。
*   (1)若設置時分秒(按鍵1是位選,按鍵2是加,按鍵3是減)。按按鍵1,小時的那兩位每0.5s
*      閃爍一次,表示可以對時的值按按鍵2一次加1或按按鍵3一次減1;再按按鍵1,分鐘的那兩
*      位每0.5s閃爍一次,表示可以對分的值進行加或減;再按按鍵1,秒的那兩位每0.5s閃爍一
*      次,表示可以對秒進行加或減。再按按鍵1或按按鍵0,退出設置模式。
*   (2)若設置年月日(按鍵0是位選,按鍵2是加,按鍵3是減)。按按鍵0,年的前兩位每0.5s閃爍
*      一次,表示可以對年前兩位的值進行加或減;再按按鍵0,年的后兩位每0.5s閃爍一次,表示
*      可以對年后兩位的值進行加或減;再按按鍵0,月的兩位每0.5s閃爍一次,表示可以對月的
*      值進行加或減;再按按鍵0,日的兩位每0.5s閃爍一次,表示可以對日的值進行加或減。再
*      按按鍵0或按按鍵1,退出設置模式。
*   (3)若設置鬧鐘(按鍵4是位選鍵,按鍵2是加,按鍵3是減)。現象和(1)一樣。(若開啟鬧鐘
*      后,到達鬧鐘時間,鬧鐘鳴叫,而無人去關閉鬧鐘,則鬧鐘從響應時間開始,鳴叫5s后,自
*      動關閉,下次時間到達后仍會提醒。)鬧鐘初始化時間"12:01:00"
*************************************************************************************/
  1. #include <stc8.h>
  2. #include "ds1302.h"
  3. #include "display.h"
  4. #include "key.h"
  5. #include "settime.h"
  6. #include "timer0.h"
  7. #include "1602.h"
  8. #include "i2c.h"
  9. #include "delay.h"

  10. sbit speaker = P1^3;             // 蜂鳴器
  11. char TIMED[7];                   // 用于接收ds1302中的數據,轉化為有符號類型,便于界限判定
  12. unsigned char alarm[3]={0,1,12}; // 存放鬧鐘時間(12:01:00鬧鐘初始化時間)
  13. unsigned int num2=0;             // 用于無人關鬧鐘時,計數,當達到5s后,把鬧鐘響應標志置0
  14. unsigned char Aflag = 0;         // 鬧鐘開關及鬧鐘時間顯示標志
  15. bit Hflag=0, Tflag=0, Sflag=0;   // Hflag閃爍標志,Tflag鬧鐘響應標志,Sflag清鬧鐘響應標志標志
  16. void main()
  17. {
  18.         unsigned char keys, i;
  19.         P1M1=0x00;P1M0=0x08;      // 蜂鳴器配置為強推挽輸出
  20.         speaker = 1;              // 關閉蜂鳴器
  21.         Ds1302Init();             // ds1302初始化         
  22.         LCD_Init();               // LCD1602初始化
  23.         Timer0Init();             // 定時器0初始化
  24.         for(i=0;i<3;i++)          // 實驗板第一次下載或復位后,往AT24C04中寫入鬧鐘初始化時間
  25.         {
  26.                 write_24c04(0x00+i,alarm[i]);
  27.                 Delay_ms(1);
  28.         }
  29.         while(1)
  30.         {
  31.                 keys = key_scan();    // 獲取按鍵按鍵值
  32.                 for(i=0;i<3;i++)      // 工作后,讀出已存入AT24C04中的鬧鐘時間
  33.                 {
  34.                         alarm[i] = read_24c04(0x00+i);
  35.                         Delay_ms(1);
  36.                 }
  37.                 settime(keys);                  // 設置時間及鬧鐘時間函數,keys=0,設置年月日,keys=1,設置時分秒,keys=4,設置鬧鐘時間
  38.                 Display();            // 工作狀態下1602顯示函數
  39.                 if(keys == 5)         // 通過按鍵5設置是否開啟鬧鐘,Aflag=1開啟,Aflag=0關閉,Aflag=2查看鬧鐘時間
  40.                 {
  41.                         Aflag++;
  42.                         if(Aflag==3)      // Aflag累加到3后,歸零
  43.                                 Aflag = 0;
  44.                 }
  45.                 if((Aflag==1)&&(TIME[0]==alarm[0])&&(TIME[1]==alarm[1])&&(TIME[2]==alarm[2]))
  46.                 {                     // 判斷是否滿足鬧鐘鳴叫條件
  47.                         Tflag = 1;        // 鬧鐘鳴叫標志置1
  48.                         num2 = 0;         // 鳴叫計數歸零
  49.                         Sflag = 0;        // 清鬧鐘鳴叫標志置0
  50.                 }
  51.                 if((Tflag == 1)&&(Aflag == 1))// 鳴叫需同時滿足鳴叫標志為1、鬧鐘開啟
  52.                 {
  53.                         speaker = ~speaker;
  54.                         if(Sflag == 1)            // 判斷鳴叫時間是否到5s了
  55.                                 Tflag = 0;            // 5s后,鳴叫標志清0
  56.                 }
  57.                 else
  58.                 {
  59.                         speaker = 0;              // 關閉蜂鳴器
  60.                         Tflag = 0;               
  61.                 }
  62.         }
  63. }
  64. void TM0_Isr() interrupt 1 using 1
  65. {
  66.         static unsigned char num1=0;                  
  67.         num1++;                      // 進一次中斷值加1,5ms進一次中斷
  68.         if(Tflag == 1)               // 到鬧鐘時間后,num2開始累加
  69.         {
  70.                 num2++;
  71.         }
  72.         if(100 == num1)              // 選中要調整的時間后,代表這個時間的兩位開始每0.5s閃爍一次   
  73.         {
  74.                 num1 = 0;
  75.                 Hflag = ~Hflag;          // 閃爍標志翻轉
  76.         }
  77.         if(1000 == num2)             // 鬧鐘無人關時,鳴叫5s后,自動關閉鬧鐘,下次時間到時仍會鳴叫      
  78.         {
  79.                 num2 = 0;
  80.                 Sflag = 1;               // 清鬧鐘標志標志置1
  81.         }
  82. }
復制代碼

[我是在我之前發的貼子的基礎上,加了鬧鐘和星期,同時把調整時間選中位改成了閃爍。這個鏈接是我修改前的模板:(想挑戰自己的就拿這個改,看能不能改成我現在這個版本)ds1302用1602實現時間顯示及調整的單片機代碼
http://www.zg4o1577.cn/bbs/dpj-164635-1.html
(出處: 單片機論壇)

P90727-090508.jpg (3.51 MB, 下載次數: 70)

效果圖.jpg

效果圖.jpg

P90727-091152.jpg (3.39 MB, 下載次數: 66)

鬧鐘定的時間.jpg

鬧鐘定的時間.jpg

捕獲.PNG (6.27 KB, 下載次數: 65)

用到的模塊.jpg

用到的模塊.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人免费视频网站在线观看 | 超碰国产在线 | 国产欧美精品一区二区色综合 | 黄网在线观看 | 中文字幕欧美一区 | 国产精品久久久久久久岛一牛影视 | 国产精品亚洲视频 | av免费网站在线观看 | 美国av毛片 | 91影院 | 超碰激情 | 日本在线看片 | av一区二区三区四区 | 日韩一区精品 | 狠狠草视频 | 亚洲成av人片在线观看 | 久久99视频精品 | 国产欧美日韩久久久 | 日韩成人在线网站 | 一区二区精品 | 国产欧美精品一区二区 | 精品视频在线播放 | a在线免费观看视频 | 色精品 | 日韩视频精品 | 日韩中文字幕在线 | 天天弄天天操 | 精品三区 | 久久精品在线 | 亚洲精品久久久久avwww潮水 | 久久久久久久久毛片 | 天天躁人人躁人人躁狂躁 | 国产一区二区三区四 | 亚洲一区 中文字幕 | 午夜精品一区二区三区在线视频 | 久久久精品国产 | 久久成人精品一区二区三区 | 国产精品不卡一区 | 日韩在线观看中文字幕 | 91视频网| 精品综合久久久 |