28BYJ的一点收获

#include <reg52.h>

unsigned long beats = 0;


void StartMotor(unsigned int angle);
void main()
{
    TMOD = 0x01;
    TH0 = 0xF8;
    TL0 = 0xCD;
    ET0 = 1;
    TR0 = 1;

    StartMotor(360*2+180);
    while(1);
}

void StartMotor(unsigned long angle)
{
    EA = 0;
    beats = (angle*4076)/360;
    EA = 1;
}

void InterruptTimer0() interrupt 1
{
    unsigned char tmp;
    static unsigned char index = 0; 
    unsigned char code BeatCode[8] = {
        0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6
    };

    if(beats!=0)
    {
        tmp = P1;
        tmp = tmp & 0xF0;
        tmp = tmp | BeatCode[index];
        P1 = tmp;
        index++;
        beat--;
        index = index & 0x07;
    }
    else
    {
        P1 = P1 | 0xFF;
    }
}

51是8位单片机,8位的概念就是按8位一个字节进行的,那么要操作多个字节,就得分多次了。而程序中定义的unsigned long很明显是4个字节,如果要赋值就得分四次进行。如果此时没有EA = 0, 此时中断发生,发生借位,程序肯定要出错了!
如果定义成char或者bit的话当然没问题了!因为它们在CPU的一次操作中完成的。

中断

void InterruptTimer0() inerrupt 1
{
    static bit div = 0;
    TH0 = 0xFC;
    TL0 = 0x67;
    KeyScan();
    div = ~div;
    if(div == 0)
    {
        TurnMotor();
    }
}

这里有一个小技巧,因为按键扫描是1ms,而电机的扫描则是2ms,但是中断扔定义1ms,同时利用了一个分频的技术,两个1ms才进行一次电机启动

-1 & 0x07

最后的结果为7;
原因为,整数的二进制就是其原码本身,负数的二进制码为其补码,所谓补码的概念为原码除符号位外,所有的位取反并加1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ReCclay

如果觉得不错,不妨请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值