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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

三角波單獨發生 單片機程序

[復制鏈接]
跳轉到指定樓層
樓主
我還是參照相關資料寫出程序,但是不適用于STC89C51單片機,需要構造外圍電路,有大神能告訴我怎樣構造外圍電路來調方波振幅嗎


單片機源程序如下:
  1. //三角波發生程序
  2. #include"reg51.h"
  3. #include <intrins.h>

  4. #define I2CDelay()  {_nop_();_nop_();_nop_();_nop_();}

  5. sbit I2C_SCL = P3^7;
  6. sbit I2C_SDA = P3^6;
  7. sbit p_out=P1^0;
  8. unsigned char code triwave[]={0,16,32,48,64,80,96,112,
  9.                                                                 128,144,160,176,192,208,
  10.                                                                 224,240,255,240,224,208,
  11.                                                                 192,176,160,144,128,112,
  12.                                                                 96,80,64,48,32,16,};//三角波波表,選取32點
  13.                                                
  14. unsigned char *pwave;//波表指針
  15. unsigned char T1RH = 1;
  16. unsigned char T1RL = 1;

  17. void I2CStart()  //產生總線起始信號
  18. {
  19.     I2C_SDA = 1; //首先確保SDA、SCL都是高電平
  20.     I2C_SCL = 1;
  21.     I2CDelay();
  22.     I2C_SDA = 0; //先拉低SDA
  23.     I2CDelay();
  24.     I2C_SCL = 0; //再拉低SCL
  25. }
  26. void I2CStop()   //產生總線停止信號
  27. {
  28.     I2C_SCL = 0; //首先確保SDA、SCL都是低電平
  29.     I2C_SDA = 0;
  30.     I2CDelay();
  31.     I2C_SCL = 1; //先拉高SCL
  32.     I2CDelay();
  33.     I2C_SDA = 1; //再拉高SDA
  34.     I2CDelay();
  35. }
  36. bit I2CWrite(unsigned char dat) //I2C總線寫操作,待寫入字節dat,返回值為應答狀態
  37. {
  38.     bit ack;  //用于暫存應答位的值
  39.     unsigned char mask;  //用于探測字節內某一位值的掩碼變量

  40.     for (mask=0x80; mask!=0; mask>>=1) //從高位到低位依次進行
  41.     {
  42.         if ((mask&dat) == 0)  //該位的值輸出到SDA上
  43.             I2C_SDA = 0;
  44.         else
  45.             I2C_SDA = 1;
  46.         I2CDelay();
  47.         I2C_SCL = 1;          //拉高SCL
  48.         I2CDelay();
  49.         I2C_SCL = 0;          //再拉低SCL,完成一個位周期
  50.     }
  51.     I2C_SDA = 1;   //8位數據發送完后,主機釋放SDA,以檢測從機應答
  52.     I2CDelay();
  53.     I2C_SCL = 1;   //拉高SCL
  54.     ack = I2C_SDA; //讀取此時的SDA值,即為從機的應答值
  55.     I2CDelay();
  56.     I2C_SCL = 0;   //再拉低SCL完成應答位,并保持住總線

  57.     return (~ack); //應答值取反以符合通常的邏輯:0=不存在或忙或寫入失敗,1=存在且空閑或寫入成功
  58. }
  59. unsigned char I2CReadNAK() //I2C總線讀操作,并發送非應答信號,返回值為讀到的字節
  60. {
  61.     unsigned char mask;
  62.     unsigned char dat;

  63.     I2C_SDA = 1;  //首先確保主機釋放SDA
  64.     for (mask=0x80; mask!=0; mask>>=1) //從高位到低位依次進行
  65.     {
  66.         I2CDelay();
  67.         I2C_SCL = 1;      //拉高SCL
  68.         if(I2C_SDA == 0)  //讀取SDA的值
  69.             dat &= ~mask; //為0時,dat中對應位清零
  70.         else
  71.             dat |= mask;  //為1時,dat中對應位置1
  72.         I2CDelay();
  73.         I2C_SCL = 0;      //再拉低SCL,以使從機發送出下一位
  74.     }
  75.     I2C_SDA = 1;   //8位數據發送完后,拉高SDA,發送非應答信號
  76.     I2CDelay();
  77.     I2C_SCL = 1;   //拉高SCL
  78.     I2CDelay();
  79.     I2C_SCL = 0;   //再拉低SCL完成非應答位,并保持住總線

  80.     return dat;
  81. }
  82. unsigned char I2CReadACK() //I2C總線讀操作,并發送應答信號,返回值為讀到的字節
  83. {
  84.     unsigned char mask;
  85.     unsigned char dat;

  86.     I2C_SDA = 1;  //首先確保主機釋放SDA
  87.     for (mask=0x80; mask!=0; mask>>=1) //從高位到低位依次進行
  88.     {
  89.         I2CDelay();
  90.         I2C_SCL = 1;      //拉高SCL
  91.         if(I2C_SDA == 0)  //讀取SDA的值
  92.             dat &= ~mask; //為0時,dat中對應位清零
  93.         else
  94.             dat |= mask;  //為1時,dat中對應位置1
  95.         I2CDelay();
  96.         I2C_SCL = 0;      //再拉低SCL,以使從機發送出下一位
  97.     }
  98.     I2C_SDA = 0;   //8位數據發送完后,拉低SDA,發送應答信號
  99.     I2CDelay();
  100.     I2C_SCL = 1;   //拉高SCL
  101.     I2CDelay();
  102.     I2C_SCL = 0;   //再拉低SCL完成應答位,并保持住總線

  103.     return dat;
  104. }

  105. //設置DAC的初始值,val是初始值
  106. void DA(unsigned char val)
  107. {
  108.         I2CStart();
  109.         if(!I2CWrite(0x48<<1))//尋址PCF8591,如未應答,停止操作并返回
  110.         {
  111.                 I2CStop();
  112.                 return;
  113.         }
  114.         I2CWrite(0x40);
  115.         I2CWrite(val);
  116.         I2CStop();
  117. }

  118. //輸出波形頻率
  119. void setwavefreq(unsigned char freq)
  120. {
  121.         unsigned long temp;
  122.         temp=(12/12)/(freq*32);//定時器的計數頻率,是波形頻率的32倍
  123.         temp=65536-temp;//定時器重載
  124.         temp=temp+33;//修斷中斷響應延時造成的誤差
  125.         T1RH=(unsigned char)(temp>>8);
  126.         T1RL=(unsigned char)temp;
  127.         TMOD&=0x0F;
  128.         TMOD|=0x10;
  129.         TH1=T1RH;
  130.         TL1=T1RL;
  131.         ET1=1;
  132.         PT1=1;
  133.         TR1=1;
  134. }
  135. //中斷T1服務函數
  136. void timer1() interrupt 3
  137. {
  138.         static unsigned int i=0;
  139. ……………………

  140. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
三角波.rar (30.75 KB, 下載次數: 37)


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕亚洲视频 | 国产成人一区二区三区久久久 | 精品1区2区| 欧美在线a| 九九热免费视频在线观看 | a成人| 先锋资源网站 | 在线国产一区 | 天天天操 | av免费在线播放 | 成人深夜福利在线观看 | 日韩国产免费观看 | 精品在线观看入口 | 精品国产一区二区三区性色av | 国产精品视频 | 国产一级淫片免费视频 | 二区中文 | 色婷婷亚洲 | 日韩高清一区 | 亚洲午夜网 | 精品久久久一区 | hitomi一区二区三区精品 | 国产成人一区二区 | 免费国产黄网站在线观看视频 | 一级片aaa| 久久久久久综合 | 久久久人成影片免费观看 | 九九久久精品 | 亚洲精品一区二区三区丝袜 | 亚洲精品一区二区网址 | 欧美大片久久久 | 欧美日本一区 | 乱码av午夜噜噜噜噜动漫 | 91精品国产一区二区三区 | 91精品国产欧美一区二区 | 日韩精品免费在线观看 | 人人色视频 | 色爱综合网 | 成人免费av在线 | 国产主播第一页 | 久久天堂网 |