找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2580|回复: 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 单片机教程网

快速回复 返回顶部 返回列表