转行搞硬件。。acm算是走到头了,毕竟电子是自己专业的特色。。
初撸单片机,买的板子是STC89C52(某宝58大洋淘来的。。) 郭天祥新概念的那本书(好像有点不配套不过凑活着弄了也。。)
说一下容易犯的错误吧。
1.串口驱动搞了1个多小时。。一直安装不上,后来跟着教程做的
2.书上写的控制LED端口的是P1 ,但实际上买的这快板子是P2 ,最开始搞了半天老是点不亮灯,后来一想会不会端口错了,换成0试试?换了不行,又换了2.。亮了(这是个问题,以后要找学长问问,怎么根据开发板看出来每个模块的端口?我找了一会也没找到。。)
3.工程式的代码敲起来有点不太习惯。。而且吐槽一下Keil 4 ,没缩进还能不能愉快的玩耍了。。
内容:
一:LED工作原理
贴张原理图。。
最开始看书上讲的原理很抽象。。这张图不错,很清楚
二:代码实现流水灯
基本思路:初始化状态为1111 1110 即只有最左边的灯亮,然后间隔性的往右移动0,(用到位移函数_crol_(a,b) 将a左移b位,循环左移并非像<< 运算似的最低位补0,右移自己脑补) 用到延时函数。。其实就是用循环卡住,大约O(24700000)==10ms
#include<reg52.h>
#include<intrins.h>
#define GPIO_LED P2
#define uint unsigned int
#define uchar unsigned char
void Delay10ms(uchar n);
void main()
{
uchar i;
GPIO_LED=0xfe;//1111_1110
while(1)
{
for(i=0;i<7;i++)
{
GPIO_LED=_crol_(GPIO_LED,1);
Delay10ms(1);
}
for(i=0;i<7;i++)
{
GPIO_LED=_cror_(GPIO_LED,1);
Delay10ms(1);
}
}
}
void Delay10ms(uchar n)
{
uchar i,j,k;
while(n--)
{
i=50;
while(i--)
{
j=38;
while(j--)
{
k=130;
while(k--);
}
}
}
}