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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機DAC0832示波器(程序仿真)運放濾波放大

[復制鏈接]
跳轉到指定樓層
樓主
仿真圖:




系統功能設計框圖
該系統采用單片機作為數據處理及控制核心,由單片機完成人機界面、系統控制、信號的采集分析以及信號的處理和變換,采用按鍵輸入,利用虛擬示波器顯示波形的方案。將設計任務分解為按鍵電路、輸出轉換電路等模塊。圖3-1為系統的總體框圖。

圖3-1 總體方框圖

3、系統設計原理圖
4.1 單片機最小系統的設計
AT89C51是片內有ROM/EPROM的單片機,因此,這種芯片構成的最小系統簡單﹑可靠。用AT89C51單片機構成最小應用系統時,只要將單片機接上時鐘電路和復位電路即可,如圖89C51單片機最小系統所示。由于集成度的限制,最小應用系統只能用作一些小型的控制單元。其應用特點:
(1)有可供用戶使用的大量I/O口線。
(2)內部存儲器容量有限。
(3)應用系統開發具有特殊性。
標準的51為8K程序空間,128字節的RAM,32條端口,5個中斷,2個定時/計數器,12個時鐘周期執行一條基本指令,最長的除法為48個周期。
圖4-1 AT89C51單片機最小系統
4.2運算放大器電路
本系統的放大電路如圖4-2所示:
圖4-2運算放大器電路
4.3 波形產生原理及模塊設計
波形產生的原理:
1、內存中首先存儲波形的數字量值數組TABLE;
2、51單片機讀取數組中的值,送入D/A轉換器;
3、D/A轉換器將輸入的數字值轉換成模擬量輸出;
4、D/A輸出的模擬電流量通過運放轉換成電壓量輸出。
由單片機采用編程方法產生四種波形、通過DA轉換模塊DAC0832在進過濾波放大之后輸出。其電路圖4-3如下:
      
      圖4-3波形產生電路

4.4控制系統設計電路圖
圖4-4 系統設計電路圖







4、程序設計流程圖



圖5-1 程序設計流程圖








5、系統仿真
將keil5編譯產生的hex文件加載到仿真軟件的單片機里后,單擊仿真界面左下方的開始按扭,仿真就開始了。具體仿真過程如下:
(1)f=50HZ正弦波的調試結果
圖6-1 正弦波的調試結果
(2)f=50HZ方波的調試結果
圖6-2 方波的調試結果
(3)f=50HZ三角波的調試結果
圖6-3 三角波的調試結果

程序代碼:
  1. #include <reg52.H>
  2. #include<absacc.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define dz XBYTE[0x7fff]//dac0832總線地址

  6. //1602LCD相關
  7. sbit RS = P3^0;   //定義端口
  8. sbit EN = P3^1;
  9. //按鍵定義
  10. sbit key1 = P3^2;
  11. sbit key2 = P3^3;
  12. sbit key3 = P3^4;
  13. sbit key4 = P3^5;
  14. uchar mode = 0;//輸出波形的模式
  15. uchar LCDFlag;//LCD更新顯示標志
  16. uchar LCDbuf[16];//LCD顯示緩存
  17. uchar TIMER_H;//給計數器的值
  18. uchar TIMER_L;
  19. int Fre10X = 200;//當前頻率的10的倍數     此時為20.0hz
  20. uchar CurStal = 1;//步進檔位1=0.1x 10=1x 100=10x
  21. uchar code WaveInfo[3][15] = {"Sine Wave     ",//顯示當前波形類型
  22.                                     "Triangle Wave ",
  23.                                     "Square Wave   "};
  24. uchar i = 0;
  25. //方波
  26. uchar code Squaretab[64] = {0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,
  27. 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  28. 255,255,255,255,255,255,255,255
  29. };
  30. //sin波
  31. uchar code Sinetab[256] = {
  32.                     0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,
  33.                                         0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,
  34.                                         0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,
  35.                                         0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,
  36.                                         0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,
  37.                                         0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,
  38.                                         0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,
  39.                                         0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,
  40.                                         0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,
  41.                                         0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,
  42.                                         0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,
  43.                                         0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,
  44.                                         0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,
  45.                                         0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,
  46.                                         0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,
  47.                                         0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
  48.                                         0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,
  49.                                         0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,
  50.                                         0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,
  51.                                         0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,
  52.                                         0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,
  53.                                         0x76,0x79,0x7c,0x80 };
  54. //三角
  55. uchar code Triangletab[64] = {
  56.   0,  8, 16, 24, 32, 40, 48, 56,
  57. 64, 72, 80, 88, 96,104,112,120,
  58. 128,136,144,152,160,168,176,184,
  59. 192,200,208,216,224,232,240,248,

  60. 248,240,232,224,216,208,200,192,
  61. 184,176,168,160,152,144,136,128,
  62. 120,112,104, 96, 88, 80, 72, 64,
  63. 56, 48, 40, 32, 24, 16, 8, 0};
  64. //鋸齒
  65. uchar code juchi[64] = {
  66. 0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,
  67. 146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255
  68. };        
  69. //uS延時函數
  70. void DelayUs2x(uchar t)
  71. {   
  72.     while(--t);
  73. }
  74. //mS延時函數
  75. void DelayMs(uint t)
  76. {

  77.     while(t--)
  78.     {
  79.         DelayUs2x(245);
  80.         DelayUs2x(245);
  81.     }
  82. }
  83. //              寫入命令函數
  84. void LCD_Write_Com(uchar com)
  85. {  
  86.     RS = 0;  
  87.     EN = 1;
  88.     P1 = com;   //送入數據
  89.     DelayUs2x(200);
  90.     EN = 0;
  91.     DelayUs2x(500);  //延時等待LCD處理數據
  92. }
  93. //              寫入數據函數
  94. void LCD_Write_Data(unsigned char Data)
  95. {
  96.     RS = 1;
  97.     EN = 1;
  98.     P1 = Data;  //送入數據
  99.     DelayUs2x(200);
  100.     EN = 0;   
  101.     DelayUs2x(500);   //延時等待LCD處理數據
  102. }
  103. //                清屏函數
  104. void LCD_Clear(void)
  105. {
  106.     LCD_Write_Com(0x01);
  107.     DelayMs(5);
  108. }
  109. //              寫入字符串函數
  110. void LCD_Write_String(uchar x, uchar y, uchar *s)
  111. {     
  112.     if(y == 0)
  113.     {     
  114.         LCD_Write_Com(0x80 + x);     //表示第一行
  115.     }
  116.     else
  117.          {      
  118.         LCD_Write_Com(0xC0 + x);      //表示第二行
  119.          }        
  120.     while(*s)
  121.          {     
  122.         LCD_Write_Data(*s);     
  123.         s++;     
  124.          }
  125. }
  126. /**************************************************
  127.               初始化函數
  128. ***************************************************/
  129. void LCD_Init(void)
  130. {
  131.     LCD_Write_Com(0x38);    //顯示模式設置
  132.     DelayMs(5);
  133.     LCD_Write_Com(0x38);
  134.     DelayMs(5);
  135.     LCD_Write_Com(0x38);  
  136.     LCD_Write_Com(0x08);    //顯示關閉
  137.     LCD_Write_Com(0x01);    //顯示清屏
  138.     LCD_Write_Com(0x06);    //顯示光標移動設置
  139.     DelayMs(5);
  140.     LCD_Write_Com(0x0C);    //顯示開及光標設置
  141. }
  142. /**************************************************
  143.    在LCD指定位置顯示光標
  144. **************************************************/
  145. void LCD_Cursor_Dis(uchar x, uchar y)
  146. {
  147.     if(y == 0)              //LCD第一行
  148.     {
  149.         LCD_Write_Com(0x80 + x);
  150.     }
  151.     else                  //LCD第二行
  152.     {
  153.         LCD_Write_Com(0xC0 + x);
  154.     }
  155.     LCD_Write_Com(0x0F);  //光標顯示開
  156.     DelayUs2x(4);         //延時越40us
  157. }
  158. /**************************************************
  159.    關閉光標
  160. **************************************************/
  161. void LCD_Close_Cursor()
  162. {
  163.     LCD_Write_Com(0x0C);  //光標顯示關
  164.     DelayUs2x(4);         //延時越40us
  165. }

  166. void keyscanf()         //按鍵掃描
  167. {
  168.     uint temp;
  169.         if(key1 == 0)//模式選擇
  170.         {
  171.                 mode++;
  172.         LCDFlag = 1;
  173.                 if(mode == 4)
  174.                         mode = 0;
  175.                 while(!key1);
  176.         }
  177.         if(key2 == 0)//增加
  178.         {
  179.                 if((Fre10X + CurStal) < 501)
  180.         {
  181.                         Fre10X = Fre10X + CurStal;
  182.             temp = (unsigned long)10000000 / 64 / Fre10X;
  183.             TIMER_H = (65535 - temp) / 256;
  184.             TIMER_L = (65535 - temp) % 256;
  185.         }
  186.         LCDFlag = 1;
  187.                 while(!key2);
  188.         }
  189.         if(key3 == 0)
  190.         {
  191.         if((Fre10X - (int)CurStal) > 1)
  192.         {
  193.                         Fre10X = Fre10X - CurStal;
  194.             temp = (unsigned long)10000000 / 64 / Fre10X;
  195.             TIMER_H = (65535 - temp) / 256;
  196.             TIMER_L = (65535 - temp) % 256;
  197.         }
  198.         LCDFlag = 1;
  199.                 while(!key3);
  200.         }
  201.         if(key4 == 0)
  202.         {
  203.             switch(CurStal)//調整步進檔位
  204.         {
  205.                 case 1:        CurStal = 10;
  206.                                 break;
  207.                 case 10: CurStal = 100;
  208.                                 break;
  209.                         case 100: CurStal = 1;
  210.                                 break;
  211.         }
  212.         LCDFlag = 1;
  213.                 while(!key4);
  214.         }
  215. }

  216. void init_time()
  217. {
  218.         EA = 1; //開中斷
  219.         ET0 = 1;
  220.         TMOD = 0X01; //初始化
  221.         TR0 = 1; //開定時器
  222. }
  223. void time0() interrupt 1 using 2
  224. {
  225.     TH0 = TIMER_H;
  226.     TL0 = TIMER_L;
  227.         switch(mode)
  228.         {
  229.         case 0://正弦顯示
  230.                         dz = Sinetab[i];
  231.                         i = i + 4;
  232.                 break;
  233.         case 1://三角顯示
  234.                         dz = Triangletab[i];
  235.                         i = (i + 1) % 64;
  236.                 break;
  237.         case 2://方波顯示
  238.                         dz = Squaretab[i];
  239.                         i = (i + 1) % 64;
  240.                 break;
  241.                 case 3://鋸齒波顯示
  242.                         dz = juchi[i];
  243.                         i = (i + 1) % 64;
  244.                 break;
  245.         }
  246. }
  247. void main()
  248. {
  249.     uint temp;
  250.     init_time();  //定時器初始化調用
  251.     mode = 1;
  252.     temp = (unsigned long)10000000 / 64 / Fre10X;
  253.     TIMER_H = (65535 - temp) / 256;
  254.     TIMER_L = (65535 - temp) % 256;
  255.     LCD_Init();     //初始化液晶
  256.     LCDFlag = 1;     //將液晶需要刷新標志置1
  257.         while(1)
  258.         {
  259.         keyscanf();  //按鍵一直掃描
  260.         if(LCDFlag)
  261.         {
  262.             LCD_Write_String(0, 0, WaveInfo[mode]);//顯示當期選擇的波形
  263.             LCDbuf[0] = Fre10X / 100 + 0x30;    //顯示當前的頻率
  264.             LCDbuf[1] = Fre10X / 10 % 10 + 0x30;  //
  265.             LCDbuf[2] = '.';                //
  266.             LCDbuf[3] = Fre10X % 10 + 0x30;     //
  267.             LCDbuf[4] = 'H';                //
  268.             LCDbuf[5] = 'z';               //
  269.             LCDbuf[6] = 0;                 //
  270.             LCD_Write_String(0, 1, LCDbuf);//
  271.             switch(CurStal)//顯示當前選擇的步進檔位
  272.             {
  273.                 case 1:  LCD_Write_String(8, 1, "+- 0.1Hz");
  274.                                         break;
  275.                 case 10: LCD_Write_String(8, 1, "+-   1Hz");
  276.                                         break;
  277.                 case 100:LCD_Write_String(8, 1, "+-  10Hz");
  278.                                         break;                    
  279.             }
  280.             LCDFlag = 0;
  281.         }
  282.         }
  283. }
復制代碼
全部資料51hei下載地址:
簡易信號發生器.zip (663.31 KB, 下載次數: 17)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:584814 發表于 2020-12-4 12:17 | 只看該作者
這個不是示波器而是信號發生器,程序在本壇里有疑似抄都不會。
回復

使用道具 舉報

板凳
ID:756378 發表于 2020-12-4 22:04 | 只看該作者
下載卡了一下分沒了 資料下不了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九热九九 | 黑人精品xxx一区一二区 | 91精品国产综合久久婷婷香蕉 | 日韩久草 | 日本精品视频 | 久久久久国产一区二区三区 | 91文字幕巨乱亚洲香蕉 | 三级视频在线观看电影 | 国产精品久久久久久久久久免费 | 国产一级毛片视频 | 国产一区二区久久 | 在线永久看片免费的视频 | 天天摸天天干 | 欧美在线视频一区二区 | 亚洲精品日韩在线 | 成人午夜性成交 | 久久精品一区二区三区四区 | www.免费看片.com| 中文字幕精品一区二区三区在线 | 成人精品一区二区三区中文字幕 | 久久久久国产精品一区二区 | 欧美专区在线 | 99精品电影 | 久久一区二区av | 中文字幕在线第一页 | 色综合久久久 | 亚洲精品久久久久久一区二区 | 成人av免费 | 91一区二区在线观看 | 久久尤物免费一区二区三区 | 在线激情视频 | 一区二区三区四区在线视频 | av中文字幕在线 | 亚洲精品在线视频 | 欧美二区三区 | 一区二区在线看 | 欧美精品一区在线 | 91麻豆精品国产91久久久久久 | 久久国产亚洲 | 国产精品18久久久久久白浆动漫 | 奇米四色影视 |