/*
作者:盗了一个你
程序整理日期:2020/1/22
CSDN:https://blog.csdn.net/weixin_41865104
*/
/*
本程序用到的资源
*/
#include"main.h"
unsigned char code Duan[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴极数码管,0-9段码表
unsigned char Data_Buffer[8]={0,0,0,0,0,0,0,0};//数据存放
u8 i=0;
sbit AddSpeed=P1^1;
sbit SubSpeed=P1^2;
sbit PWM_FC=P1^0;
int out=0;//实时脉宽
u16 cnt=0;
u16 Inpluse=0,CurSpeed=0;//脉冲计数,实时速度
u16 PWMTime=100;//初始脉冲宽度,即高电平时间
u16 SpeedSet=380;//设定初始转速
void delay(u16 x);
void PWMOUT();
void SetSpeed();
void SegRefre();
void main()
{
Timer_Init();
PID_Init();
while(1){
SetSpeed();
SegRefre();
PWMOUT();
}
}
void delay(u16 x)//延时
{
u16 i,j;
for(i=x;i>0;i--)
for(j=50;j>0;j--);
}
void PWMOUT()//输出PWM波
{
if(cnt<PWMTime)
{
PWM_FC=1;
}
else
{
PWM_FC=0;
}
if(cnt>1000) cnt=0;
}
void SetSpeed()
{
if(AddSpeed==0)//加速
{
delay(300);
if(AddSpeed==0)
{
SpeedSet+=10;
if(SpeedSet>1500)
{
SpeedSet=1500;
}
}
}
if(SubSpeed==0)//减速
{
delay(300);
if(SubSpeed==0)
{
SpeedSet-=10;
if(SpeedSet<0) SpeedSet=0;
}
}
}
void SegRefre() //显示刷新
{
Data_Buffer[0]=SpeedSet/1000;
Data_Buffer[1]=SpeedSet%1000/100;
Data_Buffer[2]=SpeedSet%100/10;
Data_Buffer[3]=SpeedSet%10;
Data_Buffer[4]=CurSpeed/1000;
Data_Buffer[5]=CurSpeed%1000/100;
Data_Buffer[6]=CurSpeed%100/10;
Data_Buffer[7]=CurSpeed%10;
}
/* 外部中断0
跳变沿触发测速
*/
void EX0_Inter() interrupt 0{
Inpluse++;
}
/*定时器中断0
*/
void Timer0() interrupt 1{
static unsigned char Bit=0;//数码管位选,静态变量,中断退出程序值保留
static unsigned int time=0;//转速测量周期
TH0=THC0;
TL0=TLC0;//2ms发生中断刷新数据
Bit++;
time++;
if(Bit>8) Bit=0;
P0=0xff;//置位
P2=Duan[Data_Buffer[Bit]];//读数据,写数据
switch(Bit)
{
case 0:P0=0X7F;break;
case 1:P0=0XBF;break;
case 2:P0=0XDF;break;
case 3:P0=0XEF;break;
case 4:P0=0XF7;break;
case 5:P0=0XFB;break;
case 6:P0=0XFD;break;
case 7:P0=0XFE;break;
}
if(time>100)//每200ms调整一次
{
time=0;
CurSpeed=Inpluse*5;
Inpluse=0;
PID_Control();
}
}
//0.1ms发生定时器中断1 cnt++
void Timer1() interrupt 3
{
cnt++; //cnt越大占空比越高
}
51单片机PID简单使用
需积分: 19 173 浏览量
2022-09-09
08:00:13
上传
评论 1
收藏 158KB ZIP 举报
嵌入式up
- 粉丝: 3w+
- 资源: 59
最新资源
- (单片机Proteus案例)DS18B20温度传感器protues仿真,包括avr16128 ds18b20两种单片机型号
- (单片机Proteus案例)AT89S51单片机用Proteus仿真案例约12例,包括计数器、动态数码显示、定时计数器等
- (单片机Proteus案例)AT89S51单片机用Proteus仿真案例约10例,包括广告灯、按键、计数器等
- (单片机Proteus案例)51单片机点阵protues仿真实现
- 最新运营商归属地数据库
- 111111111111111111111
- 汉诺塔python代码递归
- 汉诺塔python代码递归
- 汉诺塔python代码递归
- MySQL 8.0 实战教程从入门到项目实战.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0