郭天祥51单片机开发教程学习(2)

file

二进制

书中P11有详细讲解。

用0、1两个数字来表示数值,就是二进制(Binary)。
例如,数字 0、1、10、111、100、1000001 都是有效的二进制。
在单片机、计算机内部,数据都是以二进制的形式存储的。

十六进制

用A来表示10,B表示11,C表示12,D表示13,E表示14,F表示15,因此有 0~F 共16个数字,基数为16,加法运算时逢16进1,减法运算时借1当16。
例如,数字 0、1、6、9、A、D、F、419、EA32、80A3、BC00 都是有效的十六进制。

在线进制转换

支持在2~36进制之间进行任意转换,支持浮点型

在线工具

LED操作

点亮1357LED

书中P33

#include <reg52.h>
void main() {
P1=0xaa;   //点亮1357LED
while(1);
}

代码编写好以后,ctrl+s保存,按F7构造目标。
hex文件将会自动输出到工程目录下。
在STC烧录软件里,重新打开程序文件,再次进行冷启动烧录。
观察代码的运行效果。

点亮第一个LED

#include <reg52.h>
void main() {
P1=0xfe;   //点亮1 LED
while(1);
}

第一个LED闪烁

书中P35代码

#include <reg52.h>
#define uint unsigned int   //宏定义

sbit led1=P1^0;   //声明单片机P1口的第一位
uint i,j;

void main() {
while(1) {
led1=0;   //点亮第一个led

//延时
for(i=1000;i>0;i--) {
for(j=100;j>0;j--) {

}
}

led1=1;   //关闭第一个led

//延时
for(i=1000;i>0;i--) {
for(j=100;j>0;j--) {

}
}

}
}

小结

通过以上代码测试,若想点亮led,则在二进制中写1即可。
同理,熄灭led,则在二进制中写0。
例如,由于学习板上共有8个led,想点亮1357灯,则二进制代码为10101010,使用进制转换工具,将二进制转换为16进制,则为“aa”;

file

若想点亮2468灯,则二进制代码为01010101,16进制代码为“55”;

file

下面实现1357和2468交替闪烁:

#include <reg52.h>
#define uint unsigned int   //宏定义

// sbit led1=P1^0;   //声明单片机P1口的第一位
uint i,j;

void main() {
while(1) {
P1=0xaa;   //点亮1357

//延时
for(i=1000;i>0;i--) {
for(j=100;j>0;j--) {

}
}

P1=0xff;   //关闭全部

//延时
for(i=1000;i>0;i--) {
for(j=100;j>0;j--) {

}
}

P1=0x55;   //点亮2468   

//延时
for(i=1000;i>0;i--) {
for(j=100;j>0;j--) {

}
}

P1=0xff;   //关闭全部   

//延时
for(i=1000;i>0;i--) {
for(j=100;j>0;j--) {

}
}

}
}

keil代码格式化

由于keil自身不支持格式化,因此需要安装插件来实现代码的自动排版

参考教程

file

封装函数

1357和2468交替闪烁(书中P40代码)

#include <reg52.h>
#define uint unsigned int   //宏定义

//延时
void sleep(uint delay){
    uint i, j;
    for(i = delay; i > 0; i--){
        for(j = 100; j > 0; j--);
    }
}

void main(){
    while(1){
        P1 = 0xaa; //点亮1357
        sleep(1000);  //延时
        P1 = 0xff; //关闭全部
        sleep(500);  //延时
        P1 = 0x55; //点亮2468
        sleep(1000);  //延时
        P1 = 0xff; //关闭全部
        sleep(500);  //延时
    }
}

流水灯

书中P43代码,稍有优化。
原书中,aa变量的定义,在主函数main之外,是全局变量。
这里将这个变量放在了main之内,作为局部变量使用。并在定义的时候直接给了一个初始值。

#include <reg52.h>
#include <intrins.h>
#define uint unsigned int   //宏定义
#define uchar unsigned char   //宏定义

//延时
void sleep(uint delay)
{
    uint i, j;

    for(i = delay; i > 0; i--)
    {
        for(j = 100; j > 0; j--);
    }
}

void main()
{
    uchar aa = 0xfe;     //点亮第一个LED:11111110

    while(1)
    {
        P1 = aa;
        sleep(100);  //延时
        aa = _crol_(aa, 1);
    }
}

这里面存在一个问题,就是点亮LED的二进制代码,按照前文的定义,应该是10000000,但是这里不知道是怎么回事,定义的时候竟然反过来了。这个问题暂且留待以后解决。

1. 官方交流QQ群,添加多个不批。建议使用安卓手机或电脑申请。
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
EasyClick学习交流①群:737066890
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 郭天祥51单片机开发教程学习(2)

企业级大数据智能营销管理系统

了解详情