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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機開發數字秒表實驗心得體會 含仿真源碼等資料

[復制鏈接]
跳轉到指定樓層
樓主
實驗用到8155作為51單片機的IO擴展外設有3*3矩陣鍵盤,和4位數碼管

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

系統方案:

硬件設計
電源電路
電源電路由電源插座,電源開關和電源指示燈組成,其輸出為VCC;

電源電路

單片機最小系統

   89c51最小系統電路

單片機最小系統:由晶振電路,復位電路,電源電路構成;晶振電路:12MHz的晶振,兩個30Pf的瓷片電容連接而成;復位電路:10uf的電解電容,按鍵開關,1K的電阻連接而成。

8155擴展

8155擴展矩陣電路和數碼管

數碼管顯示驅動電路
   4位共陰數碼管,由8位的段選端口和4位的位選端口,8位段選端口提供字母,數字,小數點的顯示,4位位選端口控制各個數碼管的點亮,其低電平有效,數碼管的額定工作電流為20mA,PA口的工作電壓為5V,所以保證數碼管的正常點亮必須接250歐姆的上拉電阻。

3*3矩陣按鍵電路
  由三行三列的按鍵構成,主要功能的實現在于程序的編寫,本實驗中用到的行掃描程序,高三位輪流輸出低電平,低三位輸出高電平,檢測低三位的輸入電平的變化,如果有變化,則有按鍵按下,識別出具體的按鍵位置。

軟件設計
定時器0配置
8155的配置
8155的AD0~AD7提供8位地址,CE端口提供8155的IO端口的高8位地址低8位地址:0x00~0x04,分別為命令/狀態寄存器,PA口,PB口,PC口;IO/M端口提供8155的工作方式是IO擴展還是RAM擴展。PA口,PB口,PC口的輸入還是輸出由命令控制寄存器控制;高四位本實驗暫時沒有用到,所以低四位控制輸入輸出方式。

按鍵行掃描
矩陣鍵盤的6的端口,行端口接PB口的高三位,列端口接PB口的低三位,由于PB口的輸入輸出方式是分時進行的所以在行掃描過程中要更改8155的命令控制寄存器的內容,改變PB口的IO工作方式,具體為先設置PB口的工作方式為輸出方式,接著PB口高三位輪流輸出低電平,低三位輸出高電平,接著更改PB口的IO方式為輸入方式,檢測低三位的電平變化,從而檢測出具體按鍵的按下,分別進入功能函數中。

數碼管的顯示
    數碼管由8位段選端口和4位位選端口,控制4位位選端口的先后點亮,同時點亮8位段選端口輸出其特定的數字,字母,小數點。由于人眼的視覺暫留效應大約為50ms,4位位選端口的先后點亮時間差小于50ms,所以人眼會觀察到連續的數字點亮。

電路焊接
仿真結果
電路調試
設計制作中的問題及解決方法


程序流程圖:



實驗心得體會:
      本實驗我主要負責程序的編寫,首先通過數字秒表的實驗,掌握了對一個未知芯片的開發的步驟;本實驗中用到的8155芯片,通過查看資料掌握其IO擴展的使用方法,首先對8155的16位地址進行了解,高8位由CE端提供,低八位0x00~0x04,還有就是行掃描鍵盤程序的編寫,本實驗3*3矩陣鍵盤,所以為簡便高三位PB4~PB6控制行,PB0~PB2控制列,先讓高三位輪流輸出低電平:110 ,101,011,低三位輸出高電平;后檢測低三位的輸入電平高低,如果有低電平輸入則判斷有按鍵按下;各個按鍵的控制作用有:1開始記秒2停止3清零,4倒計時設置5倒計時時間設置的加6倒計時時間設置的減7啟動倒計時,每個按鍵的功能都有函數控制。再有就是定時中斷的使用,本實驗用到定時器0的模式1,定時時間為10ms;數碼管的編程方式,首先掌握0~F每個字母數字的真值表,4位共陰數碼管有8個段選端口和4個位選端口,8個段選端口控制輸出字母數字,位選端口控制那個數碼管亮,且位選端口低電平有效。本實驗用到的數碼管額定電流為20mA,端口輸出電壓5V,所以上拉電阻的大小為250歐姆。

      其次,也懂得學習不僅僅是上課看書,也最重要的是實踐將課堂的知識轉化為真正的能力,也通過實驗學會設計一個硬件系統步驟,設計方案,設計硬件電路,設計程序調試和焊接,最終完成實驗;最為重要的是一個團隊工作,各自分工大大縮短開發時間。

單片機源程序如下:
  1. #include<REG51.h>
  2. #include<ABSACC.h>
  3. #define COM8155  XBYTE[0X7F00]
  4. #define PA8155 XBYTE[0X7F01]
  5. #define PB8155 XBYTE[0X7F02]
  6. #define PC8155 XBYTE[0X7F03]
  7. typedef unsigned char uchar;
  8. typedef unsigned int uint;

  9. //8051的內部RAM的地址范圍為0000H~00FFH
  10. //A :0X7F01  B:0X7F02   C:0X7F03  定時器低字節 0404H   定時器高字節:0405H
  11. //命令/狀態:0X7F00
  12. uchar code DIG_CODE[10]={
  13.                                                 0x3f,0x06,0x5b,0x4f,0x66,
  14.                                                 0x6d,0x7d,0x07,0x7f,0x6f
  15.                                                 };
  16. uchar code PCx[4] = {0xee,0xdd,0xbb,0x77};
  17. sbit IO_M = P2^0;  
  18. sbit CE = P2^7;
  19. uchar KeyValue=0;
  20. uchar time1=0,time2=0;
  21. uint msec = 0;
  22. static uchar flag=0;
  23. uint second=0;
  24. uint CountDownSecond=0;
  25. uchar c0,c1,c2,c3;
  26. uchar KeyBoardScan();
  27. void Delay10ms(uchar s);
  28. void TimerConfig();
  29. void digitronDisplay(uint second);
  30. void Config_8155();
  31. void operate(uchar KeyValue);
  32. void Start();
  33. void Stop();
  34. void Pause();
  35. void CountDown();
  36. void SureStart();
  37. void main(){
  38.          Config_8155();
  39.         while(1){
  40.                 digitronDisplay(second);       
  41.                 operate(KeyBoardScan());       
  42.         }
  43.        
  44. }
  45. void Delay10ms(uchar s)   //誤差 0us
  46. {
  47.     unsigned char a,b;
  48.     for(s=1;s>0;s--)
  49.           for(b=38;b>0;b--)
  50.             for(a=130;a>0;a--);
  51. }
  52. void operate(uchar KeyValue){

  53.         switch(KeyValue){
  54.          case(1):Start();break;//開始
  55.          case(2):Stop();break;//清零
  56.          case(3):Pause();break;//暫停
  57.          case(4):CountDown();break;//倒計時
  58.         }
  59. }
  60. void Start(){
  61.         flag=1;
  62.         TimerConfig();
  63.                 while(1){
  64.                                         digitronDisplay(second);
  65.                                         if(second==10000){
  66.                                                  second=0;
  67.                                         }             
  68.                         digitronDisplay(second);
  69.                          if(KeyBoardScan()!=1){
  70.                          operate(KeyBoardScan());
  71.                     }          
  72.                 }
  73. }
  74.        

  75. void Stop(){
  76.         EA=0;//關總中斷
  77.         ET0=0;//關定時器0中斷
  78.         second = 0;
  79.         CountDownSecond=0;
  80.         while(1){
  81.            digitronDisplay(second);
  82.            operate(KeyBoardScan());
  83.         }
  84. }
  85. void Pause(){
  86.         ET0=0;//關定時器0中斷
  87.         while(1){
  88.                      digitronDisplay(second);
  89.                     operate(KeyBoardScan());
  90.         }
  91.        
  92. }
  93. void CountDown(){                 //設置倒計時時間
  94.   uint a=1;
  95.    while(1){
  96.    if(CountDownSecond<10000&&CountDownSecond>=0){  //顯示倒計時定時時間,如果倒計時時間超過范圍,倒計時定時時間為0
  97.                     digitronDisplay(CountDownSecond);
  98.    }else{
  99.               CountDownSecond=0;
  100.    }
  101.         KeyValue = KeyBoardScan();//獲取鍵盤數字
  102.         switch(KeyValue){
  103.          case(7):{
  104.                   CountDownSecond = CountDownSecond + a*100; //秒位加加       
  105.            break;      
  106.          }//定時間加
  107.          case(8):{
  108.          CountDownSecond = CountDownSecond - a*100;//秒位減減
  109.          break;
  110.          }//定時間減
  111.          case(9):SureStart();break;//啟動倒計時
  112.         }
  113.    }
  114.          
  115. }

  116. void SureStart(){           //啟動倒計時
  117.                 flag=2;
  118.          TimerConfig();           //配置定時中斷,中斷時間為10ms
  119.                  while(1){
  120.                         digitronDisplay(CountDownSecond);  
  121.                          if(KeyBoardScan()!=9){
  122.                                  operate(KeyBoardScan());
  123.                     }       
  124.                 }
  125. }                               

  126. uchar  KeyBoardScan(){        //行鍵盤掃描
  127.   uchar key;
  128.   uchar temp;
  129.   uchar i,j=0;
  130.   for(i=0;i<3;i++){
  131.            COM8155=0x0f;        //pb輸出
  132.          if(i==0) PB8155 = 0xfe; //11111110
  133.          if(i==1) PB8155 = 0xfd;// 11111101
  134.          if(i==2) PB8155 = 0Xfb; //11111011
  135.          COM8155 = 0X0D; //pb輸入
  136.          temp=PB8155;  //pb輸入讀取
  137.          temp=temp&0xf0;
  138.          if(temp!=0xf0){
  139.                   Delay10ms(1);
  140.                  temp = PB8155;
  141.                  temp = temp&0xf0;
  142.                  if(temp!=0xf0){
  143.                  switch(temp){
  144.                          case 0xe0:{
  145.                                    key = 7-i*3;
  146.                         }
  147.                         break;
  148.                         case 0xd0:{
  149.                                 key = 8-i*3;
  150.                         }
  151.                         break;
  152.                         case 0xb0:{
  153.                                 key = 9-i*3;
  154.                         }
  155.                         break;
  156.                  }
  157.                 }
  158.                  return key;
  159.          }
  160.   }
  161.   return 10;
  162. }
  163. void Config_8155(){         //8155芯片的配置
  164.          CE = 0;                  //片選段,為8155的16位地址提供高8位地址        P2.0~P2.7:1
  165.          IO_M = 1;                  //作為I/O擴展
  166.          COM8155 = 0X0F;          //A,B口做為輸出 C口作為輸入         
  167. }
  168. void digitronDisplay(uint second){
  169.    uchar i=0;
  170.         uchar num[4];
  171.                 num[3]=second/1000;               
  172.                 num[2]=second%1000/100;       
  173.                 num[1]=second%1000%100/10;
  174.                 num[0]=second%1000%100%10;
  175.                 PA8155=0xff;//消隱
  176.                 for(i=0;i<4;i++){
  177.                   switch(i){
  178.                   case(3): PC8155=0x08;break;
  179.                   case(2): PC8155=0x04;break;
  180.                   case(1): PC8155=0x02;break;
  181.                   case(0): PC8155=0x01;break;
  182.                   }
  183.                       if(i==2){
  184.                                      PA8155=~DIG_CODE[num[i]]&0x7f;
  185.                                            Delay10ms(1);       
  186.                                         PA8155=0xff;//消隱
  187.                           }else{
  188.                                      PA8155=~DIG_CODE[num[i]];
  189.                                            Delay10ms(1);       
  190.                                         PA8155=0xff;//消隱
  191.                           }       
  192.                 }     
  193. }         
  194. void TimerConfig(){
  195.     TMOD=0x01;                 //模式設置,00000001,可見采用的是定時器0,工作與模式1(M1=0,M0=1)。
  196.         TR0=1;                         //打開定時器
  197. ……………………

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


所有資料51hei提供下載:
微控.zip (215.07 KB, 下載次數: 47)


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

使用道具 舉報

沙發
ID:1 發表于 2017-12-8 01:07 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:219666 發表于 2017-12-10 15:34 | 只看該作者
贊一個
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九久久国产 | 黄网免费 | 久久精品亚洲成在人线av网址 | 久久精品网 | 国内精品视频在线观看 | 在线观看a视频 | 日本精品视频 | 99成人在线视频 | 一区二区三区视频在线 | 成人毛片网站 | 日韩 国产 在线 | 亚洲一在线| 亚洲日产精品 | www.中文字幕.com | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 亚洲第一福利网 | 欧美日韩亚洲国产 | 欧产日产国产精品视频 | 国产一级在线 | 狠狠av | 国产精品成人在线 | 免费观看一级黄色录像 | 九九久久国产 | 久久久www成人免费无遮挡大片 | 91精品国产综合久久久久久 | 欧美综合一区二区三区 | 一级片免费视频 | www.午夜| 中文字幕高清一区 | 欧美日韩久久 | 久久av综合 | 国产在线精品一区 | 成人免费精品视频 | 免费亚洲视频 | 久久51| 日本偷偷操 | 久久国内 | www.日韩| 成年人网站免费 | 性色av一区 | 成人国产精品久久久 |