找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

51單片機(jī)DAC0832波形發(fā)生器仿真加程序源碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
初學(xué)單片機(jī),.附件是對(duì)程序的分析和proteus仿真,適合初學(xué)搭建電路,按鍵1,2程序功能有問題,不知道那步的邏輯出現(xiàn)了問題,沒有實(shí)現(xiàn)頻率微調(diào)的功能.

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


Proteus仿真中ANOLOGUE示波器使用簡(jiǎn)述:

第一次運(yùn)行示波器會(huì)自動(dòng)打開,在關(guān)閉示波器也就是叉了之后,再次運(yùn)行不會(huì)自動(dòng)打開,需右擊示波器選擇最下面英文選項(xiàng).

連接四個(gè)掃描口中的一個(gè),對(duì)應(yīng)有四個(gè)channal,旋鈕調(diào)節(jié)掃描電壓值以改變格子代表單位,,指向?yàn)橐桓袼淼碾妷褐?例如指向2mv,則上下一格代表2mv.滾輪移動(dòng)上下坐標(biāo),可調(diào)節(jié)使其對(duì)其某根線便于測(cè)量.

Horizontal旋鈕橫向掃描周期調(diào)節(jié),可用于調(diào)節(jié)周期波形寬度,橫向滾輪調(diào)節(jié)水平坐標(biāo).小旋扭都為微調(diào).




Proteus仿真

原件:res電阻

  89c51

  DAC0832

  LM358N

  BUTTON

                              GENELECT10U16V



主函數(shù):

void main()

{

              m=65536-(150000/pinlv);           //

              a=m/256;

              b=m%256;

              initclock();

              while(1)

              {

                            if(h==0)

                            {

                                          keyscan();

                            }




              switch(boxing)

                            {

                                          case 0 : P1=sin; break;

                                          case 1 : P1=juxing; break;

                                          case 2 : P1=sanjiao; break;

                                          case 3 : P1=juchi; break;

                            }

              }

}


主函數(shù):

首先給m,a,b賦初值,調(diào)用initclock(),initclock

void initclock()

{

              TMOD=0x01;

              TH0=a ;

              TL0=b ;

              EA=1;

              ET0=1;

              TR0=1;

}


定時(shí)器方式寄存器TMOD:

TMOD用于寫入方式控制字,,以選擇定時(shí)/計(jì)數(shù)器的工作狀態(tài)及控制方式;共八位,高四位與低四位相同,分別是GATE   C/T   M1   M0,高四位控制T1,低四位控制T0.

M1M0用于指定工作方式,通過00 01 10 11的組合,可使定時(shí)/計(jì)數(shù)器分別對(duì)應(yīng)工作在0 1 2 3方式

C/T:選擇定時(shí)/計(jì)數(shù).C,T分別表示計(jì)數(shù)器和定時(shí)器.當(dāng)C/T=1時(shí),選擇計(jì)數(shù)狀態(tài),當(dāng)C/T=0時(shí)選擇定時(shí)狀態(tài)

TH0=  TL0=  計(jì)數(shù)器0的高八位和第八位,組合以放更大的數(shù)字,加一計(jì)數(shù)直至計(jì)數(shù)器滿溢出,這時(shí)打開EA(EA=1)開啟中斷總開關(guān),打開ET0開啟計(jì)數(shù)器一中斷開關(guān),TR0=1,開啟定時(shí)器0開關(guān)


實(shí)參賦給Initclock()TH0,TL0,a=m/256;b=m%256;賦初值的意義是使計(jì)數(shù)器提前溢出從而啟動(dòng)中斷

void T0_time()interrupt 1

{

              TH0= a ;

              TL0= b ;

              u++;

              if(u>=64)

                            u=0;

}

之后執(zhí)行循環(huán)

while(1)

              {              

              keyscan();


              switch(boxing)

                            {

                                          case 0 : P1=sin; break;

                                          case 1 : P1=juxing; break;

                                          case 2 : P1=sanjiao; break;

                                          case 3 : P1=juchi; break;

                            }

              }

}

循環(huán)體首先調(diào)用函數(shù)按鍵檢測(cè)函數(shù)keyscan()

void keyscan()

{

              if(s1==0)

              {

                            EA=0;

                            delay(2);

                            if(s1==0)

                            {

                                          while(!s1);

                                          pinlv+=bujin;

                                          if(pinlv>1000)

                                          {

                                                        pinlv=100;

                                          }

                                          m=65536-(150000 / pinlv);

                                          a=m / 256;

                                          b=m % 256;

                                          EA=1;

                            }

              }

              if(s2==0)

              {

                                          delay(5);

                                          if(s2==0)

                                          {

                                                        EA=0;

                                                        while(!s2);

                                                        pinlv-=bujin;

                                                        if(pinlv<100)

                                                        {

                                                                      pinlv=1000;

                                                        }

                                                        m=65536-(150000/pinlv);

                                                        a=m/256;

                                                        b=m%256;

                                                        EA=1;

                                          }

              }

              if(s3==0)

              {

                            delay(5);

                            if(s3==0)

                            {

                                          EA=0;

                                          while(!s3);

                                          boxing++;

                                          if(boxing>=4)

                                          {

                                                        boxing=0;

                                          }


                                          EA=1;

                            }

              }

}

S3是波形變換按鍵,首先關(guān)閉總中斷執(zhí)行下方語句,按鈕按下判斷,當(dāng)

S3=0即按鈕按下,while(!s3);  語句代表按鍵按下時(shí),進(jìn)行死循環(huán)不執(zhí)行下方語句,松開按鍵后boxing++是波形變換關(guān)鍵,通過變boxing的值,賦給switch()語句選擇波形

              switch(boxing)

                            {

                                          case 0 : P1=sin; break;

                                          case 1 : P1=juxing; break;

                                          case 2 : P1=sanjiao; break;

                                          case 3 : P1=juchi; break;

                            }

Sin[] juxing[] sanjiao[] juchi[] 為四個(gè)數(shù)組,通過賦值給P1并行IO口,傳給DAC0832以VREF輸出模擬信號(hào),通過中斷中的u++實(shí)現(xiàn)數(shù)組取數(shù)組元素的移動(dòng),實(shí)現(xiàn)信號(hào)的變換,在波形顯示器上顯示波形,然后打開中斷執(zhí)行變換后波形,

按鍵s1,s2執(zhí)行波形頻率的加減.同樣關(guān)閉中斷,pinglv+=bujin改變值,然后打開中斷.


單片機(jī)源程序如下:


  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit s1=P3^5;
  6. sbit s2=P3^6;
  7. sbit s3=P3^7;
  8. sbit s4=P3^4;


  9. int pinlv=100,bujin=1;
  10. unsigned int m;
  11. char boxing,u;
  12. int a,b;
  13. uchar code sin[64]={                                                
  14. 135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,
  15. 146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128
  16. };                                          //正弦波取碼
  17. uchar code juxing[64]={
  18. 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  19. 255,255,255,255,255,255,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
  20. };                                          //矩形波取碼

  21. uchar code sanjiao[64]={
  22. 0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,
  23. 248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0
  24. };                                                //三角波取碼
  25. uchar code juchi[64]={
  26. 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,
  27. 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
  28. };                                          //鋸齒波取碼


  29. void initclock()
  30. {
  31.         TMOD=0x01;
  32.         TH0=a ;
  33.         TL0=b ;
  34.         EA=1;
  35.         ET0=1;
  36.         TR0=1;
  37. }
  38.         
  39. void delay(uint xms)
  40. {
  41.         int c,d;
  42.         for (c=xms;c>0;c--)
  43.                 for(d=110;d>0;d--);
  44. }


  45. void keyscan()
  46. {
  47.         if(s1==0)
  48.         {
  49.                 EA=0;
  50.                 delay(2);
  51.                 if(s1==0)
  52.                 {
  53.                         while(!s1);
  54.                         pinlv+=bujin;
  55.                         if(pinlv>1000)
  56.                         {
  57.                                 pinlv=100;
  58.                         }
  59.                         m=65536-(150000 / pinlv);
  60.                         a=m / 256;
  61.                         b=m % 256;
  62.                         EA=1;
  63.                 }
  64.         }
  65.         if(s2==0)
  66.         {
  67.                         delay(5);
  68.                         if(s2==0)
  69.                         {
  70.                                 EA=0;
  71.                                 while(!s2);
  72.                                 pinlv-=bujin;
  73.                                 if(pinlv<100)
  74.                                 {
  75.                                         pinlv=1000;
  76.                                 }
  77.                                 m=65536-(150000/pinlv);
  78.                                 a=m/256;
  79.                                 b=m%256;
  80.                                 EA=1;
  81.                         }
  82.         }
  83.         if(s3==0)
  84.         {
  85.                 delay(5);
  86.                 if(s3==0)
  87.                 {
  88.                         EA=0;
  89.                         while(!s3);
  90.                         boxing++;
  91.                         if(boxing>=4)
  92.                         {
  93.                                 boxing=0;
  94.                         }
  95.                
  96.                         EA=1;
  97.                 }
  98.         }
  99. }

  100.                                    

  101. void main()
  102. {
  103.         m=65536-(150000/pinlv);
  104.         a=m/256;
  105.         b=m%256;
  106.         initclock();
  107.    while(1)
  108.         {         
  109.          keyscan();
  110.          
  111.         switch(boxing)
  112.                 {
  113.                         case 0 : P1=sin[u]; break;
  114.                         case 1 : P1=juxing[u]; break;
  115.                         case 2 : P1=sanjiao[u]; break;
  116.                         case 3 : P1=juchi[u]; break;
  117.                 }
  118.         }
  119. }
  120.         
  121. void T0_time()interrupt 1
  122. {
  123.         TH0= a ;
  124.         TL0= b ;
  125.         u++;
  126.         if(u>=64)
  127.                 u=0;
  128. }
復(fù)制代碼


所有資料51hei提供下載:

波形發(fā)生器.rar (334.09 KB, 下載次數(shù): 144)





評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:418900 發(fā)表于 2018-11-1 17:56 | 只看該作者
下載的壓縮文件為什么損壞?
回復(fù)

使用道具 舉報(bào)

板凳
ID:283491 發(fā)表于 2018-11-13 15:43 | 只看該作者
其實(shí)加運(yùn)算放大器有什么用,DA轉(zhuǎn)換不可以直接輸出波形嗎?
回復(fù)

使用道具 舉報(bào)

地板
ID:396689 發(fā)表于 2018-11-22 10:17 | 只看該作者
文件不適用
回復(fù)

使用道具 舉報(bào)

5#
ID:241454 發(fā)表于 2018-11-25 10:32 | 只看該作者
不錯(cuò)不錯(cuò)
回復(fù)

使用道具 舉報(bào)

6#
ID:451464 發(fā)表于 2018-12-21 12:44 來自手機(jī) | 只看該作者
你好,請(qǐng)問DA0832輸出端后面的2電容電阻什么作用
回復(fù)

使用道具 舉報(bào)

7#
ID:417927 發(fā)表于 2018-12-29 10:49 | 只看該作者
非常有用的資料!
回復(fù)

使用道具 舉報(bào)

8#
ID:514789 發(fā)表于 2019-4-17 17:28 | 只看該作者
用STM32可以嗎 這是什么原理啊~波形怎么產(chǎn)生的
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表