求助!1111111
时间:10-02
整理:3721RD
点击:
我想加个测速显示模块 哪位大神给改哈程序 硬件电路也给知道哈
// PWM 控制 DC电机转速
// 晶振为12M
// 利用定时器控制产生占空比可变的 PWM 波
// 按K1,PWM值增加,则占空比增加,电机转快
// 按K2,PWM值减小,则占空比减小,电机转慢。
// 当PWM值增加到最大值(255)或减小到最小值(1)时,蜂鸣器将报警。
#include < reg51.h >
sbit K1 =P1^0 ; //增加键
sbit K2 =P1^1 ; //减少键
sbit K3 =P1^2 ; //转向选择键
sbit PWMUOT =P3^0 ; //PWM波输出
sbit turn_around =P3^1 ; //转向控制输出
sbit BEEP =P3^2 ; //蜂鸣器
unsigned int PWM;
void Beep(void);
void delay(unsigned int n);
void main(void)
{
TMOD=0x11;//设置T0、T1为方式1(16位定时器)
TH0=0 ; //65536us延时常数(t=(65536-TH)/fosc/12)
TL0=0;
TH1=PWM ; //脉宽调节,高8位
TL1=0;
EA=1; //开总中断
ET0=1; //开T0中断
ET1=1; //开T1中断
TR0=1 ; //T0定时允许
while(1)
{
if(K3==0&&K1==1&&K2==1)//转向控制
{
turn_around=!turn_around;
}
while(K3==0);//检测K3是否释放
do{
PWM++ ;
if(PWM>0xfe)//防止PWM计数溢出
{
PWM=0xff;
}
if(PWM==0xff)Beep() ;
delay(3000);
}
while(K1==0&&K2==1);
do{
PWM-- ;
if(PWM<1)//防止PWM计数溢出
{
PWM=1;
}
if(PWM==1)Beep() ;
delay(3000);
}
while(K1==1&&K2==0);
}
}
void timer0() interrupt 1 using 2// 定时器0中断服务程序.
{
TR1=0 ; //T1禁止
TH0=0 ; //置T0定时常数
TL0=0 ;
TH1=PWM ; //置T1定时常数
TL1=0;
TR1=1 ; //T1允许
PWMUOT=0 ; //PWM波输出0
}
void timer1() interrupt 3 using 3 // 定时器1中断服务程序
{
TR1=0 ; //T1禁止
PWMUOT=1 ; //PWM波输出1
}
void Beep(void) //蜂鸣器子程序
{
unsigned char i;
for (i=0;i<100;i++)
{
delay(100);
BEEP=!BEEP; //Beep取反
}
BEEP=1; //关闭蜂鸣器
delay(100);
}
void delay(unsigned int n) // 延时子程序
{
while(n--) ;
}
// PWM 控制 DC电机转速
// 晶振为12M
// 利用定时器控制产生占空比可变的 PWM 波
// 按K1,PWM值增加,则占空比增加,电机转快
// 按K2,PWM值减小,则占空比减小,电机转慢。
// 当PWM值增加到最大值(255)或减小到最小值(1)时,蜂鸣器将报警。
#include < reg51.h >
sbit K1 =P1^0 ; //增加键
sbit K2 =P1^1 ; //减少键
sbit K3 =P1^2 ; //转向选择键
sbit PWMUOT =P3^0 ; //PWM波输出
sbit turn_around =P3^1 ; //转向控制输出
sbit BEEP =P3^2 ; //蜂鸣器
unsigned int PWM;
void Beep(void);
void delay(unsigned int n);
void main(void)
{
TMOD=0x11;//设置T0、T1为方式1(16位定时器)
TH0=0 ; //65536us延时常数(t=(65536-TH)/fosc/12)
TL0=0;
TH1=PWM ; //脉宽调节,高8位
TL1=0;
EA=1; //开总中断
ET0=1; //开T0中断
ET1=1; //开T1中断
TR0=1 ; //T0定时允许
while(1)
{
if(K3==0&&K1==1&&K2==1)//转向控制
{
turn_around=!turn_around;
}
while(K3==0);//检测K3是否释放
do{
PWM++ ;
if(PWM>0xfe)//防止PWM计数溢出
{
PWM=0xff;
}
if(PWM==0xff)Beep() ;
delay(3000);
}
while(K1==0&&K2==1);
do{
PWM-- ;
if(PWM<1)//防止PWM计数溢出
{
PWM=1;
}
if(PWM==1)Beep() ;
delay(3000);
}
while(K1==1&&K2==0);
}
}
void timer0() interrupt 1 using 2// 定时器0中断服务程序.
{
TR1=0 ; //T1禁止
TH0=0 ; //置T0定时常数
TL0=0 ;
TH1=PWM ; //置T1定时常数
TL1=0;
TR1=1 ; //T1允许
PWMUOT=0 ; //PWM波输出0
}
void timer1() interrupt 3 using 3 // 定时器1中断服务程序
{
TR1=0 ; //T1禁止
PWMUOT=1 ; //PWM波输出1
}
void Beep(void) //蜂鸣器子程序
{
unsigned char i;
for (i=0;i<100;i++)
{
delay(100);
BEEP=!BEEP; //Beep取反
}
BEEP=1; //关闭蜂鸣器
delay(100);
}
void delay(unsigned int n) // 延时子程序
{
while(n--) ;
}
接线图
需要硬件电路做支持