矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 2985|回复: 7

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

[复制链接]
     
发表于 2020-12-10 17:20:58 | 显示全部楼层 |阅读模式
本帖最后由 pdshyh 于 2020-12-10 17:25 编辑

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

程序
#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)        ;
                }
       
               
        }
}

     
发表于 2020-12-10 17:43:18 | 显示全部楼层
恭喜,马上做个BT接收机之类的都不是问题了。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-12-11 08:12:29 | 显示全部楼层
little-f 发表于 2020-12-10 17:43
恭喜,马上做个BT接收机之类的都不是问题了。

谢谢,蓝牙是SPI通讯....O(∩_∩)O哈哈~很猜BT是什么
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-12-11 08:15:34 | 显示全部楼层
本帖最后由 pdshyh 于 2020-12-11 08:36 编辑

延时函数在主函数后面出错在前面加了一个说明void delay(uint x);错误消失,下班看看书本示例在主函数后面延时示例前面有没有相应函数说明。
洞洞板扩展连接线惨不忍睹
微信图片_20201211081337.jpg
回复 支持 反对

使用道具 举报

     
发表于 2020-12-11 09:45:56 | 显示全部楼层
感觉lz在论坛写日记
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-12-11 10:27:52 | 显示全部楼层
iffi123 发表于 2020-12-11 09:45
感觉lz在论坛写日记

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

使用道具 举报

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

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

使用道具 举报

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

谢谢iffi123老师提醒,看了这个帖子以后注意 ,这次延时函数的函数声明应该前面书本视频讲到过,实操就忘得一干二净,单片机C语言编程会者不难难者不会。小白体会多做。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-5-8 03:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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