stc8h8k单片机直流电机转速测量实验c 语言代码
时间: 2023-11-15 15:05:55 浏览: 172
以下是一个基于STC8H8K单片机的直流电机转速测量实验的C语言代码:
```c
#include <STC8.H>
#define FOSC 24000000L
sbit IN1 = P1^0; //定义IN1引脚
sbit IN2 = P1^1; //定义IN2引脚
sbit EN = P1^2; //定义EN引脚
sbit D0 = P0^0; //定义D0引脚
unsigned int time = 0; //用于计时的变量
unsigned int speed = 0; //用于存储转速的变量
void delay_us(unsigned int us) { //延时函数,每次延时1微秒
while (us--);
}
void main() {
TMOD = 0x01; //设置定时器0为16位定时模式
TH0 = 0; //设置定时器0的初始值为0
TL0 = 0;
TR0 = 1; //启动定时器0
ET0 = 1; //开启定时器0中断
EA = 1; //开启总中断
IN1 = 1; //设置IN1和IN2引脚的初始状态
IN2 = 0;
EN = 1; //使能电机驱动芯片
while (1) {
if (time > 10) { //如果计时器时间超过10ms,即一圈转完
speed = 600000/time; //计算转速(单位:rpm)
time = 0; //清零计时器
}
if (speed > 100) { //如果转速超过100rpm,则点亮LED
D0 = 1;
} else {
D0 = 0;
}
}
}
void timer0_isr(void) interrupt 1 { //定时器0中断函数
TH0 = (65536 - (FOSC/12)/9600)/256; //重新设置定时器0的初始值
TL0 = (65536 - (FOSC/12)/9600)%256;
time++; //计时器加1
delay_us(100); //延时100微秒,用于消除抖动
}
```
该代码中同样使用了定时器0来计时,计算出电机一圈转过的时间,从而得出电机的转速。在主函数中,如果转速超过100rpm,则点亮P0口的第0个引脚,表示电机正在运转。需要注意的是,STC8H8K的定时器0的时钟源为系统时钟的1/12,因此需要在计算定时器初始值时除以12。此外,由于STC8H8K的定时器0的溢出时间较短,为9600个机器周期,因此需要在中断函数中添加100微秒的延时来消除抖动。
阅读全文