标题: 51单片机智能频率计程序设计 [打印本页]

作者: 宁1018    时间: 2019-12-15 14:44
标题: 51单片机智能频率计程序设计
设计一个智能频率计,外部提供四种频率信号,要求:
(1)上电后,LCD1601字符屏先显示初始化界面:“Frequency Testing
(2)通过开关选择四种频率信号,再按下测量开关,测量频率,测量完成后在字符屏上显示测量结果。

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


单片机源程序如下:
  1. #include<reg51.h>
  2. #include<absacc.h>
  3. #include<string.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define WCOMM XBYTE[0x0000]
  7. #define RCOMM XBYTE[0x0001]
  8. #define WDATA XBYTE[0x0002]
  9. #define RDATA XBYTE[0x0003]
  10. uchar LCD_Disp_Buffer[]="Frequency Testing";
  11. uchar count=0;
  12. sbit K1=P1^0;
  13. uint temp;
  14. void BusyWait()
  15. {
  16.    while((RCOMM & 0x80) != 0x00);
  17. }
  18. void Write_Command(uchar cmd)
  19. {
  20.    BusyWait();
  21.    WCOMM=cmd;
  22. }
  23. void Write_Data(uchar dat)
  24. {
  25.    BusyWait();
  26.    WDATA=dat;
  27. }
  28. void Initialise()
  29. {
  30.    Write_Command(0x30);
  31.    Write_Command(0x01);
  32.    Write_Command(0x06);
  33.    Write_Command(0x0c);
  34. }
  35. void ShowString(uchar *str)
  36. {
  37.     uchar i=0;
  38.         Write_Command(0x80);
  39.         while(str[i]!='\0'&&i<16&&str[i]!='A')
  40.         Write_Data(str[i++]);
  41.         for(;i<16;i++) Write_Data(' ');
  42.   }
  43. void Init()
  44. {
  45.    TMOD=0x51;
  46.    EA=1;
  47.    ET0=1;
  48.    ET1=1;
  49.    TL1=255;
  50.    TH1=255;
  51.    TH0=(65536-50000)/256;
  52.    TL0=(65536-50000)%256;
  53. }
  54. void Delay(uchar t)
  55. {
  56.    uchar a,b;
  57.    for(;t>0;t--)
  58.    for(a=38;a>0;a--)
  59.    for(b=140;b>0;b--);
  60. }
  61. void main()
  62. {
  63.   uchar i=0;
  64.   Initialise();
  65.   Init();
  66.   ShowString(LCD_Disp_Buffer);
  67.   while(1)
  68.   {
  69.          if(K1==0)
  70.          {
  71.            temp=0;
  72.            TR1=1;
  73.            TR0=1;
  74.          }
  75.          ShowString(LCD_Disp_Buffer);
  76.   }
  77. }
  78. void jishu( ) interrupt 3
  79. {
  80.    TL1=255;
  81.    TH1=255;
  82.    temp++;
  83. }
  84. void time_0( ) interrupt 1
  85. {
  86.     uchar i;
  87.    TH0=(65536-50000)/256;
  88.    TL0=(65536-50000)%256;
  89.    if(++count==20)
  90.    {
  91.           TR1=0;
  92.           TR0=0;
  93.       count=0;
  94.           LCD_Disp_Buffer[0]=temp/10000+'0';
  95.       LCD_Disp_Buffer[1]=temp/1000%10+'0';
  96.       LCD_Disp_Buffer[2]=temp/100%10+'0';
  97.       LCD_Disp_Buffer[3]=temp%100/10+'0';
  98.       LCD_Disp_Buffer[4]=temp%10+'0';
  99.           for(i=5;i<16;i++)
  100.            LCD_Disp_Buffer[i]=' ';
  101.           TL1=255;
  102.       TH1=255;
  103.    }
  104. }
复制代码

所有资料51hei提供下载:
智能频率计.zip (30.66 KB, 下载次数: 44)



作者: @@;    时间: 2020-1-3 17:21
频率范围多少
作者: 温xyz    时间: 2020-1-3 21:20
@@; 发表于 2020-1-3 17:21
频率范围多少

对于没有分频器的,这种单片机在12M频率下,最多能有400KHZ的测量范围。
作者: limuzi0916    时间: 2020-1-14 12:33
运行之后按下按钮不显示所测数据,是什么原因呢

作者: limuzi0916    时间: 2020-1-14 12:41
请问不显示所测频率是什么原因呢
作者: limuzi0916    时间: 2020-1-14 14:29
运行后不显示频率表




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1