矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: 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):
少主函数,
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 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 等等运算结果都存在什么地方了。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-11-16 15:59:59 | 显示全部楼层
adc、dac和at24c08芯片都已经连接到转换板,烧录座也到了还没用,想先弄简单的I2c读写at24c08芯片,程序下载没反应,对问题查找是弱项排除法,把原来数码管等程序下载单片机没问题,换了一片at24c08I2c芯片还是没反应,
微信图片_20201116154926.png
看示例at24c02芯片和at24c08芯片手册容量不同其它参数基本相同,万用表检查at24c08芯片电路连接没有错误,今天用示波器测量发现单片机连接at24c08芯片SDA引脚有方波,SCL引脚波形没有方波,可能是单片机P2^1连接有问题下班再查
DS1Z_QuickPrint1.png
回复 支持 反对

使用道具 举报

     
发表于 2020-11-16 16:25:31 | 显示全部楼层
我想知道command=command<<1 等等运算结果都存在什么地方了

就在那个地方没地方去,command被乘以2
回复 支持 反对

使用道具 举报

     
发表于 2020-11-16 16:40:25 | 显示全部楼层
自己以前做的at24c08读写程序,已通过。给你参考一下,端口根据你的实际改一下。 闪存at24c02.rar (34.11 KB, 下载次数: 56)
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-11-16 16:45:48 | 显示全部楼层
w6955 发表于 2020-11-16 16:25
我想知道command=command

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

使用道具 举报

     
 楼主| 发表于 2020-11-16 16:57:07 | 显示全部楼层
glory 发表于 2020-11-16 16:40
自己以前做的at24c08读写程序,已通过。给你参考一下,端口根据你的实际改一下。

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

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

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

使用道具 举报

     
 楼主| 发表于 2020-11-18 19:31:46 | 显示全部楼层
glory 发表于 2020-11-16 16:40
自己以前做的at24c08读写程序,已通过。给你参考一下,端口根据你的实际改一下。

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

使用道具 举报

     
 楼主| 发表于 2020-11-25 07:57:30 | 显示全部楼层
24C08程序,SAD引脚换P2^2或P2^0都有方波,SCL引脚换P2^2或P2^0都没有方波,led灯没有亮没有读到写的数据,不知道写入没有。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-11-26 20:17:29 来自手机 | 显示全部楼层
24C08读写在论坛老师帮助下弄好了,还用示波器测量到了波形,就是书本例题有问题不知道什么原因还要排查。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

蒙公网安备 15040402000005号

GMT+8, 2025-4-28 09:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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