1.c语言,及部分汇编代码
2.用一个月时间看完做完郭天祥的十天学会51单片机
3.买一块开发板
4.学习能够看懂看会原理图
5.掌握搜集资料,datasheet查找阅读英文手册的能力
6.自己动手动手动手做一个简单的功能
最后,我其实不建议51入门,可以直接stm32,虽然他还是单片机。不过十年前我当初也是51入门的,乐此不疲。至于忽悠你什么协议,内核,我觉得让一个大一嵌入式新手学这些,无疑没有基础就想建高楼,所以踏踏实实从基础开始,大学就是注重基础,学习能力!
你这是有开发板做测试吧。从你的程序,到你得出的三个结论,最关键的问题就是你对单片机执行程序的速度理解不够造成的,用你思考问题的速度(相当慢的)来考虑单片机的速度(是人思考问题的速度的几千倍,几万倍),所以,得出了错误的结论。
1,实际运行情况是按了一次可以闪烁。可能你只做了一次测试,就得出了这个结论。如果你多做几次,而且每次按键的时间都不同,就会发现有时能闪烁,有时就是灭的,没有规律。
原因:if(K1==0)
{
DELAY_MS(5)
if(K1==0) key=~key
}
这段程序在你按下键并没有松开的时候,并不是只执行一次的,是很多次,与你按键时间长短有关,就是因为单片机执行程序的速度是快的,你慢的思维去考虑就出错了。 key=~key也就变化很多次,是什么,不确定了。
因为按住不松,while(K1==1)条件不满足,就不会闪烁。直到松开,也恰好key=1了,就进入while(K1==1)循环闪烁了。
当你执行多次,按键时间长短不同,就有不会闪烁的时候,那就是key=0了。
2,再按一次却不能关闭。是可能关闭的。如果进入 闪烁状态,再按一次,能否关闭,也不确定,因为key=~key变化还不是一次,还不确定。
3,K1==0应该跳出循环,但是跳不出。其实是可以跳出循环的。
这是因为在闪烁状态下,按键松开的状态下,
while(K1==1)//标记
{
LED1=0
DELAY_MS(1000)//延时长
LED1=1
DELAY_MS(1000)
}要执行完这个循环闪烁,这可是有两个延时的,你再次按键的时间要足够长,等这两个延时结束,才能再判断上面的if(K1==0)。而第二次你按键的时间肯定是短的,所以,误以为不能跳出循环的,但,是可以的,只你按键够长。可是,跳出循环,再按键,是什么状态,还是不确定。
根据以上的分析,你的程序应该怎么改,应该知道了吧。