pdshyh 发表于 2020-12-10 17:20:58

单片机C52编程MCP4822--DAC试验

本帖最后由 pdshyh 于 2020-12-10 17:25 编辑

I2C读写24C08程序确实操蛋断断续续半个月书本例程还是搞不定,还是论坛老师提供的程序可以,单片机C52编程SPI通讯MCP4822--DAC试验轻松多了,网上搜的例程,参照书本并行DAC0832修改了一个LED灯由不亮-暗-亮循环的程序,电压由2.2--2.6V,LED灯万用表二极管档测量导电电压是2.5V。
有一个情况延时函数在主函数后面出错书本示例在主函数后面:L焊接MCP4822/LED到编程调整示波器捕获一天时间:lol :lol :lol
C52扩展板左1是MCP4822

SPI通讯时序示波器也完美捕捉


程序
#include<reg52.h>   //包含52系列单片机头文件
#include<intrins.h>   //包含52系列单片机函数头文件
#define uchar unsigned char//为宏定义,把unsigned char用uchar表示,方便书写
#define uint unsigned int   //为宏定义,把unsigned int用uint表示,方便书写
sbit MCP4822_SCL = P2^3;                //SCLK
sbit MCP4822_LDAC = P2^6;                //LDAC
sbit MCP4822_SDI = P2^4;         //SDI
sbit MCP4822_CS = P2^5;            //cs
uint i,j,k;
void setVoltage(uchar config, uint dat)         
{
      uint command = 0;
               // uchar i;
                command |= config << 12;      //config 0x01 --A通道 x2最高输出4096mV关闭输出0x00
                //config 0x03 --A通道 x1最高输出2048mV关闭输出0x02
                //config 0x09 --B通道 x2最高输出4096mV关闭输出0x08
      command |= (dat & 0x0FFF);      //0000 1111 1111 1111config 0x0b --B通道 x1最高输出2048mV      关闭输出 0x0b   设置和数据到command
      MCP4822_CS =1;//刚开始MCP4822_CS为高电平
      MCP4822_LDAC =1 ;      //MCP4822_LDAC为高电平
      MCP4822_SCL =0;   //刚开始MCP4822_SCL为低平
      MCP4822_CS = 0;;      //ce变为低电平,允许单片机向MCP4822中的寄存器写入设置参数和数据
      _nop_();   //稍微延时(一个机器周期)

      for (i=0; i<16;i++)
      {
               MCP4822_SCL=0;
                  //MCP4822_SDI=command&0x80>>15 ;
                  command=command<<1 ;
                  MCP4822_SDI=CY;          // command<<1高位溢出最高位自动寄存在CY
                  MCP4822_SCL=1 ;               //config 0x09 --B通道 x2最高输出4096mV关闭输出0x08
      }
      
      MCP4822_CS = 1;    //设置参数和数据写完之后,把MCP4822_CS拉高,防止对写入的数据进行误操作
      _nop_();//稍微延时
      MCP4822_SDI=1;   //释放MCP4822_SDI数据线
      MCP4822_SCL=1;   //释放sclk时钟线
      MCP4822_LDAC=0;      //输入存储器数据传递到DAC存储器。
      MCP4822_LDAC=1;
}


void delay(uint x)

{
        for(j=x;j>0;j--)
        {
                for(k=120;k>0;k--);
        }
}

void main(void)
{
       
        while (1)
        {


                uint text;
               
                for(text=2200;text<2600;text++)
                {
                       setVoltage(0x01,text);
                  setVoltage(0x09,text);
                        delay(20)        ;
                }
       
               
        }
}

little-f 发表于 2020-12-10 17:43:18

恭喜,马上做个BT接收机之类的都不是问题了。

pdshyh 发表于 2020-12-11 08:12:29

little-f 发表于 2020-12-10 17:43
恭喜,马上做个BT接收机之类的都不是问题了。

谢谢,蓝牙是SPI通讯....O(∩_∩)O哈哈~很猜BT是什么;P

pdshyh 发表于 2020-12-11 08:15:34

本帖最后由 pdshyh 于 2020-12-11 08:36 编辑

延时函数在主函数后面出错在前面加了一个说明void delay(uint x);错误消失,下班看看书本示例在主函数后面延时示例前面有没有相应函数说明。:D
洞洞板扩展连接线惨不忍睹:lol :lol

iffi123 发表于 2020-12-11 09:45:56

感觉lz在论坛写日记;P

pdshyh 发表于 2020-12-11 10:27:52

iffi123 发表于 2020-12-11 09:45
感觉lz在论坛写日记

O(∩_∩)O哈哈~,:handshake 电桥使用规定放到论坛用的时候找着挺方便的,还是休闲无事。还有I2C读写24C08程序折腾苦了,这个太顺了也高兴。:lol

iffi123 发表于 2020-12-11 10:42:55

pdshyh 发表于 2020-12-11 10:27
O(∩_∩)O哈哈~, 电桥使用规定放到论坛用的时候找着挺方便的,还是休闲无事。还有I2C读写24C0 ...

其实有些自己的摸索过程没必要都放在论坛上的,把最后的心得体会经验告诉大家更有意义

pdshyh 发表于 2020-12-11 11:15:44

iffi123 发表于 2020-12-11 10:42
其实有些自己的摸索过程没必要都放在论坛上的,把最后的心得体会经验告诉大家更有意义

谢谢iffi123老师提醒,看了这个帖子以后注意:L ,这次延时函数的函数声明应该前面书本视频讲到过,实操就忘得一干二净,单片机C语言编程会者不难难者不会。小白体会多做。
页: [1]
查看完整版本: 单片机C52编程MCP4822--DAC试验