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读写在论坛老师帮助下弄好了,还用示波器测量到了波形,就是书本例题有问题不知道什么原因还要排查。