单片机学习之旅 day_1
一、安装必要软件
1,keil uvision5 点此链接前往官网下载
2,STC-ISP 点此链接前往官网下载
tips:上述两程序均为完成本文时对应程序的最新版本,链接均指向官网链接
二、创建空工程
启动Keil,依次点击Project→New uVision Project,选择用于存储工程的文件夹并为工程命名。

随后会弹出选择单片机型号的窗口,本人单片机型号为STC89C52RC,这里选择MicroChip的AT89C52,实际请根据自己单片机型号进行选择。

选择完成后会弹出选择是否加入初始化代码询问的信息,此处通常选择“是”,初学者不知道如何修改启动代码可以选择“否”。

随后依次展开Project窗口的Tatget 1→Source Group 1,右键Source Group 1,点击Add New Item to Group ‘Source Group 1’,命名为main.c,写入如下代码:

void main(){
}
这个工程编译运行后会让你的单片机回到初始状态。
三、点亮LED灯
将光标移动至main.c第一行void之前,右键打开菜单,单击**Insert #include
#include<REGX52.H>

查看单片机LED模块原理图,可知
tips:此处为普中开发板LED模块原理图,不同型号单片机的原理也可能不同,请根据自己单片机型号查找原理图,建议询问自己购买单片机的店铺客服。

此处提供两个实例代码,并说明其作用:
#include <REGX52.H>
void main(){
P2=0xFE;
//此处FE为16进制,转换为二进制为11111110,此代码可以点亮单片机LED模块第一个LED灯
}
#include <REGX52.H>
void main(){
P2=0xFC;
//此处FC为16进制,转换为二进制为11111100,此代码可以点亮单片机LED模块前两个LED灯
}
显然这个程序可以通过一个由8位二进制转换而来的16进制控制单片机的LED灯,8位二进制的0代表灯亮,1代表灯灭,8位二进制从右往左对应单片机的从左往右。
要生成可在STC-ISP下载到单片机的Hex文件需要打开Keil uvision的Creat HEX File选项

四、Led闪烁
打开STC-ISP程序,在工具栏找到软件延时计算器,自由设定定时长度,此处以500ms为例。
tips:注意选择自己单片机型号,此处为STC89

生成C代码并复制粘贴到keil uvision中,完成后续程序。

#include <REGX52.H>
#include <INTRINS.H>
// 此处库INTRINS.H为函数_nop_()所用到的
void Delay500ms(void)
{
unsigned char data i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main(){
while(1){
P2=0xFE; //点亮led灯
Delay500ms(); //延时500ms
P2=0xFF; //熄灭led灯
Delay500ms(); //延时500ms
}
}
五、LED流水灯
由四的LED闪烁我们可以直觉的想到可以让LED灯从左至右依次点亮后熄灭,以下代码可以实现:
void main(){
while(1){
P2=0xFE; //点亮led灯1,1111 1110
Delay500ms(); //延时500ms
P2=0xFD; //点亮led灯2,1111 1101
Delay500ms(); //延时500ms
P2=0xFB; //点亮led灯3,1111 1011
Delay500ms(); //延时500ms
P2=0xF7; //点亮led灯4,1111 0111
Delay500ms(); //延时500ms
P2=0xEF; //点亮led灯5,1110 1111
Delay500ms(); //延时500ms
P2=0xDF; //点亮led灯6,1101 1111
Delay500ms(); //延时500ms
P2=0xBF; //点亮led灯7,1011 1111
Delay500ms(); //延时500ms
P2=0x7F; //点亮led灯8,0111 1111
Delay500ms(); //延时500ms
P2=0xFF; //熄灭所有led灯,1111 1111
Delay500ms(); //延时500ms
}
}
这是一种极其原始的方法,代码繁琐但必定有效,更高阶一些的写法,如unsigned char可以让控制LED的八位二进制的高电平位从右往左移动,对应单片机LED灯从左往右依次点亮后熄灭,实现流水灯的效果。
unsigned char ucled=0x01; //0000 0001
void main(){
while(1){
P2=~ucled;
Delay500ms();
ucled<<=1;
if(ucled==0x00) ucled=0x01; //循环
}
}