时值2021暑假,兜某申请留校,开始51单片机学习之路。
正文开始之前,得感谢实验室学长的帮助
正文
c51对现在得我来说,就是一块可以被点亮得板子,从io口到寄存器,实际上我都是一知半解,那么我就从我的角度来讲一讲吧,在代码世界里0和1构成了全部,那么代码时如何干涉现实得呢,答案是电路,电路的开合构成了代码干涉现实的基础。
跑流水灯之前,首先得让灯亮起来,单片机上电之后,led模块由于它所具有的上拉电阻(我也不太能理解这个玩意)所表现得是高电平,而点亮他,只需要给它对应的Io(输入输出端)接上低电平即可也就是赋0(兜某使用的普中板子,led对应io是P2);所以不管是给P2(io总线)整体给0,还是P2下的0-7分线赋值0,都可。
例程1,点亮led模块第一个灯
#include<reg52.h>
sbit led=P2^0;
void main()
{
led=0;
}
sbit位,简单来讲就是告诉编译器,这个P2的孩子0-7中的某一个,他不听话,你不要给他供电了,然后这个孩子觉得不满,表现出来就是亮了(随口一说)
例程2,点亮所有led灯
#include<reg52.h>
sbit led1=P2^0;
sbit led2=P2^1;
sbit led3=P2^2;
sbit led4=P2^3;
sbit led5=P2^4;
sbit led6=P2^5;
sbit led7=P2^6;
sbit led8=P2^7;
void main()
{
led1=led2=led3=led4=led5=led6=led7=led8=0;
}
笑死了,简单粗暴吧,哈哈哈。
#include<reg52.h>
#define uint unsigned int
void main()
{
while(1)
P2=0x00;
}
也可以这样,这块有意思的i地方就是十六进制的问题了,因为普中板的P2总线下有八个led而前文说过要想让Led处于亮的状态只需要给它0,那么,对总线赋00000000就ok,由于十六进制转二进制0x00就是00000000,所以,给P2这个值即可。
十六进制赋总线数0xaa=10101010,0的位置亮1的位置灭(单片机内部都是以二进制存储的,只要是同一个数值的数就可,所以十六进制转十进制P2=170也能完成同样的效果)
流水灯实现的第二步
你可以通过十六进制自由的选择自己想让那个io口的led亮起之后,自然的就开始考虑,如何让led闪烁起来了,如何闪烁呢,你肯定想到了,给他不断地赋值0和1,它就闪起来了,你想的一点都没错,那么例程一来了
#include<reg52.h>
sbit led=P2^0;
void main()
{
while(1){
led=0;
led=1;
}}
你观察一下,你的肉眼能区分到它的闪烁嘛?
答案是不行
为啥呢,因为闪的太快了,肉眼无法观察到,那么,接下来要做的就是对它进行延时,你给暗下去的那个过程延时,它自然就能观察到明显的明暗现象了。
#include<reg52.h>
#define uint unsigned int
sbit led=P2^0;
void delay();
void main()
{
while(1){
led=0;
delay();
led=1;
delay();
}}
void delay()
{
uint i,j;
for(i=500;i>0;i--)
for(j=110;j>0;j--)
;
}
延时的奥义就是给一个循环,给他进行无意义计算,拖慢进程,所以,那个分号别忘记写哦。
关于延时函数在此不予赘述,嗯,留一个可调用的函数就欧克,
void delayms(unsigned int xms){
uint i,j;
for(i=xms;i>0;i--)
for(j=110;J>0;j--)
;
}
//i=xms极为延时约xms毫秒
如何使用延时对它进行流水灯的点亮呢
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit led1=P2^0;
sbit led2=P2^1;
sbit led3=P2^2;
sbit led4=P2^3;
sbit led5=P2^4;
sbit led6=P2^5;
sbit led7=P2^6;
sbit led8=P2^7;
void delayms(unsigned int xms){
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--)
;
}
//i=xms极为延时约xms毫秒
void main()
{ while(1){
led1=led2=led3=led4=led5=led6=led7=led8=0;
delayms(500);
led1=led2=led3=led4=led5=led6=led7=led8=1;
delayms(500);
led1=0;delayms(500); led1=1;
led2=0;delayms(500); led2=1;
led3=0;delayms(500); led3=1;
led4=0;delayms(500); led4=1;
led5=0;delayms(500); led5=1;
led6=0;delayms(500); led6=1;
led7=0;delayms(500); led7=1;
led8=0;delayms(500); led8=1;
}
}
就像这样,是不是很繁琐,ok,下面说不繁琐的,先上代码
/流水灯 调用左右移函数在inteins.h文件下的_crol_(,)和_cror_(,)具体分辨以最后一位分辨l——left,r——right;
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delayms(unsigned int xms){
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--)
;
}
uchar led;
void delay();
void main()
{
led = 0xfe;
P2 = led;
while(1)
{
led = _cror_(led,1);
P2 = led;
delayms(500);
}
}