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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5433|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)電子時鐘設(shè)計 帶仿真圖文件

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:258038 發(fā)表于 2017-12-6 10:03 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
基于AT89C51的單片機(jī)顯示


所有資料51hei提供下載:
實驗22 DS1302日期時間實驗.doc (78.5 KB, 下載次數(shù): 16)

新建壓縮(zipped)文件夾.zip (74.94 KB, 下載次數(shù): 63)


設(shè)計,帶仿真圖文件 ,要求說明,帶注釋程序


單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char

  4. sbit lcdrs=P2^0;
  5. sbit lcdrw=P2^1;
  6. sbit lcden=P2^2; //定義LCD的引腳

  7. sbit rst=P1^0; //定義DS1302的引腳
  8. sbit clk=P1^1;
  9. sbit io=P1^2;

  10. sbit set=P1^3; //定義按鍵
  11. sbit add=P1^4;
  12. sbit ok=P1^5;

  13. uchar year,month,day,hour,minute,second,n; //定義變量
  14. void delay() //延時,用于LCD控制
  15. { uchar i;
  16.    for(i=0;i<100;i++); }

  17. void w_lcdcom(uchar com) //寫LCD命令數(shù)據(jù)
  18. {   lcdrs=0;
  19.    lcdrw=0;
  20.    delay();
  21.    P0=com;
  22.    lcden=1;
  23.    delay();
  24.    lcden=0; }

  25. void w_lcddat(uchar dat) //寫LCD一個字符數(shù)據(jù)
  26. {  lcdrs=1;
  27.    lcdrw=0;
  28.    delay();
  29.    P0=dat;
  30.    lcden=1;
  31.    delay();
  32.    lcden=0; }

  33. void initlcd() //初始化LCD
  34. {  lcden=0;
  35.    w_lcdcom(0x38);
  36.    w_lcdcom(0x6);
  37.    w_lcdcom(0xc); }

  38. void w_lcdstr(uchar *s) //寫LCD字符串
  39. { while(*s)
  40.    {  w_lcddat(*s);
  41.       s++;} }

  42. void w_ds1302(uchar dat) //寫DS1302一個字節(jié)數(shù)據(jù)
  43. {  uchar i;
  44.    rst=1;
  45.    for(i=0;i<8;i++)
  46.    {  clk=0;
  47.       io=dat&0x01;
  48.       dat>>=1;
  49.           clk=1;
  50.       _nop_();_nop_();}}

  51. uchar r_ds1302() //讀DS1302一個字節(jié)數(shù)據(jù)
  52. {  uchar i;
  53.    uchar dat=0;
  54.    for(i=0;i<8;i++)
  55.    {  clk=0;_nop_();_nop_();
  56.       dat>>=1;
  57.       if(io)dat|=0x80;
  58.       clk=1;_nop_();_nop_();}
  59.           rst=0;
  60.       return (dat);}  

  61. void key() //按鍵處理
  62. {  if(set)goto l2; //“SET”鍵未按下時轉(zhuǎn)L2,退出。
  63.    else
  64.    {  w_lcdcom(0xf);  //顯示LCD的光標(biāo)
  65.       n++;//變量n保存“SET”按下的次數(shù)(1~6),用來確定光標(biāo)的位置和要修改和內(nèi)容。
  66.           if(n==7)n=1;}


  67. l1:while(~set); //等待“SET”鍵釋放
  68.    switch (n)  //根據(jù)n的值設(shè)置光標(biāo)的位置
  69.    {  case 1:w_lcdcom(0x89);break; //年的個位位置
  70.       case 2:w_lcdcom(0x8c);break; //月的個位位置
  71.           case 3:w_lcdcom(0x8f);break;//日的個位位置
  72.           case 4:w_lcdcom(0xc7);break;        //時的個位位置
  73.           case 5:w_lcdcom(0xca);break;        //分的個位位置
  74.           case 6:w_lcdcom(0xcd);} //秒的個位位置

  75.    if(~set) //“SET”鍵多次按下時,修改n的值
  76.    {  n++;
  77.           if(n==7)n=1;}
  78.         if(~add)// 當(dāng)“ADD”鍵按下時,根據(jù)n的值相應(yīng)內(nèi)容
  79.    {  switch(n)
  80.       {  case 1:
  81.              {  year++; //“年”加1(取值范圍00H~99H,BCD格式)
  82.            if(year%16==10)year=(year+0x10)&0xf0; //BCD調(diào)整
  83.                          if(year==0xa0)year=0; //當(dāng)“年”值=A0H時,清0
  84.                          w_lcdcom(0x88);// 置光標(biāo)到“年”的十位
  85.                          w_lcddat(year>>4|0x30); //顯示“年”的十位
  86.                  w_lcddat(year&0xf|0x30);} //顯示“年”的個位
  87.                  break;

  88.          case 2:
  89.              {  month++; //“月”加1
  90.             if(month%16==10)month=(month+16)&0xf0;
  91.                          if(month==0x13)month=0;
  92.                          w_lcdcom(0x8b);
  93.                          w_lcddat(month>>4|0x30);
  94.                 w_lcddat(month&0xf|0x30);}
  95.                  break;

  96.                  case 3:
  97.              {  day++; //“日”加1
  98.            if(day%16==10)day=(day+0x10)&0xf0; //BCD調(diào)整
  99.                          if(month==2)
  100.                          {if (year%400==0||(year%4==0&&year%100!=0)){if(day==0x29)day=0;}//當(dāng)值=29H時,清0
  101.                           else {if(day==0x30)day=0;}}//當(dāng)值=30H時,清0
  102.                          if(month%2==0){if(day==0x31)day=0;} //當(dāng)值=31H時,清0
  103.                          if(month%2==1){if(day==0x32)day=0;}//當(dāng)值=32H時,清0
  104.                         
  105.                          w_lcdcom(0x8e);// 置光標(biāo)到十位
  106.                          w_lcddat(day>>4|0x30); //顯示十位
  107.                  w_lcddat(day&0xf|0x30);} //顯示個位
  108.                  break;

  109.                  case 4:
  110.              {  hour++; //“時”加1
  111.            if(hour%16==10) hour=(hour+16)&0xF0; //BCD調(diào)整
  112.                          if(hour==0x24)hour=0; //當(dāng)值=24H時,清0
  113.                          w_lcdcom(0xc6);// 置光標(biāo)到十位
  114.                          w_lcddat(hour>>4|0x30); //顯示十位
  115.                  w_lcddat(hour&0xf|0x30);} //顯示個位
  116.                  break;

  117.                  case 5:
  118.              {  minute++; //“分”加1
  119.            if(minute%16==10) minute=(minute+16)&0xF0; //BCD調(diào)整
  120.                          if(minute==0x60)minute=0; //當(dāng)值=60H時,清0
  121.                          w_lcdcom(0xc9);// 置光標(biāo)到十位
  122.                          w_lcddat(minute>>4|0x30); //顯示十位
  123.                  w_lcddat(minute&0xf|0x30);} //顯示個位
  124.                  break;

  125.                  case 6:
  126.              {  second++; //“秒”
  127.                    if(second%16==10) second=(second+16)&0xF0; //BCD調(diào)整
  128.                          if(second==0x60)second=0; //當(dāng)值=60H時,清0
  129.                          w_lcdcom(0xcc);// 置光標(biāo)到十位
  130.                          w_lcddat(second>>4|0x30); //顯示十位
  131.                  w_lcddat(second&0xf|0x30);} //顯示個位
  132.                  break;}
  133.         }

  134.    while(~add); //等待“ADD”鍵釋放
  135.    if(ok)goto l1; //“OK”鍵未按下時轉(zhuǎn)L1
  136.    w_ds1302(0x8e);// 置DS1302控制口地址
  137.    w_ds1302(0); //允許寫操作
  138.    rst=0;
  139.    w_ds1302(0x80); //置DS1302“秒”地址
  140.    w_ds1302(second); //寫“秒”值
  141.    rst=0;                 
  142.    w_ds1302(0x82); //置DS1302“分”地址
  143.    w_ds1302(minute); //寫“分”值
  144.    rst=0;
  145.    w_ds1302(0x84); //置DS1302“時”地址
  146.    w_ds1302(hour); //寫“hour”值
  147.    rst=0;
  148.    w_ds1302(0x86); //置DS1302“day”地址
  149.    w_ds1302(day); //寫“day”值
  150.    rst=0;
  151.    w_ds1302(0x88); //置DS1302“month”地址
  152.    w_ds1302(month); //寫“month”值
  153.    rst=0; //地址依次加2
  154.    w_ds1302(0x8c); //置DS1302“年”地址
  155.    w_ds1302(year); //寫“年”值
  156.    rst=0;
  157. l2:w_lcdcom(0xc); //關(guān)閉LCD光標(biāo)
  158.    n=0;}


  159. void main() //主程序
  160. {  initlcd(); //初始化LCD
  161.    while(1)
  162.    {  w_ds1302(0x8e); //置DS1302控制口地址
  163.       w_ds1302(0x80); //禁止寫操作
  164.           rst=0;
  165.           w_lcdcom(0x80); //置LCD第1行光標(biāo)
  166.           w_lcdstr("DATE  20"); //顯示字符串

  167.           w_ds1302(0x8d); //置DS1302“年”地址
  168.           year=r_ds1302(); //讀“年”值,為BCD格式(00H~99H)
  169.           w_lcddat(year>>4|0x30); //顯示“年”的十位
  170.           w_lcddat(year&0xf|0x30); //顯示“年”的個位
  171.           w_lcddat('-'); //顯示分隔符
  172.           w_ds1302(0x89);  //置DS1302“月”地址
  173.           month=r_ds1302();  //讀“月”值,為BCD格式
  174.           w_lcddat(month>>4|0x30); //顯示“月”的十位
  175.           w_lcddat(month&0xf|0x30); //顯示“月”的個位
  176.           w_lcddat('-'); //顯示分隔符
  177.       w_ds1302(0x87);  //置DS1302“day”地址
  178.           day=r_ds1302();  //讀“day”值,為BCD格式
  179.           w_lcddat(day>>4|0x30); //顯示十位
  180.           w_lcddat(day&0xf|0x30); //顯示個位
  181. //地址依次減2,時間的分隔符用“:”
  182.           w_lcdcom(0xc0); //置LCD第2行光標(biāo)
  183.           w_lcdstr("TIME  "); //顯示字符串
  184.           w_ds1302(0x85); //置DS1302“hour”地址
  185.           hour=r_ds1302(); //讀值,為BCD格式
  186.           w_lcddat(((hour&0xf0)>>4)|0x30); //顯示十位
  187.           w_lcddat(hour&0xf|0x30); //顯示個位
  188.           w_lcddat(':'); //顯示分隔符

  189.           w_ds1302(0x83); //置DS1302“minute”地址
  190.           minute=r_ds1302(); //讀值,為BCD格式
  191.           w_lcddat(((minute&0xf0)>>4)|0x30); //顯示十位
  192.           w_lcddat(minute&0xf|0x30); //顯示個位
  193.           w_lcddat(':'); //顯示分隔符

  194.           w_ds1302(0x81); //置DS1302“秒”地址
  195.           second=r_ds1302(); //讀“秒”值,為BCD格式
  196.           w_lcddat(((second&0xf0)>>4)|0x30); //顯示“秒”的十位
  197.           w_lcddat(second&0xf|0x30); //顯示“秒”的個位

  198.           key(); //調(diào)用按鍵處理函數(shù)

  199.    }
  200. }
復(fù)制代碼





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

使用道具 舉報

沙發(fā)
ID:782897 發(fā)表于 2020-6-18 21:02 來自手機(jī) | 只看該作者
樓主,怎么添加鬧鐘
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产视频久 | 精品一区二区三区在线观看 | 天堂色综合 | 久久久69| 国产精品亚洲欧美日韩一区在线 | 国产一区二区三区在线免费观看 | av国产精品毛片一区二区小说 | 精品视频导航 | 久久精品色欧美aⅴ一区二区 | 99精品免费 | 男女下面一进一出网站 | 波多野结衣在线观看一区二区三区 | 凹凸日日摸日日碰夜夜 | 亚洲自拍偷拍免费视频 | 午夜天堂精品久久久久 | 成人高清在线视频 | 日本免费黄色 | 麻豆精品国产91久久久久久 | 午夜影院在线观看版 | 欧美一级二级视频 | 欧美黑人激情 | 欧美在线视频一区 | www.47久久青青 | 国产精品永久免费 | 在线视频日韩 | 91午夜在线 | 国产在线播放av | 国产不卡在线播放 | 亚洲精品一二区 | 亚洲精品久久久一区二区三区 | 亚洲深夜福利 | 久草电影网 | 伊人狠狠 | 精品国产高清一区二区三区 | 欧美精品一区二区三区一线天视频 | 最新日韩在线 | 91精品导航 | 国产精品国产三级国产aⅴ中文 | www.99精品 | 7777在线| 另类视频区 |