欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

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

QQ登錄

只需一步,快速開始

搜索
查看: 7218|回復(fù): 4
收起左側(cè)

基于pcf8591的ad轉(zhuǎn)換正弦波輸出 帶單片機(jī)源程序與仿真

[復(fù)制鏈接]
ID:296972 發(fā)表于 2018-4-29 12:42 | 顯示全部樓層 |閱讀模式
pcf8591是8位的ad轉(zhuǎn)換器芯片,帶da輸出功能

用單片機(jī)定時(shí)器 定時(shí)輸出數(shù)字量 轉(zhuǎn)化成模擬電壓 形成正弦波
運(yùn)行后 在debug里面選擇 digital oscillscope 調(diào)出示波器
通道a 幅值2mv  掃面速度2us
波形如下 最高位不取反的波形.png
最高位取反后的波形.png 0.jpg

單片機(jī)源程序如下:
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. #define iic_delay() {_nop_();_nop_();_nop_();_nop_();}

  4. sbit scl = P1^6;
  5. sbit sda = P1^7;
  6. sbit led1 = P1^2;
  7. sbit led2 = P1^3;

  8. bit ack1 ,ack2;
  9. unsigned char d;

  10. void delayms(unsigned int x)
  11. {
  12.   unsigned int j;
  13.   while(x--)
  14.   for(j=125;j>0;j--);

  15. }
  16. void iic_start()
  17. {   
  18.    sda = 1;
  19.    scl = 1;

  20.    iic_delay();
  21.    sda = 0;
  22.    iic_delay();
  23.    scl = 0;

  24. }

  25. void iic_end()
  26. {
  27.    scl = 0;
  28.    sda = 0;
  29.    iic_delay();
  30.    scl = 1;
  31.    iic_delay();
  32.    sda = 1;
  33.    iic_delay();

  34. }

  35. bit iic_write(unsigned char dat)
  36. {        static bit ack;       
  37.         unsigned char mask;
  38.         for(mask=0x80;mask!=0;mask>>=1 )
  39.         {
  40.                  if((mask&dat)==0x00)
  41.                    sda = 0;
  42.                 else sda = 1;

  43.                   iic_delay();
  44.                    scl = 1;
  45.                    iic_delay();
  46.               scl = 0;
  47.         }

  48.         sda = 1;                                   //主機(jī)釋放         開漏結(jié)構(gòu) 寫1的話 這個(gè)從機(jī)釋放 當(dāng)所有從機(jī)都寫1的時(shí)候 總線才釋放
  49.            iic_delay();                        //一旦某個(gè)從機(jī)寫零 總線拉低 代表busy  見ti文檔 2面
  50.         scl = 1;                                // 拉高 8+1  最后一個(gè)脈沖用于從機(jī)應(yīng)答信號(hào) scl 拉高 從機(jī)改變sda來響應(yīng)是否應(yīng)答
  51.         ack = sda;                            //scl拉低  主機(jī)sda 傳輸數(shù)據(jù)
  52.         iic_delay();
  53.         scl = 0 ;
  54.         return ack;
  55. }

  56. unsigned char iic_readdat_ack()
  57. {        static unsigned char mask,dat;
  58.         sda = 1;
  59.         for(mask = 0x80;mask!=0 ;mask>>=1)
  60.         {
  61.                          
  62.            iic_delay();                        //一旦某個(gè)從機(jī)寫零 總線拉低 代表busy  見ti文檔 2面
  63.         scl = 1;                                // 拉高 8+1  最后一個(gè)脈沖用于從機(jī)應(yīng)答信號(hào) scl 拉高 從機(jī)改變sda來響應(yīng)是否應(yīng)答
  64.         if(sda == 0)
  65.                 dat&=~mask;
  66.         else dat |= mask;

  67.            iic_delay();
  68.         scl = 0;

  69.         }
  70.         sda = 0;
  71.         iic_delay();
  72.         scl = 1;
  73.         iic_delay();
  74.         scl = 0;

  75.         return dat;

  76. }

  77. unsigned char iic_readdat_nack()
  78. {        static unsigned char mask,dat;
  79.         sda = 1;
  80.         for(mask = 0x80;mask!=0 ;mask>>=1)
  81.         {
  82.                          
  83.            iic_delay();                        //一旦某個(gè)從機(jī)寫零 總線拉低 代表busy  見ti文檔 2面
  84.         scl = 1;                                // 拉高 8+1  最后一個(gè)脈沖用于從機(jī)應(yīng)答信號(hào) scl 拉高 從機(jī)改變sda來響應(yīng)是否應(yīng)答
  85.         if(sda == 0)
  86.                 dat&=~mask;
  87.         else dat |= mask;

  88.            iic_delay();
  89.         scl = 0;

  90.         }
  91.         sda = 1;
  92.         iic_delay();
  93.         scl = 1;
  94.         iic_delay();
  95.         scl = 0;

  96.         return dat;

  97. }

  98. void sentad_data( char d )
  99. {
  100. iic_start();                     
  101.     ack1 = iic_write(0x48<<1);
  102.         led1 = ack1;
  103.         ack2 = iic_write(0x40);
  104.         led2 = ack2;

  105. //        iic_start();
  106. //        iic_write((0x48<<1)|0x01);
  107. //        iic_readdat_ack();
  108. //        d =   iic_readdat_nack();
  109. //        P3 = d;

  110.         iic_write(d);
  111.                           
  112.         iic_end();
  113. }
復(fù)制代碼
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #include<math.h>

  4. #define time_step 15000                          //        定時(shí)器時(shí)常

  5. unsigned char DSY_BUFF_CODE[16] = {0xc0,0xf9,0xa4,0xb0,
  6.                                         0x99,0x92,0x82,0xf8,
  7.                                         0x80,0x90,0x88,0x83,
  8.                                         0xc6,0xa1,0x86,0x8e};

  9. sbit seg1 = P2^4;
  10. sbit seg2 = P2^5;
  11. sbit seg3 = P2^6;
  12. sbit seg4 = P2^7;

  13. void timer_init();
  14. void sentad_data(unsigned char);
  15. double  rad;


  16. void main()
  17. {

  18.           timer_init();
  19. //         sentad_data(0xff);                  
  20.     while(1);
  21. }

  22. void timer_init()
  23. {
  24.         TMOD=0x01;
  25.         TH0=(65536-time_step)/256;
  26.         TL0=(65536-time_step)%256;  
  27.         EA=1;
  28.         ET0=1;  
  29.         TR0=1;
  30. }


  31. void timer0_int() interrupt 1
  32. {        static unsigned char wei=0;
  33.         static  char d;
  34.         static unsigned int num = 0;                  //num 代表360個(gè)點(diǎn)中的第幾個(gè)點(diǎn)  每次遞增5個(gè)點(diǎn)
  35.        

  36.         TH0=(65536-time_step)/256;
  37.         TL0=(65536-time_step)%256;


  38.         d =(char)( (sin(0.01744*num))*127);          // 3.14115/180 表示每度的弧度值 乘以度數(shù)num
  39.         // 再把度數(shù)的sin值乘以127 輸出成模擬電壓量注意不能乘以255 因?yàn)檫@里是有符號(hào)類型 最高位是符號(hào)為 所以8位的數(shù)值最大位127
  40.                                                                                   
  41.         if((d&0x80)!=0x80)  d = d|0x80;                  //這里要再把最高位取反 與上0x80不等于0x80說明最高位為0 那么或上0x80將最高位置1
  42.         else d &= 0x7f;                                                  // 如果不將最高位取反的話 波形會(huì)有問題 見文件夾中的截圖                         
  43.        
  44.         sentad_data(d);                                                  //將d輸出成模擬電壓

  45.         if(num==360) num =0;
  46.         num = num + 5;                                                  //每次遞增5度

  47.          switch(wei)                                                  // 將d值送至數(shù)碼管顯示 可以通過調(diào)高time_step 觀察d值 用于調(diào)試
  48.         {
  49.                  case 1:
  50.                 P2 &= 0x0f;
  51.                 P0 = DSY_BUFF_CODE[d/1000];
  52.                 seg1 = 1;
  53.                 break;

  54.                 case 2:
  55.                 P2 &= 0x0f;
  56.                 P0 = DSY_BUFF_CODE[d%1000/100];
  57.                 seg2 = 1;
  58.                 break;               

  59.                  case 3:
  60.                 P2 &= 0x0f;
  61.                 P0 = DSY_BUFF_CODE[d%100/10];
  62.                 seg3 = 1;
  63.                 break;

  64.                  case 4:
  65.                 P2 &= 0x0f;
  66.                 P0 = DSY_BUFF_CODE[d%10];
  67.                 seg4 = 1;

  68.                 break;

  69. ……………………

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

所有資料51hei提供下載:
1.zip (227.92 KB, 下載次數(shù): 100)


評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:490330 發(fā)表于 2019-4-2 20:25 | 顯示全部樓層
很好,十分感謝
回復(fù)

使用道具 舉報(bào)

ID:445096 發(fā)表于 2019-4-11 18:27 | 顯示全部樓層
波形頻率在哪里調(diào)
回復(fù)

使用道具 舉報(bào)

ID:445096 發(fā)表于 2019-4-11 20:43 | 顯示全部樓層
972250229 發(fā)表于 2019-4-11 18:27
波形頻率在哪里調(diào)

我也想問
回復(fù)

使用道具 舉報(bào)

5#
無效樓層,該帖已經(jīng)被刪除
ID:353450 發(fā)表于 2019-5-5 07:34 來自觸屏版 | 顯示全部樓層
TH0=(65536-time_step)/256;          TL0=(65536-time_step)%256;這句什么意思呢?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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