找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4943|回复: 0
收起左侧

三角波单独发生 单片机程序

[复制链接]
ID:219321 发表于 2017-7-15 16:14 | 显示全部楼层 |阅读模式
我还是参照相关资料写出程序,但是不适用于STC89C51单片机,需要构造外围电路,有大神能告诉我怎样构造外围电路来调方波振幅吗
0.png

单片机源程序如下:
  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)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表