写一个用EC11控制C8051F320单片机来控制LED灯程序
时间: 2023-03-25 22:00:33 浏览: 71
这里提供一个简单的EC11控制C8051F320单片机来控制LED灯的程序:
1. 首先,需要定义引脚和变量:
sbit LED = P1^; //LED灯连接的引脚
sbit EC11_A = P3^2; //EC11旋转编码器A相连接的引脚
sbit EC11_B = P3^3; //EC11旋转编码器B相连接的引脚
unsigned char EC11_LastCode = ; //EC11旋转编码器上一次的状态
unsigned char EC11_NewCode = ; //EC11旋转编码器当前的状态
2. 接下来,需要编写EC11旋转编码器的中断服务程序:
void EC11_ISR() interrupt //EC11旋转编码器中断服务程序
{
EC11_LastCode <<= 2; //将上一次的状态左移2位
EC11_LastCode |= ((EC11_A << 1) | EC11_B); //将当前的状态加入到上一次的状态中
EC11_NewCode = EC11_LastCode & xF; //取出最后4位作为当前状态
}
3. 然后,在主函数中初始化中断和定时器:
void main()
{
EA = 1; //开启总中断
EX = 1; //开启外部中断
IT = 1; //设置外部中断为下降沿触发
TMOD = x01; //设置定时器为模式1
TH = xFC; //设置定时器的高8位
TL = x67; //设置定时器的低8位
TR = 1; //启动定时器
while(1)
{
//LED灯控制代码
}
}
4. 最后,在while循环中编写LED灯的控制代码:
void main()
{
EA = 1; //开启总中断
EX = 1; //开启外部中断
IT = 1; //设置外部中断为下降沿触发
TMOD = x01; //设置定时器为模式1
TH = xFC; //设置定时器的高8位
TL = x67; //设置定时器的低8位
TR = 1; //启动定时器
while(1)
{
if(EC11_NewCode != EC11_LastCode) //如果EC11旋转编码器的状态发生改变
{
if(EC11_NewCode == x02 || EC11_NewCode == xD) //如果旋转方向为顺时针
{
LED = ~LED; //LED灯亮
}
else if(EC11_NewCode == x08 || EC11_NewCode == x03) //如果旋转方向为逆时针
{
LED = ; //LED灯灭
}
EC11_LastCode = EC11_NewCode; //更新EC11旋转编码器的状态
}
}
}
这个程序的作用是,当EC11旋转编码器顺时针旋转时,LED灯亮;逆时针旋转时,LED灯灭。