二进制
书中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”;
若想点亮2468灯,则二进制代码为01010101,16进制代码为“55”;
下面实现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自身不支持格式化,因此需要安装插件来实现代码的自动排版
封装函数
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,但是这里不知道是怎么回事,定义的时候竟然反过来了。这个问题暂且留待以后解决。
飞云脚本圈: 586333520
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 郭天祥51单片机开发教程学习(2)