硬件 应该没什么错误,就是软件有点问题
关键是串口控制寄存器的设置,我觉得模棱两可
请各位 前辈指点下!
想实现的功能 就是2线串口 在单音 模式下 输出一个单频率点 就行!
#include<reg52.h>
#include<intrins.h> //包含右移
#include<math.h>
sbit UPDCLK = P2^6; //20 更新时钟,上升沿锁存数据到编程寄存器
sbit MRESET = P3^0; //71 主复位端,高电平有效复位
sbit IORESET = P2^3;
void WriteData(unsigned char DataByte); //写字节数据
void WriteADDR(unsigned char DATAAddress); //写寄存器地址
//*********************************
void main()
{
MRESET=1;
MRESET=1; //复位 高电平持续时间长点
MRESET=1;
MRESET=1;
MRESET=1; //复位 高电平持续时间长点
MRESET=1 ;
MRESET=1;
MRESET=1; //复位 高电平持续时间长点
MRESET=1;
MRESET=0;
SCON=0; //方式0 串口 同步传输 TXD做移位脉冲 和 AD9852的SCLK相连 RXD传输数据与AD9852的
IORESET=1;
IORESET=1;
IORESET=0;
WriteADDR(0x08); //I幅度字高字节地址
WriteData(0xff); //幅度字高字节
WriteData(0xff);
IORESET=1;
IORESET=1;
IORESET=0;
WriteADDR(0x09); //q幅度字高字节地址
WriteData(0xFF); //幅度字高字节
WriteData(0xFF);
IORESET=1;
IORESET=1;
IORESET=0;
WriteADDR(0x07); //控制寄存器 地址
WriteData(0x00); // 4个字节的控制
WriteData(0x04); // 旁路倍频 外看面61脚
WriteData(0x00); // 外部UPDCLK控制
WriteData(0x60); //关反辛格滤波器
UPDCLK=1;
UPDCLK=1;
UPDCLK=0;
//********************************* 以上初始化完成 下面输入频率字
IORESET=1;
IORESET=1;
IORESET=0;
WriteADDR(0x02); //数据频率控制字 50M输出,300M的系统时钟
WriteData(0xAB);
WriteData(0xAA);
WriteData(0xAA);
WriteData(0xAA);
WriteData(0xAA);
WriteData(0x2A);
UPDCLK=1;
UPDCLK=1;
UPDCLK=0;
}
//***写入数据
void WriteData(unsigned char DataByte)
{
unsigned char bdata x,y;
x =DataByte;
y =0;
if(x&0x01) //数据格式旋转180
y=y|0x80; //由D7 D6 D5 D4 D3 D2 D1 D0
if(x&0x02) // D0 D1 D2 D3 D4 D5 D6 D7
y=y|0x40;
if(x&0x04)
y=y|0x20;
if(x&0x08)
y=y|0x10;
if(x&0x10)
y=y|0x08;
if(x&0x20)
y=y|0x04;
if(x&0x40)
y=y|0x02;
if(x&0x80)
y=y|0x01;
SBUF=y;
//SBUF=x;
TI=0;
}
//*********************************
//***写入地址
void WriteADDR(unsigned char DATAAddress)
{
unsigned char bdata x,y;
x =DATAAddress;
y =0;
if(x&0x01) //数据格式旋转180
y=y|0x80; //由D7 D6 D5 D4 D3 D2 D1 D0
if(x&0x02) // D0 D1 D2 D3 D4 D5 D6 D7
y=y|0x40;
if(x&0x04)
y=y|0x20;
if(x&0x08)
y=y|0x10;
if(x&0x10)
y=y|0x08;
if(x&0x20)
y=y|0x04;
if(x&0x40)
y=y|0x02;
if(x&0x80)
y=y|0x01;
SBUF=y;
//因为串口输出的数据是D0在前的 与一般相反 所以颠倒
TI=0; //当传输一个字节时,串口会自动置位,会造成无法移位 输入下一个字节 所以清零
} |