找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2243|回复: 2
收起左侧

用89C2051单片机做的电机测速器,千位显示不出来

[复制链接]
ID:185519 发表于 2017-8-29 14:05 | 显示全部楼层 |阅读模式
各位大侠。我用89C2051做的电机测速器,改了很多次千位总是显示不出来,贴出来麻烦指点一下。谢谢。

89c2051.jpg


  1. #include <AT892051.H>
  2. #include <STDIO.H>
  3. #define BYTE unsigned char   
  4. #define WORD unsigned int   
  5. #define minplus 120000000                //2*1000*1000*60

  6. sbit KEY   = P3^5;                                        //切换开关
  7. sbit CLK   = P3^4;                                        //脉冲输入端
  8. sbit qian  = P3^3;
  9. sbit bai   = P3^1;
  10. sbit shi   = P3^0;
  11. sbit ge    = P3^7;
  12. sbit pluse = P3^2;
  13. BYTE led[4],min,sec,dms,showBit,cn,cn_l,cn_h,cn_n;
  14. WORD speed,Temp1,Temp2,Temp3,count;
  15. bit DmS5 = 0,dp1, dp2, dp3;
  16. unsigned long count32,cn_Temp;
  17. union  un
  18. {
  19.         unsigned long cn_Zu;
  20.         BYTE cn_byte[4];
  21. }uCount;

  22. const BYTE DATA_7SEG[ ] =
  23. {        
  24.         0xE7, // 0
  25.         0x84, // 1
  26.         0xD3, // 2
  27.         0xD6, // 3
  28.         0xB4, // 4
  29.         0x76, // 5
  30.         0x77, // 6
  31.         0xC4, // 7
  32.         0xF7, // 8
  33.         0xF6, // 9
  34.         0xFF,
  35.         0x00
  36. };


  37. //delay()________________________________________________
  38. void delay(BYTE t)
  39. {
  40.         BYTE i;
  41.          for (i=0;i<t;i++);
  42. }

  43. //display()______________________________________________________
  44. void display(void)
  45. {
  46.         BYTE i;
  47.          for (i=0;i<4;i++)
  48.         {
  49.                 P3=~(1<<i);        //低电平驱位选
  50.             P1=DATA_7SEG[led[i]];
  51.             delay(255);    //about 1.5ms
  52.         }
  53.          // P1=0xff;
  54.          // P3=0xff;
  55. }

  56. void disp_init(void)
  57. {   
  58.         BYTE i;
  59.         led[0]=0x0a;
  60.         led[1]=0x0a;
  61.         led[2]=0x0a;
  62.         led[3]=0x0a;
  63.         for(i=0;i<200;i++)
  64.         {
  65.                 display();
  66.         }
  67. }

  68. //Int0()_________________________________________________________
  69. void Int0(void) interrupt 0
  70. {
  71.                 EA = 0;
  72.                 TR0 = 0;
  73.                 uCount.cn_byte[2] = TH0;
  74.                 uCount.cn_byte[3] = TL0;
  75.                 uCount.cn_byte[1] = cn;
  76.                 cn = 0;
  77.                 TH0 = 0x00;
  78.                 TL0 = 0x0D;
  79.                 TR0 = 1;
  80.                 EA = 1;
  81. }

  82. //Time0()_________________________________________________________
  83. void Time0(void) interrupt 1
  84. {
  85.         cn ++;
  86. }

  87. //Time1()_________________________________________________________
  88. void Time1(void) interrupt 3
  89. {
  90.         TF1 = 0;
  91.         TH1 = 0xd8;
  92.         TL1 = 0xf0;
  93.         DmS5 =1;
  94.         switch (showBit)
  95.         {
  96.                 case 0:
  97.                 {
  98.                         ge = 0;
  99.                         shi = 1;
  100.                         bai = 1;
  101.                         qian = 1;
  102.                         P1 = DATA_7SEG[led[showBit]];
  103.                         showBit ++;
  104.                         break;
  105.                 }
  106.                 case 1:
  107.                 {
  108.                         ge = 1;
  109.                         shi = 0;
  110.                         bai = 1;
  111.                         qian = 1;
  112.                         P1 = DATA_7SEG[led[showBit]];
  113.                         showBit ++;
  114.                         break;
  115.                 }
  116.                 case 2:
  117.                 {
  118.                         ge = 1;
  119.                         shi = 1;
  120.                         bai = 0;
  121.                         qian = 1;
  122.                         if((led[showBit] == 0) && (led[showBit+1] == 0))
  123.                         {
  124.                                 P1 = 0;
  125.                         }
  126.                         else
  127.                         {
  128.                                 P1 = DATA_7SEG[led[showBit]];
  129.                         }
  130.                         showBit ++;
  131.                         break;
  132.                 }
  133.                 case 3:
  134.                 {
  135.                         ge = 1;
  136.                         shi = 1;
  137.                         bai = 1;
  138.                         qian = 0;
  139.                         if(led[showBit] == 0)
  140.                         {
  141.                                 P1 = 0;
  142.                         }
  143.                         else
  144.                         {
  145.                                 P1 = DATA_7SEG[led[showBit]];
  146.                         }
  147.                         showBit = 0;
  148.                         break;
  149.                 }
  150.                 default:
  151.                         showBit =0;
  152.                         break;
  153.         }
  154. }

  155. //________________________________________________________________
  156. void main(void)
  157. {
  158.         //BYTE j;
  159.         
  160.         P1 = 0xff;
  161.         P3 = 0xff;
  162.         
  163.         TMOD = 0X11;
  164.         
  165.         TH1 = 0xd8;
  166.         TL1 = 0xf0;
  167.         TR1 = 1;
  168.         ET1 = 1;
  169.         
  170.         EA = 1;
  171.         
  172.         disp_init();                  //初始化显示

  173.         //TR0 = 0;
  174.         //TH0 = 0x0;
  175.         //TL0 = 0x0;
  176.         
  177.         IT0 = 1;
  178.         EX0 = 1;
  179.         PX0 = 1;
  180.         ET0 = 1;
  181.         pluse = 1;
  182.         
  183.         cn = 0;
  184.         speed = 0;
  185.         //count32 = 250000;
  186.         
  187.         while(1)
  188.         {         
  189.                
  190.                 if(DmS5 ==1)
  191.                 {
  192.                         
  193.                         
  194.                         dms++;
  195.                         if(dms > 99)
  196.                         {
  197.                                 KEY = 1;
  198.                                 dms = 0;
  199.                                 EA = 0;
  200.                                 uCount.cn_byte[0] = 0;
  201.                                 
  202.                                 //count32 = (unsigned long)(cn_n << 16) + (cn_h << 8) + cn_l;
  203.                                 cn_Temp = uCount.cn_Zu;
  204.                                 EA = 1;
  205.                                 if(cn_Temp == 0)
  206.                                 {
  207.                                         speed = 0;
  208.                                 }
  209.                                 else
  210.                                 {
  211.                                         if(KEY == 1)
  212.                                         {
  213.                                                 speed = (minplus/cn_Temp)>>4;
  214.                                         }
  215.                                         else
  216.                                         {
  217.                                                 speed = minplus/cn_Temp;
  218.                                         }
  219.                                 }
  220.                                 led[3]= speed/1000;
  221.                                 Temp1 = speed%1000;
  222.                                 led[2]= Temp1/100;
  223.                                 Temp2 = Temp1%100;
  224.                                 led[1]= Temp2/10;
  225.                                 led[0]= Temp2%10;
  226.                         }
  227.                         DmS5 = 0;
  228.                 }
  229.                
  230.         }
  231. }
复制代码
回复

使用道具 举报

ID:185519 发表于 2017-8-29 14:58 | 显示全部楼层
正常应该显示值=输入频率*60秒/16 (转一周16个光栅采样脉冲)
即:
      速度显示    1425=380*60/16
     
但实际只显示“425”
回复

使用道具 举报

ID:185519 发表于 2017-8-29 23:54 | 显示全部楼层
补一个Proteus 仿真。

89C2051转速表.rar

17.23 KB, 下载次数: 11

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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