久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3756|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

51單片機+ICL7660+TL082的簡易頻率計設(shè)計,含源代碼,原理圖,PCB及文檔

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:635913 發(fā)表于 2020-6-9 19:40 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

    基于AT89C51單片機設(shè)計了一款測量范圍在10HZ-10KHZ的頻率計,主要由輸入放大電路,整形電路、單片機AT89C51和顯示電路等組成。被測信號(正弦波或方波)通過放大、整形電路轉(zhuǎn)換成同頻率的方波脈沖信號,采用單片機內(nèi)部的定時/計數(shù)器T0進行計數(shù)。放大整形后的信號輸入到AT89C51單片機T0中斷口使用其計數(shù)模式對輸入信號進行計數(shù),再利用內(nèi)部定時器T1進行定時。最后在軟件的主函數(shù)部分通過一系列計算得出頻率,輸送至LCD液晶顯示屏輸出測量輸入信號值。
    方案:
    系統(tǒng)以AT89C51為核心,設(shè)計了一款測試范圍在10Hz ~ 10KHz 的頻率計。該系統(tǒng)主要設(shè)計思想是信號予處理電路 、串行通信電路 、測量數(shù)據(jù)顯示電路和系統(tǒng)軟件所組成, 其中信號予處理電路包含待測信號放大、波形變換、波形整形和分頻電路。信號予處理電路中的放大器實現(xiàn)對待測信號的放大 ,降低對待測信號的幅度要求;波形變換和波形整形電路實現(xiàn)把正弦波樣的正負交替的信號波形變換成可被單片機接受的信號。

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


單片機源程序如下:
  1. #include <reg52.h>

  2. #define LCD1602_DB  P0          //數(shù)據(jù)信號
  3. #define u32 unsigned long int
  4. #define u16 unsigned int
  5. #define u8 unsigned char

  6. u32 fre;
  7. u8 add;
  8. u8 WeiShu;
  9. u16 count;
  10. u16 count1;

  11. sbit   LCD1602_RS=P2^6;             //片選信號
  12. sbit   LCD1602_RW=P2^5;             //讀寫信號
  13. sbit   LCD1602_E=P2^7;                    //使能信號

  14. u8 character[15];                                                                         //在屏幕上顯示的字符串
  15. u8 character_1[]={"frequency lx"};        //顯示

  16. u8 hz[]={"Hz"};
  17. u8 khz[]={"KHz"};


  18. void InitLcd1602();
  19. void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
  20. void timer_init();            //中斷初始化函數(shù)


  21. void delay_1s()                                 //延遲1s
  22. {
  23.         unsigned int i,j;      
  24.         for(i = 0;i<100;i++)              
  25.                 for(j = 0;j<1000;j++);
  26. }

  27. // 等待液晶準備好
  28. void LcdWaitReady()
  29. {
  30.     u8 sta;
  31.     LCD1602_DB = 0xFF;
  32.     LCD1602_RS = 0;
  33.     LCD1602_RW = 1;
  34.     do
  35.                 {
  36.                         LCD1602_E = 1;
  37.                         sta = LCD1602_DB; //讀取狀態(tài)字
  38.                         LCD1602_E = 0;
  39.     }while (sta & 0x80); //bit7 等于 1 表示液晶正忙,重復(fù)檢測直到其等于 0 為止
  40. }

  41. //向 LCD1602 液晶寫入一字節(jié)命令,cmd-待寫入命令值
  42. void LcdWriteCmd(unsigned char cmd)
  43. {
  44.     LcdWaitReady();
  45.     LCD1602_RS = 0;
  46.     LCD1602_RW = 0;
  47.     LCD1602_DB = cmd;
  48.     LCD1602_E = 1;
  49.     LCD1602_E = 0;
  50. }

  51. // 向 LCD1602 液晶寫入一字節(jié)數(shù)據(jù),dat-待寫入數(shù)據(jù)值
  52. void LcdWriteDat(unsigned char dat)
  53. {
  54.     LcdWaitReady();
  55.     LCD1602_RS = 1;
  56.     LCD1602_RW = 0;
  57.     LCD1602_DB = dat;
  58.     LCD1602_E = 1;
  59.     LCD1602_E = 0;
  60. }

  61. // 設(shè)置顯示 RAM 起始地址,亦即光標位置,(x,y)-對應(yīng)屏幕上的字符坐標
  62. void LcdSetCursor(unsigned char x, unsigned char y)
  63. {
  64.     u8 addr;
  65.     if (y == 0){ //由輸入的屏幕坐標計算顯示 RAM 的地址
  66.         addr = 0x00 + x; //第一行字符地址從 0x00 起始
  67.     }else{
  68.         addr = 0x40 + x; //第二行字符地址從 0x40 起始
  69.     }
  70.     LcdWriteCmd(addr | 0x80); //設(shè)置 RAM 地址
  71. }

  72. //在液晶上顯示字符串,(x,y)-對應(yīng)屏幕上的起始坐標,str-字符串指針
  73. void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
  74. {
  75.     LcdSetCursor(x, y); //設(shè)置起始地址
  76.     while (*str != '\0')
  77.         { //連續(xù)寫入字符串數(shù)據(jù),直到檢測到結(jié)束符
  78.         LcdWriteDat(*str++); //先取 str 指向的數(shù)據(jù),然后 str 自加 1
  79.     }
  80. }

  81. // 初始化 1602 液晶
  82. void InitLcd1602()
  83. {
  84.     LcdWriteCmd(0x38); //16*2 顯示,5*7 點陣,8 位數(shù)據(jù)接口
  85.     LcdWriteCmd(0x0C); //顯示器開,光標關(guān)閉
  86.     LcdWriteCmd(0x06); //文字不動,地址自動+1
  87.     LcdWriteCmd(0x01); //清屏
  88. }

  89. void number_dispose()    //數(shù)據(jù)處理
  90. {
  91.         //character[15]={'\0'};
  92.         u8 i,j=1;
  93.         u32 temp;
  94.         u32 number_sign;
  95.        
  96.         if(fre<1000)
  97.         {
  98.                 temp=fre*100;
  99.                 number_sign=fre*100;
  100.                 while(temp>0)         //計算位數(shù)
  101.                 {
  102.                         temp/=10;
  103.                         j++;
  104.                 }
  105.                 WeiShu=j;
  106.                 for(i=0;i<j;i++)   //依次取余
  107.                 {
  108.                         if(i==2)
  109.                                 character[j-i-1]='.';
  110.                         else
  111.                         {
  112.                                 character[j-i-1]=number_sign%10+0x30;
  113.                                 number_sign/=10;
  114.                         }
  115.                 }
  116.         }
  117.         else
  118.         {
  119.                 temp=fre;
  120.                 number_sign=fre;
  121.                 while(temp>0)         //計算位數(shù)
  122.                 {
  123.                         temp/=10;
  124.                         j++;
  125.                 }
  126.                 WeiShu=j;
  127.                 for(i=0;i<j;i++)   //依次取余
  128.                 {
  129.                         if(i==3)
  130.                                 character[j-i-1]='.';
  131.                         else
  132.                         {
  133.                                 character[j-i-1]=number_sign%10+0x30;
  134.                                 number_sign/=10;
  135.                         }
  136.                 }
  137.         }
  138. }


  139. void main()
  140. {         
  141.         timer_init();             //定時/計數(shù)器初始化  
  142.         while(1)
  143.         {   
  144.                 number_dispose();        //數(shù)據(jù)處理
  145.                 InitLcd1602();
  146.                 LcdShowStr(0, 0, character_1);
  147.                 LcdShowStr(0, 1, character);  
  148.                 if(fre<1000)
  149.                         LcdShowStr(WeiShu+1, 1, hz);
  150.                 else
  151.                         LcdShowStr(WeiShu+1, 1, khz);
  152.                 delay_1s();
  153.         }
  154. }

  155. //定時/計數(shù)器初始化

  156. void timer_init(void)       //定時/計數(shù)器初始化
  157. {      
  158.         TMOD=0x66;                //計數(shù)器0和計數(shù)器1工作工作方式2,自動重裝初值     
  159.         TH0=0;                    //計數(shù)器初值為0     
  160.         TL0=0;  
  161.         TR0=1;                    //計數(shù)器開始計數(shù)               
  162.         ET0=1;                    //打開計數(shù)器0中斷   
  163.         TH1=0;                    //計數(shù)器初值為0
  164.         TL1=0;  
  165.         TR1=1;                    //計數(shù)器開始計數(shù)            
  166.         ET1=1;                    //打開計數(shù)器1中斷     
  167.         RCAP2H=(65536-62500)/256; //在程序初始化的時候給RCAP2L和RCAP2H賦值,        
  168.         RCAP2L=(65536-62500)%256; //TH2和TL2將會在中斷產(chǎn)生時自動使TH2=RCAP2H,TL2=RCAP2L。     
  169.         TH2=RCAP2H;               //12M晶振下每次中斷62.5ms(1s=1000ms=62.5ms×16)  
  170.         TL2=RCAP2L;
  171.         ET2=1;                    //打開定時器2中斷         
  172.         TR2=1;                    //定時器2開始計時  
  173.         EA=1;                     //開總中斷  
  174. }

  175. //中斷函數(shù)

  176. void timer2(void) interrupt 5 //定時器2中斷(62.5ms)
  177. {      
  178.         add++;
  179.         TF2=0;                      //定時器2的中斷標志位TF2不能夠由硬件清零,所以要在中斷服務(wù)程序中將其清零   
  180.         if (add==32)                //定時1s時間到  
  181.         {  
  182.                 add=0;                                                         //計時清0
  183.                 EA=0;                     //關(guān)中斷                 
  184.                 fre=(long)count1*256+TL1; //count*256強制轉(zhuǎn)換成long型,否則將不產(chǎn)生進位~先判斷分頻后(計數(shù)器1)
  185. //                FLAG = 0;
  186.                 if(fre<2000)//如果不到200KHz則讀取分頻前(計數(shù)器0)頻率(200K÷100=2000)
  187.                 {
  188.                         fre = (long)count*256+TL0;
  189. //                        FLAG = 1;         
  190.                 }
  191. //                if(!FLAG)
  192. //                {
  193. //                        fre = fre *100;//100分頻
  194. //                }
  195.                 TL0=0;                    //清零計數(shù)器0計數(shù)            
  196.                 TH0=0;
  197.                 TL1=0;
  198.                 TH1=0;
  199.                 count=0;                  //清零計數(shù)器0計數(shù)         
  200.                 count1=0;
  201.                 EA=1;                     //開中斷            
  202.         }
  203. }

  204. void timer0(void) interrupt 1 //計數(shù)器0中斷        
  205. {
  206.         count++;
  207. }               
復(fù)制代碼

所有資料51hei提供下載:

簡易頻率計-AD原理圖PCB.zip

854.88 KB, 下載次數(shù): 36, 下載積分: 黑幣 -5

AD原理圖及PCB

簡易頻率計-程序.zip

6.88 KB, 下載次數(shù): 27, 下載積分: 黑幣 -5

程序

簡易頻率計-文檔.zip

162.12 KB, 下載次數(shù): 33, 下載積分: 黑幣 -5

文檔

評分

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

查看全部評分

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品一 | 欧美韩一区二区三区 | 亚洲综合视频 | 在线播放国产一区二区三区 | 亚洲一区电影 | 久久午夜电影 | 国产原创视频 | 日本网站免费在线观看 | 国产精品不卡一区二区三区 | 国产激情视频在线观看 | 一区欧美| 亚洲精品成人在线 | 国产成人精品一区二区三区视频 | jizz18国产 | 久在线| 国产精品久久久久久福利一牛影视 | 青娱乐一区二区 | 日韩中文字幕视频在线 | 在线观看日韩精品视频 | 欧美日韩综合视频 | 午夜亚洲 | 亚洲欧美中文日韩在线v日本 | 色片在线观看 | 久久av.com| 国产成人99久久亚洲综合精品 | 欧美在线视频一区二区 | 毛片久久久 | 国产精品99久久久久久动医院 | www.久久国产精品 | 亚洲视频在线看 | 在线观看av中文字幕 | 久久精品国产一区二区电影 | 99re热这里只有精品视频 | 在线观看黄色 | 91影院在线观看 | 国产一区二 | 日韩国产高清在线观看 | 国产日韩欧美一区 | 亚洲欧美激情国产综合久久久 | 成人影院一区二区三区 | 国产精品高潮呻吟久久aⅴ码 |