用51单片机写一个定时器正交编码的航标灯的程序
时间: 2023-11-26 18:02:27 浏览: 97
以下是51单片机定时器正交编码的航标灯程序,假设使用的是STC89C52单片机:
```c
#include <reg52.h>
sbit LED1 = P1^0;
sbit LED2 = P1^1;
unsigned char code KEY_CODE[4] = {0x03, 0x02, 0x00, 0x01}; // 正交编码表
void main()
{
TMOD = 0x01; // 定时器0工作在模式1,16位定时器计数器
TH0 = 0xFC; // 定时器初值
TL0 = 0x18;
TR0 = 1; // 启动定时器
EA = 1; // 允许中断
ET0 = 1; // 允许定时器0中断
while(1)
{
// do nothing
}
}
void timer0_isr() interrupt 1
{
static unsigned char i = 0;
static unsigned char last_code = 0xFF; // 上一次编码值
TH0 = 0xFC; // 重新设置定时器初值
TL0 = 0x18;
i++;
if(i > 3) i = 0;
P2 = KEY_CODE[i]; // 输出正交编码值
// 判断编码值是否有变化
if(last_code != KEY_CODE[i])
{
switch(KEY_CODE[i])
{
case 0x03: // 向右转
LED1 = 1;
LED2 = 0;
break;
case 0x02: // 向左转
LED1 = 0;
LED2 = 1;
break;
default: // 停止转动
LED1 = 0;
LED2 = 0;
break;
}
last_code = KEY_CODE[i];
}
}
```
在本例中,使用定时器0产生中断,通过循环输出正交编码表中的值,从而实现正交编码。同时,通过判断编码值是否有变化,控制航标灯的亮灭状态。其中,LED1和LED2分别控制航标灯向左和向右转动,当编码值为0x00时,表示停止转动。
需要注意的是,本例中使用了STC89C52单片机的P1口控制LED灯,如果使用其他型号的单片机,需要根据具体情况修改程序中的引脚定义。
阅读全文