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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5846|回復: 2
打印 上一主題 下一主題
收起左側

一種智能頻率計的設計與制作(AVR) 帶仿真與源程序和原理圖

[復制鏈接]
跳轉到指定樓層
樓主

基于avr單片機的頻率計的仿真原理圖



俺畢業設計的小玩意.也許有人可以拿去玩.

當時剛出畢業選題就趕緊的選了這個簡單的.免得以后為畢業設計費神.
這是最初的,后來給學校也是交的這個. 花了三天時間.

//*********************11月29日開始畢業選題
讀了一點頻率計原理,高頻記數,低頻測周期 規劃了一下大體,堅決不用老師指定的51,
//*********************11月30日開始寫代碼
湊合著開始了,偏差很大,很無聊,晚上跟123JJ在51hei灌水,灌了陣找到思維了,繼續寫,基本完成
//*********************12月1日調試
寫了個串口上位機對數據進行分析和記錄,方便多了.仔細的調了下.不管他效率和規范了,出結果了就要得,馬虎的收工了.
16MHz晶振,范圍1Hz--5MHz,軟件仿真測周期誤差<1/8us.計數誤差最大可能1hz. 當然液晶顯示誤差就大多了.顯示位數有限.隨便忽悠一下, 可以給老師交差了.前端信號處理和pcb以后再弄.

后來前端處理參照冬瓜哥的精華帖和建議,把CD4069作運放用.
感謝冬瓜哥給我打板,搭順路車.

后來在寒假發神經又琢磨了一下,修改下代碼,加上些別的東西,反正資源還足夠,有些作了測試,有些只是空想,規劃和寫代碼,沒有測試.脈寬和占空比,電壓表,示波器,歐姆表,信號發生器,溫度計,電容表,電感表,邏輯儀,紅外分析,弄了5,6天又停了,人太懶.再后來又忘干凈了,只記得電容表是測充電時間.
再后來,寫畢業論文,網上下了n多資料和論文用來copy,弄的電腦很亂,寫到一半,實在太亂,文件整理中,大把的刪文件夾,一不小心把軟件都刪了,還好在qq群共享里留下了這個最初版本.好險.差點作無用功.






下面是智能頻率計的原理圖是用ad畫的.


下面是主程序的源程序:
  1. #ifndef main_c   //test ok
  2.   #define main_c
  3. #endif

  4. #include "main.h"
  5. //************************全局變量

  6. volatile uint t0_cont;

  7. volatile uint t1_cont;
  8. volatile uchar flg1; //
  9. //-------------------------------------------------------------------------
  10. //     測試函數 用來初始化
  11. //-------------------------------------------------------------------------
  12. void test()
  13. {
  14.   send_str( "pinlvji" ); //完成后把所有串口去掉
  15.   showstr( "cymometer", 1, 1, 9 ); //液晶顯示
  16. //  showstr( "1KHz", 12, 1, 4 );
  17.   showstr( "Hz", 14, 2, 2 );
  18. }

  19. //-------------------------------------------------------------------------
  20. //mcu初始化 端口 定時器 中斷 外中斷 變量
  21. //-------------------------------------------------------------------------
  22. void mcu_init()
  23. {
  24. //******************端口
  25.   data_direc = out; //輸出
  26.   DDRB = out; //輸出
  27.   DDRC = out; //輸出
  28.   PORTC = 0X00; //輸出0

  29.   DDRB=0XE0;   //輸入口      
  30.   PORTB=0XE9;
  31. //********************定時器
  32.   TIMSK |= 0x12; //定時中斷允許位 只允許兩個匹配
  33. }

  34. //-------------------------------------------------------------------------
  35. //       主函數
  36. //-------------------------------------------------------------------------
  37. int main()
  38. {
  39.   uchar f_t; //用測頻還是測周
  40. //******************
  41.   mcu_init();                 //初始化
  42.   usart_init( 57600 );        //初始化
  43.   send_str( "com ok" ); //完成后把所有串口去掉
  44.   yj_set( 0x38, 0x0f, 0x06 ); //初始化
  45.   clearall(); //初始化
  46.   mzd_on();   //開中斷

  47.   #if debug
  48.     test();
  49.   #endif

  50.   while ( 1 )
  51.   {
  52.     if ( !( PINB& ( 1 << 3 )))
  53.     {
  54.       refish();       //刷新所有的東西
  55.       f_t = hz_try(); //估計范圍 1k
  56.       if ( f_t )
  57.       {
  58.         cl_f(); //頻率法
  59.       }
  60.       else
  61.       {
  62.         cl_t(); //周期法
  63.       }
  64.     }
  65.   }
  66.   return 1;
  67. }
復制代碼
cale.c
  1. #ifndef cale_c
  2.   #define cale_c
  3.   #include "main.h"
  4. //-------------------------------------------------------------------------
  5. // //周期法   先笨方法
  6. //-------------------------------------------------------------------------
  7.   void cale_t( uchar* back )
  8.   {
  9.     ulint count_all; //存放周期 max 16m min 16k
  10.     uint z_sh;      
  11.     ulint y_sh;     
  12.     uchar test;      
  13. //*******************整數小數分離  
  14.     count_all = t1_cont * 50000+TCNT1;
  15.         if(count_all>max_t)
  16.         count_all=max_t;
  17.     z_sh = max_t / count_all;         
  18.         #if pc
  19.     y_sh=max_t-count_all*z_sh;
  20.         y_sh*=10;
  21.     count_all/=100;
  22. #else
  23.     y_sh = ( max_t % count_all )* 1000;
  24. #endif
  25. //*******************整數計算部分
  26.     *back++ = z_sh / 100;
  27.     z_sh = z_sh % 100;
  28.     *back++ = z_sh / 10;
  29.     *back++ = z_sh % 10;
  30. //***************小數計算
  31.     z_sh = y_sh / count_all;
  32.     *back++ = z_sh / 100;
  33.     z_sh = z_sh % 100;

  34.     *back = z_sh / 10;
  35.     z_sh = z_sh % 10;
  36. //************做四舍五入計算
  37.     test=0;
  38.     if ( z_sh >= 5 )
  39.     {
  40.         send_char(z_sh);
  41.       *back += 1; //
  42.       if ( *back == 10 )
  43.       {
  44.             test++;
  45.         *back-- = 0;
  46.         *back += 1;
  47.         if ( *back == 10 )
  48.         {
  49.             test++;
  50.           *back-- = 0;
  51.           *back += 1; //
  52.           if ( *back == 10 )
  53.           {
  54.             test++;
  55.             *back-- = 0;
  56.             *back += 1; //
  57.             if ( *back == 10 )
  58.             {
  59.             test++;
  60.               *back-- = 0;
  61.               *back += 1;
  62.             }
  63.           }
  64.         }
  65.       }
  66.     }
  67.     back-=(4-test);

  68. //****************轉到ascii碼
  69.     for ( test = 5; test > 0; test-- )
  70.     {
  71.       *back++ = * back + 0x30;
  72.     }
  73. back-=5;
  74. //****************插進小數點
  75.     back[5] = back[4];
  76.     back[4] = back[3];
  77.     back[3] = '.';

  78. //****************去掉不要的0

  79.     for ( test = 3; test > 0; test-- )
  80.     {
  81.       if ( *back == 0x30 )
  82.       {
  83.         *back++ = * back - 0x30;
  84.       }
  85.       else
  86.       {
  87.         break;
  88.       }
  89.     }
  90.   }

  91. //-------------------------------------------------------------------------
  92. //       //記數法
  93. //-------------------------------------------------------------------------
  94.   void cale_f( uchar* back )
  95.   {
  96.     ulint count_all;  
  97.     uchar test;      

  98.     count_all = t1_cont * 50000+TCNT1; //原始值
  99. //*****************計算 笨方法計算
  100.     *back++   = count_all / 1000000; //最高位
  101.     count_all = count_all % 1000000; //去掉最高位
  102.     *back++   = count_all / 100000; //100k位
  103.     count_all = count_all % 100000; //去掉
  104.     *back++   = count_all / 10000;
  105.     count_all = count_all % 10000;
  106.     *back++   = count_all / 1000;
  107.     count_all = count_all % 1000;
  108.     *back++   = count_all / 100;
  109.     count_all = count_all % 100;
  110.     *back++   = count_all / 10;   //十位
  111.     *back     = count_all % 10;   //個位

  112.     back = back - 6;

  113. //轉到ascii字符
  114.     for ( test = 7; test > 0; test-- )
  115.     {
  116.       *back++ = * back + 0x30;
  117.     }
  118.     back = back - 7; //指針退回
  119. //處理前面的0
  120.     while ( *back == 0x30 )
  121.     {
  122.       *back++ = * back - 0x30;
  123.     }
  124.   }
  125. #endif
復制代碼




所有資料下載:
一種智能頻率計的設計與制作(AVR).rar (132.94 KB, 下載次數: 59)


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

使用道具 舉報

沙發
ID:82939 發表于 2016-10-28 14:45 | 只看該作者
學了一段時間了,正好給自己一個練習的機會
回復

使用道具 舉報

板凳
ID:28656 發表于 2017-2-13 17:13 | 只看該作者
學習學習
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 男女在线网站 | 中文字幕在线不卡播放 | 青青久久av北条麻妃海外网 | 亚洲一区二区久久久 | 成人免费区一区二区三区 | 国产免费拔擦拔擦8x高清 | 欧美久| 精品一区二区视频 | 在线三级电影 | 精品国产视频 | 日韩成人在线视频 | 国产在线精品一区二区 | 精品国产一区二区在线 | 久久久久久久久久久福利观看 | 婷婷一级片 | 日韩欧美精品在线 | 日日躁狠狠躁aaaaxxxx | 亚洲精品一区二区三区丝袜 | a在线观看| 欧美精品在欧美一区二区 | 成人午夜精品 | 91在线视频一区 | 最新日韩在线 | 一区二区三区在线播放视频 | 性一爱一乱一交一视频 | 国产精品久久免费观看 | 狠狠综合网 | 九色www | 日日干日日色 | 精品久久不卡 | 久久久久久久成人 | 欧美成人久久 | 日韩欧美国产精品一区 | 日韩中文电影 | 在线观看av网站永久 | 国产精品黄视频 | 欧美一级片在线看 | 亚洲成人午夜在线 | 九九久久这里只有精品 | 亚洲欧美一区二区三区国产精品 | 亚洲欧美中文日韩在线v日本 |