51单片机之LED灯
实验要求
LED灯以一秒的频率闪烁众所众知,软件编程的第一个小程序就是打印“hello world”,同样硬件的编程也有他的第一个小程序,那就是LED灯的点亮,如果不做一个这样的小实验,学再多理论也是纸上谈兵。下面我们来实现LED灯闪烁的实验。
物料清单
电容
12M晶振
点阵开关
电阻
LED灯
AT89C52单片机(和51效果一样)
原理图
为了更形象的讲解LED灯闪烁的实验,笔者特意画了LED闪烁的原理图,他们的作用如下:
18脚和19脚接的是12M晶振系统,它是系统时序的由来;9脚所接的是复位系统,当我们按下按键之后,系统会从程序最开始的代码开始运行;
P0.0接了一个电阻和一个LED灯,为什么接这个电阻呢?如果不加电阻,电流过大可能会烧坏LED灯,所以LED灯使用的时候一般都加限流电阻。
复位电路和晶振电路是单片机的固定外围电路,数据手册上已经给出,不需要我们花心思研究。
程序
我们要做的是让单片机控制LED灯以一秒的频率闪烁,这就避免不了写程序,看看现在的硬件产品吧,哪一个硬件产品里面没有集成电路,又有哪一个没有代码的“参与”。所以不要说硬件工程师就只做硬件,写单片机代码也是硬件工程师分内的事。下面把完整代码分享给大家。
#include <reg51.h>
void delay(void)
void main()
{
while(1)
{
P0=0x01;
delay();
P0=0x01;
}
void delay(void)
{
unsigned char a,b,c;
for(c=167;c>0;c--)
for(b=171;b>0;b--)
for(a=16;a>0;a--);
_nop_;
}
}
delay()函数是由单片机小精灵生成的,如果我们自己计算的话太麻烦了。
实验现象
视频加载中...
最后
我们实验的当中只用到了一个LED灯,所以直接用单片机驱动也可以,但是单片机的总的驱动电流就很小,如果LED灯多了的话,51单片机是驱动不了的,这时候就需要外加电源和开关管来驱动LED。
51单片机驱动 LCD1602液晶显示 PROTEUS仿真 LCD指令解释
最近后台有小伙伴留言和我说老师给他们留了一个设计作业要用单片机去驱动LCD1602液晶显示任意字符,我利用空闲时间做了一个小实验,希望能帮到他做一个参考,更希望你们看后能有所收获。
51单片机驱动 LCD1602液晶显示系统 PROTEUS仿真及源代码设计
废话不多说先上实物图
LCD1602+51单片机最小系统应用仿真及制作
好了,接下来正式进入制作环节:
第一步:仿真
绘制好原理图,仿真时单片机最小系统只放一个单片机就可以了,但实际电路中需要加上电源模块、复位模块。如下图:
原理图文件请在附件中找。
原理图绘制好后,编写代码并生成hex文件。参考代码如下:
/*************************功能************************/
/*使用外部中断INTO改变LED状态,并且用1602显示出其状态*/
#include<reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]=" HELLO 1602 ";
uchar code table0[]="1602 TEST ";
uchar code table1[]="RESULT: "; //空格是写到LCD了,即空格也是内容
uchar code table2[]="OK!";
uchar code table3[]="liang";
uchar code table4[]="mie";
uchar num;
sbit led=P1^7;
sbit lcden=P2^0; //液晶使能端
sbit lcdrs=P2^2; //液晶数据命令选择端选择写数据还是写命令
void delay(uint z) // 延时函数
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void write_com(uchar com) //写入
{
lcdrs=0; //LCD 选择输入命令
P0=com; //向P0 口输入命令 39-32端口
delay(5); //延时
lcden=1; //打开LCD 使能
delay(5); //一个高脉冲
lcden=0; //关闭LCD 使能
}
void write_data(uchar date)
{
lcdrs=1; //设置为输入数据
P0=date; //将数据赋给P0 口
delay(5); //延时
lcden=1; //置高
delay(5); //高脉冲
lcden=0; //置低完成高脉冲
}
void init() //LED 初始化
{
lcden=0;
write_com(0x38);//设置16x2 显示5x7 点阵,8 位数据接口
write_com(0x0c); //设置开始显示不显示光标 (指令4)
write_com(0x06); //写一个字符后地址指针加1 (指令3)
write_com(0x01); //显示清零数据指针清零 (指令1)
}
void display(unsigned char *p)//按指针 地址写入数据
{
while(*p!='\0')
{
write_data(*p); //写数据
p++;
delay(1);
}
}
void main()
{
TCON=0x01; //设置中断为INTO
IE=0x81;
led=0;
init();
write_com(0x80); //将数据指针第一行第一个字处,
display(table); //调用函数的方式写入数据
delay(800);
write_com(0x80); //将数据指针第一行第一个字处,
display(table0); //调用函数的方式写入数据
write_com(0x80+0x40); //定义指针位置 将数据指针第二行第一个字处
for(num=0;num<7;num++)
{
write_data(table1[num]);
delay(5);
}
write_com(0x80+0x4c); //按1602的地址单个写入数据
write_data(table2[0]);
write_com(0x80+0x4d); //按1602的地址单个写入数据
write_data(table2[1]);
write_com(0x80+0x4e); //按1602的地址单个写入数据
write_data(table2[2]);
while(1);
}
void key_can() interrupt 0
{
delay(20); // 消除按键抖动
if(P3^3==0)
{
if(P3^3==0)
{
led=!led;
}
if(led==1)
{
write_com(0x80+0x4b);
display(table3);
}
else if(led==0)
{
write_com(0x80+0x4b); //按1602的地址单个写入数据
display(table4);
write_com(0x80+0x4f);
write_data(table1[8]); //按1602的地址单个写入数据
write_com(0x80+0x4e);
write_data(table1[8]);
}
}
}
原理图和代码都有了,仿真的准备工作就完了,现在正式进入仿真。
将代码加载进单片机中,仿真结果如下图:
元器件清单
原件布局及效果图如下:
最后按照要求全部焊接好,上电烧程序测试就可以了。
应该写得够详细了吧,最后,如果有什么意见或者建议欢迎直接给我留言,让我们共同学习一起进步,如果需要完整的代码或设计文件,请在下方留言或者私信我,看到后会第一时间回复。
谢谢!
如果喜欢我的文章请评论转发加关注哦。
相关问答
英语翻译基于 单片机 的 LED显示屏 是由多个独立的 LED 发光二极管...[最佳回答]IsbecomesbasedonthemonolithicintegratedcircuitLEDdisplaymonitorbymanyindependentLEDli...
帮个忙大佬们!求助!!什么是全息 LED 屏?[回答]市场上销售的所谓LED平板电视机就是LED背光。而商铺用的LED广告牌用的就是LED面板。北京航空航天大学出版社,出版的基于51系列单片机的LED显示屏开...
51单片机 怎么用一个按键和一个定时器来模拟PWM控制一个 LED 灯...控制led灯的亮度等级.#include"my51.h"#include"timer0.h"#definegrading20//亮度20级变化...
51单片机 定时器中断控制 led 灯亮灭?1.在设置好TCON(IT0/1=0/1)寄存器,IE寄存器后当设定的外部中断电平被拉低时会执行中断程序,中断程序执行完毕后回到原程序执行处继续执行*2.外部中断TCON设...
关于8个共阴极数码管与 51单片机 相连做显示器的接法?都是并到一...8550是NPN的三极管,你的数码管是共阴还是共阳?给你方案:1共阴数码管,共阴数码管就是说你需要控制发光二极管的正极,而7段的负...
51单片机 如何同时点亮2个 led ?51单片机(也称为8051单片机)可以通过IO口控制LED的点亮和熄灭。要同时点亮两个LED,您可以按照以下步骤操作:1.连接LED:将两个LED连接到单片机的两个IO口上...
对于下面的 51单片机LED 闪烁实验C程序,为什么 LED 会一直不停...[最佳回答]因为你的代码后面的“空白”处都是复位命令,所以你的代码执行完了就复位了,就闪啦。。
89s 51单片机 高电平能驱动 LED 吗?高电平和低电平各是什么范围?不外接上拉电阻时也可以驱动,通过设置IO口的模式为强推挽输出,其输出电流可达20mA,不过手册建议整个芯片电流不超过55mA。一般外接上拉电阻来驱动LED。对于工...
自制的 51单片机 学习板继电器、蜂鸣器有反应 但数码管、 LED 都...2:LED方向是否正确?3:确认数码管是否正确,有共阴共阳之分.线路是否正确?4:用万用表测试脚位电平是否正常.5:检查单片机是否有部分I/O口损坏.或是更换试...
51单片机 用1个按键点亮 LED 灯,另1个按键关?//假设按键输入P1.0,P1.1,LED控制P2.0,都是低电平有效#include"reg51.h"sbitKEY0=P1^0;关灯按键sbitKEY1=P1^1;开灯按键sb...