用C语言编写,单片机控制LED灯并用定时器延时,每隔一秒使LED依次点亮,8 个灯
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C语言编写,单片机控制LED灯并用定时器延时,每隔一秒使LED依次点亮,8 个灯相关的知识,希望对你有一定的参考价值。
我再帮你补一课,看了你的标题,我写了一个用定时器0来控制一个LED灯第隔1秒钟亮灭一次的程序,希望对你有用,另外我也写了一个你说的那个程序,一起发上来吧****************这个是用定时器0控制一个灯的亮和灭******************************
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
/**************************************/
uchar num;
bit tt;
sbit d=P1^0;
/******************主程序入口********************/
void main()
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
TCON=0x10;
EA=1;
ET0=1;
tt=255;
while(1)
if(num==20)
tt=!tt;
d=tt;
num=0;
void timer() interrupt 1
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
num++;
****************这个程序是逐个点亮的(思路:由256逐减1,值由LED灯显示)***********************
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
/**************************************/
uchar num,tt;
//bit tt;
sbit d=P1^0;
/******************主程序入口********************/
void main()
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
TCON=0x10;
EA=1;
ET0=1;
tt=255;
while(1)
if(num==20)
tt--;
P1=tt;
num=0;
void timer() interrupt 1
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
num++;
参考技术A ‘每隔一秒使LED依次点亮’,其实我没看懂这句话。是每隔一秒亮一个灯,还是。。。追问
每隔一秒亮一个灯,亮完8个灯就停止,不亮了
追答二楼那个就是了呀
追问C语言编写的有没有啊
追答#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar a=0,i=8;
void main()
uchar t;
TMOD=1; //初始化定时器0
TH0=(65535-50000)/256; //设定50ms计时初值
TL0=(65535-50000)%256;
EA=1; //开总中断
ET0=1; //开T0中断
TR0=1; //启动T0定时器
t=0Xfe;
P1=t;
while(i)
if(a==20)
t=_crol_(t,1);
P1=t;
a=0;
i--;
while(1)
P1=0xff; //8个led灯为共阳接法
void time0() interrupt 1
TH0=(65535-50000)/256; //设定50ms计时初值
TL0=(65535-50000)%256;
a++;
void main()
TMOD=0x21; //初始化定时器T0为工作方式
TH0=0x3c; //设定50ms计时初值
TL0=0xb0;
EA=1; //开总中断
ET0=1; //开T0中断
TR0=1; //启动T0定时器
while(1);
//名称:T0中断服务程序
void time0() interrupt 1
中断20次向下执行I/O移位就可以了
TH0=0x3c;//定时器重新赋值就可以了 TL0=0xb0;
51单片机led灯控制
关于内容理解:
先读懂51单片机的实验原理图,然后再着手编程。
由图可知
1,led灯接的是单片机的P0口,意味着我们只能用P0口来编程。
2,led灯是共阳极,当给低电平时led灯才会亮,(单片机灌电流能力较强,输出电流较弱,所以一般用共阳极)
3,led所在的P0口是读io口,故使用时用一个变量来做中介
实验效果
实现跑马灯效果,P0^0->P0^7口依次亮且每次只亮一个灯,然后P0^7->P0^0。
实验代码
#include <reg52.h> //此文件中定义了51的一些特殊功能寄存器 #include <intrins.h> //--声明全局函数--// void Delay10ms(unsigned int c); //延时10ms void main() { unsigned char i; unsigned char LED; //--首先赋值LED--// LED = 0xFE; while (1) { //--LED往左闪烁--// for (i = 0 ;i < 7 ; i++) { //--将LED 的值赋给P2口--// P0 = LED; Delay10ms(50); //延时一下,为了让灯有持续点亮的时间 LED = LED << 1; // 将LED里面的值左移一位,然后重新赋给LED LED = LED | 0x01; // 移位后,前面的位为高电平 } //--LED向右显示--// for (i = 0 ;i < 7 ; i++) { P0 = LED; Delay10ms(50); LED = LED >> 1; // 右移 LED = LED | 0x80; // 移位后,后面的位为高电平 } } } void Delay10ms(unsigned int c) //误差 0us { unsigned char a, b; //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--// for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--); } } }
扩展:实现流水灯
一次点亮P0^0->P0^7
#include <reg52.h> //此文件中定义了51的一些特殊功能寄存器 #include <intrins.h> //--声明全局函数--// void Delay10ms(unsigned int c); //延时10ms void main() { unsigned char i; unsigned char LED; //--首先赋值LED--// while (1) { LED = 0xFE; //--LED往左闪烁--// for (i = 0 ;i < 8 ; i++) { //--将LED 的值赋给P2口--// P0 = LED; Delay10ms(50); //延时一下,为了让灯有持续点亮的时间 LED = LED << 1; // 将LED里面的值左移一位,然后重新赋给LED // LED = LED | 0x01; // 移位后,前面的位为高电平 } //--LED向右显示--// LED = 0x7F; for (i = 0 ;i < 8 ; i++) { P0 = LED; Delay10ms(50); LED = LED >> 1; // 右移 // LED = LED | 0x80; // 移位后,后面的位为高电平 } } } void Delay10ms(unsigned int c) //误差 0us { unsigned char a, b; //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--// for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--); } } }
以上是关于用C语言编写,单片机控制LED灯并用定时器延时,每隔一秒使LED依次点亮,8 个灯的主要内容,如果未能解决你的问题,请参考以下文章