单片机控制LED循环 您所在的位置:网站首页 头文件timer0 单片机控制LED循环

单片机控制LED循环

2024-05-29 14:34| 来源: 网络整理| 查看: 265

目录

硬件电路设计

仿真电路设计

程序设计

学习了LED灯的点亮和闪烁后,下面尝试以左移的方式实现LED灯的循环点亮。

硬件电路设计

结合51单片机最小系统的知识,利用AD19画好最小系统电路(未包括电源部分)。

本设计需要实现8个LED灯的循环点亮。LED(发光二极管)正极接+5V电源,负极接单片机P1口,这样只要单片机P1口输出高低电平就可以导通二极管,实现LED灯的点亮与熄灭。

仿真电路设计

仿真电路图与AD原理图画法一致,但应注意仿真最小系统复位电路中电容值取0.1uf,电阻值取100Ω,与AD原理图中有所区别。

程序设计

程序采用Keil5设计,8位LED左移的程序:

/*----------------------------------------------- 名称:IO口高低电平控制??内容:循环左移依次点亮一个LED灯,左移符号? //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include //因为要用到左右移函数,所以加入这个头文件#define?led?P1?????//将?P1口定义为led?后面就可以使用led代替P1口void Delay(unsigned int t); //函数声明/*------------------------------------------------ 主函数------------------------------------------------*/void main (void){ unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255 led=~0x01; Delay(50000); //大约延时450ms while(1) { for(i=0;i

单片机原理及应用(C51语言版) 实验三 指示灯循环控制

实验功能如下:

实现8个LED灯依次点亮的功能:P0.0→P0.1→P0.2→P0.3→ ┅ →P0.7→P0.6→P0.5→ ┅ →P0.0的顺序,无限循环,间隔约50ms。

环境配置:Proteus 7;Keil

步骤:

1.根据实验要求绘制电路图。

? 绘制时(1)选择并摆放电路元件

? ? ? ? ? ? ?(2)摆放电源正负极

? ? ? ? ? ? ?(3)连接各元件,根据需要绘制支线和总线,对于总线上的支线要进行标号

? ? ? ? ? ? ?(4)修改电阻阻值,R1为1k欧,其余均为200欧,以便达到仿真时能使LED灯亮起的电流量

? 绘制完成后电路图如下:

2.在Keil中编写并编译C51程序。

?(1)编写并编译程序,将以.c为后缀的程序文件添加到Source Group里;

?(2)导出.omf为后缀的工程文件;

3.回到Proteus7中,为单片机添加工程文件并仿真;

? 添加工程文件:

? 仿真:8个LED灯依次点亮,无限循环。

四、效果图

目录

一、功能介绍

二、程序实现

1、测试文件test.c

2、定时器T0的配置文件Timer0_Init.h和Timer0_Init.c

2.1定时器配置的步骤? ? ? ??

2.2头文件Timer0_Init.h

2.3定时器T0的初始配置Timer0_Init.c

3、独立按键模块Independentkey.h和Independentkey.c

3.1头文件Independentkey.h

3.2独立按键键值检测Independentkey.c

4.延时函数Delay.h和Delay.c

1.头文件Delay.h

2.延时函数Delay.c

三、程序效果

一、功能介绍

? ? ? ? 用独立按键控制LED灯的循环右移或者左移(中间间隔1s)。按下key1,LED循环右移;按下key2,LED循环左移。间隔时间1s通过设置单片机内部的定时器来实现,当计数记满后,向CPU发出中断请求,中断响应后,CPU开始执行中断程序,完成后再返回执行主程序。

二、程序实现

1、测试文件test.c

#include

#include

#include"Timer0_Init.h"

#include"Independentkey.h"

unsigned char LEDMODE=0;

//定时1s中断

void Timer0_ISR() interrupt 1

{

static int count=0;

count++;

TH0=0xfc;

TL0=0x18;

if(count==1000)

{

count=0;

if(LEDMODE==1)//循环右移

P2=_cror_(P2,1);

if(LEDMODE==2)//循环左移

P2=_crol_(P2,1);

}

}

int main()

{

unsigned char keynum=0;

P2=0xfe;

Timer0_Init();

while(1)

{

keynum=Independentkey();

if(keynum!=0)//判断按下

{

if(keynum==1)

LEDMODE=1;//循环右移

if(keynum==2)

LEDMODE=2;//循环左移

}

}

}

2、定时器T0的配置文件Timer0_Init.h和Timer0_Init.c

2.1定时器配置的步骤? ? ? ??

? ? ? ? ? ? ? ? ①对TMOD赋值。确定是使用定时器T1还是T0,是计数模式(C/T=1)还是定时模式? ? ? ? (C/T=0),还有工作方式的确定。例如:TMOD=0x01(定时器T0,工作方式为1)。

? ? ? ? ? ? ? ? ②初始值的确定。将其写入 TH0、TL0 或 TH1、TL1。假如TMOD=0x01时,需要定时1s。因为此时T0工作在方式1,16位的定时器,最大计数2^16=65536。假设系统晶振为12MHz,

默认12分频,那么一个计数(定时脉冲周期)的时间为,最大有65536个计数所以最大定时65536us=0.65536s。最大定时时间不够1s,所以采用定时1ms,重复1000次。定时1ms,初始值为:65536-1000=64536,化成16进制0xfc18,TH0=0xfc,TL0=0x18。

? ? ? ? ? ? ? ? ③开放定时器中断。以定时器T0为例:EA=1;ET0=1。

? ? ? ? ? ? ? ? ④打开定时器。以定时器T0为例:TR0=1。

2.2头文件Timer0_Init.h

#ifndef __TIMER0_INIT_H__

#define __TIMER0_INIT_H__

void Timer0_Init();

#endif

2.3定时器T0的初始配置Timer0_Init.c

#include

void Timer0_Init()//定时器0,工作方式1

{

TMOD=0x01;

TH0=0xfc;//1ms

TL0=0x18;

EA=1;

ET0=1;

TR0=1;

}

//定时1s中断

//void Timer0_ISR() interrupt 1

//{

// static int count=0;

// count++;

// TH0=0xfc;

// TL0=0x18;

// if(count==1000)

// {

// count=0;

//

// }

//}

3、独立按键模块Independentkey.h和Independentkey.c

3.1头文件Independentkey.h

#ifndef __INDEPENDENTKEY_H__

#define __INDEPENDENTKEY_H__

unsigned char Independentkey();

#endif

3.2独立按键键值检测Independentkey.c

#include

#include"Delay.h"

unsigned char Independentkey()

{

unsigned char keynum=0;

if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);keynum=1;}

if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);keynum=2;}

if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);keynum=3;}

if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);keynum=4;}

return keynum;

}

4.延时函数Delay.h和Delay.c

1.头文件Delay.h

#ifndef __DELAY_H__

#define __DELAY_H__

void Delay(unsigned int Xms);

#endif

2.延时函数Delay.c

void Delay(unsigned int Xms) //@12.000MHz

{

unsigned char i, j;

while(Xms--)

{

i = 12;

j = 169;

do

{

while (--j);

} while (--i);

}

}

三、程序效果

????????按下key1,LED循环右移;按下key2,LED循环左移。循环中间间隔1s。

标签: 单片机控制LED循环_单片机原理及应用 实验三 指示灯循环控制



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有