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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

模數(shù)電函數(shù)發(fā)生器+單片機測量Proteus仿真設(shè)計全套資料

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:209172 發(fā)表于 2017-6-17 18:25 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
給大家分享一個由模擬電子和數(shù)字電子技術(shù)組成的函數(shù)發(fā)生器proteus仿真,還帶單片機測量電路和源程序。適合電氣課程設(shè)計,有論文、proteus仿真、LED顯示波形頻率.

電路能輸出正弦波、方波和三角波等三種波形,并可由單片機來測試準確性.

模數(shù)電函數(shù)發(fā)生器仿真原理圖如下(proteus工程文件可到本帖附件中下載):


單片機測量電路仿真原理圖:


包含c語言和匯編語言的單片機測量波形的程序源碼:


課設(shè)論文 仿真等都有 資料很全:


單片機源程序如下:
  1. #include <AT89x52.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <intrins.h>
  5. float f;                                                            //頻率
  6. float p;                                                            //周期
  7. float sj;                                                            //閘門時間
  8. char idata buff[20];                                 
  9. char flag=0;                                                    //頻率\周期選擇標(biāo)志位
  10. char xs=0;                                                                //設(shè)置閘門時間結(jié)束后是否顯示結(jié)果的標(biāo)志位
  11. unsigned char m=0,n=0,yichu=0,fenpin;   //m定時中斷次數(shù) n計數(shù)中斷次數(shù) yichu判斷是定時器還是計數(shù)器溢出

  12. #define Key_Set P1
  13. #define K1 0xbf
  14. #define K2 0x7f
  15. #define NO_Set 0xff
  16. #define Freq 0
  17. #define Peri 1

  18. sbit B153=P2^4;
  19. sbit A153=P2^3;
  20. sbit P17=P1^7;
  21. sbit P16=P1^6;
  22. sbit P35=P3^5;
  23. sbit Set=P3^2;



  24. unsigned char LCD_Wait(void);
  25. void LCD_Write(bit style, unsigned char input);
  26. void LCD_SetDisplay(unsigned char DisplayMode);
  27. void LCD_SetInput(unsigned char InputMode);
  28. void LCD_Initial();
  29. void GotoXY(unsigned char x, unsigned char y);
  30. void Print(unsigned char *str);

  31. void C52_Initial();
  32. void Delay(unsigned int t);
  33. void display(float f);
  34. void cepin();
  35. void panduan();
  36. void timedisplay(float sj);
  37. void Time_Set1();
  38. void Time_Set2();
  39. void t0();
  40. void t1();
  41. /***************************************************************************
  42. *                                                                          *
  43. *   模塊名稱:     LCD1602顯示程序                                         *
  44. *                                                                          *
  45. *   Author:        SSP                                                     *
  46. *   Created:       2015/12/15                                              *
  47. ***************************************************************************/


  48. /***********************Port Definitions***********************************/
  49. sbit LcdRs= P2^0;
  50. sbit LcdRw= P2^1;
  51. sbit LcdEn= P2^2;
  52. sfr  DBPort= 0x80;                //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數(shù)據(jù)端口

  53. /************************內(nèi)部等待函數(shù)***************************************/
  54. unsigned char LCD_Wait(void)
  55. {
  56.         LcdRs=0;                 //寄存器選擇輸入端         1:數(shù)據(jù) 0:指令
  57.         LcdRw=1;        _nop_(); //RW:為0:寫狀態(tài);為1:讀狀態(tài);
  58.         LcdEn=1;        _nop_();        //使能輸入端,讀狀態(tài),高電平有效;寫狀態(tài),下降沿有效
  59.         LcdEn=0;
  60.         return DBPort;               
  61. }
  62. /***********************向LCD寫入命令或數(shù)據(jù)*********************************/
  63. #define LCD_COMMAND 0      // Command
  64. #define LCD_DATA 1      // Data
  65. #define LCD_CLEAR_SCREEN        0x01      // 清屏
  66. #define LCD_HOMING                  0x02      // 光標(biāo)返回原點
  67. void LCD_Write(bit style, unsigned char input)
  68. {
  69.         LcdEn=0;
  70.         LcdRs=style;
  71.         LcdRw=0;                _nop_();
  72.         DBPort=input;        _nop_();//注意順序
  73.         LcdEn=1;                _nop_();//注意順序
  74.         LcdEn=0;                _nop_();
  75.         LCD_Wait();        
  76. }
  77. /********************設(shè)置顯示模式****************************************/
  78. #define LCD_SHOW                        0x04    //顯示開
  79. #define LCD_HIDE                        0x00    //顯示關(guān)         

  80. #define LCD_CURSOR                        0x02         //顯示光標(biāo)
  81. #define LCD_NO_CURSOR                0x00    //無光標(biāo)                     

  82. #define LCD_FLASH                        0x01    //光標(biāo)閃動
  83. #define LCD_NO_FLASH                0x00    //光標(biāo)不閃動

  84. void LCD_SetDisplay(unsigned char DisplayMode)
  85. {
  86.         LCD_Write(LCD_COMMAND, 0x08|DisplayMode);        
  87. }
  88. /*********************設(shè)置輸入模式***************************************/
  89. #define LCD_AC_UP 0x02
  90. #define LCD_AC_DOWN        0x00      // default

  91. #define LCD_MOVE 0x01         // 畫面可平移
  92. #define LCD_NO_MOVE        0x00      //default

  93. void LCD_SetInput(unsigned char InputMode)
  94. {
  95.         LCD_Write(LCD_COMMAND, 0x04|InputMode);
  96. }
  97. /******************初始化LCD******************************************/
  98. void LCD_Initial()
  99. {
  100.         LcdEn=0;
  101.         LCD_Write(LCD_COMMAND,0x38);               //8位數(shù)據(jù)端口,2行顯示,5*7點陣
  102.         LCD_Write(LCD_COMMAND,0x38);
  103.         LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //開啟顯示, 無光標(biāo)
  104.         LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  105.         LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC遞增, 畫面不動
  106. }

  107. /************************************************************************/
  108. void GotoXY(unsigned char x, unsigned char y)
  109. {
  110. if(y==0)
  111.         LCD_Write(LCD_COMMAND,0x80|x);
  112. if(y==1)
  113.         LCD_Write(LCD_COMMAND,0x80|(x-0x40));
  114. }
  115. void Print(unsigned char *str)
  116. {
  117.         while(*str!='\0')
  118.         {
  119.                 LCD_Write(LCD_DATA,*str);
  120.                 str++;
  121.         }
  122. }
  123. /**************************************************************************/                 


  124. /***************************************************************************
  125. *                                                                          *
  126. *    模塊名稱:     頻率測量程序                                           *
  127. *    主要技術(shù)指標(biāo): 測量范圍:0.1Hz~4MHz,閘門時間:0.05s~10s可調(diào)。      *
  128. *    Author:        SSP                                          *
  129. *    Created:       2015/12/15                                             *
  130. ***************************************************************************/


  131. /***************************89c52初始化************************************/
  132. void C52_Initial()
  133. {
  134.          sj=1000000.00;
  135.          Key_Set=0xff;
  136.          TMOD=0x51;                                 // 01010001  T1為計數(shù)器,T0為定時器
  137.          EA=1;
  138.          ET0=1;
  139.          ET1=1;
  140.          EX0=1;                                                           
  141.          PX0=1;                                            //外部中斷0設(shè)置為高優(yōu)先級
  142.          IT0=0;                                                        //電平觸發(fā)方式
  143. }

  144. /**************************ms延時子程序*******************************************/
  145. void Delay(unsigned int t)      //t隨著數(shù)值越大,誤差趨于平衡.
  146. {
  147.    unsigned char i;
  148.      while(t--)
  149.        {
  150.          for(i=0;i<123;i++){;}
  151.        }
  152. }
  153. /*************************計數(shù)中斷************************************************/
  154. void t1(void) interrupt 3                 //計數(shù)器1溢出,yichu=1
  155. {n++;
  156. yichu=1;
  157. TH1=0;
  158. TL1=0;
  159. }
  160. /*************************定時中斷************************************************/
  161. void t0(void) interrupt 1            
  162. {   
  163.     m++;
  164.         yichu=2;                                            //定時器0溢出,yichu=2
  165.         TH0=0x3c;                       //定時50ms
  166.         TL0=0xb0;
  167. }
  168. /*************************頻率顯示************************************************/
  169. void Fdisplay(float f)
  170. {        
  171.     if(f>999400.00)
  172.        {
  173.         if(f<4000400.00)
  174.                 {sprintf(buff," Freq:%2.4fmHz ",(f/1000000.00));}

  175.             }
  176.          else
  177.              {
  178.             if(f>1040.00)
  179.                     {sprintf(buff," Freq:%4.2fkHz ",(f/1000.00));}
  180.             else
  181.                    {
  182.                     if(f>0.06)
  183.                             {sprintf(buff," Freq:%3.2fHz    ",f);}

  184.                         }
  185.                            
  186.              }
  187.     GotoXY(0,1);
  188.     Print(buff);
  189. }
  190. /*************************周期顯示************************************************/
  191. void Pdisplay(float p)
  192. {   
  193.     if(p>999400.00)
  194.        {
  195.         if(p<10004000.00)
  196.                 {sprintf(buff," Cycle:%2.4fs  ",(p/1000000.00));}
  197.             else
  198.                 {sprintf(buff,"error(Time or F)",p);}
  199.             }
  200.          else
  201.                   {
  202.              if(p>9950.00)
  203.                     {sprintf(buff," Cycle:%4.2fms ",(p/1000.00));}
  204.                   else
  205.                     {
  206.                         if(p>0.248)
  207.                             {sprintf(buff," Cycle:%3.3fus ",p);}
  208.                         else
  209.                         {sprintf(buff,"error(Time or F)",p);}
  210.                         }        
  211.         }

  212.     GotoXY(0,1);
  213.     Print(buff);
  214. }

  215. /*************************測試頻率*************************************************/
  216. void cepin()
  217. {
  218.         unsigned char a;
  219.         unsigned long js;
  220.         m=0;
  221.         n=0;
  222.         TMOD=0x51;
  223.         TH0=0x3c;         //定時50ms
  224.         TL0=0xb0;
  225.         TH1=0;
  226.         TL1=0;
  227.         a=sj/50000.00;
  228.         TCON=0x50;        //啟動定時器和計數(shù)器
  229.         while(m!=a);
  230.         TCON=0;        
  231.         js=TH1*256+n*65536+TL1;
  232.         f=(js/(sj/1000000.00))*fenpin;
  233.         p=sj/(js*fenpin);
  234.         if(xs==0)         //設(shè)置結(jié)束后第一次不顯示結(jié)果
  235.         {
  236.         if(flag==Freq) Fdisplay(f);
  237.         else Pdisplay(p);
  238.         }
  239. }        

  240. /************************判斷頻率**************************************************/
  241. void panduan()
  242. {
  243.         xs=0;           //設(shè)置結(jié)束后第二次循環(huán)顯示結(jié)果
  244.         B153=1;         //選擇16分頻
  245.         A153=0;
  246.         yichu=0;
  247.         TMOD=0x51;           
  248.         TH0=0xff;                          //定時器0     200us
  249.         TL0=0x38;
  250.         TH1=0xff;                          //計數(shù)器1      100脈沖
  251.         TL1=0x9c;
  252.         TR0=1;                   //啟動定時器0和計數(shù)器1
  253.         TR1=1;
  254.         while(yichu==0);         //如果沒有溢出一直循環(huán)
  255.         TR0=0;                   //已經(jīng)溢出關(guān)閉定時器0和計數(shù)器1
  256.         TR1=0;                                    
  257.         if(yichu==1)                 //計數(shù)器先溢出:在200ms內(nèi)測得的脈沖過多,說明頻率較高(f>500khz)
  258.                 {fenpin=16;      //轉(zhuǎn)為測16分頻后的頻率       16
  259.                       cepin();}
  260.         else                                  //定時器先溢出:100個脈沖的時間比較短,即頻率較低,可以減少分頻數(shù)
  261.             {
  262.             yichu=0;
  263.                 B153=0;
  264.                 A153=1;
  265.                 TH0=0xfc;                  //定時器0       1ms
  266.                 TL0=0x18;
  267.                 TH1=0xff;                  //計數(shù)器1        100個脈沖
  268.                 TL1=0x9c;
  269.                 TR0=1;                //啟動定時器0和計數(shù)器1
  270.             TR1=1;
  271.                 while(yichu==0);      //如果沒溢出一直循環(huán)
  272.                 TR0=0;                //已經(jīng)溢出關(guān)閉定時器0和計數(shù)器1
  273.             TR1=0;
  274.                 if(yichu==1)          //計數(shù)器先溢出:在1ms內(nèi)測得的脈沖過多,說明頻率較高(1khz<f<500khz)
  275.                         {fenpin=4;        //轉(zhuǎn)為測4分頻后的頻率       4
  276.                          cepin();}
  277.                 else                          //定時器先溢出:100個脈沖的時間比較短,即頻率較低
  278.                     { fenpin=1;
  279.                   B153=0;
  280.                           A153=0;
  281.                       cepin();}      
  282.             }
  283. }
  284. /*************************顯示閘門時間************************************************/   
  285. void timedisplay(float GTime)
  286. {
  287.         sprintf(buff,"GTime=%7.0fus  ",GTime);
  288.         GotoXY(0,1);
  289.         Print(buff);
  290.         Delay(50);
  291. }

  292. /***************************減按鍵***********************************************/
  293. void Time_Set2()
  294. {
  295. Delay(1000);
  296. if(P17==1)
  297.      { sj=sj-50000.00;
  298.        if(sj>50000.00) timedisplay(sj);
  299.            else
  300.                {sj=50000.00;
  301.                 timedisplay(sj); }
  302.          }
  303. else
  304. {while(P17==0)
  305.      { Delay(500);
  306.            sj=sj-500000.00;
  307.            if(sj>50000.00) timedisplay(sj);
  308.            else
  309.                {sj=50000.00;
  310.                 timedisplay(sj); }
  311.          }
  312. }   
  313. }

  314. /***************************加按鍵***********************************************/      
  315. void Time_Set1()
  316. {
  317. Delay(1000);
  318. if(P16==1)
  319.      {
  320.           sj=sj+50000.00;
  321.           if(sj<10000000.00) timedisplay(sj);
  322.           else
  323.                {sj=10000000.00;
  324.                 timedisplay(sj);}
  325.          }
  326. else
  327. {while(P16==0)
  328.      { Delay(500);
  329.            sj=sj+500000.00;
  330.            if(sj<10000000.00) timedisplay(sj);
  331.            else
  332.                {sj=10000000.00;
  333.                 timedisplay(sj);}             //按住1s快加0.5s
  334.          }
  335. }   
  336. }
  337. /***************************閘門時間設(shè)置*******************************************/
  338. void Time_Set()        interrupt 0
  339. {
  340. EA=0;                                    //防止無限中斷
  341. Delay(100);
  342. if(Set==0)                                                        
  343.   {
  344.    Delay(1000);                                             //判斷處于哪種設(shè)置狀態(tài)
  345.    if(Set==1)
  346.          {
  347.           GotoXY(0,1);
  348.           Print(" Press Button...");
  349.       GotoXY(0,0);
  350.       Print("   T Settings   ");
  351.       while(Set==1)
  352.          {
  353.           switch(Key_Set)
  354.             {
  355.                    case  K1: Time_Set1();break;
  356.                  case  K2: Time_Set2();break;
  357.                  default: break;
  358.                  }
  359.          }
  360.           }
  361.     else                                                               //選擇測試頻率或周期
  362. ……………………

  363. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
模數(shù)電函數(shù)發(fā)生器.zip (1.77 MB, 下載次數(shù): 192)


評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:219321 發(fā)表于 2017-7-15 11:53 | 只看該作者
謝謝,但是你知道怎么樣控制波形振幅·嗎
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 伊人最新网址 | www免费视频| 一区二区日韩 | 色婷婷综合网 | 久久久久综合 | 高清亚洲 | 91免费版在线观看 | 日韩在线视频播放 | 亚洲综合无码一区二区 | 亚洲一区中文 | 欧美一区二区三区在线 | 色婷婷综合久久久中字幕精品久久 | 欧美激情欧美激情在线五月 | 中文字幕亚洲在线 | 久久久成人免费一区二区 | 色婷婷亚洲一区二区三区 | 日韩黄a | 久久成人免费 | 亚洲 自拍 另类 欧美 丝袜 | 羞羞视频网站免费观看 | 欧美综合视频在线 | 国产亚洲精品精品国产亚洲综合 | 成年男女免费视频网站 | 国产精品美女久久久久久不卡 | 国产高清一区二区三区 | 在线亚洲精品 | 91视频大全 | 亚洲小视频在线观看 | 国产免费色 | 在线免费观看成年人视频 | 一级毛片网| 精品国产乱码久久久久久牛牛 | 国产精品亚洲综合 | 中文字幕亚洲欧美日韩在线不卡 | 91久久精品一区二区二区 | 乳色吐息在线观看 | 伊人激情综合网 | 二区视频| 国产成人久久精品一区二区三区 | 中文字幕免费观看 | 成人网在线观看 |