找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2779|回复: 0
打印 上一主题 下一主题
收起左侧

单片机数字记频器仿真程序 lcd1602显示外部输入的脉冲频率

[复制链接]
跳转到指定楼层
楼主
lcd1602显示外部输入的脉冲频率

压缩包里有一个后缀为.pdsprj的文件  使用proteus打开  我的是8.6   这个就是仿真文件。
仿真图片有个叫仿真成功的.png的后缀文件。   所有proteus可keil工程文件都在这个压缩包里头。文件不多,一眼就看得出来 .uvproj后缀是keil工程文件

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


单片机源程序如下:
  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. }
复制代码

所有资料51hei提供下载:
数字频率计设计(余浩东1710720049).zip (204.74 KB, 下载次数: 35)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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