单片机控制LED循环 | 您所在的位置:网站首页 › 头文件timer0 › 单片机控制LED循环 |
目录 硬件电路设计 仿真电路设计 程序设计 学习了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 实验室设备网 版权所有 |