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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復(fù)制鏈接]
ID:635913 發(fā)表于 2020-6-9 19:40 | 顯示全部樓層 |閱讀模式

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

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

單片機(jī)源程序如下:
  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. // 等待液晶準(zhǔn)備好
  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 起始地址,亦即光標(biāo)位置,(x,y)-對應(yīng)屏幕上的字符坐標(biāo)
  62. void LcdSetCursor(unsigned char x, unsigned char y)
  63. {
  64.     u8 addr;
  65.     if (y == 0){ //由輸入的屏幕坐標(biāo)計(jì)算顯示 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)屏幕上的起始坐標(biāo),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ù)寫入字符串?dāng)?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 點(diǎn)陣,8 位數(shù)據(jù)接口
  85.     LcdWriteCmd(0x0C); //顯示器開,光標(biāo)關(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)         //計(jì)算位數(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)         //計(jì)算位數(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í)/計(jì)數(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í)/計(jì)數(shù)器初始化

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

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

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

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

所有資料51hei提供下載:

簡易頻率計(jì)-AD原理圖PCB.zip

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

AD原理圖及PCB

簡易頻率計(jì)-程序.zip

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

程序

簡易頻率計(jì)-文檔.zip

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

文檔

評分

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

查看全部評分

回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 中文在线播放 | 在线亚洲免费视频 | 伊人伊人 | 国产精品国产三级国产aⅴ入口 | 毛片一级片 | 看特级黄色片 | 一级黄色短片 | 国产精品视屏 | 亚洲一区二区国产 | 午夜成人在线视频 | 日韩在线免费播放 | 91久久国产综合久久 | 免费在线色| 成人毛片一区二区三区 | 在线观看www | 九九国产 | 91亚洲国产成人久久精品网站 | 91一区二区| 久久久一区二区三区 | 91久久久久久久久久久 | 亚洲免费在线观看 | 欧美日韩一区不卡 | 国产成人福利在线观看 | 日韩一区二区三区在线视频 | 成人av一区二区三区 | 一区二区三区四区不卡 | 日韩亚洲视频 | 51ⅴ精品国产91久久久久久 | 色婷婷综合成人av | 亚洲午夜在线 | 国产激情三区 | 成人免费毛片片v | 亚洲91视频 | 午夜理伦三级理论三级在线观看 | 久久美女网| 高清av一区 | 国产精品久久久久久久午夜片 | 亚洲国产精品日韩av不卡在线 | 国产 欧美 日韩 一区 | 中文字幕在线免费观看 | 9久9久9久女女女九九九一九 |