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

QQ登錄

只需一步,快速開始

帖子
查看: 5223|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)頻率計(jì)程序 74HC14整形電路+74HC390分頻電路 Proteus仿真原理圖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
程序和仿真程序,原理圖都在壓縮包里,經(jīng)過本人親自驗(yàn)證可以使用
電路原理圖如下:


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


單片機(jī)源程序如下:
  1. //******************************************************************************************
  2. //連接框圖:       ___________________
  3. //                |              P1.0 |->RS
  4. //                |              P1.1 |->RW
  5. //                |              P1.2 |->E
  6. //                |              P0   |->DB
  7. //                |                     P3.4 |->1~9999hz的輸入
  8. //                |              P3.5 |->1~9999KHZ輸入 (分頻后)
  9. //******************************************************************************************
  10. #include <reg52.h>
  11. unsigned long int fre;
  12. unsigned char time;
  13. unsigned int count;
  14. unsigned int count1;

  15. //端口及函數(shù)說明----------------------------------------------------------------------------

  16. sbit   LCD_RS=P1^0;          //片選信號(hào)
  17. sbit   LCD_RW=P1^1;          //讀寫信號(hào)
  18. sbit   LCD_E=P1^2;           //使能信號(hào)


  19. #define LCD_DB     P0        //數(shù)據(jù)信號(hào)
  20. unsigned char character[10]={0};//在屏幕上顯示的字符串
  21. unsigned char character_1[]={"fre= Hz"};
  22. unsigned char FLAG = 0;

  23. void LCD_init(void);//初始化函數(shù)   
  24. void LCD_write_command(unsigned char command);//寫指令函數(shù)         
  25. void LCD_write_data(unsigned char dat);//寫數(shù)據(jù)函數(shù)           
  26. void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat);//在某個(gè)屏幕位置上顯示一個(gè)字符,X(0-15),y(1-2)
  27. void delay_n40us(unsigned int n);//延時(shí)函數(shù)
  28.      
  29. void timer_init();            //中斷初始化函數(shù)  


  30. //-------------------------------------------------------------------------------

  31. void delay_n40us(unsigned int n)                  //延時(shí)函數(shù)
  32. {
  33.         unsigned int i;
  34.         unsigned char j;            
  35.         for(i=n;i>0;i--)
  36.         for(j=0;j<2;j++);         
  37. }

  38. void delay_1s()
  39. {
  40.         unsigned int i,j;
  41.         for(i = 0;i<100;i++)
  42.                 for(j = 0;j<1000;j++);
  43. }                                      

  44. void LCD_init(void)         //液晶初始化函數(shù)
  45. {
  46.         LCD_write_command(0x38);//設(shè)置8位格式,2行,5x7
  47.         LCD_write_command(0x38);//設(shè)置8位格式,2行,5x7
  48.         LCD_write_command(0x38);//設(shè)置8位格式,2行,5x7         切記要寫三遍!�。�!
  49.         LCD_write_command(0x0c);//整體顯示,關(guān)光標(biāo),不閃爍
  50.         LCD_write_command(0x06);//設(shè)定輸入方式,增量不移位
  51.         LCD_write_command(0x01);//清除屏幕顯示         
  52.         delay_n40us(100);//清屏延時(shí)
  53. }

  54. void LCD_write_command(unsigned char dat)  //寫命令函數(shù)
  55. {
  56.         LCD_DB=dat;
  57.         LCD_RS=0;//指令         
  58.         LCD_RW=0;//寫入         
  59.         LCD_E=1; //使能         
  60.         LCD_E=0;
  61.         delay_n40us(1);//寫命令延時(shí)   
  62. }         

  63. void LCD_write_data(unsigned char dat)          //寫數(shù)據(jù)函數(shù)
  64. {
  65.         LCD_DB=dat;
  66.         LCD_RS=1;//數(shù)據(jù)         
  67.         LCD_RW=0;//寫入         
  68.         LCD_E=1;//使能  
  69.         LCD_E=0;
  70.         delay_n40us(1);         //寫數(shù)據(jù)延時(shí)
  71. }

  72. void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat)//顯示一個(gè)字符
  73. {
  74.         unsigned char address;
  75.         if(y==1)
  76.                  address=0x80+x;         //顯示在第一排的時(shí)候的x的地址
  77.         else
  78.                  address=0xc0+x;         //顯示在第二排的時(shí)候的x的地址
  79.         LCD_write_command(address);         //輸入地址
  80.         LCD_write_data(dat);                 //輸入數(shù)據(jù)
  81. }
  82. void LCD_disp_num(unsigned char x,unsigned char y,unsigned char dat)//顯示一個(gè)數(shù)字
  83. {
  84.         unsigned char address;
  85.         if(y==1)
  86.                  address=0x80+x;         //顯示在第一排的時(shí)候的x的地址
  87.         else
  88.                  address=0xc0+x;         //顯示在第二排的時(shí)候的x的地址
  89.         LCD_write_command(address);         //輸入地址
  90.         LCD_write_data(dat+48);                 //輸入數(shù)據(jù)
  91. }

  92. void dis_num(void)
  93. {
  94.         unsigned char i=0,j=0,k=0;
  95.         LCD_write_command(0x01);//清除屏幕顯示
  96.         
  97.         character[0] = fre/1000000;
  98.         character[1] = fre/100000%10;
  99.         character[2] = fre/10000%10;
  100.         character[3] = fre/1000%10;
  101.         character[4] = fre/100%10;
  102.         character[5] = fre/10%10;
  103.         character[6] = fre%10;
  104.     character[7] = 'H';
  105.         character[8] = 'z';
  106.         
  107.         for(i = 0;i<4;i++)                 //顯示fre
  108.         {
  109.                  LCD_disp_char(i+0,1,character_1[i]);
  110.         }
  111.         for(i = 0;i<10;i++)         //判斷第一個(gè)不為0的數(shù)
  112.         {
  113.                 if(character[i]!=0)
  114.                         break;
  115.         }
  116.         k = 10-i-2;
  117.         for(j = 0;j<k;j++)         //顯示所有的數(shù)字
  118.         {
  119.                         LCD_disp_num(4+j,1,character[i++]);        
  120.         }
  121.         
  122.     for(i = 5;i<7;i++)         //顯示Hz
  123.         {
  124.                  LCD_disp_char(j+4,1,character_1[i]);
  125.                 j++;
  126.         }
  127. }



  128. void main()
  129. {
  130.         unsigned char i;
  131.         LCD_init();
  132.         timer_init();             //定時(shí)/計(jì)數(shù)器初始化

  133.         for(i = 0;i<4;i++)
  134.         {
  135.                  LCD_disp_char(i+0,1,character_1[i]);
  136.         }
  137.         while(1)
  138.         {
  139.                 dis_num();         //顯示
  140.                  delay_1s();
  141.                         
  142.         }                                                
  143. }

  144. void timer_init(void)         //定時(shí)/計(jì)數(shù)器初始化
  145. {
  146.         TMOD=0x66;                //計(jì)數(shù)器0工作工作方式2,自動(dòng)重裝初值
  147.         TH0=0;                    //計(jì)數(shù)器初值為0
  148.         TL0=0;
  149.         TR0=1;                    //計(jì)數(shù)器開始計(jì)數(shù)            
  150.         ET0=1;                    //打開計(jì)數(shù)器0中斷   

  151.         TH1=0;                    //計(jì)數(shù)器初值為0
  152.         TL1=0;
  153.         TR1=1;                    //計(jì)數(shù)器開始計(jì)數(shù)            
  154.         ET1=1;                    //打開計(jì)數(shù)器0中斷   

  155.         RCAP2H=(65536-62500)/256; //在程序初始化的時(shí)候給RCAP2L和RCAP2H賦值,
  156.         RCAP2L=(65536-62500)%256; //TH2和TL2將會(huì)在中斷產(chǎn)生時(shí)自動(dòng)使TH2=RCAP2H,TL2=RCAP2L。
  157.         TH2=RCAP2H;               //12M晶振下每次中斷62.5ms
  158.         TL2=RCAP2L;
  159.         ET2=1;                    //打開定時(shí)器2中斷         
  160.         TR2=1;                    //定時(shí)器2開始計(jì)時(shí)  
  161.         EA=1;                     //開總中斷   
  162. }
  163. //----------------------------------------------------------------
  164. void timer2(void) interrupt 5 //定時(shí)器2中斷(62.5ms)
  165. {
  166.         time++;
  167.         TF2=0;                    //定時(shí)器2的中斷標(biāo)志位TF2不能夠由硬件清零,所以要在中斷服務(wù)程序中將其清零
  168.         if (time==16)             //定時(shí)1s時(shí)間到  
  169.         {
  170.            time=0;                //計(jì)時(shí)清0                 
  171.            fre=(long)count*256+TL0;     //count*256強(qiáng)制轉(zhuǎn)換成long型,否則將不產(chǎn)生進(jìn)位 先判斷分頻后的
  172.          
  173.            if(fre>2000)//200K之后讀取分頻后的頻率
  174.            {
  175.                            fre = (long)count1*256+TL1;
  176.            }   
  177.            
  178.            count=0;               //清零計(jì)數(shù)器0計(jì)數(shù)         
  179.            count1=0;
  180.            EA=1;                  //開中斷            
  181.         }
  182. }
  183. //----------------------------------------------------------------
  184. void timer0(void) interrupt 1 //計(jì)數(shù)器0中斷         
  185. {
  186.         count++;
  187. }               
  188. //----------------------------------------------------------------
  189. void timer1(void) interrupt 3 //計(jì)數(shù)器1中斷
  190. {
  191.         count1++;
  192. }
  193.          
復(fù)制代碼

注意Proteus只能用7.5版本,高版本都不行的 我測(cè)試過:
Proteus7.5版本的仿真和程序.7z (466.71 KB, 下載次數(shù): 101)


評(píng)分

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

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:362333 發(fā)表于 2022-7-30 22:41 來自觸屏版 | 只看該作者
最高測(cè)多少頻率?
回復(fù)

使用道具 舉報(bào)

板凳
ID:228452 發(fā)表于 2022-7-31 01:14 | 只看該作者
1~9999KHZ input
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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