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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機數字電子鐘課程設計 含源碼,原理圖,仿真圖

  [復制鏈接]
跳轉到指定樓層
樓主
這是花了幾天時間做的課程設計,里面包含原理圖,
代碼,
仿真圖,
程序,
大家請多多指教。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include<reg52.h>//包含52單片機頭文件
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit rs=P2^0;  //定義1602液晶RS端
  5. sbit lcden=P2^2;//定義1602液晶LCDEN端
  6. sbit rd=P2^1;        //定義1602液晶rd端
  7. sbit s1=P3^0;   //定義按鍵--功能鍵
  8. sbit s2=P3^1;        //定義按鍵--增加鍵
  9. sbit s3=P3^2;        //定義按鍵--減小鍵
  10. sbit beep=P2^3; //定義蜂鳴器端
  11. uchar count,s1num;
  12. char miao,shi,fen,nian,yue,ri,zhou,num,tian;
  13. char yizhou[8][4]={"MON","TUE","WEN","THU","FRI","SAT","SUN"};
  14. int pingnian[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
  15. int ruinian[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
  16. void delay(uint z)  //延時函數
  17. {
  18.         uint x,y;
  19.         for(x=z;x>0;x--)
  20.                 for(y=110;y>0;y--);
  21. }
  22. void di()
  23. {
  24.         uchar i;
  25.         for(i=0;i<100;i++)
  26.         {
  27.                  beep = ~beep;
  28.                 delay(1);
  29.         }
  30.         beep = 0;
  31. }
  32. void write_com(uchar com)//液晶寫命令函數
  33. {
  34.         rs=0;
  35.         lcden=0;
  36.         P0=com;
  37.         delay(5);
  38.         lcden=1;
  39.         delay(5);
  40.         lcden=0;       
  41. }
  42. void write_date(uchar date)//液晶寫數據函數
  43. {
  44.         rs=1;
  45.         lcden=0;
  46.         P0=date;
  47.         delay(5);
  48.         lcden=1;
  49.         delay(5);
  50.         lcden=0;       
  51. }
  52. void write_sfm(uchar add,uchar date)//寫時分秒函數
  53. {
  54.         uchar shi,ge;
  55.         shi=date/10;//分解一個2位數的十位和個位
  56.         ge=date%10;
  57.         write_com(0x80+0x40+add);//設置顯示位置
  58.         write_date(0x30+shi);//送去液晶顯示十位
  59.         write_date(0x30+ge); //送去液晶顯示個位
  60. }
  61. void write_nyr(uchar add,uchar date)//寫年月日函數
  62. {
  63.         uchar shi,ge;
  64.         shi=date/10;//分解一個2位數的十位和個位
  65.         ge=date%10;
  66.         write_com(0x80+add);//設置顯示位置
  67.         write_date(0x30+shi);//送去液晶顯示十位
  68.         write_date(0x30+ge); //送去液晶顯示個位
  69. }
  70. void init()//初始化函數
  71. {
  72.         num=0;
  73.         rd=0;  
  74.         lcden=0;
  75.         fen=0; //初始化分變量值
  76.         miao=0;
  77.         shi=0;
  78.         nian=1;
  79.         yue=1;
  80.         ri=1;
  81.         zhou=0;
  82.         count=0;
  83.         s1num=0;
  84.         write_com(0x38);//初始化1602液晶
  85.         write_com(0x0c);
  86.         write_com(0x06);
  87.         write_com(0x01);
  88.         write_com(0x80+1);//設置顯示初始坐標
  89.         write_date('2');
  90.         write_com(0x80+2 );
  91.         write_date('0');
  92.         write_com(0x80+0x40+6);//寫出時間顯示部分的兩個冒號
  93.         write_date(':');
  94.         delay(5);
  95.         write_com(0x80+0x40+9);
  96.         write_date(':');
  97.         delay(5);
  98.         write_com(0x80+5);//寫出時間顯示部分的兩個-
  99.         write_date('-');
  100.         delay(5);
  101.         write_com(0x80+8);
  102.         write_date('-');
  103.         delay(5);
  104.         write_com(0x80+12);
  105.         for(num=0;num<3;num++)
  106.         {
  107.                 write_date(yizhou[zhou][num]);
  108.                 delay(5);
  109.         }        
  110.         write_nyr(3,nian);
  111.         write_nyr(6,yue);
  112.         write_nyr(9,ri);
  113.         write_sfm(10,miao);
  114.         write_sfm(7,fen);
  115.         write_sfm(4,shi);
  116.         TMOD=0x01;//設置定時器0工作模式1
  117.         TH0=(65536-50000)/256;//定時器裝初值
  118.         TL0=(65536-50000)%256;
  119.         EA=1;        //開總中斷
  120.         ET0=1;        //開定時器0中斷
  121.         TR0=1;        //啟動定時器0
  122. }
  123. void keyscan()//按鍵掃描函數
  124. {
  125.         if(s1==0)       
  126.         {
  127.                 delay(5);
  128.                 if(s1==0)//確認功能鍵被按下
  129.                 {        s1num++;//功能鍵按下次數記錄
  130.                         while(!s1);//釋放確認
  131.                         di();//每當有按鍵釋放蜂鳴器發出滴聲
  132.                         if(s1num==1)//第一次被按下時
  133.                         {
  134.                                 TR0=0;  //關閉定時器
  135.                                 write_com(0x80+0x40+11);//光標定位到秒位置
  136.                                 write_com(0x0f); //光標開始閃爍
  137.                         }
  138.                         if(s1num==2)//第二次按下光標閃爍定位到分鐘位置
  139.                         {
  140.                                 write_com(0x80+0x40+8);
  141.                         }
  142.                         if(s1num==3)//第三次按下光標閃爍定位到小時位置
  143.                         {
  144.                                 write_com(0x80+0x40+5);
  145.                         }
  146.                         if(s1num==4)//第四次按下光標閃爍定位到周位置
  147.                         {
  148.                                 write_com(0x80+14);
  149.                         }
  150.                         if(s1num==5)//第五次按下光標閃爍定位到日位置
  151.                         {
  152.                                 write_com(0x80+10);
  153.                         }
  154.                         if(s1num==6)//第六次按下光標閃爍定位到月位置
  155.                         {
  156.                                 write_com(0x80+7);
  157.                         }
  158.                         if(s1num==7)//第七次按下光標閃爍定位到年位置
  159.                         {
  160.                                 write_com(0x80+4);
  161.                         }
  162.                         if(s1num==8)//第八次按下
  163.                         {
  164.                                 s1num=0;//記錄按鍵數清零
  165.                                 write_com(0x0c);//取消光標閃爍
  166.                                 TR0=1;        //啟動定時器使時鐘開始走
  167.                         }               
  168.                 }
  169.         }
  170.         if(s1num!=0)//只有功能鍵被按下后,增加和減小鍵才有效
  171.         {
  172.                 if(s2==0)
  173.                 {
  174.                         delay(5);
  175.                         if(s2==0)//增加鍵確認被按下
  176.                         {
  177.                                 while(!s2);//按鍵釋放
  178.                                 di();//每當有按鍵釋放蜂鳴器發出滴聲
  179.                                 if(s1num==1)//若功能鍵第一次按下
  180.                                 {
  181.                                         miao++; //則調整秒加1
  182.                                         if(miao>=60)//若滿60后將清零
  183.                                                 miao=0;
  184.                                         write_sfm(10,miao);//每調節一次送液晶顯示一下
  185.                                         write_com(0x80+0x40+11);//顯示位置重新回到調節處
  186.                                 }
  187.                                 if(s1num==2)//若功能鍵第二次按下
  188.                                 {
  189.                                         fen++;//則調整分鐘加1
  190.                                         if(fen>=60)//若滿60后將清零
  191.                                                 fen=0;
  192.                                         write_sfm(7,fen);//每調節一次送液晶顯示一下
  193.                                         write_com(0x80+0x40+8);//顯示位置重新回到調節處
  194.                                 }
  195.                                 if(s1num==3)//若功能鍵第三次按下
  196.                                 {
  197.                                         shi++;//則調整小時加1
  198.                                         if(shi>=24)//若滿24后將清零
  199.                                                 shi=0;
  200.                                         write_sfm(4,shi);;//每調節一次送液晶顯示一下
  201.                                         write_com(0x80+0x40+5);//顯示位置重新回到調節處
  202.                                 }
  203.                                 if(s1num==4)//若功能鍵第四次按下
  204.                                 {       
  205.                                         zhou++;
  206.                                         if(zhou>=7)//若滿7后將清零
  207.                                                 zhou=0;
  208.                                         write_com(0x80+12);//設置顯示初始坐標
  209.                                         for(num=0;num<3;num++)
  210.                                         {
  211.                                                 write_date(yizhou[zhou][num]);
  212.                                                 delay(5);
  213.                                         }
  214.                                 }
  215.                                 if(s1num==5)//若功能鍵第二次按下
  216.                                 {
  217.                                         ri++;//則調整日加1
  218.                                         if((2000+nian)%400==0||(2000+nian)%4==0&&(2000+nian)%100!=0)
  219.                                         tian=ruinian[yue];
  220.                                         else nian=pingnian[yue];
  221.                                         if(ri>tian)
  222.                                                 ri=1;
  223.                                         write_nyr(9,ri);//每調節一次送液晶顯示一下
  224.                                         write_com(0x80+10);//顯示位置重新回到調節處
  225.                                 }
  226.                                 if(s1num==6)//若功能鍵第二次按下
  227.                                 {
  228.                                         yue++;//則調整月加1
  229.                                         if(yue>12)//若滿12后將清零
  230.                                                 yue=1;
  231.                                         write_nyr(6,yue);//每調節一次送液晶顯示一下
  232.                                         write_com(0x80+7);//顯示位置重新回到調節處
  233.                                 }
  234.                                 if(s1num==7)//若功能鍵第二次按下
  235.                                 {
  236.                                         nian++;//則調整nian加1
  237.                                         if(nian>50)//若滿50后將清零
  238.                                                 nian=0;
  239.                                         write_nyr(3,nian);//每調節一次送液晶顯示一下
  240.                                         write_com(0x80+4);//顯示位置重新回到調節處
  241.                                 }
  242.                         }
  243.                 }
  244.                 if(s3==0)
  245.                 {
  246.                         delay(5);
  247.                         if(s3==0)//確認減小鍵被按下
  248.                         {
  249.                                 while(!s3);//按鍵釋放
  250.                                 di();//每當有按鍵釋放蜂鳴器發出滴聲
  251.                                 if(s1num==1)//若功能鍵第一次按下
  252.                                 {
  253.                                         miao--; //則調整秒加1
  254.                                         if(miao<0)//若滿60后將清零
  255.                                                 miao=59;
  256.                                         write_sfm(10,miao);//每調節一次送液晶顯示一下
  257.                                         write_com(0x80+0x40+11);//顯示位置重新回到調節處
  258.                                 }
  259.                                 if(s1num==2)//若功能鍵第二次按下
  260.                                 {
  261.                                         fen--;//則調整分鐘加1
  262.                                         if(fen<0)//若滿60后將清零
  263.                                                 fen=59;
  264.                                         write_sfm(7,fen);//每調節一次送液晶顯示一下
  265.                                         write_com(0x80+0x40+8);//顯示位置重新回到調節處
  266.                                 }
  267.                                 if(s1num==3)//若功能鍵第三次按下
  268.                                 {
  269.                                         shi--;//則調整小時加1
  270.                                         if(shi<0)//若滿24后將清零
  271.                                                 shi=23;
  272.                                         write_sfm(4,shi);;//每調節一次送液晶顯示一下
  273.                                         write_com(0x80+0x40+5);//顯示位置重新回到調節處
  274.                                 }
  275.                                 if(s1num==4)//若功能鍵第四次按下
  276.                                 {       
  277.                                         zhou--;
  278.                                         if(zhou<0)//若滿7后將清零
  279.                                                 zhou=6;
  280.                                         write_com(0x80+12);//設置顯示初始坐標
  281.                                         for(num=0;num<3;num++)
  282.                                         {
  283.                                                 write_date(yizhou[zhou][num]);
  284.                                                 delay(5);
  285.                                         }
  286.                                 }
  287.                                 if(s1num==5)//若功能鍵第二次按下
  288.                                 {
  289.                                         ri--;//則調整日加1
  290.                                         if((2000+nian)%400==0||(2000+nian)%4==0&&(2000+nian)%100!=0)
  291.                                         tian=ruinian[yue];
  292.                                         else nian=pingnian[yue];
  293.                                         if(ri<1)
  294.                                         ri=tian;
  295.                                         write_nyr(9,ri);//每調節一次送液晶顯示一下
  296.                                         write_com(0x80+10);//顯示位置重新回到調節處
  297.                                 }
  298.                                 if(s1num==6)//若功能鍵第二次按下
  299.                                 {
  300.                                         yue--;//則調整月加1
  301.                                         if(yue<1)//若滿12后將清零
  302.                                                 yue=12;
  303.                                         write_nyr(6,yue);//每調節一次送液晶顯示一下
  304.                                         write_com(0x80+7);//顯示位置重新回到調節處
  305.                                 }
  306.                                 if(s1num==7)//若功能鍵第二次按下
  307.                                 {
  308.                                         nian--;//則調整nian加1
  309.                                         if(nian<0)//若滿50后將清零
  310.                                                 nian=50;
  311.                                         write_nyr(3,nian);//每調節一次送液晶顯示一下
  312.                                         write_com(0x80+4);//顯示位置重新回到調節處
  313.                                 }
  314.                         }
  315.                 }
  316.         }
  317. }
  318. void main()//主函數
  319. {
  320.         init();//首先初始化各數據
  321.         while(1)//進入主程序大循環
  322.         {
  323.                 keyscan();//不停的檢測按鍵是否被按下
  324.         }
  325. }
  326. void timer0() interrupt 1//定時器0中斷服務程序
  327. {
  328.         TH0=(65536-50000)/256;//再次裝定時器初值
  329.         TL0=(65536-50000)%256;
  330.         count++;                //中斷次數累加
  331.         if(count==20) //20次50毫秒為1秒
  332.         {
  333.                 count=0;
  334.                 miao++;
  335.                 if(miao>=60)//秒加到60則進位分鐘
  336.                 {
  337.                         miao=0;//同時秒數清零
  338.                         fen++;
  339.                         if(fen>=60)//分鐘加到60則進位小時
  340.                         {
  341.                                 fen=0;//同時分鐘數清零
  342.                                 shi++;
  343.                                 if(shi>=24)//小時加到24則小時清零
  344.                                 {
  345.                                         shi=0;
  346.                                         ri++;
  347.                                         zhou++;
  348.                                         if(zhou>6)//若滿7后將清零
  349.                                                 zhou=0;
  350.                                         write_com(0x80+12);//設置顯示初始坐標
  351.                                         for(num=0;num<3;num++)
  352.                                         {
  353.                                                 write_date(yizhou[zhou][num]);
  354.                                                 delay(5);
  355.                                         }
  356.                                         if((2000+nian)%400==0||(2000+nian)%4==0&&(2000+nian)%100!=0)
  357.                                         tian=ruinian[yue];
  358. ……………………

  359. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
DZZ.zip (81.76 KB, 下載次數: 236)


評分

參與人數 3黑幣 +65 收起 理由
aoshibaku + 12 贊一個!
瘦成大雞腿 + 3 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:150718 發表于 2018-5-12 11:10 | 只看該作者
資料無法下載
回復

使用道具 舉報

板凳
ID:460560 發表于 2019-1-3 00:15 | 只看該作者
牛逼 完美的程序
回復

使用道具 舉報

地板
ID:463682 發表于 2019-1-7 16:22 | 只看該作者
真的非常棒了,完美
回復

使用道具 舉報

5#
ID:463682 發表于 2019-1-7 16:47 | 只看該作者
有個地方不對就是月不調整的話日只能調整為1或0,樓主看看能不能解決
回復

使用道具 舉報

6#
ID:465706 發表于 2019-1-10 12:19 | 只看該作者
很厲害的仿真
回復

使用道具 舉報

7#
ID:467090 發表于 2019-1-12 19:08 | 只看該作者
多謝!
回復

使用道具 舉報

8#
ID:467090 發表于 2019-1-12 19:08 | 只看該作者
謝謝  非常感謝
回復

使用道具 舉報

9#
ID:516931 發表于 2019-4-26 10:12 | 只看該作者
樓主會把這些在tft屏上顯示出來嗎
回復

使用道具 舉報

10#
ID:522829 發表于 2019-4-27 12:48 | 只看該作者
需要這個,感謝
回復

使用道具 舉報

11#
ID:523554 發表于 2019-4-28 12:30 | 只看該作者
厲害,正好學習一下

回復

使用道具 舉報

12#
ID:529630 發表于 2019-5-7 15:48 | 只看該作者
樓主!很想問一下,這個系統是怎么供電的啊,圖里面電源接在哪啊,還有就是RP1是什么啊
回復

使用道具 舉報

13#
ID:1076181 發表于 2023-5-8 22:12 | 只看該作者
lotta7788 發表于 2019-5-7 15:48
樓主!很想問一下,這個系統是怎么供電的啊,圖里面電源接在哪啊,還有就是RP1是什么啊

rp1是排阻
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99re在线视频 | 亚洲乱码一区二区三区在线观看 | 黄色一级电影免费观看 | 日韩中文一区二区三区 | 国产亚洲精品精品国产亚洲综合 | 色综合九九| 日本精品一区二区三区在线观看视频 | 户外露出一区二区三区 | 久久久久久久久久久久久91 | 日韩高清黄色 | 中文字幕在线观看一区 | 正在播放国产精品 | 欧美激情久久久久久 | 99re视频在线观看 | 亚洲影视在线 | 成人亚洲精品 | 国产十日韩十欧美 | 欧美日韩在线免费 | 一区二区三区欧美 | 99re在线| 在线观看国产视频 | 亚洲精品一区二区三区四区高清 | 久久久久久久av麻豆果冻 | 黄色大片免费播放 | 在线电影日韩 | 国产精品永久久久久 | 亚洲精选久久 | 国产成人免费 | 免费一级黄色电影 | 免费国产黄 | 国产精品爱久久久久久久 | 韩国精品在线 | 亚洲午夜精品久久久久久app | 国产一级精品毛片 | 欧美成年人 | 免费色网址 | 亚洲精品在线观看视频 | 91精品国产一区二区在线观看 | 亚洲精品久久 | 国产精品一区二区欧美黑人喷潮水 | 九九热精 |