本人初学者,有一问题请教大家.
我用STC89C52,三个定时器一起用,T0是计外脉冲的,T1是输出方波,T2用来采样和控制T1输出相应频率的方波,
问题是T1输出的方波不太稳定,波型上横向有过冲现象,表现在步进电机上就是转速不大稳,但是不用T2,把T2关掉,直接打开T1就好多了,
但这样又实现不了我想要的功能,这是怎么回事,该怎样修改,或是哪位大神有更好的方法,请帮我解惑.
- #include<STC89C5xRC.h>
- typedef unsigned char u8;
- typedef unsigned int u16;
- u8 t0,t1,i,bb=100;
- u16 t2;
- u8 code tab[]={0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f};
- unsigned char Dis_Shiwei;//定义十位
- unsigned char Dis_Gewei; //定义个位
- unsigned char Dis_Baiwei; //定义百位
- sbit sucu=P1^0; //方波输出
- sbit deng1=P1^1; //高转速指示
- sbit deng2=P1^2; //低转速指示
- sbit led0= P1^6; //这3个调试用,没什么实际意义
- sbit led1=P1^7;
- sbit led2=P1^5;
- bit kong;
- delay(u16 a)
- {
- while(a--);
- }
- timor()
- {
- TMOD |= 0x10;
- T2MOD |= 0; //初始化模式寄存器
- T2CON = 0; //初始化控制寄存器
- TL2 = 0x18; //设置定时初值
- TH2 = 0xfC; //设置定时初值
- RCAP2L = 0x18; //设置定时重载值
- RCAP2H = 0xfC; //设置定时重载值
-
- ET2=1; //打开定时2器中断
- EA=1; //打开总中断
- TR2=1; //定时器2启动
-
- EX0=1; //外部中断0打开;
- IT0=1; //外部中断0选择下降沿触发
- TH1 = 0xfe; //定时器1赋初值
- TL1 = bb; //由bb的值决定转速
- ET1 = 1; //打开定时1器中断
- //TR1 = 1; //定时器1启动
-
-
-
- }
- xianshi()
- {
-
- P0=Dis_Baiwei; //显示百位
- P2=5; //P2口控制位选端,数5表示选中的第六位数码管 下同
- delay(300);
- P0=Dis_Shiwei;//显示十位
- P2=6;
- delay(300); //短暂延时
- P0=Dis_Gewei; //显示个位
- P2=7;
- delay(300);
-
-
- }
- main()
- {
- timor();
- while(1)
- {
- xianshi();
- }
- }
- void InitTimer0(void) interrupt 0 //using 1//外中断0入口
- {
- t0++; //用来计INT0输入的脉冲数
- led0=~led0;
- }
- void InitTimer1(void) interrupt 3 using 1//定时器1中断入口
- {
-
- TH1 = 0xfe; //赋初值
- TL1 = bb; //bb决定转速
- t1++;
- //led1=~led1;
- if(t1==2) //二分频
- {
- t1=0;
- sucu=~sucu;
- }
-
-
- }
- void InitTimer2(void) interrupt 5 //定时器2中断入口 1ms定时
- {
-
- TF2=0; //定时器2溢出位清零
- t2++;
- if(t2==50)
- {
- EX0=0; //外中断0关闭
- TR2=0; //定时器2关闭
- t2=0; //t2清零
-
- Dis_Baiwei=tab[t0/100%10]; //百位显示值处理
- Dis_Shiwei=tab[t0/10%10]; //十位显示值处理
- Dis_Gewei=tab[t0%10]; //个位显示处理
-
- if(t0>=9 && t0<=10) //如果i大于9而小于10,执行
- { //花括号内的函数 下同
-
- deng1=0;
- deng2=1;
- kong=1;
- //bb=190;
- //TR1=1; //定时器1启动
-
- }
- else if(t0>=6 && t0<=7)
- {
-
- deng2=0;
- deng1=1;
- bb=70;
- TR1=1;
- }
-
- else //如果上述值都不等于
- {
- deng1=1; //指示灯关闭
- deng2=1;
- kong=0;
- TR1=0; //定时器1关闭,电机停转
- bb=100;
- sucu=1;
- }
-
- TR2=1; //定时器2启动
- EX0=1; //外中断0打开
- t0=0; //外中断0计数值清0
-
-
- }
-
-
- if(kong==1) //步进电机软启动
- {
-
- if(bb<190)
- {
- bb++;
- TR1=1; //定时器1启动
- led1=~led1;
- }
-
-
-
- }
-
复制代码
|