unsigned char rev_data = 0;
unsigned char send_data = 0;
void interrupt ISR()
{
if (RCIE & RCIF) //判断是否为串口接收中断
{
rev_data = RCREG; //将接收缓存器中数据读取出来
if(TRMT == 1)
{
TXREG = rev_data;
}
PORTD = ~PORTD;
}
}
单片机最好不要直接寄存器的值赋给寄存器,对串口接收中断必须将缓存器数据读取出来才能清空。另外main函数中while(1)当中要作长延时,不然数据看不到你从串口助手发送后,单片机返回的数据,你尝试一下,不能保证一定可以。
你好,对于你这个问题其实也不是太难,不要在乎片子有多复杂,也不要在乎问题有多难,关键是勇于挑战他,你弄永远不行,程序是调试出来的,别人给你写的你不一定可以用得上。AD985X系列的DDS芯片大同小异,基本也就是协议问题。仔细看一下,手册上的介绍对你很有帮助,还有就是关于你选择的PIC的那款片子,也很简单,给你一个相关的程序参考一下,真的是大同小异无非是细节问题。这个没有人能帮到你,靠自己是最好的也可以学习很多东西。还是那句话程序师调试出来的
如果在调试过程中有什么问题请Hi我,常在线
AD9851的驱动程序
//头文件
#include "SPCE061Ah"
//变量说明
unsigned long int Freq_Ctrl_Word = 0x051eb851; //频率控制字 先传低位再传高位
unsigned int Phase_Ctrl_Word = 0x0000; //相位控制字 先传低位再传高位
unsigned int Order_Ctrl_Word = 0x0000;//b32:0 6倍频关闭 b33b34:00 电源工作模式
//定义AD9851与SPCE061A的接口
#define M_DATA 0x0001
#define M_UD 0x0002
#define M_CLK 0x0004
#define Set_IOA_Bit(x) (P_IOA_Data = P_IOA_Buffer | x) //置高
#define Clear_IOA_Bit(x) (P_IOA_Data = P_IOA_Buffer & ~x) //置低
//====================================================================
// ----Function: void Init_AD9851(void)
// -Description: 初始化与AD9851连接的IO口
// --Parameters: 无
// ------Return: 无
// -------Notes: 不影响其他IO口
//====================================================================
void Init_AD9851(void)
{
P_IOA_Dir |= (M_DATA + M_UD + M_CLK);
P_IOA_Attrib |= (M_DATA + M_UD + M_CLK);
P_IOA_Data &= ~(M_DATA + M_UD + M_CLK);
}
//====================================================================
// ----Function: void Write_AD9851(void)
// -Description: 向AD9851写入频率控制字,命令控制字和相位控制字
// --Parameters: 无
// ------Return: 无
// -------Notes: 无
//====================================================================
void Write_AD9851(void)
{
unsigned long int mask = 0x0001;
unsigned int i;
Clear_IOA_Bit(M_UD); //M_UD置低
//送32位频率控制字
for(i = 0;i < 32;i++)
{
Clear_IOA_Bit(M_CLK); //M_CLK置低
if(Freq_Ctrl_Word & mask)
{
Set_IOA_Bit(M_DATA);
}
else
{
Clear_IOA_Bit(M_DATA);
}
Set_IOA_Bit(M_CLK);
mask = mask << 1;
}
//送3位的命令控制字
mask = 0x0001;
for(i = 0;i < 3;i++)
{
Clear_IOA_Bit(M_CLK); //M_CLK置低
if(Order_Ctrl_Word & mask)
{
Set_IOA_Bit(M_DATA);
}
else
{
Clear_IOA_Bit(M_DATA);
}
Set_IOA_Bit(M_CLK);
mask = mask << 1;
}
//送5位相位控制字
mask = 0x0001;
for(i = 0;i < 5;i++)
{
Clear_IOA_Bit(M_CLK); //M_CLK置低
if(Phase_Ctrl_Word & mask)
{
Set_IOA_Bit(M_DATA);
}
else
{
Clear_IOA_Bit(M_DATA);
}
Set_IOA_Bit(M_CLK);
mask = mask << 1;
}
Set_IOA_Bit(M_UD); //M_UD置高 ,产生上升沿 ,频率更新使能,输出有效
}
最后在说一下个人的理解,也就是DDS与MCU之间的接口问题,个人认为有点像SPI,只不过SPI的数据口是串行的,而在这这里是分时并行。主要问题就是协议,唯一的办法就是求助于数据手册,我刚出去查了一下,好像全是E文的,建议前期工作就是对照Google翻译这个数据手册,很有必要。
学习和创作的过程也很有趣,虽然很艰辛
void delay()
{
int i;
i=1;
for(i<=20000,i++)这个for()语句有问题,for语句中的初始化和满足条件都可以省略,但是中间的分号“;”不能省略。比如for(;;)和while(1)是等效的
continue;
}
以上就是关于PIC单片机问题 串口传输数据,感觉一直在中断程序里面门都进不了主循环。全部的内容,包括:PIC单片机问题 串口传输数据,感觉一直在中断程序里面门都进不了主循环。、PIC单片机C语言编程的高手来帮帮忙啊!、跪求高手:PIC单片机新手 编译问题 请指教 用的是PIC16F628A等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)