❶ 用C语言编写一个单片机控制LED灯闪烁变化的编程 急用!!!!!!!!!
C语言实现LED灯闪烁控制配套51单片机开发板。
#include //包含单片机寄存器的头文件
/****************************************
函数功能:延时一段时间
*****************************************/
void delay(void) //两个void意思分别为无需返回值,没有参数传递。
{
unsigned int i; //定义无符号整数,最大取值范围65535。
for(i=0;i<20000;i++) //做20000次空循环。
; //什么也不做,等待一个机器周期。
}
/*******************************************************
函数功能:主函数 (C语言规定必须有也只能有1个主函数)。
********************************************************/
void main(void)
{
while(1) //无限循环。
{
P0=0xfe; //P1=1111 1110B, P0.0输出低电平。
delay(); //延时一段时间。
P0=0xff; //P1=1111 1111B, P0.0输出高电平。
delay(); //延时一段时间。
}
}
单片机驱动LED灯的源程序:
#include<reg52.h> //头文件。
#define uint unsigned int
#define uchar unsigned char
sbit LED1=P1^7; //位定义。
void delay_ms(uint);//mS级带参数延时函数。
void main()
{
while(1)
{
LED1=0;
delay_ms(1000);
LED1=1;
delay_ms(1000);
}
}
void delay_ms(uint z) //延时子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
(1)延时器开关灯单片机程序扩展阅读:
单片机应用分类:
通用型:
这是按单片机(Microcontrollers)适用范围来区分的。例如,80C51式通用型单片机,它不是为某种专门用途设计的;专用型单片机是针对一类产品甚至某一个产品设计生产的,例如为了满足电子体温计的要求,在片内集成ADC接口等功能的温度测量控制电路。
总线型:
这是按单片机(Microcontrollers)是否提供并行总线来区分的。总线型单片机普遍设置有并行地址总线、 数据总线、控制总线,这些引脚用以扩展并行外围器件都可通过串行口与单片机连接。
另外,许多单片机已把所需要的外围器件及外设接口集成一片内,因此在许多情况下可以不要并行扩展总线,大大减省封装成本和芯片体积,这类单片机称为非总线型单片机。
控制型:
这是按照单片机(Microcontrollers)大致应用的领域进行区分的。一般而言,工控型寻址范围大,运算能力强;用于家电的单片机多为专用型。
通常是小封装、低价格,外围器件和外设接口集成度高。 显然,上述分类并不是惟一的和严格的。例如,80C51类单片机既是通用型又是总线型,还可以作工控用。
参考资料来源:网络-单片机
❷ 51单片机如何用一个定时器当多个延时电路用, 就是按下开关一 ,亮三秒。 按下开关二,灯泡亮五秒。
没想法就不会有创新,你的想法就很好。像这种亮灯的程序,对时间要求不是那么严格(如果极其严格就没法实现),那么可以采用如下方法实现你的要求:
//假设晶振12MHZ,按键输入P1.0,P1.1,P1.2;LED控制P2.0,P2.1,P2.2,都是低电平有效
#include "reg51.h"
unsigned int YSJS1=0;
unsigned int YSJS2=0;
unsigned int YSJS3=0;
sbit KEY1=P1^0;按键
sbit KEY2=P1^1;按键
sbit KEY3=P1^2;按键
sbit LED1=P2^0;灯
sbit LED2=P2^1;灯
sbit LED3=P2^2;灯
void Timer1Init(void) //500微秒@12.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10; //设置定时器模式
TL1 = 0x0C; //设置定时初值
TH1 = 0xFE; //设置定时初值
TF1 = 0; //清除TF1标志
ET1 = 1; //使能定时器1中断
TR1=1; //定时器1开始计时
EA =1; //开总中断
}
void main(void)
{
LED1=1;
LED2=1;
LED3=1;
KEY1=1;
KEY2=1;
KEY3=1;
Timer1Init()
while(1)
{
if(KEY1==0)
{
YSJS=6000;
LED1=0;
}
if(KEY2==0)
{
YSJS=10000;
LED2=0;
}
if(KEY3==0)
{
YSJS=16000;
LED3=0;
}
}
}
void TIMER1(void) interrupt 3 //定时器1中断函数使用默认寄存器组
{
TH1 = 0XFE; //定时器1定时时间=500us
TL1 = 0X0C;
if(YSJS1!=0)
{
YSJS1--;
}
else LED1=1;
if(YSJS2!=0)
{
YSJS2--;
}
else LED2=1;
if(YSJS2!=0)
{
YSJS2--;
}
else LED2=1;
}
❸ 单片机流水灯C语言程序(8个灯,依次点亮每个灯,延时500MS)
单片机流水灯C语言程序的源代码如下:
#include //51系列单片机定义文件
#define uchar unsigned char //定义无符号字符
#define uint unsigned int //定义无符号整数
void delay(uint); //声明延时函数
void main(void)
{
uint i;
uchar temp;
while(1)
{
temp=0x01;
for(i=0;i<8;i++) //8个流水灯逐个闪动
{
P1=~temp;
delay(100); //调用延时函数
temp<<=1;
}
temp=0x80;
for(i=0;i<8;i++) //8个流水灯反向逐个闪动
{
P1=~temp;
delay(100); //调用延时函数
temp>>=1;
}
temp=0xFE;
for(i=0;i<8;i++) //8个流水灯依次全部点亮
{
P1=temp;
delay(100); //调用延时函数
temp<<=1;
}
temp=0x7F;
for(i=0;i<8;i++) //8个流水灯依次反向全部点亮
{
P1=temp;
delay(100); //调用延时函数
temp>>=1;
}
void delay(uint t) //定义延时函数
{
register uint bt;
for(;t;t--)
for(bt=0;bt<255;bt++);
}
(3)延时器开关灯单片机程序扩展阅读
51单片机流水灯的源代码如下
#include<reg51.h>
#include<intrins.h>
voiddelay(inta)
{
inti;
while(a--)for(i=0;i<110;i++);
}
main()
{
inti;
while(1)
{
P0=0xfe;
for(i=0;i<8;i++)
{
P0=_crol_(P0,1);
delay(500);
}
}
}
❹ 想让单片机控制定时器延时闪烁,但是灯却一直亮着,没有达到要的效果(用c语言控制的)
delay()实现里面不能用if来判断TF0,因为程序运行到这时定时计数器还在计数,TH0还没有溢出,TF0还是0;所以你要用个while(!TF0);让程序在这等一下,等到TH0溢出,这时TF0被硬件自动置1,while(!TF0)循环结束,程序继续往下走,这时令TR0=0,关闭定时器。delay()运行完总共延时也就是50毫秒。以方式0为例():
❺ 怎样用单片机做一个简单的流水灯
单片机流水灯代码:#include<reg51.h>//51头文件void delay(int t)//定义延时函数{int j;while(t--){for(j=0;j<500;j++);}}void main(){int i;while(1){for(i=0;i<7;i++)//循环点亮LED,到第7个LED延时一会就结束循环。
在这个单片机流水灯代码中,假设使用的是8051单片机。需要定义8个LED灯,分别连接到P1端口的不同引脚上。然后使用一个循环结构来控制这8个LED灯按照一定的顺序逐个亮起,形成流水灯的效果。
具体来说,使用for循环来控制LED灯的亮灭顺序。在每次循环中,通过给P1端口赋值来控制LED灯的亮灭状态。例如,给P1端口赋值为0x01,那么第一个LED灯就会亮起,其他LED灯则熄灭。然后使用delay函数来延迟一段时间,以便观察到LED灯的亮灭变化。接着再给P1端口赋值为0x02,第二个LED灯就会亮起,其他LED灯则熄灭。以此类推,直到最后一个LED灯亮起为止。
最后,我们需要在程序中定义delay函数,以便实现LED灯的亮灭延迟。这个函数可以通过使用while循环来实现,需要注意的是,在实际应用中,需要根据不同的单片机型号和硬件环境来进行相应的调整和修改。
单片机流水灯的定义
单片机流水灯是一种常见的电子装置,通过单片机控制多个LED灯以一定的顺序逐个亮起,形成流水般的效果。其原理是通过编写程序来控制单片机的输出端口,从而控制LED灯的亮灭状态。在实际应用中,可以使用不同的单片机型号和开发环境来实现流水灯功能,具体的实现方法会因硬件环境和软件工具的不同而有所差异。
一般来说,实现流水灯功能需要以下步骤:首先确定单片机型号和开发环境,并熟悉指令集和寄存器配置。然后确定LED灯的连接方式,并编写程序来控制LED灯的亮灭状态。最后在程序中添加延时函数来实现LED灯的亮灭延迟。在编写程序时,需要注意语法错误和逻辑错误,并进行测试和调试,以确保程序能够正确运行并实现预期的流水灯效果。
❻ 需要一个C语言程序。51单片机控制:按键按一下,延迟1分钟后开灯,灯亮半个小时就熄灭的程序急需!
如果对时间要求不精确,用软延时即可。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit s=P1^0;
sbit led=P1^1;
void delayms(uint i) //1ms延时程序
{
uchar j;
for(;i>0;i--)
{
for(j=0;j<125;j++)//如果延时时间误差较大,可按比例改变125这个数
//取值范围0-255,数值越大,延时越长
{;}
}
}
void delay1s(uint i) //1s延时程序
{
for(;i>0;i--){delay1ms(1000);}
}
void main()
{
led=0;
while(1)
{
if (s==0)
{
delayms(20);
if (s==0);{delay1s(60);led=1; }
}
if(led==1){delay1s(1800);led=0; }
}
}
如果对时间要求精确,则要用到定时器,还要确保电路外接有晶振,并已知晶振频率
❼ 单片机编程,控制LED延时亮灭的程序,
#include<reg51.h>
#include<INTRINS.h>
#defineu16unsignedint
#defineu8unsignedchar
#definePin00x01
#definePin10x02
#definePin20x04
#definePin30x08
#definePin40x10
#definePin50x20
#definePin60x40
#definePin70x80
sbitled1=P1^1;
sbitled2=P1^2;
sbitled3=P1^3;
sbitled4=P1^4;
sbitled5=P1^5;
sbitkg1=P3^1;
sbitkey2=P3^2;
sbitkey3=P3^3;
/****************************************/
voidinit() //初始化函数
{TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
}
/////////////////////////
u8s(){//扫描按键
staticu8ms;
u8t=0;
// if(key1==0)t|=Pin1;
if(key2==0)t|=Pin2;
if(key3==0)t|=Pin3;
if(t!=0x00){
if(ms<100)ms++;
if(ms==5){
returnt;
}
}elsems=0;
return0x00;
}
///////////////////////
typedefstruct{
u16time;//n毫秒后
u8l; //亮的灯
u8m; //灭的灯
}ledcmd;
#defineLED_CMD_SIZE10
codeledcmdlcmd[]={
{0,Pin2,0},//0s后led2亮
{500,Pin4,0,},//0.5s后led4亮
{1000,0,Pin4},//1s后led4灭
{300,Pin3,0,},
{300,Pin4,0,},
{1000,0,Pin4,},
{300,0,Pin2,},
{200,Pin5,0,},
{40,0,Pin5|Pin3},
{500,0,Pin1},
};
voidled_l(u8v){//亮灯程序
P1=P1&(~v);
}
voidled_m(u8v){//灭灯程序
P1=P1|(v);
}
u8ledzt=0xff;//led任务zt为0xff表示待机
u16ledjs;//倒计时
voidled_start(){//启动程序
ledzt=0;
ledjs=lcmd[ledzt].time;
}
voidledcx(){//led流程程序
if(ledzt<LED_CMD_SIZE){
if((ledjs==0)&&(ledzt<LED_CMD_SIZE)){//计时到0
ledzt++;
if(ledzt!=LED_CMD_SIZE){
ledjs=lcmd[ledzt].time;
}
}
if(ledzt>1){//
led_l(lcmd[ledzt-1].l);
led_m(lcmd[ledzt-1].m);
}
}
}
/***********************************/
voidmain()//主函数
{
u8k;
init();//系统初始化
TR0=1;//定时器开始计时
while(1){
if(ledzt==0xff){led1=(kg1!=0);};//led不在运行状态时根据开关改变led1
k=s();//读取按键值
if((k&Pin2)!=0){//key2
if(led1==0&&ledzt==0xff){
led_start();
}
}
if((k&Pin3)!=0){//key3
ledzt=0xff;
led_m(Pin2|Pin4);
}
ledcx();
}
}
/****************************/
voidtimer0()interrupt1//1ms定时器
{
TH0=(65536-1000)/256;//重载初值
TL0=(65536-1000)%256;
if(ledjs>0)ledjs--;
}
❽ 单片机间隔点亮一led灯的C语言程序
以下是一个单片机间隔点亮一LED灯的C语言程序,以8051单片机为例:
c
Copy code
#include
//包含了AT89C51的寄存器定义
void delay(unsigned int xms) //延时函数,xms为要延时的毫秒数
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
void main()
{
P1=0x00; //将P1口全部置为0,防止其它引脚影响
while(1)
{
P1=0xff; //点亮P1口第0个引脚上的LED灯友念行,0xff为二进制的11111111
delay(1000); //延时1秒
P1=0x00; //将P1口全部置好哗为0,熄灭LED灯
delay(1000); //延时1秒
}
}
上述程序的作用是在单片机的P1口上间隔高迟点亮一盏LED灯,每隔1秒钟灯的状态会发生一次变化,即由点亮状态变为熄灭状态,再由熄灭状态变为点亮状态。