蓝桥杯单片机led流水灯学习

大一零基础搞蓝桥杯单片机组,多天以来,感觉上手挺难的,将自己的学习笔记拿出来分享
首先是建工程,我用的单片机是IAP15F2K61S2型号的,建的工程是IA89C52的
新建一个文档,保存名称是main.c,接下来一个曾经困扰我的一个设置就是hex文件的生成,我们可以这样设置在这里插入图片描述
点上去后我开始写第一个程序,点亮我的开发板上第一个led灯:

#include "reg52.h"
sbit led0 = P0^0;//定义led0,也就是P0的零号引脚
sbit led1 = P0^1;
int main(){
	P2=0xa0;P0=0x00;
	P2=0x80;P0=0xff;//初始化,暂时不讲了,这里意思是关掉蜂鸣器,P0口转向led灯并全部关闭
	led0=0;//点亮led0,这里1为关闭0为开
	while(1);
}

结果图:在这里插入图片描述
下面讲一下16进制
也就是满16进一,对应关系:

11
22
33
44
10A/a
11B/b
12C/c
13D/d
14E/e
15F/f

然后下面再写一个前面4个灯一起亮的程序
我们知道0,1代表的是灯亮灭,那么四位的二进制数字代表的就是四个灯,也就是为什么使用十六进制
有很多器件也是8个引脚,所以0X**十六进制可以广泛应用于单片机

#include "reg52.h"
sbit led0 = P0^0;
sbit led1 = P0^1;
int main(){
	P2=0xa0;P0=0x00;
	P2=0x80;P0=0xff;
	P0=0xf0;//11110000对应的灯
	while(1);
}

效果图:
在这里插入图片描述

以此推的话P0=0x55就是偶数灯亮,0xaa就是奇数灯亮

接下来我们开始写流水灯

先介绍一下延时的方法,要么就是计数器,中断程序,要么就是延时函数
计数器和中断程序后面写,先讲个最简单的也就是延时函数,通过空循环,让程序延时,原理就是处理每条语句cpu都需要一定时间处理,通过空循环那么可以轻松延时
以下是计算循环次数的方法

1.先计算你单片机的振荡(时钟)周期 T= 1/晶振(11.0592MHZ)

2.一次 i - -操作为12T

3.忽略变量定义,上述延时函数共需时间:921z12T

4.带入T:92112T*z 约为 z ms

可以轻松计算。那么实现延时流水灯的方法已经浮现了
以下是最初的程序

#include "reg52.h"
sbit led0 = P0^0;
sbit led1 = P0^1;
sbit led2 = P0^2;
sbit led3 = P0^3;
sbit led4 = P0^4;
sbit led5 = P0^5;
sbit led6 = P0^6;
sbit led7 = P0^7;
void delayms(unsigned int ms){
	unsigned int i;
	while(ms--){
		for(i=0;i<628;i++);
	}
}
int main(){
	P2=0xa0;P0=0x00;
	P2=0x80;P0=0xff;
	while(1){
		led7=1;
		led0=0;
		delayms(500);
		led1=0;
		led0=1;
		delayms(500);
		led2=0;
		led1=1;
		delayms(500);
		led3=0;
		led2=1;
		delayms(500);
		led4=0;
		led3=1;
		delayms(500);
		led4=1;
		led5=0;
		delayms(500);
		led5=1;
		led6=0;
		delayms(500);
		led6=1;
		led7=0;
		delayms(500);
	}
}

效果视频就不播放了
但是这个程序是不是有点冗长呢?
那么看这样
led0显示是P0状态是11111110
led1显示是P0状态是11111101
led2显示是P0状态是11111011

那么我们想到左移右移运算符
我们只需要让1往左移i位是不是就可以了然后取反就是我们所要的情况
下面上码!

#include "reg52.h"
sbit led0 = P0^0;
sbit led1 = P0^1;
sbit led2 = P0^2;
sbit led3 = P0^3;
sbit led4 = P0^4;
sbit led5 = P0^5;
sbit led6 = P0^6;
sbit led7 = P0^7;
void delayms(unsigned int ms){
	unsigned int i;
	while(ms--){
		for(i=0;i<628;i++);
	}
}
int main(){
	unsigned int i;
	P2=0xa0;P0=0x00;
	P2=0x80;P0=0xff;
	while(1){
		for(i=0;i<8;i++){
			P0=~(1<<i);
			delayms(500);
		}
	}
}

好了,这样流水灯就做出来了
今天就到这吧

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值