想把方波的输入频率显示在液晶上,但是总是显示00000,有大神帮忙看下程序吗?

2019-07-15 16:51发布

本人想把50000HZ的方波频率,通过定时加中断的方法显示在液晶上,但是总是显示不出来。

定时加中断:通过定时1S,然后计算出1s内的脉冲数来计算频率。

电路图如下:方波信号接在了T1口。 液晶显示器在P0口
电路图

程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int

  4. uchar code count[]="0123456789";

  5. uint counter=0;        //脉冲数
  6. uint calsp;                //设定多长时间计数一次
  7. uint frequency;         //频率数值

  8. sbit rs=P2^4;
  9. sbit rw=P2^5;
  10. sbit en=P2^6;

  11. void delay(uint);
  12. void timer_init();
  13. void lcd_init();
  14. void write_cmd(uchar);
  15. void write_data(uchar);
  16. void tran();
  17. void display(uchar,uchar,uchar);
  18. void display_num();



  19. void main()  //主程序
  20. {

  21.         lcd_init();
  22.         timer_init();
  23.         while(1)
  24.         {
  25.           tran();
  26.           display_num();
  27.          }
  28. }

  29. void delay(uint num)
  30. {
  31.     uint x,y;
  32.     for(x=num;x>0;x--)
  33.     for(y=110;y>0;y--)
  34.             ;

  35. }

  36. void timer0() interrupt 1
  37. {
  38.           TH0=(65536-50000)/256;         //重新装入初值,计数时间为50ms
  39.         TL0=(65536-50000)%256;
  40.         calsp++;
  41. }

  42. void IN_T0() interrupt 0
  43. {
  44.     counter++;
  45. }

  46. void tran()
  47. {

  48.    if(calsp==20)
  49.    frequency=counter;
  50.    counter=0;    //脉冲数清零
  51.    calsp=0;                 //标志位清零
  52. }

  53. void timer_init() //定时器和外部中断初始化
  54. {
  55.         EA=1;        //开启总中断        
  56.         EX0=1;        //开启外部中断0
  57.         IT0=1;        //设置成下降沿触发方式
  58.         TMOD=0x01; //设置定时器0为模式1,即16位计数模式
  59.         TH0=(65536-50000)/256;         //计数时间为50ms
  60.         TL0=(65536-50000)%256;
  61.         ET0=1;                //开启定时器0中断
  62.         TR0=1;                //启动定时器0
  63. }

  64. void write_cmd(uchar cmd)        //写命令函数
  65. {
  66.         rs=0;
  67.         rw=0;
  68.         P0=cmd;
  69.         delay(5);
  70.         en=1;
  71.         delay(5);
  72.         en=0;
  73. }
  74. void write_data(uchar dat)  //写数据函数
  75. {
  76.         rs=1;
  77.         rw=0;
  78.         P0=dat;
  79.         delay(5);
  80.         en=1;
  81.         delay(5);
  82.         en=0;
  83. }
  84. void lcd_init()        //lcd初始化
  85. {
  86.         rs=0;
  87.         rw=0;
  88.         en=0;
  89.         write_cmd(0x02);
  90.         write_cmd(0x06);
  91.         write_cmd(0x0c);
  92.         write_cmd(0x38);
  93.         write_cmd(0x01);
  94. }

  95. void display(uchar x,uchar y,uchar dat)     //液晶行和列显示,X:行  Y:列  dat:要显示的数据
  96. {
  97.         uchar m;
  98.         if(x==1)
  99.         {
  100.         m=0x40;
  101.         }
  102.         else
  103.         m=0;
  104.         m=y|m;
  105.         write_cmd(0x80+m);
  106.         write_data(dat);
  107. }


  108. void display_num()
  109. {
  110.         uchar ge,shi,bai,qian,wan;
  111.         ge=frequency%10;
  112.         shi=frequency%100/10;
  113.         bai=frequency%1000/100;
  114.         qian=frequency%10000/1000;
  115.         wan=frequency%100000/10000;
  116.         
  117.         display(1,8,count[ge]);
  118.         delay(1);
  119.         display(1,7,count[shi]);
  120.         delay(1);
  121.         display(1,6,count[bai]);
  122.         delay(1);
  123.         display(1,5,count[qian]);
  124.         delay(1);
  125.         display(1,4,count[wan]);
  126.         delay(1);
  127. }
复制代码

有大神帮忙看下是什么原因吗?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。