pdshyh 发表于 2020-11-11 16:31:06

参照书本DS1302时钟芯片SDI通信的例子和论坛老师的STC15W408AS的例子MCP4822比葫芦画瓢编程还没测试运行有几个警告。
#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^5;                //SCLK
sbit MCP4822_LDAC = P2^4;                //LDAC
sbit MCP4822_SDI = P2^3;         //SDI
sbit MCP4822_CS = P2^2;            //cs
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);      //config 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;
}
处理后还有两个
Build target 'Target 1'
compiling MCP4822.c...
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?_SETVOLTAGE?MCP4822
*** WARNING L10: CANNOT DETERMINE ROOT SEGMENT
Program Size: data=8.0 xdata=0 code=56
"MCP4822" - 0 Error(s), 2 Warning(s).
在线翻译:***警告L16:未分类的段,忽略了覆盖过程
   区隔:?PR?_SETVOLTAGE?MCP4822
***警告L10:无法确定根段
MCP4822写是由高位依次到低位我用左移后MCP4822_SDI=command&0x80>>15 ;还有command<<1左移后高位进入 MCP4822_SDI=CY有点拿不准。

补充内容 (2020-11-12 10:26):
少主函数,

pdshyh 发表于 2020-11-13 15:44:49

在做c52的MCP4822过程有两个问题请教1.void setVoltage(uchar config, uint dat) 中uchar config, uint dat的两个参数用0x的16进制和10进制数据结果一样不一样。2. 单片机I/O输入输出都对应着特殊寄存器,下面command=command<<1 ;                  MCP4822_SDI=CY;          // command<<1高位溢出最高位自动寄存在CY,我想知道command=command<<1 等等运算结果都存在什么地方了。

pdshyh 发表于 2020-11-16 15:59:59

adc、dac和at24c08芯片都已经连接到转换板,烧录座也到了还没用,想先弄简单的I2c读写at24c08芯片,程序下载没反应,对问题查找是弱项排除法,把原来数码管等程序下载单片机没问题,换了一片at24c08I2c芯片还是没反应,

看示例at24c02芯片和at24c08芯片手册容量不同其它参数基本相同,万用表检查at24c08芯片电路连接没有错误,今天用示波器测量发现单片机连接at24c08芯片SDA引脚有方波,SCL引脚波形没有方波,可能是单片机P2^1连接有问题下班再查:lol

w6955 发表于 2020-11-16 16:25:31

我想知道command=command<<1 等等运算结果都存在什么地方了

就在那个地方没地方去,command被乘以2

glory 发表于 2020-11-16 16:40:25

自己以前做的at24c08读写程序,已通过。给你参考一下,端口根据你的实际改一下。

pdshyh 发表于 2020-11-16 16:45:48

w6955 发表于 2020-11-16 16:25
我想知道command=command

谢谢指教,我是搜百度关于左移溢出到PSW的CY位是ADD SUBB DIV MUL 等都可以影响到PSW的CY位,我以为这些是存储器名称看结构框图一个没找到。:L 原来是运算命令:Q ,还是想知道这些运算是在那些存储器中存储。又搜看到“51单片机 ROM 是程序存储器/RAM是用户定义的数据变量i,是用来存放实时数据和运算过程中产生的一些中间变量。还要作为堆栈使用。”还有“ACC,累加器累加器的bai作用:
1、在运算器中,累加器是专门存du放算术或逻辑运算的一个操zhi作数和运算结dao果的寄存器。能进行加、减、读出、移位、循环移位和求补等操作。是运算器的主要部分。
2、在中央处理器CPU中,累加器(accumulator)是一种暂存器,它用来储存计算所产生的中间结果。如果没有像累加器这样的暂存器,那么在每次计算(加法,乘法,移位等等)后就必须要把结果写回到内存,然后再读回来。然而存取主内存的速度是比从数学逻辑单元(ALU)到有直接路径的累加器存取更慢。
3、在汇编语言程序中,累加器——AX是一个非常重要的寄存器,但在程序中用它来保存临时数据时,最后将其转存到其它寄存器或内存单元中,以防止在其它指令的执行过程中使其中的数据被修改,从而得到不正确的结果,为程序的调试带来不必要的麻烦。”
单片机学习还是不扎实,碎片化学习。:Q

pdshyh 发表于 2020-11-16 16:57:07

glory 发表于 2020-11-16 16:40
自己以前做的at24c08读写程序,已通过。给你参考一下,端口根据你的实际改一下。

谢谢,已经下载,看到延时方法时序更细腻,还有LED显示地址和数据,:handshake

补充内容 (2020-11-17 08:09):
查了SCL引脚和P2^1连接没问题,用的是书本的at24c02读写程序,查了SCL引脚位定义也没错,单独编写一个简单程序看单片机P2^1口输出对不对。

补充内容 (2020-11-17 08:59):
准备单独编写一个简单程序看单片机P2^1口输出对不对。

pdshyh 发表于 2020-11-18 19:31:46

glory 发表于 2020-11-16 16:40
自己以前做的at24c08读写程序,已通过。给你参考一下,端口根据你的实际改一下。

谢谢,单片机通过简单led点亮熄灭命令测量单片机2^1指令1或0测量都是5v电压,其他口没问题就换了2^2,用您的程序点亮了led灯书本例程还不行我再对比检查:handshake

pdshyh 发表于 2020-11-25 07:57:30

24C08程序,SAD引脚换P2^2或P2^0都有方波,SCL引脚换P2^2或P2^0都没有方波,led灯没有亮没有读到写的数据,不知道写入没有。:L

pdshyh 发表于 2020-11-26 20:17:29

24C08读写在论坛老师帮助下弄好了,还用示波器测量到了波形,就是书本例题有问题不知道什么原因还要排查。
页: 1 2 3 4 5 [6]
查看完整版本: 单片机学习的请教