📄 test.c
字号:
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //共阴极0~9对应16进制数
//数码管位选控制口定义
sbit LED4=P2^7;
sbit LED3=P2^6;
sbit LED2=P2^5;
sbit LED1=P2^4;
//按键口申明
sbit S1=P2^3;
sbit S2=P2^2;
sbit S3=P2^1;
sbit PWM=P3^3; //控制电机的PWM口
unsigned char tabArry[4]; //存入显示数据
char flag=1; //按键标志,当flag=1时表示没有按下,当flag=0时表示有按键按下
int counter; //用于频率计定时器计数,当为50时,定时为1秒
int speed,setspeed=16; //电机实际转速,设定的电机转速
int speedcount; //转速计数
int keycount=0; //按键计数,为0时测转速,为1时设置转速
int z_counter=0; //占空比计数,计100次
int zkb=50; //所调制的占空比
int pwmcount=0;
//毫秒延时程序
void delayms(int ms)
{
uchar i;
while(ms--)
{
for(i=250;i>0;i--);
}
}
//数据分位
void change(char ch,unsigned int frequency)
{
tabArry[0]=ch; //显示字母,A为测得转速,b为设置转速
tabArry[1]=frequency%1000/100; //百位
tabArry[2]=frequency%100/10; //十位
tabArry[3]=frequency%10; //个位
}
//键盘扫描
void keyscan()
{
if(flag==1)
{
if(S3==0) //用S3切换实际转速与设定转速
{
delayms(2); //延时去抖
if(S3==0)
{
flag=0;
keycount++;
if(keycount>=2) keycount=0;
}
}
if(S2==0 && keycount==1) //设置转速加1
{
delayms(2);
if(S2==0 && keycount==1)
{
flag=0;
setspeed++;
if(setspeed>1000) setspeed=999;
}
}
if(S1==0 && keycount==1) //设置转速减1
{
delayms(2);
if(S1==0 && keycount==1)
{
flag=0;
setspeed--;
if(setspeed<0) setspeed=0;
}
}
}
if(S1!=0 && S2!=0 && S3!=0) flag=1; //判断按键是否弹起
}
//显示函数
void display()
{
switch(keycount)
{
case 0: //当keycount=0时显示实际转速
change(0x0a,speed);
break;
case 1:
change(0x0b,setspeed); //当keycount=1时显示设置转速
break;
}
P0 = table[tabArry[0]];
LED1=0;
delayms(2);
LED1=1;
P0 = table[tabArry[1]];
LED2=0;
delayms(2);
LED2=1;
P0 = table[tabArry[2]];
LED3=0;
delayms(2);
LED3=1;
P0 = table[tabArry[3]];
LED4=0;
delayms(2);
LED4=1;
}
//程序初始化
void Init()
{
TMOD=0x11; //定时器1方式1,定时器0方式1
TH0=0x70;//定义20ms,用于测速,晶振22.1184MHz
TL0=0x00;
TH1=0xf8; //定义1mS,用于控制电机转速
TL1=0xcc;
ET0=1;//允许定时0中断
ET1=1;//允许定时1中断
TR0=1;//定时器0启动
TR1=1;//定时器1启动
EX0=1;//允许外部中断
IT0=1;//边沿出发
EA=1;//总中断打开
}
//*******************************************************
void main(void)
{
Init();
while(1)
{
keyscan();//按键程序
display();//显示程序
}
}
//定时器0,用于测电机转速
void timer0() interrupt 1
{
TH0=0x70;//定义20ms
TL0=0x00;
counter++;
if(counter>=50) //1s时将电机脉冲读出
{
counter=0; //定时器计数清零,便于下一次测速计数
speed=speedcount; //将测得的频率赋给speed显示
speedcount=0; //将电机转速计数清零,重新计数
}
}
//定时器1,用于控制PWM输出
void timer1() interrupt 3
{
TH1=0xf8; //重新赋初值
TL1=0xcc;
z_counter++; //占空比计数加1
if(z_counter>=100) z_counter=0; //当计数超过100后清零,便于重新计数
if(setspeed>speed) //当设定的值大于实际值时,所调制的占空比加1
{
zkb++;
if(zkb>100) zkb=100;
}
else if(setspeed<speed) //当设定的值小于实际值时,所调制的占空比减1
{
zkb--;
if(zkb<0) zkb=0;
}
else zkb=50; //当设定的值等于实际值时,所调制的占空恒为50
if(z_counter<zkb) PWM=0;
else PWM=1;
}
//外中断0,用于电机速度计数,每产生一次中断计数一次
void Pint0() interrupt 0
{
speedcount++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -