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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于pcf8591的ad轉換正弦波輸出 帶單片機源程序與仿真

[復制鏈接]
跳轉到指定樓層
樓主
pcf8591是8位的ad轉換器芯片,帶da輸出功能

用單片機定時器 定時輸出數字量 轉化成模擬電壓 形成正弦波
運行后 在debug里面選擇 digital oscillscope 調出示波器
通道a 幅值2mv  掃面速度2us
波形如下


單片機源程序如下:
  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;                                   //主機釋放         開漏結構 寫1的話 這個從機釋放 當所有從機都寫1的時候 總線才釋放
  49.            iic_delay();                        //一旦某個從機寫零 總線拉低 代表busy  見ti文檔 2面
  50.         scl = 1;                                // 拉高 8+1  最后一個脈沖用于從機應答信號 scl 拉高 從機改變sda來響應是否應答
  51.         ack = sda;                            //scl拉低  主機sda 傳輸數據
  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();                        //一旦某個從機寫零 總線拉低 代表busy  見ti文檔 2面
  63.         scl = 1;                                // 拉高 8+1  最后一個脈沖用于從機應答信號 scl 拉高 從機改變sda來響應是否應答
  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();                        //一旦某個從機寫零 總線拉低 代表busy  見ti文檔 2面
  84.         scl = 1;                                // 拉高 8+1  最后一個脈沖用于從機應答信號 scl 拉高 從機改變sda來響應是否應答
  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. }
復制代碼
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #include<math.h>

  4. #define time_step 15000                          //        定時器時常

  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個點中的第幾個點  每次遞增5個點
  35.        

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


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

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

  47.          switch(wei)                                                  // 將d值送至數碼管顯示 可以通過調高time_step 觀察d值 用于調試
  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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

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


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:490330 發表于 2019-4-2 20:25 | 只看該作者
很好,十分感謝
回復

使用道具 舉報

板凳
ID:445096 發表于 2019-4-11 18:27 | 只看該作者
波形頻率在哪里調
回復

使用道具 舉報

地板
ID:445096 發表于 2019-4-11 20:43 | 只看該作者
972250229 發表于 2019-4-11 18:27
波形頻率在哪里調

我也想問
回復

使用道具 舉報

5#
ID:353450 發表于 2019-5-5 07:34 來自觸屏版 | 只看該作者
TH0=(65536-time_step)/256;          TL0=(65536-time_step)%256;這句什么意思呢?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一级一级 | 久久国产视频网 | 在线观看日韩精品视频 | 精品无码久久久久久国产 | 中文字幕精品一区二区三区精品 | pacopacomama在线 | 欧美精品在线免费观看 | 国产高清精品在线 | 日韩激情视频一区 | 国产免费一区二区 | 日韩一区二区三区精品 | 性色av网站| 久久精品国产久精国产 | 一区二区国产精品 | 国产精品免费一区二区三区四区 | 欧美一区二区在线观看 | 日韩视频一区 | 精品视频一区二区三区在线观看 | 一级黄色片网站 | 国产精品久久久久永久免费观看 | 国产午夜在线 | 久久99精品久久 | 日韩精品一区二区三区在线观看 | 中文字幕在线免费观看 | 午夜小电影 | 国产精品一区二区三区在线播放 | 国产精品视频yy9299一区 | 日韩电影一区 | 日韩欧美综合 | 亚洲一区不卡在线 | 亚洲精品91| 在线观看黄色大片 | 国产区在线观看 | 91一区二区三区 | 91av视频在线观看 | 亚洲免费大片 | 欧美日韩综合 | 日韩精品a在线观看图片 | 国产精品久久国产精品 | 中文福利视频 | 免费观看黄色一级片 |