我用的是AT89C52
想做到0.5KHZ~20KHZ之间精确线性调频脉冲信号,怎么也实现不了,以下是代码,请教一下高手意见!
/*****************************************************************************
* 程序名称: *
* 编写时间:2008.9.27 *
* 程序版本:1.0 *
* 程序作者:夏寒冰 *
* 开发单位:合肥工大高科信息技术有限责任公司(质检部) *
******************************************************************************/
//定时器计算公式:(65535-定时常数)*(12/晶振频率)=0.1MS
#include
#include
#include //内部包含延时函数 _nop_();
//TIME:0.1ms =1Khz
#define V_TH0 0Xff
#define V_TL0 0X9c
#define V_TMOD 0X51 //0x01
//I
sbit P1_0=P1^0; //LED
sbit P1_1=P1^1; //KEY++
sbit P1_2=P1^2; //KEY--
sbit P1_3=P1^3; //KEY Enter
//O
sbit SER=P1^4; //14
sbit clock=P1^5; //
sbit latch=P1^6; // 12
//输出显示
sbit CP1=P0^0; //CP
sbit EnMoto1=P0^1 ;//EN
sbit CW_CCW1=P0^2 ;//CW
void init_sys(void); /*系统初始化函数*/
void delay(void);
void showFour(int value);
int ScanKeyValue(void);
int item,xf=8;//角度索引,细分值
int cTime=0,xTime,tk=0,Count=0,SecValue;
bit Flat=0,Flat1=0;
int zkb1,Vn,Vn2,VMAX=9999,VMIN=100,DispValue; //占空比间隔0.1ms*Vn,当Vn=0时,定时器以0.1ms中断,定时器最大中断时间间隔为0.1*VMAX
float FOS=0.0;//频率检测
//圆盘参数
idata float C0=301; //18个孔组合的圆周长 mm
idata float L0=20; //18个孔之间角度
/*0~F之间模式选择字符*/
unsigned char MODEL_7SEG[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
/*ERROR 字符 错误提示*/
unsigned char ERROR_7SEG[4]={0x86,0xaf,0xaf,0xa3};
//unsigned char F8DZ[8]={0x09,0x69,0x60,0x66,0x06,0x96,0x90,0x99};//8细分反转:A-AB'-B'-A'B'-A'-A'B-B-BA
// unsigned char Z8DZ[8]={0x99,0x90,0x96,0x06,0x66,0x60,0x69,0x09};//8细分正转:BA-B-A'B-A'-A'B'-B'-AB'-A步距角为0.9度
//unsigned char F4DZ[4]={0x60,0x06,0x90,0x09};//4细分反转:B'-A'-B-A 步距角为1.8度
//unsigned char Z4DZ[5]={0x66,0x69,0x99,0x96,0x66};//4细分正转: A'B'-AB'-AB-A'B-A'B'
//unsigned char Z2DZ[2]={0x66,0x99};//2细分正转:A'B'-AB
void main()
{
idata float len=C0/360*L0; //小点间距弧长单位:mm
init_sys();
Vn=100;
EnMoto1=1;//电机驱动打开
CW_CCW1=1;//正转
showFour(Vn);
delay();
Vn2=Vn;
cTime=(int)((float)1000/Vn2);
zkb1=(int)(cTime-(float)cTime/2);
Flat=0;
while(1)
{
P1_1=P1_2=1;
if(!P1_3||!P1_1||!P1_2)
{
Flat=1;
SecValue=0;
}
if(Flat)
{
if(SecValue>=0&&SecValue<3)
{
if(!P1_3||!P1_1||!P1_2)
showFour(ScanKeyValue());//
if(!P1_3)
{
Vn2=Vn;
cTime=(int)((float)1000/Vn2);
zkb1=(int)(cTime-(float)cTime/2);
}
}
else
{
Flat=0;
}
}
else
{
SecValue=0;
if(Flat1)
{
FOS=TH1*256+TL1;
// DispValue=(int)((FOS-FOS*0.13)*len);//速度=频率*最小弧长 (单位mm/s)
DispValue=len/(1000/(FOS-FOS*0.127))*1000;
showFour(DispValue);
TH1=TL1=0;Flat1=0;
}
}
}//end while
}
//********************************************键盘扫描
int ScanKeyValue()
{
if(!P1_1)
{
while(!P1_1);
{ Vn+=10;
if(Vn>=VMAX)
{
Vn=VMAX;
}
}
}
else if(!P1_2)//KEY--
{
while(!P1_2);
{ Vn-=10;
if(Vn<=VMIN)
{
Vn=VMIN;
}
}
}
return (Vn);
}
/******************************************************
*函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/
void init_sys(void) /*系统初始化函数*/
{
/*定时器初始化*/
TMOD=V_TMOD;
TH0=V_TH0;
TL0=V_TL0;
//IE=0x82;
// TCON=0x00;
TR0=1;
TR1=1;//
ET0=1;
EA=1;
}
void delay()
{
int i,j;
for(i=0;i<10;i++)
for(j=0;j<10;j++);
}
/*****************************************
Model 控制 74HC595 显示数据送入7段数码中
*****************************************/
void show_model(unsigned char WriteValue)
{
unsigned char TempValue;
unsigned char i;
latch=0;
for(i=0;i<8;i++)//
{
clock=0; //
TempValue=(WriteValue<
if(TempValue>=0x80)
{
SER=1;
}
else
{
SER=0;
}
_nop_();
_nop_();
clock=1;
_nop_();
_nop_();
}
latch=1;
}
/*****************************************
显示四位数字
*****************************************/
void showFour(int value)
{
int d,c,b,a,x;//d=千位 c=百位 b=十位 a=个位
if(value>=0 && value<100000 )//识别0~9999之间十进制值为合法范围
{d=value/1000;
c=value/100-d*10;
b=value/10-d*100-c*10;
a=value%10;
for(x=0;x<4;x++)
{
if(x==0)
{
show_model(MODEL_7SEG[a]);//
//_nop_();show_model(0xff);//
}
else
{
if(x==1)
{
show_model(MODEL_7SEG);//
// _nop_();show_model(0xff);//
}
else
{
if(x==2)
{
show_model(MODEL_7SEG[c]);//
_nop_();
}
else
{
if(x==3)
show_model(MODEL_7SEG[d]);//
_nop_();
}
}
}
}
}
else
{ //识别0~9999之间十进制值不为合法范围
for(x=0;x<4;x++)
{
if(x==0)
{
show_model(ERROR_7SEG[3]);//千位
_nop_();
}
else
{
if(x==1)
{
show_model(ERROR_7SEG[2]);//百位
_nop_();
}
else
{
if(x==2)
{
show_model(ERROR_7SEG[1]);//十位
_nop_();
}
else
{
if(x==3)
show_model(ERROR_7SEG[0]);//个位
_nop_();
}
}
}
}
}
}
/*定时器方式1中断函数*/
void timer0(void) interrupt 1 using 2
{
TH0=V_TH0;
TL0=V_TL0;
if(xTime++>=cTime)
xTime=0;
else
if(tk++>=zkb1)
{
tk=0;
CP1=0;
}
else
{
CP1=1;
}
if((Count++)>=10000)//when 1s
{
Count=0;
Flat1=1;
SecValue++;
P1_0=~P1_0;
}
}