找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3019|回復(fù): 0
收起左側(cè)

單片機(jī)數(shù)字記頻器仿真程序 lcd1602顯示外部輸入的脈沖頻率

[復(fù)制鏈接]
ID:508977 發(fā)表于 2019-12-19 19:08 | 顯示全部樓層 |閱讀模式
lcd1602顯示外部輸入的脈沖頻率

壓縮包里有一個(gè)后綴為.pdsprj的文件  使用proteus打開  我的是8.6   這個(gè)就是仿真文件。
仿真圖片有個(gè)叫仿真成功的.png的后綴文件。   所有proteus可keil工程文件都在這個(gè)壓縮包里頭。文件不多,一眼就看得出來 .uvproj后綴是keil工程文件

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
仿真成功圖片.png 頻率設(shè)置圖片.png

單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. unsigned long int fre;
  3. unsigned char time;
  4. unsigned int count;
  5. unsigned int count1;
  6. sbit   lcdrs=P2^0;          
  7. sbit   lcdrw=P2^1;         
  8. sbit   lcden=P2^2;          
  9. #define lcddb  P0
  10. unsigned char character[10]={0};
  11. unsigned char character_1[]={"fre= Hz"};
  12. unsigned char FLAG = 0;  
  13. void LCD_init(void);  
  14. void LCD_write_command(unsigned char command);         
  15. void LCD_write_data(unsigned char dat);   
  16. void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat);
  17. void delay_n40us(unsigned int n);
  18. void timer_init();            
  19. void delay_n40us(unsigned int n)               
  20. {
  21.         unsigned int i;
  22.         unsigned char j;            
  23.         for(i=n;i>0;i--)
  24.         for(j=0;j<2;j++);         
  25. }
  26. void delay_1s()
  27. {
  28.         unsigned int i,j;
  29.         for(i = 0;i<100;i++)
  30.                 for(j = 0;j<1000;j++);
  31. }                                      
  32. void LCD_init(void)         
  33. {
  34.         LCD_write_command(0x38);
  35.         LCD_write_command(0x38);
  36.         LCD_write_command(0x38);
  37.         LCD_write_command(0x0c);
  38.         LCD_write_command(0x06);
  39.         LCD_write_command(0x01);  
  40.         delay_n40us(100);
  41. }
  42. void LCD_write_command(unsigned char dat)  
  43. {
  44.         lcddb=dat;
  45.         lcdrs=0;         
  46.         lcdrw=0;
  47.         lcden=1;          
  48.         lcden=0;
  49.         delay_n40us(1);   
  50. }         
  51. void LCD_write_data(unsigned char dat)          
  52. {
  53.         lcddb=dat;
  54.         lcdrs=1;          
  55.         lcdrw=0;          
  56.         lcden=1;  
  57.         lcden=0;
  58.         delay_n40us(1);          
  59. }
  60. void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat)
  61. {
  62.         unsigned char address;
  63.         if(y==1)
  64.                  address=0x80+x;         
  65.         else
  66.                  address=0xc0+x;         
  67.         LCD_write_command(address);          
  68.         LCD_write_data(dat);                  
  69. }
  70. void LCD_disp_num(unsigned char x,unsigned char y,unsigned char dat)
  71. {
  72.         unsigned char address;
  73.         if(y==1)
  74.                  address=0x80+x;          
  75.         else
  76.                  address=0xc0+x;          
  77.         LCD_write_command(address);         
  78.         LCD_write_data(dat+48);                 
  79. }
  80. void dis_num(void)
  81. {
  82.         unsigned char i=0,j=0,k=0;
  83.         LCD_write_command(0x01);
  84.         character[0] = fre/10000000;
  85.         character[1] = fre/1000000%10;
  86.         character[2] = fre/100000%10;
  87.         character[3] = fre/10000%10;
  88.         character[4] = fre/1000%10;
  89.         character[5] = fre/100%10;
  90.         character[6] = fre/10%10;
  91.         character[7] = fre%10;
  92.     character[8] = 'H';
  93.         character[9] = 'z';
  94.         for(i = 0;i<4;i++)                 
  95.         {
  96.                  LCD_disp_char(i+0,1,character_1[i]);
  97.         }
  98.         for(i = 0;i<10;i++)         
  99.         {
  100.                 if(character[i]!=0)
  101.                         break;
  102.         }
  103.         k = 8-i;
  104.         for(j = 0;j<k;j++)         
  105.         {
  106.                         LCD_disp_num(4+j,1,character[i++]);       
  107.         }
  108.     for(i = 5;i<7;i++)         
  109.         {
  110.                  LCD_disp_char(j+4,1,character_1[i]);
  111.                 j++;
  112.         }
  113. }
  114. void main()
  115. {
  116.         unsigned char i;
  117.         LCD_init();
  118.         timer_init();              
  119.         for(i = 0;i<4;i++)
  120.         {
  121.                  LCD_disp_char(i+0,1,character_1[i]);
  122.         }
  123.         while(1)
  124.         {
  125.                 dis_num();         
  126.                 delay_1s();
  127.         }
  128. }
  129. void timer_init(void)         
  130. {
  131.         TMOD=0x66;                 
  132.         TH0=0;                    
  133.         TL0=0;
  134.         TR0=1;                              
  135.         ET0=1;                     
  136.         TH1=0;                    
  137.         TL1=0;
  138.         TR1=1;                                
  139.         ET1=1;                     
  140.         RCAP2H=(65536-62500)/256;
  141.         RCAP2L=(65536-62500)%256;  
  142.         TH2=RCAP2H;               
  143.         TL2=RCAP2L;
  144.         ET2=1;                             
  145.         TR2=1;                     
  146.         EA=1;                       
  147. }
  148. void timer2(void) interrupt 5
  149. {
  150.         time++;
  151.         TF2=0;                    
  152.         if (time==16)              
  153.         {
  154.            time=0;               
  155.            EA=0;                                   
  156.            fre=(long)count1*256+TL1;     
  157.            FLAG = 0;
  158.           
  159.            if(fre<2000)
  160.            {
  161.                            fre = (long)count*256+TL0;
  162.                         FLAG = 1;         
  163.            }
  164.                 if(!FLAG)
  165.                 {
  166.                         fre = fre *100;
  167.                 }
  168.            TL0=0;                     
  169.            TH0=0;
  170.            TL1=0;
  171.            TH1=0;
  172.            count=0;                 
  173.            count1=0;
  174.            EA=1;                     
  175.         }
  176. }

  177. void timer0(void) interrupt 1          
  178. {
  179.         count++;
  180. }               

  181. void timer1(void) interrupt 3
  182. {
  183.         count1++;
  184. }
復(fù)制代碼

所有資料51hei提供下載:
數(shù)字頻率計(jì)設(shè)計(jì)(余浩東1710720049).zip (204.74 KB, 下載次數(shù): 35)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表