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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10816|回復: 3
收起左側

51單片機的多波形發生器設計(PCF8591)源程序 正弦波、三角波、鋸齒波、方波、梯形波

  [復制鏈接]
ID:641714 發表于 2019-12-23 15:55 | 顯示全部樓層 |閱讀模式
多波形發生器基本功能:
1、可產生多種波形,如正弦波、三角波、鋸齒波、方波、梯形波等;
2、各種波形可通過按鍵選擇;
3、可調節信號的頻率參數。

1方案論證與對比
1.1     方案1

利用STC89C52RC為硬件核心,STC89C52RC具有8KB ROM存儲空間,512字節數據存儲空間,帶有MCS-51系列單片機完全兼容,STC89C52RC可以通過串口下載。本次實驗設計采用單片機的PCF8591硬件接口實現D/A數模轉換設計。PCF8591時一個單電源低功耗的8位CMOS數據采集器件,具有4路模擬輸入,1路模擬輸出和一個串行I2C總線接口用來與單片機通信,符合電路簡單,方便查找錯誤的設計理念。


2硬件電路設計

仔細分析課題后,并查找了相應資料,所學單片機中有關矩陣按鍵、A/D模數和D/A數模轉換的有關知識,設計出整體硬件原理框圖如圖1所示, 其中晶振通過自身振蕩為單片機系統提供基準時鐘信號,復位電路用于單片機復位,矩陣按鍵控制波形、頻率切換。

      

圖1 整體原理框圖

2.1 最小系統的設計

單片機最小系統的三要素就是電源、晶振和復位電路。

本設計中選用的STC89C52RC需要5V的供電系統,將供電電路接在STC89C52RC的40和20引腳的位置上,40引腳接+5V,即VCC。20引腳接GND,即電源負極。

晶振為單片機系統提供基準時鐘信號。STC89C52RC的18引腳和19引腳接一個11.0592MHz的晶振,外加兩個20pF的電容,電容用于幫助晶振起振,并維持晶振信號的穩定。

單片機復位分為三種情況:上電復位、手動復位和程序自動復位。

上電復位即單片機上電后,單片機進行一個內部的初始化過程,保證單片機每次都從一個固定的相同的狀態開始工作。手動復位即人主動去按下復位按鍵,讓程序重新初始化重新運行。程序自動復位即單片機遇到某些情況自動復位到初始化的狀態。

具體電路設計參見下圖2 :


圖2 單片機最小系統


2.2PCF8591電路設計


圖3 PCF8591電路

其中引腳1、2、3、4是4路模擬輸入,引腳5、6、7是I2C總線的硬件地址,8 腳是數 字地 GND,9 腳和 10 腳是I2C總線的 SDA 和SCL。12腳是時鐘選擇引腳,如果接高電平表 示用外部時鐘輸入,接低電平則用內部時鐘,我們本次設計電路用的是內部時鐘,因此12腳直接接 GND,同時 11腳懸空。13腳是模擬地 AGND。14腳是基準源,15腳是 DAC 的模擬輸出,16腳是供電電源 VCC。

在軟件編程過程中單片機對PCF8591進行初始化,一共發送三個字節即可。第一個字節,和 EEPROM 類似,是器件地址字節,其中7位代表地址,1位代表讀寫方向。地址高4位固定是0b1001,低三位是A2,A1,A0, 這三位我們電路上都接了GND,因此也就是0b000。

圖 4 PCF8591 地址字節
發送到 PCF8591 的第二個字節將被存儲在控制寄存器,用于控制 PCF8591 的功能。
圖 5  PCF8591 控制字節
控制字節的第6位是DA使能位,這一位置1表示DA輸出引腳使能,會產生模擬電壓輸出功能。
2.3矩陣按鍵電路的設計

通過高四位全部輸出低電平,低四位輸出高電平。當接收到的數據,低四位不全為高電平時,說明有按鍵按下,然后通過接收的數據值,判斷是哪一列有按鍵按下,然后再反過來,高四位輸出高電平,低四位輸出低電平,然后根據接收到的高四位的值判斷是那一行有按鍵按下,從而能夠確定是哪一個按鍵按下了。電路如圖6示:



圖6 矩陣鍵盤電路


3系統軟件設計流程圖
3.1主程序工作流程

首先開啟總中斷,讓中斷程序能夠正常運行,配置T0定時1ms,初始化波形和頻率,進入循環不斷掃描按鍵動態在中斷中完成按鍵掃描并消抖,主程序調用按鍵動作函數。當檢測到鍵4按下第一次,顯示三角波;當檢測鍵4按下第二次,顯示鋸齒波;當檢測到鍵4按下第三次,顯示方波;當檢測到鍵4按下第四次,顯示梯形波若無檢測到鍵按下,則輸出默認正弦波;當檢測到按下鍵8,調整波形頻率。主程序流程圖如圖7所示:   


                             圖7 主程序流程圖
3.2中斷子程序設計
3.2.1 T0定時器

中斷子程序中,通過定時器T0執行矩陣按鍵掃描函數檢測是否按下按鍵,定時器中斷流程圖如圖8所示:


                          


圖8 T0中斷子程序流程圖

3.2.2 T1定時器
通過定時器T1執行波形輸出和頻率轉換,改變定時器T1的時鐘周期來改變輸出頻率。定時器中斷流程圖如圖9所示:


圖9 T1中斷子程序流程圖

附錄一:總電路設計圖

單片機源程序如下:
  1. #include <reg52.h>
  2. unsigned char  code SinWave[256] ={           //正弦波
  3. 127 ,        133 ,        139 ,        146 ,        152 ,        158 ,        164 ,        170,
  4. 176,         181 ,        187 ,        192 ,        198 ,        203 ,        208,         212 ,
  5. 217 ,        221 ,        225 ,        229 ,        233,         236,         239,         242 ,        
  6. 244 ,        247 ,        249 ,        250 ,        252 ,        253 ,        253 ,        254 ,

  7. 254 ,        254 ,        253 ,        253,         252 ,        250 ,        249 ,        247 ,
  8. 244,         242 ,        239,         236 ,        233 ,        229 ,        225 ,        221 ,
  9. 217 ,        212 ,        208 ,        203 ,        198 ,        192 ,        187 ,        181 ,
  10. 176 ,        170 ,        164 ,        158 ,        152 ,        146 ,        139 ,        133 ,
  11.         
  12. 127 ,        121 ,        115 ,        108 ,        102 ,        96         ,   90          ,  84         ,
  13. 78         ,        73         ,        67         ,        62         ,        56        ,         51         ,        46         ,        42        ,
  14. 37         ,        33,                 29         ,        25        ,         21        ,         18         ,        15         ,        12         ,        
  15. 10         ,        7 ,                5         ,        4         ,        2         ,        1         ,        1         ,        0          ,

  16. 0         ,        0 ,                1         ,        1         ,        2         ,        4         ,        5         ,        7          ,
  17. 10         ,        12 ,        15         ,        18         ,        21         ,        25         ,        29         ,        33  ,
  18. 37         ,        42 ,        46         ,        51         ,        56         ,        62         ,        67         ,        73         ,
  19. 78         ,        84         ,        90         ,        96         ,        102 ,        108 ,        115 ,        121         ,

  20. } ;
  21. unsigned char code SawWave[256] = {        //鋸齒波
  22. 0,        2,        4,        6,        8,        10,        12,        14,
  23. 16,        18,        20,        22,        24,        26,        28,        30,        
  24. 32,        34,        36,        38,        40,        42,        44,        46,        
  25. 48,        50,        52,        54,        56,        58,        60,        62,
  26.         
  27. 64,        66,        68,        70,        72,        74,        76,        78,        
  28. 80,        82,        84,        86,        88,        90,        92,        94,        
  29. 96,        98,        100,102,104,106,108,110,        
  30. 112,114,116,118,120,122,124,126,        

  31. 128        ,130,132,134,136,138,140,142,        
  32. 144        ,146,148,150,152,154,156,158,        
  33. 160        ,162,164,166,168,170,172,174,        
  34. 176        ,178,180,182,184,186,188,190,        

  35. 192,194        ,196,198,200,202,204,206,        
  36. 208,210        ,212,214,216,218,220,222,        
  37. 224,226        ,228,230,232,234,236,238,        
  38. 240,242        ,244,246,248,250,252,254,        
  39. };
  40. unsigned char code TriWave[256]= {         //三角波
  41. 0 ,    4    , 8,    12  ,  16   , 20  ,  24  ,  28 ,  
  42. 32 ,   36   , 40,    44 ,   48  ,  52 ,   56  ,  60        ,
  43. 64  ,  68   , 72 ,   76  ,  80   , 84  ,  88  ,  92  ,  
  44. 96   ,100  , 104 ,  108  , 112  , 116  , 120  , 124         ,
  45. 128  ,132  , 136,   140  , 144  , 148 ,  152  , 156 ,  
  46. 160  , 164  , 168,   172 ,  176 ,  180,   184 ,  188 ,
  47. 192  , 196 ,  200,   204,   208 ,  212 ,  216 ,  220 ,  
  48. 224  , 228 ,  232,   236 ,  240  , 244 ,  248 ,  252  ,
  49. 255  , 251 ,  247 ,  243,   239  , 235 ,  231 ,  227  ,
  50. 223  , 219 ,  215,   211 ,  207  , 203 ,  199 ,  195 ,
  51. 191  , 187 ,  183,   179,   175  , 171 ,  167 ,  163 ,
  52. 159  , 155 ,  151,   147,   143  , 139 ,  135  , 131  ,
  53. 127  , 123 ,  119,   115,   111  ,107  , 103  ,  99   ,
  54. 95   , 91  ,  87 ,   83 ,   79   , 75 ,   71  ,  67           ,
  55. 63   , 59 ,   55 ,   51 ,   47   ,43   , 39   , 35    ,
  56. 31   , 27,    23 ,   19 ,   15   , 11 ,    7   ,  3          ,
  57. };
  58. unsigned char code SquWave[256] = {        //方波
  59. 255,255,255,255,255,255,255,255,
  60. 255,255,255,255,255,255,255,255,
  61. 255,255,255,255,255,255,255,255,
  62. 255,255,255,255,255,255,255,255,

  63. 255,255,255,255,255,255,255,255,
  64. 255,255,255,255,255,255,255,255,
  65. 255,255,255,255,255,255,255,255,
  66. 255,255,255,255,255,255,255,255,
  67. };
  68. unsigned char code TraWave[256] = {//梯形波
  69. 0    , 6   ,  12 ,   18 ,   24 ,   30 ,   36  ,  42  ,  
  70. 48  ,  54   , 60 ,   66 ,   72 ,   78  ,  84  ,  90         ,
  71. 96  ,  102  , 108,   114 ,  120,   126 ,  132 ,  138 ,  
  72. 144 ,  150 ,  156,   162 ,  168 ,  174 ,  180 ,  186 ,
  73. 192 ,  198  , 204 ,  210  , 216 ,  222 ,  228 ,  234 ,  
  74. 240 ,  246 ,  252 ,  255,   255,   255,   255,   255,
  75. 255,   255,   255,   255,   255,   255,          255,   255,   
  76. 255,   255,   255,   255,   255,   255,   255,   255,
  77. 255,   255,   255,   255,   255,   255  , 249  , 243 ,  
  78. 237 ,  231  , 225  , 219  , 213,   207 ,  201  , 195  ,
  79. 189 ,  183  , 177 ,  171  , 165        ,  159  , 153  , 147 ,  
  80. 141,   135  , 129 ,  123 ,  117  , 111 ,  105  , 99 ,  
  81. 93 ,   87   , 81 ,   75  ,  69        ,  63  ,  57   , 51 ,   
  82. 45 ,   39    ,33   , 27 ,   21,    15  ,  9    , 3 ,
  83. };
  84. unsigned char code *pWave;  //波表指針
  85. unsigned char T0RH = 0;  //T0重載值的高字節
  86. unsigned char T0RL = 0;  //T0重載值的低字節
  87. unsigned char T1RH = 1;  //T1重載值的高字節
  88. unsigned char T1RL = 1;  //T1重載值的低字節
  89. unsigned char t;//函數周期
  90. unsigned char f;//頻率

  91. void ConfigTimer0(unsigned int ms);
  92. void SetWaveFreq(unsigned char freq);
  93. extern void KeyScan();
  94. extern void KeyDriver();
  95. extern void I2CStart();
  96. extern void I2CStop();
  97. extern bit I2CWrite(unsigned char dat);

  98. void main()
  99. {   
  100.     EA = 1;             //開總中斷
  101.     ConfigTimer0(100);  //配置T0定時1ms
  102.     pWave = SinWave;  //默認正弦波
  103.     SetWaveFreq(5);  //默認頻率100Hz
  104.         f = 128;
  105.    
  106.     while (1)
  107.     {
  108.                KeyDriver();  //調用按鍵驅動
  109.     }
  110. }

  111. /*改變波形*/
  112. void KeyAction(unsigned char keycode)
  113. {        
  114.         static unsigned char i = 0;

  115.         if(keycode == 0x26)
  116.         {
  117.                 if(i==0)
  118.                 {
  119.                         i = 1;
  120.                         pWave = TriWave;
  121.                 }
  122.                 else if(i==1)
  123.                 {
  124.                         i = 2;
  125.                         pWave = SawWave;
  126.                 }
  127.                 else if(i==2)
  128.                 {
  129.                         i = 3;
  130.                         pWave = SquWave;
  131.                 }
  132.                 else if(i==3)
  133.                 {
  134.                         i = 4;
  135.                         pWave = TraWave;
  136.                 }
  137.                 else
  138.                 {
  139.                         i = 0;
  140.                         pWave = SinWave;
  141.                 }
  142.         }
  143. }
  144. /*改變頻率*/
  145. void KeyAction_f(unsigned char keycode)
  146. {
  147.         static unsigned char i = 0;

  148.         if(keycode == 0x25)
  149.         {
  150.                 if(i==0)
  151.                 {
  152.                         i = 1;
  153.                         f = 128;
  154.                 }
  155.                 else
  156.                 {
  157.                         i = 0;
  158.                         f = 64;
  159.                 }
  160.         }        
  161. }

  162. /* 設置DAC輸出值,val-設定值 */
  163. void SetDACOut(unsigned char val)
  164. {
  165.     I2CStart();
  166.     if (!I2CWrite(0x48<<1)) //尋址PCF8591,如未應答,則停止操作并返回
  167.     {
  168.         I2CStop();
  169.         return;
  170.     }
  171.     I2CWrite(0x40);         //寫入控制字節
  172.     I2CWrite(val);          //寫入DA值  
  173.     I2CStop();
  174. }

  175. /*改變頻率*/
  176. void SetWaveFreq(unsigned char freq)
  177. {
  178.         unsigned long tmp;

  179.         tmp = (11059200/12)/(freq * 128);
  180.         tmp = 65536 - tmp;
  181.         tmp = tmp + 33;
  182.         T1RH = (unsigned char)(tmp >> 8);
  183.         T1RL = (unsigned char)tmp;
  184.         TMOD &= 0x0F;
  185.         TMOD |= 0X10;
  186.         TH1 = T1RH;
  187.         TL1 = T1RL;
  188.         ET1 = 1;
  189.         PT1 = 1;
  190.         TR1 = 1;
  191. }
  192. /* 配置并啟動T0,ms-T0定時時間 */
  193. void ConfigTimer0(unsigned int ms)
  194. {
  195.     unsigned long tmp;  //臨時變量
  196.    
  197.     tmp = 11059200 / 12;       //定時器計數頻率
  198.     tmp = (tmp * ms) / 1000;  //計算所需的計數值
  199.     tmp = 65536 - tmp;         //計算定時器重載值
  200.     tmp = tmp + 28;            //補償中斷響應延時造成的誤差
  201.     T0RH = (unsigned char)(tmp>>8);  //定時器重載值拆分為高低字節
  202.     T0RL = (unsigned char)tmp;
  203.     TMOD &= 0xF0;   //清零T0的控制位
  204.     TMOD |= 0x01;   //配置T0為模式1
  205.     TH0 = T0RH;     //加載T0重載值
  206.     TL0 = T0RL;
  207.     ET0 = 1;        //使能T0中斷
  208.     TR0 = 1;        //啟動T0
  209. }
  210. /* T0中斷服務函數,執行按鍵掃描 */
  211. void InterruptTimer0() interrupt 1
  212. {
  213.     TH0 = T0RH;  //重新加載重載值
  214.     TL0 = T0RL;
  215.     KeyScan();   //按鍵掃描        
  216.         
  217. }
  218. /* T1中斷服務函數,執行波形輸出 */
  219. void InterruptTimer1() interrupt 3
  220. {
  221.     static unsigned char i = 0;
  222.    
  223.     TH1 = T1RH;  //重新加載重載值
  224.     TL1 = T1RL;
  225.     //循環輸出波表中的數據
  226.     SetDACOut(pWave[i]);

  227.         if(f == 128)
  228.         {
  229.             i++;
  230.             if (i >= 128)
  231.             {
  232.                 i = 0;
  233.             }
  234.         }

  235.         if(f == 64)
  236.         {
  237.             i = i+2;
  238.             if (i >= 128)
  239.             {
  240.                 i = 0;
  241.             }
  242.         }
  243. }
復制代碼

正弦波

正弦波

三角波

三角波

鋸齒波

鋸齒波

方波

方波

梯形波

梯形波
51hei.png

波形發生器.rar

1.24 MB, 下載次數: 246, 下載積分: 黑幣 -5

評分

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

查看全部評分

回復

使用道具 舉報

ID:604918 發表于 2022-4-28 15:05 | 顯示全部樓層
這是用啥仿真的
回復

使用道具 舉報

ID:903830 發表于 2022-11-14 16:45 | 顯示全部樓層
請問如何實現峰峰值0-3V的鋸齒波
回復

使用道具 舉報

ID:433219 發表于 2022-11-15 10:38 | 顯示全部樓層
PCF8591   這死貴的價格,還不如用stc去做。大不了2片
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产美女一区 | 日韩精品在线播放 | 国产伦精品一区二区三区照片91 | 蜜月aⅴ国产精品 | 超碰在线免费 | 亚洲精品字幕 | 欧美一级全黄 | 国产丝袜一区二区三区免费视频 | 久久免费精品视频 | 久久综合久久久 | 91精品成人久久 | 久久国产视频播放 | 新超碰97 | 欧美精品综合在线 | 伊人久久综合 | 国产成人免费视频网站视频社区 | 国产精品亚洲精品 | 亚洲欧洲日本国产 | 成人黄色三级毛片 | 成年人在线视频 | 欧美男人亚洲天堂 | 日本一区二区三区视频在线 | 亚洲欧美日韩高清 | 欧美日韩一区二区在线观看 | 午夜理伦三级理论三级在线观看 | 精品毛片在线观看 | 日本三级做a全过程在线观看 | 成人激情视频在线 | 伊人久久在线 | 亚洲成人av在线播放 | 亚洲欧美日韩系列 | 国产999精品久久久久久绿帽 | 国产主播第一页 | 日韩精品视频在线播放 | 国产一区二区三区四区在线观看 | 欧美一区二区三区在线播放 | 一区二区精品视频 | 我想看一级黄色毛片 | www.国产精品 | www.国产精品 | 亚洲精品免费看 |