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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stc8單片機轉數表原理圖與源程序

[復制鏈接]
跳轉到指定樓層
樓主
電路原理圖如下:


單片機源程序如下:
  1. #include "stc8.h"
  2.   #include "LED.h"



  3. //#include<reg52.h>                        //包含頭文件

  4. #define uchar unsigned char
  5. #define uint unsigned int        //宏定義

  6. sbit COUNT_IN=P3^3;                        //定義信號輸入



  7. uchar count,m,n;                                //定義計算速度變量
  8. unsigned long RPM=0;                        //定義速度變量
  9. unsigned long TT=0;                                //定義時間變量
  10. unsigned long sum=0;                        //計算平均值的總數
  11. unsigned char T_num=0;                        //平均值取值的次數
  12. unsigned long num=0;                        //單次轉速
  13. unsigned long TT1=0;                                //定義定時器中斷次數變量
  14. bit flag;                                        //定義位變量,值只能是0或者1

  15.                         uchar p,sec;
  16.   
  17.                        
  18.                        
  19.      void delay(uint x)                //延時函數,大約延時1ms,不精確
  20.     {
  21.             uint i,j;                        //定義延時函數變量
  22.             for(i=0;i<x;i++)        //for循環延時
  23.             for(j=0;j<110;j++);
  24.     }

  25. //void delayms(unsigned int m)
  26. //     {
  27. //          int  a, b;

  28. //         for(a=0;a<5000;a++)
  29. //         for(b=0;b<m;b++);
  30. //          
  31. //         }



  32.                          
  33.        

  34.   unsigned char code Led_display[]={                                                //標準字庫 共陰數碼管字符
  35.   ////  //         0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
  36.            0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
  37.        
  38. //        unsigned char  LedBuff[] = { 0xFF, 0xFF, 0xFF, 0xFF};        //數碼管顯示緩存區
  39.                                        

  40. // static       
  41.                                          unsigned long Temp;
  42.                                          
  43.        
  44. void LED_Init(void)
  45. {
  46.   P1=0x3F;
  47.         P34=0;
  48.   P35=0;
  49.        
  50.         P36=0;
  51.         P37=0;
  52.                        
  53. }
  54. //

  55. void init()                                //定時器中斷初始化
  56. {
  57. //        IT0=1;        //INT0負跳變觸發         =1下降沿
  58.         IT1=1;        //INT0負跳變觸發         =1下降沿
  59.        
  60.     TMOD=0x01;//定時器工作于方式1 16位不自動重載模式 當[TH1,TL1]中的16位計數值溢出時,定時器1將從0開始計數
  61.         TH0=0;         
  62.         TL0=0;
  63.         EA=1; //CPU開中斷總允許  中斷允許寄存器
  64.         ET0=1;  ////使能定時器中斷
  65. //        EX0=1;//開外部INTO中斷  //使能 INT0 中斷,**********
  66.         EX1=1;//開外部INTO中斷  //使能 INT0 中斷,**********

  67.     TR0=0;//啟動定時  啟動定時器

  68.         TH1=0x3c;  //定時器 1 高 8 為寄存器
  69.         TL1=0xb0;    ////定時器 1 低 8 為寄存器
  70.         ET1=1;  //////使能定時器中斷
  71.         TR1=1;  ////開外部INT O  中斷  //使能 INT  0  中斷,**********
  72. }



  73. void LedScan(void)   //數碼管掃描顯示
  74. {  
  75.    if (RPM<1)
  76.          {
  77.              P1 = 0x00;   //顯示指示燈
  78.                  P34=1;
  79.                  P35=1;
  80.                  P36=1;
  81.                  P37=1;

  82.                  
  83.                  delay(10);

  84.          }
  85.          else{
  86.                  
  87.                  if (RPM>9999)
  88. {
  89.        
  90.         P1 = 0x6F;   //顯示報警9999
  91.                  P34=0;
  92.                  P35=0;
  93.                  P36=0;
  94.                  P37=0;
  95.                        

  96. }
  97. else
  98. {
  99.          static unsigned char i = 0;  //動態掃描索引

  100.           unsigned char buf[4]=0;
  101.            Temp=RPM;
  102.           buf[0] = Temp%10;
  103.     buf[1] = (Temp/10)%10;
  104.     buf[2] = (Temp/100)%10;
  105.            buf[3] = (Temp/1000)%10;
  106.     P1 = 0x00;   //顯示消隱
  107.     switch (i)
  108.     {
  109.         case 0: P34=1;P35=1;P36=1;P37=0; P1=Led_display[buf[i]]; i++;break;
  110.         case 1:P34=1; P35=1;P36=0;P37=1; P1=Led_display[buf[i]]; i++;break;
  111.         case 2: P34=1;P35=0;P36=1;P37=1; P1=Led_display[buf[i]]; i++;break;
  112.                           case 3: P34=0;P35=1;P36=1;P37=1; P1=Led_display[buf[i]];i=0; break;
  113.         default: break;
  114.                        
  115.                 }
  116.        
  117. }
  118.          

  119. //                }
  120.                
  121.         }
  122. }

  123.       
  124.                


  125. main()
  126. {
  127.                         init();                  //調用初始化函數
  128.       P1M1=0;P1M0=0xFF;
  129. //            P3M1=0x00;P3M0=0x00;  
  130.             P3M1=0x08;P3M0=0x08;

  131.                     
  132.        
  133. while(1)
  134.       {
  135.                                                 LedScan();
  136.                         }
  137.                 }
  138.                        
  139.                

  140. //中斷服務函數

  141. void EXINT0() interrupt 2 //外部中斷函數,霍爾元件有信號,會進入此中斷
  142. {
  143.        
  144.         if(TR0==0)                                           //霍爾有信號輸入時,定時器沒有打開就打開定時器,準備計時
  145.         {
  146.                 TH0=0;
  147.                 TL0=0;                                           //定時器清零
  148.                 TT=0;                                           //計時變量清零
  149.                 TT1=0;                                           //定時器中斷次數清零
  150.                 TR0=1;                                           //打開定時器,開始計時
  151.                 p=0;sec=0;
  152.         }
  153.         else                                                   //第二次檢測到信號時
  154.         {
  155.                 p=0;sec=0;
  156.                 TR0=0;                                           //關閉定時器
  157.                 TT=TT1*65536+TH0*256+TL0;  //計算兩次信號的時間差。中斷次數*65536+TH0*256+TL0,得到時間差
  158.                 TH0=0;
  159.                 TL0=0;                                           //計算完成后,將定時器清零
  160.                 num=120000000/TT;                   //根據時間計算1min中的速度。一分鐘是60秒,一秒是1000毫秒,1毫秒是1000us,所以是60*1000*1000/時間,TT的單位是單片機的最快速度1微秒
  161.                 TT1=0;                                           //計算完速度后,TT1清零
  162.                 if(num>1000)                           //轉速超過1000時,取50次的平均值
  163.                 {
  164.                         sum=num+sum;                   //將數據加一起
  165.                         T_num++;                           //次數加
  166.                         if(T_num>=20)                   //加到50次
  167.                         {
  168.                                 T_num=0;                   //次數清零
  169.                                 RPM=sum/20;                   //總數除以50得到平均值
  170.                                 sum=0;                           //計算完后總數清零
  171.                         }
  172.                 }
  173.                 else                                           //轉速小于1000時
  174.                 {
  175.                         sum=0;                                   //總數清零
  176.                         RPM=num;                           //數據直接賦值給轉速
  177.                         num=0;                                   //數據清零
  178.                         T_num=0;                           //次數清零
  179.                 }
  180.         }
  181. }

  182. void timeT0() interrupt 1                   //兩次信號中間,定時器有中斷
  183. {
  184.         TT1++;                                                   //說明達到一次65536,將TT1加1,計算時,將TT1乘以65536就是這個的時間了
  185.         TH0=0;
  186.         TL0=0;                                                   //定時器清零
  187. }

  188. void timeT1() interrupt 3                   //兩次信號中間,定時器有中斷
  189. {
  190.         TH1=0x3c;
  191.         TL1=0xb0;                                                   //定時器清零
  192. //        LedScan();//***
  193.         p++;
  194.         if(p>=20)
  195.         {
  196.                 p=0;
  197.                 sec++;
  198.                 if(sec>=5)
  199.                 {
  200.                         sec=0;
  201.                         RPM=0;
  202.                         TR0=0;
  203.                 }
  204.         }
  205. }               
復制代碼
Keil代碼下載:
轉速表程序.rar (73.11 KB, 下載次數: 33)

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产福利在线看 | 全部免费毛片在线播放网站 | 亚洲精品一区二区在线观看 | 国产91丝袜在线播放 | 日韩av中文 | 911精品美国片911久久久 | 亚洲精品乱码久久久久久按摩观 | 99精品久久久久久 | 99在线精品视频 | 亚洲国产精品一区 | 久久国产成人精品国产成人亚洲 | 国产精品特级片 | 永久看片| 亚洲精品成人 | 久久久网| 91视频大全 | 全部免费毛片在线播放网站 | 久草资源网站 | 亚洲成人免费在线观看 | www视频在线观看 | 久久免费精品 | 美美女高清毛片视频免费观看 | www.伊人.com| 亚洲资源在线 | 成人免费在线播放 | 精品伊人久久 | 亚洲欧美综合精品久久成人 | 亚洲+变态+欧美+另类+精品 | 久久免费精品 | 亚洲欧美中文日韩在线v日本 | 亚洲一区二区电影在线观看 | 在线免费观看亚洲 | 日本中出视频 | 干干干操操操 | 黄色一级视频 | 一区二区在线不卡 | 三级黄视频在线观看 | 久久久福利 | 亚洲影音先锋 | 在线观看亚洲欧美 | 午夜久久久 |