28BYJ的一点收获
【摘要】
#include <reg52.h>
unsigned long beats = 0;
void StartMotor(unsigned int angle);
void main()
...
#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;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
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();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
这里有一个小技巧,因为按键扫描是1ms,而电机的扫描则是2ms,但是中断扔定义1ms,同时利用了一个分频的技术,两个1ms才进行一次电机启动
-1 & 0x07
- 1
最后的结果为7;
原因为,整数的二进制就是其原码本身,负数的二进制码为其补码,所谓补码的概念为原码除符号位外,所有的位取反并加1
文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。
原文链接:recclay.blog.csdn.net/article/details/75579335
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)