请高手帮我看看这个程序,我的单片机用的是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;//测试点 }
|