找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1580|回复: 0
打印 上一主题 下一主题
收起左侧

单片机DA转换 PCF8591锯齿波代码Proteus仿真原理图

[复制链接]
跳转到指定楼层
楼主
锯齿波生成原理:PCF8591中所存数据不断增大,直至到达最值(十进制255),随后令PCF8591中所存数据变为0,从而到达锯齿波的效果
实现:输出峰峰值为0-3V的爬升锯齿波
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>   //包含函数_nop_()定义的头文件
  3. #define AddWr 0x90   //PCF8591写地址
  4. #define u8 unsigned char
  5. #define u16 unsigned int

  6. u8 code juchi[64]=
  7. {
  8. 0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,
  9. 146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255
  10. };                                          //锯齿波取码
  11. sbit Sda=P1^2;        //定义IIC总线引脚
  12. sbit Scl=P1^1;
  13. u16 num;


  14.   void Start(void)
  15.   {
  16.    Sda=1;
  17.    _nop_();
  18.    Scl=1;
  19.    _nop_();
  20.    Sda=0;        //sda负跳变
  21.    _nop_();
  22.    Scl=0;
  23.   }

  24.   void Stop(void)
  25.   {
  26.    Sda=0;
  27.    _nop_();
  28.    Scl=1;
  29.    _nop_();
  30.    Sda=1;        //sda正跳变
  31.    _nop_();
  32.    Scl=0;
  33.    }

  34.          
  35.          void Send(u8 Data)
  36.         {
  37.           u8 BitCounter=8;   //定义发送位数为8
  38.           do
  39.           {
  40.                  Scl=0;
  41.                  _nop_();
  42.                  if((Data&0x80)==0x80)        //逐位判别1/0后送至SDA
  43.                     Sda=1;        //scl低电平期间数据送至sda线                        
  44.                  else
  45.                     Sda=0;
  46.                   Scl=1;        //scl变高输出数据(写入pcf8591)                        
  47.                   Data=Data<<1;
  48.                   BitCounter--;
  49.           }while(BitCounter);
  50.           Scl=0;
  51.         }
  52.         
  53.         void Ack(void)
  54.    {
  55.     Sda=0;         //scl高电平期间sda输出低电平
  56.                 _nop_();
  57.                 Scl=1;         
  58.                 _nop_();
  59.                 Scl=0;
  60.                 _nop_();
  61.         }
  62.          
  63.         void DACconversion(u8 sla,u8 c, u8 Val)    //8591输出一个数据
  64.         {
  65.                 Start();//启动总线
  66.                 Send(sla);//发送器件地址
  67.                          Ack();        
  68.                 Send(c);//发送控制字节
  69.                          Ack();        
  70.                 Send(Val);//发送DAC的数值
  71.                          Ack();        
  72.                 Stop();//结束总线
  73.         }

  74.          
  75.         void main()
  76.         {
  77.                 while(1)
  78.                 {
  79.                                 for(num=0;num<64;num++)
  80.                          {
  81.                                         DACconversion(AddWr,0x40,juchi[num]);
  82.                          }
  83.                   if(num==64)
  84.                                 {
  85.                                                 num=0;
  86.                                 }

  87.                 }
  88.         }
复制代码

Keil代码与Proteus8.13版本的仿真下载(注意不能兼容其他版本 只能用8.13打开):
DA锯齿波发生器.7z (32.08 KB, 下载次数: 22)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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