找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

三角波單獨發(fā)生 單片機程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:219321 發(fā)表于 2017-7-15 16:14 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
我還是參照相關(guān)資料寫出程序,但是不適用于STC89C51單片機,需要構(gòu)造外圍電路,有大神能告訴我怎樣構(gòu)造外圍電路來調(diào)方波振幅嗎


單片機源程序如下:
  1. //三角波發(fā)生程序
  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()  //產(chǎn)生總線起始信號
  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()   //產(chǎn)生總線停止信號
  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總線寫操作,待寫入字節(jié)dat,返回值為應(yīng)答狀態(tài)
  37. {
  38.     bit ack;  //用于暫存應(yīng)答位的值
  39.     unsigned char mask;  //用于探測字節(jié)內(nèi)某一位值的掩碼變量

  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位數(shù)據(jù)發(fā)送完后,主機釋放SDA,以檢測從機應(yīng)答
  52.     I2CDelay();
  53.     I2C_SCL = 1;   //拉高SCL
  54.     ack = I2C_SDA; //讀取此時的SDA值,即為從機的應(yīng)答值
  55.     I2CDelay();
  56.     I2C_SCL = 0;   //再拉低SCL完成應(yīng)答位,并保持住總線

  57.     return (~ack); //應(yīng)答值取反以符合通常的邏輯:0=不存在或忙或?qū)懭胧。?=存在且空閑或?qū)懭氤晒?br />
  58. }
  59. unsigned char I2CReadNAK() //I2C總線讀操作,并發(fā)送非應(yīng)答信號,返回值為讀到的字節(jié)
  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中對應(yīng)位清零
  70.         else
  71.             dat |= mask;  //為1時,dat中對應(yīng)位置1
  72.         I2CDelay();
  73.         I2C_SCL = 0;      //再拉低SCL,以使從機發(fā)送出下一位
  74.     }
  75.     I2C_SDA = 1;   //8位數(shù)據(jù)發(fā)送完后,拉高SDA,發(fā)送非應(yīng)答信號
  76.     I2CDelay();
  77.     I2C_SCL = 1;   //拉高SCL
  78.     I2CDelay();
  79.     I2C_SCL = 0;   //再拉低SCL完成非應(yīng)答位,并保持住總線

  80.     return dat;
  81. }
  82. unsigned char I2CReadACK() //I2C總線讀操作,并發(fā)送應(yīng)答信號,返回值為讀到的字節(jié)
  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中對應(yīng)位清零
  93.         else
  94.             dat |= mask;  //為1時,dat中對應(yīng)位置1
  95.         I2CDelay();
  96.         I2C_SCL = 0;      //再拉低SCL,以使從機發(fā)送出下一位
  97.     }
  98.     I2C_SDA = 0;   //8位數(shù)據(jù)發(fā)送完后,拉低SDA,發(fā)送應(yīng)答信號
  99.     I2CDelay();
  100.     I2C_SCL = 1;   //拉高SCL
  101.     I2CDelay();
  102.     I2C_SCL = 0;   //再拉低SCL完成應(yīng)答位,并保持住總線

  103.     return dat;
  104. }

  105. //設(shè)置DAC的初始值,val是初始值
  106. void DA(unsigned char val)
  107. {
  108.         I2CStart();
  109.         if(!I2CWrite(0x48<<1))//尋址PCF8591,如未應(yīng)答,停止操作并返回
  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);//定時器的計數(shù)頻率,是波形頻率的32倍
  123.         temp=65536-temp;//定時器重載
  124.         temp=temp+33;//修斷中斷響應(yīng)延時造成的誤差
  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服務(wù)函數(shù)
  136. void timer1() interrupt 3
  137. {
  138.         static unsigned int i=0;
  139. ……………………

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

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


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

使用道具 舉報

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

本版積分規(guī)則

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

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

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