PIC单片机问题 串口传输数据,感觉一直在中断程序里面门都进不了主循环。

PIC单片机问题 串口传输数据,感觉一直在中断程序里面门都进不了主循环。,第1张

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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10213202.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存