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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7301|回復: 7
收起左側

51單片機DAC0832波形發生器仿真加程序源碼

  [復制鏈接]
ID:377946 發表于 2018-8-5 11:10 | 顯示全部樓層 |閱讀模式
初學單片機,.附件是對程序的分析和proteus仿真,適合初學搭建電路,按鍵1,2程序功能有問題,不知道那步的邏輯出現了問題,沒有實現頻率微調的功能.

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

Proteus仿真中ANOLOGUE示波器使用簡述:

第一次運行示波器會自動打開,在關閉示波器也就是叉了之后,再次運行不會自動打開,需右擊示波器選擇最下面英文選項.

連接四個掃描口中的一個,對應有四個channal,旋鈕調節掃描電壓值以改變格子代表單位,,指向為一格所代表的電壓值,例如指向2mv,則上下一格代表2mv.滾輪移動上下坐標,可調節使其對其某根線便于測量.

Horizontal旋鈕橫向掃描周期調節,可用于調節周期波形寬度,橫向滾輪調節水平坐標.小旋扭都為微調.



0.png

Proteus仿真

原件:res電阻

  89c51

  DAC0832

  LM358N

  BUTTON

                              GENELECT10U16V



主函數:

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;

                            }

              }

}


主函數:

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

void initclock()

{

              TMOD=0x01;

              TH0=a ;

              TL0=b ;

              EA=1;

              ET0=1;

              TR0=1;

}


定時器方式寄存器TMOD:

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

M1M0用于指定工作方式,通過00 01 10 11的組合,可使定時/計數器分別對應工作在0 1 2 3方式

C/T:選擇定時/計數.C,T分別表示計數器和定時器.當C/T=1時,選擇計數狀態,當C/T=0時選擇定時狀態

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


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

void T0_time()interrupt 1

{

              TH0= a ;

              TL0= b ;

              u++;

              if(u>=64)

                            u=0;

}

之后執行循環

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;

                            }

              }

}

循環體首先調用函數按鍵檢測函數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是波形變換按鍵,首先關閉總中斷執行下方語句,按鈕按下判斷,當

S3=0即按鈕按下,while(!s3);  語句代表按鍵按下時,進行死循環不執行下方語句,松開按鍵后boxing++是波形變換關鍵,通過變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[] 為四個數組,通過賦值給P1并行IO口,傳給DAC0832以VREF輸出模擬信號,通過中斷中的u++實現數組取數組元素的移動,實現信號的變換,在波形顯示器上顯示波形,然后打開中斷執行變換后波形,

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


單片機源程序如下:


  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. }
復制代碼
0.png

所有資料51hei提供下載:

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

評分

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

查看全部評分

回復

使用道具 舉報

ID:418900 發表于 2018-11-1 17:56 | 顯示全部樓層
下載的壓縮文件為什么損壞?
回復

使用道具 舉報

ID:283491 發表于 2018-11-13 15:43 | 顯示全部樓層
其實加運算放大器有什么用,DA轉換不可以直接輸出波形嗎?
回復

使用道具 舉報

ID:396689 發表于 2018-11-22 10:17 | 顯示全部樓層
文件不適用
回復

使用道具 舉報

ID:241454 發表于 2018-11-25 10:32 | 顯示全部樓層
不錯不錯
回復

使用道具 舉報

ID:451464 發表于 2018-12-21 12:44 來自手機 | 顯示全部樓層
你好,請問DA0832輸出端后面的2電容電阻什么作用
回復

使用道具 舉報

ID:417927 發表于 2018-12-29 10:49 | 顯示全部樓層
非常有用的資料!
回復

使用道具 舉報

ID:514789 發表于 2019-4-17 17:28 | 顯示全部樓層
用STM32可以嗎 這是什么原理啊~波形怎么產生的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本不卡免费新一二三区 | 亚洲精品视频在线 | 欧美一级片在线观看 | 国产精品成人在线播放 | 麻豆久久| 久久久综合精品 | 国产日韩欧美中文字幕 | 一级毛片网 | 久久伊人青青草 | 一区二区高清不卡 | 中文字幕亚洲视频 | 久久久久国产精品午夜一区 | 365夜爽爽欧美性午夜免费视频 | 一区二区三区欧美在线 | 大象视频一区二区 | 97国产成人 | 亚洲日本中文 | 久久免费精品视频 | 午夜网| 在线不卡视频 | 午夜在线电影网 | 久久9久 | 国产高清视频在线观看 | 国产午夜久久 | 久久久99国产精品免费 | 国产乱码精品一区二区三区忘忧草 | 美女131mm久久爽爽免费 | 亚洲伊人a | 国产区在线观看 | 97视频在线看| av大片在线观看 | 亚洲精品视频在线播放 | 在线视频亚洲 | 欧洲成人免费视频 | 亚洲区一区二区 | 欧美精品网 | 在线观看欧美日韩视频 | 超碰欧美 | 二区在线观看 | 色综合一区二区 | 亚洲在线一区二区三区 |