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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機數碼管電子鐘源程序 原理圖與Proteus仿真

[復制鏈接]
跳轉到指定樓層
樓主
下面是51單片機數碼管電子鐘的proteus仿真原理圖(工程文件可到本帖附件中下載):


單片機電子鐘源程序如下:
  1. //#include <reg51.h>
  2. //# include <absacc.h>
  3. # include <STC12C5A60S2.h>
  4. # define uchar unsigned char
  5. # define uint unsigned int
  6. # define uint32 unsigned long int
  7. # define sint32 signed long int
  8. # define vtim1        50000   //定時50ms,一幀8*50=40ms,頻率=40Hz
  9. # define vtim2        2500   //定時2.5ms,一幀8*2.5=20ms,頻率=50Hz
  10. //# define vt                DBYTE[0x21^0]
  11. # define vt                ((unsigned char volatile data  *) 0)[0x21^0]
  12. //sbit        vt=0xe8;

  13. //數碼管位選循環變量
  14. uchar        wi=0;
  15. //共陰數碼管段碼表
  16. uchar code distable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X40,0x00,0x31};
  17. //位選碼表
  18. uchar  code numi[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  19. //顯示緩存
  20. uchar V_ram[]={0x01,0x02,0x10,0x03,0x04,0x10,0x05,0x06};
  21. sbit p32=P3^2;
  22. sbit p33=P3^3;
  23. uchar   i=0;
  24. uchar           j=0,k=0,ss=0;
  25. uchar   x=0;
  26. uchar   key_num=0xff;

  27. void main()
  28. {
  29.   vt=1;
  30.   vt=0;
  31.   vt=1;
  32.   IT0=0;
  33.   IT1=0;
  34.   EA=1;
  35.   ET0=1;
  36.   ET1=1;
  37.   EX0=1;
  38.   EX1=1;
  39.   PT0=1;
  40.   TH1=(65536-vtim1)/256;
  41.   TL1=(65536-vtim1)%256;
  42.   TH0=(65536-vtim2)/256;
  43.   TL0=(65536-vtim2)%256;
  44.   TMOD=0X11;
  45.    TR0=1;
  46.    TR1=1;

  47. while(1);

  48. }
  49. void t1_rpt() interrupt 3  //50ms中斷
  50. {
  51.           TH1=(65536-vtim1)/256;
  52.           TL1=(65536-vtim1)%256;
  53.         /////////////////按鍵去抖動////////////////
  54.         if(~(EX1||EX0))
  55.         {
  56.                    x++;
  57.                    if(x>=5)//按鍵按下250ms 后,全能按鍵中斷
  58.                    {
  59.                           IE0=0;          //清中斷源
  60.                           IE1=0;          //清中斷源
  61.                     EX1=1;          //打開中斷
  62.                         EX0=1;          //打開中斷
  63.                 }
  64.         }
  65.         ////////////////0.35秒閃爍周期///////////////
  66.         if(key_num<8)
  67.         {
  68.                 k++;                  //閃爍計時變量
  69.                 j++;                 //閃爍超時變量
  70.                 k=k&0x07;         //0.4秒閃爍周期
  71.                 if(k<4)
  72.                 {
  73.                         ss=0;         //0.2秒亮
  74.                 }
  75.                 else
  76.                 {
  77.                         ss=1;         //0.2秒滅
  78.                 }

  79.                 if(j>=100)          //超時5秒閃爍停止
  80.                 {
  81.                         key_num=0xff;
  82.                         k=0;
  83.                         j=0;
  84.                         ss=0;
  85.                 }
  86.         }
  87. }
  88.   

  89. void t0_rpt() interrupt 1
  90. {           ///////////////////////////定時刷新數碼管代碼//////////////////////////////
  91.                 uchar        dm=0,wx=0;
  92.                   TH0=(65536-vtim2)/256;
  93.                   TL0=(65536-vtim2)%256;
  94.                   dm=distable[V_ram[wi]];        //取顯示段碼
  95.                 if((wi==key_num)&&(ss==1))dm=distable[0x11];  // key_num:表示對應數碼管閃爍;ss=1表示顯示黑色
  96.                 wx=numi[wi];                           //取位選碼
  97.                 P1=0x00;                           //關顯示
  98.                 P2=dm;                                   //段碼賦給P0口
  99.                 P1=wx;
  100.                 wi++;
  101.                 if(wi==8)
  102.                 {       
  103.                         wi=0;
  104.                         i++;
  105.                 }
  106.            /////////////////////////計時代碼,把秒,分,時分別放入對應的顯示RAM////////////////////////
  107.                 if(i==50)
  108.                 {  //秒
  109.                         i=0;
  110.                         V_ram[7]++;          //秒個位++
  111.                         if(V_ram[7]>=10)
  112.                                 {
  113.                                          V_ram[7]=0;
  114.                                          V_ram[6]++;  //秒十位++
  115.                                         if(V_ram[6]>=6)
  116.                                         {
  117.                                                  V_ram[6]=0;
  118.                                                  V_ram[4]++;  //分個位++
  119.                                                 if(V_ram[4]>=10)
  120.                                                 {
  121.                                                          V_ram[4]=0;
  122.                                                          V_ram[3]++;          //分十位++
  123.                                                         if(V_ram[3]>=6)
  124.                                                         {
  125.                                                                  V_ram[3]=0;
  126.                                                                  V_ram[1]++;          //時個位++
  127.                                                                 if((V_ram[1]>=10)&&(V_ram[0]<2))
  128.                                                                 {
  129.                                                                          V_ram[1]=0;
  130.                                                                          V_ram[0]++;          //時十位++
  131.                                                                 }
  132.                                                                 if((V_ram[1]>=4)&&(V_ram[0]>=2))
  133.                                                                 {
  134.                                                                          V_ram[1]=0;           //時個位清零
  135.                                                                          V_ram[0]=0;            //時十位清零
  136.                                                                 }
  137.                                                         }
  138.                                                 }
  139.                                         }

  140.                                 }
  141.                 }
  142.          
  143. }
  144. void EXTR0_rpt() interrupt 0         /////////外部中斷1,功能鍵:切換對應的數碼管并使該數碼管閃爍////////////////
  145.   {        
  146.                   x=0;        //按鍵去抖動計時清零
  147.                   EX0=0;        //關中斷,用于去抖動
  148.                 j=0;        //長期不按鍵,閃爍停止。閃爍超時變量清零
  149.              if(key_num==7)
  150.                         key_num=0;
  151.                 else
  152.                     key_num++;
  153.                 if(key_num==2)key_num=3;   //
  154.                 if(key_num==5)key_num=6;  //
  155.   }
  156. void EXTR1_rpt() interrupt 2
  157.   {
  158.                   x=0;        //按鍵去抖動計時清零
  159.                   EX1=0;        //關中斷,用于去抖動
  160.                 j=0;        //長期不按鍵,閃爍停止。閃爍超時變量清零
  161.                   switch (key_num)
  162.                    {
  163.                           case 2:
  164.                           case 5:    {
  165.                                               break;
  166.                                                 }
  167.                           case 0:    {
  168.                                         if (V_ram[key_num]<2)
  169.                                         {
  170.                                                                 V_ram[key_num]=V_ram[key_num]+1;         //時十位加1
  171.                                                         }
  172.                                                      else
  173.                                                              V_ram[key_num]=0x00;
  174.                                      break;
  175.                                                   }                                  
  176.                           case 1:                    //時個位加1
  177.                           case 4:                          //分個位加1
  178.                           case 7:                {          //秒個位加1
  179.                                               if (V_ram[key_num]<9)
  180.                                                       V_ram[key_num]=V_ram[key_num]+1;
  181.                                                             else
  182.                                                                   V_ram[key_num]=0;
  183.                                                         //if ((V_ram[0]==2)&&(V_ram[1]>=4))
  184.                                               //{
  185.                                                           //        V_ram[1]=3;
  186.                                                           //}
  187.                                                           break;
  188.                                                   }
  189.                           case 3:                  //分十位加1
  190.                           case 6:   {          //秒十位加1
  191.                                                if (V_ram[key_num]<5)
  192.                                                        V_ram[key_num]=V_ram[key_num]+1;
  193.                                                             else
  194.                                                                   V_ram[key_num]=0;
  195.                                                           break;
  196.                                                   }
  197.                            default:   
  198.                                                           …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

給大家分享一些我們老師給的一些經典的單片機程序源碼, 一共有十多個.都有詳細的注釋,然大家快速的理解每一行代碼的意思。而且有proteus仿真原理圖。大家可以直接驗證程序的對錯.


本系列所有源碼打包下載地址(含proteus仿真工程文件和源程序):
http://www.zg4o1577.cn/bbs/dpj-82474-1.html

本例程下載:
電子鐘.rar (79.12 KB, 下載次數: 82)

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

使用道具 舉報

沙發
ID:363666 發表于 2018-7-3 09:42 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人久久久久 | 久久99精品久久久 | 日韩三极 | 精品乱码久久久久 | www.99re5.com| 亚洲欧美日韩国产综合 | 日韩欧美一区二区三区四区 | 精品国产一区二区在线 | 久久精品欧美视频 | 夜夜摸夜夜操 | 免费v片在线观看 | 亚洲国产精品久久久久秋霞不卡 | 亚洲 欧美 另类 综合 偷拍 | 亚洲欧美一区二区三区视频 | 视频一二区| 91精品国产91久久久久久最新 | 亚洲 欧美 另类 综合 偷拍 | 成人在线观看免费 | 久久久久久久久久久蜜桃 | av在线成人 | 天堂久久天堂综合色 | 亚洲一区二区黄 | 亚洲久久| 成人字幕网zmw| av黄色在线播放 | 羞羞视频在线网站观看 | 精品成人av| 欧美日韩成人在线 | 国产色黄 | 国产91精品久久久久久久网曝门 | 久久久久国产精品 | 午夜手机在线视频 | 国产精品久久久久婷婷二区次 | 成人毛片视频在线播放 | 亚洲精品一区二区另类图片 | 久久久久久蜜桃一区二区 | 日本久久综合 | 一区二区日本 | 欧美精品久久久 | 久久久亚洲 | av免费电影在线 |