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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機DS1302時鐘芯片的鬧鐘程序,想加一個整點報時滴滴十秒

[復制鏈接]
跳轉到指定樓層
樓主
想加一個整點報時滴滴十秒的一個程序,不知道怎么寫,寫好了加在整個程序的哪個位置,請各位大佬不吝賜教,小弟感激不盡!

單片機源程序如下:
//1602顯示時鐘,按K3進入時鐘設置,按K1選擇設置的時分秒日月,按K2加1。//
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define lcd1602data P0
  4. typedef unsigned char u8;
  5. typedef unsigned int u16;
  6. sbit E=P2^7;   //設置液晶端口    使能信號
  7. sbit RW=P2^5;  //讀寫選擇  讀:H/寫:L
  8. sbit RS=P2^6;  //數據命令選擇  數據:H/命令:L
  9. sbit  key1=P3^1;
  10. sbit  key2=P3^0;
  11. sbit  key3=P3^2;
  12. sbit  spk=P1^7;

  13. sbit SCLK=P3^6;   //設置時鐘端口
  14. sbit IO=P3^4;
  15. sbit RST=P3^5;  
  16. u16 read[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};   //設置秒分時日月周年讀寄存器
  17. u16 write[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};  //設置秒分時日月周年寫寄存器
  18. u8 time[]={0x30,0x30,0x23,0x13,0x09,0x04,0x19};    //存放初始時間
  19. u16 setmark,setplace;      //setmark檢測key3是否按下,setplace選擇要調整的時間塊。
  20. void delay_ms(u16 n);
  21. void initConfiguration();
  22. void lcdDisplay();
  23. void lcdwrite_com(u8 datas);
  24. void lcdwrite_datas(u8 datas);
  25. void lcdinit();
  26. void writebyte(u8 address,u8 datas);
  27. u8 readbyte(u8 address);
  28. void ds1302init();
  29. void read_time();
  30. void DIDI(u16);
  31. void main()
  32. {
  33.   u16 i;
  34.   initConfiguration();   //初始化
  35.   lcdinit();
  36.   ds1302init();
  37.   while(1)
  38.   {
  39.    if(setmark==0)    //時鐘正常運作
  40.    {
  41.     read_time();
  42.    }
  43.    else        //調整時間
  44.    {
  45.      if(key1==0)
  46.     {
  47.      delay_ms(1);
  48.     if(key1==0)
  49.     {
  50.        setplace++;     //按下key1要調整的時間塊加一
  51.       setplace%=7;
  52.     }
  53.     while(i<50&&key1==0)    //等待key1松開
  54.      {
  55.      i++;
  56.      delay_ms(10);
  57.      }
  58.      i=0;
  59.     }

  60.     if(key2==0)
  61.     {
  62.       delay_ms(1);
  63.      if(key2==0)        //按下key2對應的初始時間加一
  64.      {
  65.        time[setplace]++;
  66.      if((time[setplace]&0x0f)>9)      //換成BCD碼。
  67.      {
  68.       time[setplace]=time[setplace]+6;
  69.      }
  70.      if((time[setplace]>=0x60)&&(setplace<2))  //分秒只能到59
  71.      {
  72.       time[setplace]=0;
  73.      }
  74.      if((time[setplace]>=0x24)&&(setplace==2))  //小時只能到23
  75.      {
  76.       time[setplace]=0;
  77.      }
  78.      if((time[setplace]>=0x32)&&(setplace==3))  //日只能到31
  79.      {
  80.       time[setplace]=1;
  81.      }
  82.      if((time[setplace]>=0x13)&&(setplace==4))  //月只能到12
  83.      {
  84.       time[setplace]=1;
  85.      }
  86.      if((time[setplace]>=0x8)&&(setplace==5))  //周只能到7
  87.      {
  88.      time[setplace]=1;
  89.      }
  90.                   
  91.      }
  92.      while((i<50)&&(0==key2))
  93.      {
  94.       i++;
  95.      delay_ms(10);
  96.      }
  97.      i=0;
  98.     }
  99.    }
  100.    lcdDisplay();
  101.   }
  102. }



  103. void delay_ms(u16 n)    //準確延時一毫秒,晶振12M
  104. {
  105. u16 a,b;
  106. for(;n>0;n--)
  107. {
  108.   for(a=199;a>0;a--)
  109.   {
  110.    for(b=1;b>0;b--)
  111.    {
  112.      ;
  113.    }
  114.   }
  115. }
  116. }


  117. void initConfiguration()  //初始化外部中斷0
  118. {
  119. EA=1;
  120. IT0=1;
  121. EX0=1;
  122. }
  123. void init0() interrupt 0  //按下key3時間保持不變
  124. {
  125.   delay_ms(10);
  126.   if(key3==0)
  127.   {
  128.    setmark=~setmark;
  129.   setplace=0;
  130.   ds1302init();
  131.   }
  132. }
  133. void lcdDisplay()      //顯示函數
  134. {

  135. lcdwrite_com(0x80+0x00);    //確定寫數據的位置
  136. lcdwrite_datas('2');
  137. lcdwrite_datas('0');
  138. lcdwrite_datas('0'+time[6]/16);    //寫入年份的高位
  139. lcdwrite_datas('0'+(time[6]&0x0f));  //低位
  140. lcdwrite_datas('-');
  141. lcdwrite_datas('0'+time[4]/16);
  142. lcdwrite_datas('0'+(time[4]&0x0f));  //里面的小括號很重要
  143. lcdwrite_datas('-');  
  144. lcdwrite_datas('0'+time[3]/16);
  145. lcdwrite_datas('0'+(time[3]&0x0f));
  146.   
  147. lcdwrite_com(0x8c);
  148. lcdwrite_datas('0'+(time[5]&0x07));
  149. lcdwrite_com(0xc0);        //跳線帽Joe接vcc
  150. lcdwrite_datas('0'+time[2]/16);
  151. lcdwrite_datas('0'+(time[2]&0x0f));
  152. lcdwrite_datas('-');
  153. lcdwrite_datas('0'+time[1]/16);
  154. lcdwrite_datas('0'+(time[1]&0x0f));
  155. lcdwrite_datas('-');
  156. lcdwrite_datas('0'+time[0]/16);   
  157. lcdwrite_datas('0'+(time[0]&0x0f));
  158. }
  159. void lcdwrite_com(u8 datas)    //lcd液晶寫入指令操作        模擬時序
  160. {
  161. E=0;
  162. RW=0;
  163. RS=0;
  164. lcd1602data=datas;
  165. delay_ms(1);
  166. E=1;
  167. //delay_ms(1);
  168. E=0;

  169. }
  170. void lcdwrite_datas(u8 datas)   //lcd液晶寫入數據操作
  171. {
  172. E=0;
  173. RW=0;
  174. RS=1;
  175. lcd1602data=datas;
  176. delay_ms(1);       //延時不能太長否則調整不靈敏
  177. E=1;
  178. //delay_ms(1);
  179. E=0;

  180. }
  181. void lcdinit()       //LCD液晶初始化
  182. {
  183. lcdwrite_com(0x38);   //8位總線,顯示兩行,5x7點陣
  184. lcdwrite_com(0x0c);    //開顯示功能,無關標
  185. lcdwrite_com(0x06);    //光標右移,即數據依次右移
  186. lcdwrite_com(0x01);    //清屏
  187. lcdwrite_com(0x80);    //第一個數據位置
  188. }


  189. void writebyte(u8 address,u8 datas)     //在寄存器里寫時間數據,模擬時序
  190. {
  191. u8 i;
  192. RST=0;
  193. _nop_();
  194. SCLK=0;
  195. _nop_();
  196. RST=1;
  197. _nop_();
  198. for(i=0;i<8;i++)
  199. {
  200.   IO=address&0x01;
  201.   address>>=1;
  202.   SCLK=1;
  203.   _nop_();
  204.   SCLK=0;
  205.   _nop_();
  206. }
  207. for(i=0;i<8;i++)
  208. {
  209.   IO=datas&0x01;
  210.   datas>>=1;
  211.   SCLK=1;
  212.   _nop_();
  213.   SCLK=0;
  214.   _nop_();
  215. }
  216. RST=0;
  217. }
  218. u8 readbyte(u8 address)     //讀寄存器里的時間數據
  219. {
  220. u8 i,datas,dat;
  221. RST=0;
  222. //_nop_();
  223. SCLK=0;
  224. //_nop_();
  225. RST=1;
  226. //_nop_();
  227. for(i=0;i<8;i++)
  228. {
  229.   IO=address&0x01;
  230.   address>>=1;
  231.   SCLK=1;
  232.   _nop_();
  233.   SCLK=0;
  234.   _nop_();
  235. }
  236. //_nop_();
  237. for(i=0;i<8;i++)
  238. {
  239.   dat=IO;
  240.   datas=(datas>>1)|(dat<<7);
  241.   SCLK=1;
  242.   _nop_();
  243.   SCLK=0;
  244.   _nop_();
  245. }
  246. RST=0;
  247. //_nop_();
  248. SCLK=1;
  249. //_nop_();
  250. IO=0;
  251. //_nop_();
  252. IO=1;
  253. //_nop_();
  254. return datas;
  255. }
  256. void ds1302init()      //在寄存器里寫入初始時間
  257. {
  258. u8 i;
  259. writebyte(0x8e,0x00);    //關閉寫保護寄存器
  260. for(i=0;i<7;i++)
  261. {
  262.   writebyte(write[i],time[i]);
  263. }
  264. writebyte(0x8e,0x80);     //打開寫保護寄存器
  265. }
  266. void read_time()       //讀取時鐘時間    time數組存儲
  267. {
  268. u8 i;
  269. for(i=0;i<7;i++)
  270. {
  271.   time[i]=readbyte(read[i]);
  272. }
  273. }
復制代碼


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

使用道具 舉報

沙發
ID:307020 發表于 2019-9-20 16:51 | 只看該作者
假設BUZ1上接VCC,在小時位增加1時P1.7輸出一定頻率的高電位脈沖(101010),Q1按頻率通斷,BUZ1出聲;秒加十后P1.7輸出低電位0關掉Q1便可。
回復

使用道具 舉報

板凳
ID:610666 發表于 2019-9-20 21:27 | 只看該作者
wj_yuq 發表于 2019-9-20 16:51
假設BUZ1上接VCC,在小時位增加1時P1.7輸出一定頻率的高電位脈沖(101010),Q1按頻率通斷,BUZ1出聲;秒加 ...

就是BUZ1上接Vcc,從23點到0點,會響嗎?
具體程序該怎么寫,加在哪個位置?
請賜教
回復

使用道具 舉報

地板
ID:123289 發表于 2019-9-21 08:59 | 只看該作者
只要你不抄別人的程序,你就能辦到。
回復

使用道具 舉報

5#
ID:610666 發表于 2019-9-21 23:42 | 只看該作者
yzwzfyz 發表于 2019-9-21 08:59
只要你不抄別人的程序,你就能辦到。

因為不太懂,這個是參照別人的程序寫的,望指點
回復

使用道具 舉報

6#
ID:307020 發表于 2019-9-23 13:13 | 只看該作者
即便是參照別人程序寫的,也要整明白,你代碼中“u8 time[]={0x30,0x30,0x23,0x13,0x09,0x04,0x19};    //存放初始時間”保存了從DS1302模塊讀來的實時數據,對照DS1302的Data Sheet,研讀你程序代碼,找到”小時“”秒“數據在time[]中的具體位置,在代碼中增加”小時緩存“、”BUZ計數“變量,比較”小時緩存“與time[]中小時數據;當time[]中小時數據=”小時緩存“+1時,按順序進行如下內容:1”BUZ計數“==10(BUZ秒數);2P1.7輸出一定頻率的高電位脈沖(101010),Q1按頻率通斷,BUZ1出聲;3”BUZ計數“=”BUZ計數“-1直到”BUZ計數“=0;4P1.7輸出低電位0關掉Q1;”小時緩存“=”小時緩存“+1。具體放在什么位置無所謂,學單片機的樂趣在于搞明白,然后實現自己的想法。
回復

使用道具 舉報

7#
ID:610666 發表于 2019-9-23 21:53 | 只看該作者
wj_yuq 發表于 2019-9-23 13:13
即便是參照別人程序寫的,也要整明白,你代碼中“u8 time[]={0x30,0x30,0x23,0x13,0x09,0x04,0x19};    // ...

您好,我才開始學,能明白您說的意思,但是自己學疏才淺不能實現您指點的這些,望您寫個范例,供我參考、學習,感激不盡
回復

使用道具 舉報

8#
ID:429156 發表于 2019-9-26 14:38 | 只看該作者
程序中加個判斷不就搞定?
回復

使用道具 舉報

9#
ID:610666 發表于 2019-9-26 19:59 | 只看該作者
xiaomi_51hei 發表于 2019-9-26 14:38
程序中加個判斷不就搞定?

關鍵是不會呀
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 波多野结衣先锋影音 | 男女污污网站 | 中文字幕在线电影观看 | 精品久久国产视频 | 不用播放器看的av | 91影视| 龙珠z国语版在线观看 | 在线看一区二区三区 | 亚洲精品在线视频 | 亚洲精品一区二区 | 精品1区2区 | 成人影院在线 | 日韩国产精品一区二区三区 | 国产亚洲黄色片 | 爱综合| 99re6在线视频 | a级大片免费观看 | 影音先锋中文字幕在线观看 | 国产亚洲精品精品国产亚洲综合 | 亚洲一区在线日韩在线深爱 | 99精品久久久久久中文字幕 | 97精品一区二区 | 国产一级片免费看 | 国产精品成人在线 | 日韩av一区二区在线观看 | 日本a级大片 | 精品亚洲一区二区三区 | 亚洲综合久久久 | 日韩毛片 | 手机av免费在线 | 视频在线观看一区二区 | 免费在线一区二区 | 黄色免费网站在线看 | 国产99久久久国产精品 | 国产一级电影在线观看 | 欧美爱爱视频 | 成人一区精品 | 欧美日韩国产高清视频 | 亚洲欧美日韩精品久久亚洲区 | 精一区二区 | 国产成人精品一区二区三区网站观看 |