首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]请高手帮我看看这个串行输出数据控制锁相环程序,似乎不停的循环,但我解决不

[求助]请高手帮我看看这个串行输出数据控制锁相环程序,似乎不停的循环,但我解决不

请高手帮我看看这个程序,我的单片机用的是C8051F330.我是用它来控制锁相环.
程序是单片机向锁相环输出3组数据,每组数据包含3个8位二进制数.其中用到单片机3个I/O口,一个做时钟信号,一个控制信号,一个数据信号.
程序编译下载没问题,在线仿真也没问题.但用示波器查看三个口都一直有信号输出,似乎程序在一直不停的执行.
曾经怀疑是单片机在不停的复位,检查程序发现初始化时没有禁止看门狗,现在是改进后的程序,但问题仍然存在.小弟真的是没办法了.
请各位高手指点一下,或者帮忙改下这程序.在此多谢了?

#include<c8051F330.h>

sbit DAT =P1^0;//锁相环数据信号
sbit SCK =P1^1;//锁相环时钟信号
sbit LE =P1^2;//锁相环控制信号

sbit Detect=P1^3;//程序完成检测信号

void InitDevice(void);//初始化
void Delay(unsigned char timer);
void PLLInit(void);//送数函数


unsigned char code m=0;
unsigned char code init[9]={0x34,0x03,0xC7,0x00,0x04,0x82,0x11,0x43,0x21};

void main()
{
InitDevice();
Delay(255);
Delay(255);
P0=0xFF;
P1=0xFF;
PLLInit();
Delay(100);
PLLInit();
Delay(100);
do //死循环函数
{
LE=1;
SCK=0;
DAT=0;
}while(m==0);//while(m!=0)
}

void InitDevice(void)

{
OSCICN=0xC3;//内部振荡器SYSCLK=24.5M
P0MDOUT=0x00;//
P1MDOUT=0x07;//"1"为推挽输出
P0SKIP=0xFF;//不跳过(全0)会使P0.0和P0.2口,从而使得它始终为0(强电平)
P1SKIP=0xFF;//"1"为跳过
XBR0=0x00;//0x02;//SPI I/O ENBALE?
XBR1=0x40;//弱上拉允许,交叉开关允许
//SPI0CFG=0x40;//主器件方式,第一个边沿采样
//SPI0CN=0x03;//允许SPI,3线主方式
//SPI0CKR=0x00;//SYSCLK=24.5M FSCK=24.5M
IE=0x00;//禁止中断
PCA0MD=0x00;//CLR WDTE,时钟源=系统
PCA0CPL2=0xFF;//超时间隔=32.1mS for sysclk=2
PCA0MD=0x40;//SETB WDTE
}
void Delay(unsigned char timer)
{
unsigned char i,j;
for(i=0;i<timer;i++)
{
for(j=0;j<255;j++)
{
PCA0CPH2=0x00;//喂狗
}
}
}
void PLLInit(void)
{
unsigned char i,j,k,l,SendBit,SendNumber=0;
l=3;
do
{
LE=1;
SCK=0;
DAT=0;

for(i=0;i<3;i++)//3组数据
{
LE=0;
for(j=0;j<3;j++)//每组3个字节
{
SendBit=init[i*3+j];
for(k=0;k<8;k++)//每字节8位
{
SendBit<<=1;//先送高位
DAT=CY;
SCK=1;
Delay(25);
SCK=0;

l++;
PCA0CPH2=0x00;//喂狗
}
}
LE=1;
}

Delay(10);//0.00842231S
//l--;

}while(l==3);//与理论似乎不符(l赋值为3,当l==3循环结束)
Detect=0;//测试点
}

我大致看了一下程序,哎,一看别人程序就迷糊。

但是我感觉好像你这个

do

{

}while(I==3)

中,I等于3啥时候出现呢?

下面循环,我咋觉得等所有的for循环结束的时候I=9呢?

for(i=0;i<3;i++)

{

for(j=0;j<3;j++)

{

for(k=0;i<3;i++)

I++;

}

}

返回列表