导语
根据前面对51单片机的了解和基础理论知识的掌握,经过自己的焊接或钞能力手中有了开发板,就开始了正式的单片机学习实践。
在前续知识的了解和掌握就进入了程序编写以及电路调试等工程开展中,真正做到理论与实践结合。
通过查看原理图可知,主要有P0端口,P1端口,P2端口,P3端口等,这些端口占了端口的大部分,除此之外还有复位端口Rst,时钟电路XTLin和XTLout,电源和其他功能端口,在大多数时候,我们都将使用P0到P3这些端口。
LED
简介
Led为发光二极管光源。此种光源具有体积小、寿命长、效率高等优点。由等半导体材料制成的、直接将电能转变成光能,效率很高。当加上一定的正向电流时,Led发光,并呈现相对稳定的正向电压,随电流变化不明显。
正负极区分
直插
- 单色LED有两根引脚,这两根引脚有正、负极之分。长脚为正。
- 当长短脚无法观察时,可从侧面观察两条引出线在管体内的形状.较小的是正极,较大的类似于碗状的是负极
- 也可通过万用表的蜂鸣挡区分,通过调整红黑表笔在LED的顺序使得LED发光,此时红表笔所在的引脚为正极。
贴片LED
- 有色点的为负极,相对的为正极。
- “T”一横的一边是正极,相对的为负极。
- 三角形底边靠近的是正极,顶角靠近的是负极。
- 带小缺角那端就是负极,另一端是正极。
管压降
当电流过LED以后相对于同一参考点的电势(电位)变化称为电压降,简称压降。通常二极管的管压降在0.7V左右,在LED中,红色LED在2v-2.2v,绿色在3v-3.2v,白色蓝色在3.5v。
流水灯电路
正极通过限流电阻连接到5V,负极连接到P1端口。也就是说,当阴极为低电平时,LED通过电流,被点亮。反之LED熄灭。
软件程序
位定义
通过sbit关键字定义IO,是C51专有的关键字。
sbit LED0=P1^0;//LED0
sbit LED1=P1^1;//LED1
sbit LED2=P1^2;//LED2
sbit LED3=P1^3;//LED3
sbit LED4=P1^4;//LED4
sbit LED5=P1^5;//LED5
sbit LED6=P1^6;//LED6
sbit LED7=P1^7;//LED7
延时函数
编写延时函数,实现延时的功能,传参为延时时间,无返回值。
其内部实现与单片机的运行速度有关,主要原理是,单片机在运行程序时,每一条指令会占用单片机的一个机器周期,如12M外部京真心,一条指令会占用1ms时间。通过for循环使得单片机进行大量运算,占用大量机器周期达到目的。延时计算不准确,可通过stc-isp软件生成更精准的值。
void delay_ms(unsignedchar ms)
{
unsignedint i,j;
for(i=0;i for(j=0;j<333;j++);
};i++)
主函数
void main(void)
{
while(1)
{
LED0=0;delay_ms(1000);LED0=1;//LED0点亮,其余熄灭
LED1=0;delay_ms(1000);LED1=1;//LED1点亮,其余熄灭
LED2=0;delay_ms(1000);LED2=1;//LED2点亮,其余熄灭
LED3=0;delay_ms(1000);LED3=1;//LED3点亮,其余熄灭
LED4=0;delay_ms(1000);LED4=1;//LED4点亮,其余熄灭
LED5=0;delay_ms(1000);LED5=1;//LED5点亮,其余熄灭
LED6=0;delay_ms(1000);LED6=1;//LED6点亮,其余熄灭
LED7=0;delay_ms(1000);LED7=1;//LED7点亮,其余熄灭
}
}
通过while(1)使得函数循环运行,通过定义的IO名称对单个IO进行操作,在多个操作时十分容易出错,所以也可以对IO进行总线操作。
总线IO
当我们使用大量的IO时候,可进行总线操作,对端口直接赋值,可将端口直接看作unsigned char的变量。
P1=0xfe;//相当于二进制 1111 1110
//即P1.1 - P1.7写入1,P10写入0,LED0点亮
对此,我们可以使用位运算操作P1端口。
void main(void)
{
while(1)
{
unsignedchar temp=0xfe,i;
temp=0xfe; // 1111 1110
for(i=0; i< 8; i++)
{
LED= temp;
temp=(temp<<1) | 1; //1111 1101
delay_ms(1000);//延时1s
}
}
}
1111 1110 << 1 = 1111 1100,向左移动空位补零
1111 1100 | 1 = 1111 1101,即1111 1100 | 0000 0001。有1则1。最低位补1;
同样,我们也可以使用数组对其操作。
数组
我们通过盒中与里面的东西来表示。
变量的类型相当于盒子的大小,char可以装255个,int可以装65535个,使用什么数据类型取决于数据的范围,范围大,需要的盒就大。大盒子装的多,占用地方(内存)也多。
一个盒子有唯一的一个名字,称为变量名,给他装上东西,称为赋值。这些盒子没什么联系,当然也有一些盒子里面装了一些小盒子,不过只有大盒子有名字叫LED_DAT,小盒子只能通过大盒子才能获得自己的名字。老大在大盒子里排第一个,我们叫他LED_DAT[0],以此类推。当然,我们再给大盒子装东西的时候就需要考虑,有多少数据,因为有多少数据就需要多少盒子。盒子用多大的,因为盒子大了需要占地方。
因此我们定义了整个大盒子
unsignedchar LED_DAT[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
我们选择了unsigned char类型的盒子,因为里面最大的数据也没超过unsigned char的表示范围。同时,我们装了{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}这些数,编译器将数据数出来创建了一个可以装8个unsigned char小盒子的大盒子起名为LED_DAT;并通过LED_DAT[下标]访问或修改里面小盒子的值。
unsignedchar LED_DAT[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void main(void)
{
while(1)
{
unsignedchar i;
for(i=0;i<8;i++)
{
P1=LED_DAT[i];
delay_ms(1000);
}
}
}
在这个里面,我们通过LED_DAT[i]获得了里面的值,并写入了P1,实现了流水灯的效果。
不太建议使用_crol_()这些循环左移和循环右移函数,建议位运算直接干,位运算YYDS。
快去实现你的炫酷流水灯吧。
-
led
+关注
关注
240文章
23102浏览量
657872 -
51单片机
+关注
关注
273文章
5697浏览量
123081
发布评论请先 登录
相关推荐
评论