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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機減一秒表計數設計,包含硬件電路相關介紹以及各部分原理說明...

[復制鏈接]
跳轉到指定樓層
樓主
這是我做的單片機減一秒表計數設計,包含硬件電路相關介紹以及各部分原理說明。
最后附上軟件部分的程序設計流程圖以及相關的程序編寫內容。
大家有需要的可以下載參考。
1秒表設計(兩位的LED數碼減1數碼顯示,采用定時/計數器實現定時控制,能實現開始計數、停止計數和清零控制等功能)。
數值從99減到0,能啟動開始計數、暫停、復位到99重新計數,對于實驗室單片機硬件設備可用8255擴展的8位七段LED顯示器選其兩位進行顯示,3種功能可用矩陣鍵盤來控制實現,1秒倒計時可用定時器T0選擇模式2實現。
硬件設計(包括設計方案及說明、完整的硬件連接圖等)
設計方案:2位七段LED顯示器顯示,定時器選用T0,選擇模式2,采用內部中斷,矩陣鍵盤控制不同情況。(停止計數可用使定時器停止工作和使LED顯示當前數2種方法實現,這里選用使LED顯示當前數暫停
說明:選其1,2位七段LED顯示器分別作為十位和個位,讀其矩陣鍵盤鍵值進行判斷再改變工作狀態:
硬件連接:8255擴展七段LED顯示器及矩陣鍵盤即可。
LED顯示原理:
①實驗箱上8155擴展的有8位七段LED顯示器,采用動態方式驅動。即一位LED顯示器顯示一小段時間,然后是下一位LED顯示器顯示一段小時間。只要刷新頻率不小于50Hz,利用人眼的視覺誤差,就可以獲得清晰穩定的顯示效果。
②LED顯示器的各段由8155的B口驅動,各段的驅動位如表;段引腳為低電平則對應段發光,高電平則對應段熄滅,顯示字的字形代碼如表;8個LED的選擇位由8255的A口驅動,高電平則選中對應位,低電平則對應位熄滅。
程序流程圖

                                                                                          
單片機源程序編寫:
  1. #include <intrins.h>
  2. #include < absacc.h >
  3. #include<reg52.h>
  4. #define COM8155 XBYTE[0x1000]  //8155寫命令地址口
  5. #define PA8155 XBYTE[0x1001]   //PA口讀寫地址口
  6. #define PB8155 XBYTE[0x1002]   //PB口讀寫地址口     
  7. #define PC8155 XBYTE[0x1003]   //PC口讀寫地址口
  8. code unsigned char led_font[] = {0xc0,0xf9,0xa4,0xb0,  
  9.                           0x99,0x92,0x82,0xf8,
  10.                                            0x80,0x90,0x88,0x83,  
  11.                                       0xc6,0xa1,0x86,0x8e,
  12.                                                        0xff
  13.                                                       }; //共陰數碼管0-9、a-f及全熄的字形碼
  14. code unsigned char key_code[]={0x11,0x12,0x14,0x18,
  15.                               0x21,0x22,0x24,0x28,
  16.                               0x41,0x42,0x44,0x48,
  17.                               0x81,0x82,0x84,0x88};  //此數組為鍵盤編碼
  18. unsigned char key_read(void);                                            //讀鍵盤函數
  19. unsigned char led_data[8]={16,16,16,16,16,16,16,16};//當前的顯示數字
  20. void  delay_ms(unsigned charn);     //延時程序
  21. void  led_display(unsignedchar *p );  //LED動態顯示子程序
  22. unsigned int m;
  23. void led_display(unsigned char *p)
  24. {  unsigned char i;
  25.    unsigned char j;
  26.    unsigned char led_bit[8]={0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x08};
  27.                     //LED的位選碼表
  28. for (i=0;i<2;i++)  
  29.   {
  30.          PB8155 =led_font[p[ i]];
  31.     PA8155 = led_bit[ i];
  32.       for (j=0;j<125;j++);
  33.   }
  34. }
  35. void delay_ms(unsigned char n)      //延時Nms
  36. {
  37. unsigned char i;
  38. while(n--)                                                   // 對于11.0592M時鐘,約延時1ms
  39. {
  40. for (i=0;i<125;i++);
  41. }
  42. }
  43. unsigned char n=1;                     //用于暫停時等待再次啟動的while循環
  44. unsigned char second;                                                                            //定義計數second
  45. void main (void)                                                                                       //主函數
  46. {
  47. TMOD=0X02;                                                                                        //選定時器0,工作方式2
  48. TH0=0X06;                                                                                              //設定定時器初值
  49.   TL0=0X06;
  50. ET0=1;                                                                                                      //開定時器中斷
  51. EA=1;                                                                                                       //允許CPU中斷
  52. second=99;                                                                                              //設定second初值99
  53. COM8155 = 0x03;                                                                                   //C口輸入,A、B口輸出
  54. while(1)                                                                                                       //等待啟動鍵0按下
  55.   {  n=1;
  56.     if(key_read()==0)                                                                                //按下啟動鍵0
  57.      {
  58.       TR0=1;                                                                                            //開始計數
  59. }
  60.   }
  61. }
  62. void t0(void) interrupt 1 using 0                                             //TL0計數溢出時進入中斷函數
  63. {m++;                                                                                                 //每次進入中斷函數m++
  64. {
  65. led_display(led_data);  //調用LED顯示程序
  66. if(m==85)                                                                                  //m==85時一秒
  67.    {
  68. m=0;                                                                                      //使m=0,用于下次m再計時
  69.     second--;                                                                                  //到達一秒時當前值減1
  70.     led_data[0]=second/10;                                                        //送出當前值顯示(十位)
  71.     led_data[1]=second%10;                                                       //(個位)
  72.    }
  73. else                                                                                                    //未到一秒時顯示當前值
  74.   {
  75.    led_data[0]=second/10;
  76.    led_data[1]=second%10;
  77.    }
  78. if(second==-1)                                                                      //second<0時再賦值99循環
  79.          {
  80. second=99;
  81.          }  
  82. if(key_read()==1)                                                                 //按下暫停鍵1時
  83.          {
  84.       while(n)                                                                              //循環顯示當前值
  85.           {
  86. led_data[0]=second/10;
  87.       led_data[1]=second%10;
  88.       led_display(led_data);                                                        //調用LED顯示程序
  89.   if(key_read()==0)   //再次按下啟動鍵0時,n==0,跳出while循環
  90.            {
  91. TR0=0;
  92.              n=0;
  93. }      
  94.    }
  95. }
  96.    if(key_read()==2)              //按下復位鍵時,second=99
  97.          {second=99;
  98.                    led_data[0]=second/10;
  99.    led_data[1]=second%10;
  100.    }
  101. }
  102. }
  103. unsigned char key_read(void)  //讀鍵盤值,PA低四位為輸出端即鍵盤列輸出端,PC低四位為輸入端即鍵盤行輸入端
  104. {
  105. unsigned char i,scandata;
  106.                     //col_out輸出PA口低四位,row_in獲取PC口低四位,組合成鍵碼
  107. unsigned char key_current,col_out,row_in;                 
  108. scandata=0x01;     //設定掃描初值
  109. PA8155=0x0f;  
  110. delay_ms(5);   
  111. if((PC8155&0x0f)==0x00) //無按鍵按下,防止讀取不到鍵值,比如說是干擾
  112.       {
  113. return  0xff;
  114.        }
  115. for(i=0;i<4;i++)
  116.   {
  117.    PA8155=scandata;        //PA口低四位循環輸出0,掃描鍵盤
  118. col_out=0x0f&scandata;   //存儲PA口掃描的低四位
  119. if((PC8155&0x0f)!=0x00)   //再次檢測PC口低四位是否有低電平
  120.      {
  121. row_in=(PC8155&0x0f)<<4;    //存儲PC口的低四位
  122. key_current=row_in+col_out; //key存儲鍵盤編碼,鍵碼為行(高4位)加列(低4位)
  123.       }
  124. scandata=_crol_(scandata,1);   //此函數功能為左循環移位
  125.    }
  126. for(i=0;i<16;i++)                           //查表獲得相應的16進制值存放key_result中
  127.    {
  128. if(key_current==key_code)  
  129.      {
  130. return i;      
  131.      }
  132.    }
  133. return 0xff;

  134. }

復制代碼




評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 香蕉视频在线播放 | 成人免费淫片aa视频免费 | 爱爱免费视频 | 国产精品精品 | 成人久久久| 9191在线播放 | 欧美日韩国产一区二区三区 | 精品久久国产 | 国产成人一区二区 | 人人干人人草 | 国产一区久久精品 | 久久久精品日本 | 亚洲一区国产精品 | 一级毛片在线播放 | 国产精品久久久久久久久久免费看 | 国产精品成人69xxx免费视频 | 亚洲综合日韩精品欧美综合区 | 国产精品99999999 | 亚洲欧美一区二区三区国产精品 | 91一区二区三区在线观看 | 精品视频一二区 | 在线播放中文字幕 | chengrenzaixian| 欧美一区二区三区四区五区无卡码 | 国产精品综合久久 | 亚洲精品国产第一综合99久久 | 久久网亚洲| 九九综合| 国产99久久精品 | 一级黄色毛片子 | 欧美日韩国产一区二区 | 成人网视频 | 亚洲福利一区二区 | 欧美成人精品一区二区男人看 | 欧美在线视频不卡 | 国产成人精品午夜 | 99视频在线 | a久久久久久 | 中文字幕一区二区在线观看 | 奇米久久久 | 久久久久久久久久久久久91 |