通过51单片机控制时钟,从而控制时间,来完成闪烁 /***/ /*程序名称:点亮一个P1。0口的发光管*/ /*说 明 :利用软件延时500ms*/ /*操作类型:位操作 */ /*作者 :铁手一郎 /*QQ:347999853
以下是一个简单的51单片机程序,通过按下按键可以实现4种不同状态的灯亮灭,包括正闪、反闪、多种间隔闪。程序中使用了定时器来实现闪烁功能。程序中使用了P1.0到P1.3作为控制灯的引脚,P3.2作为按键的引脚。每当按下按键时,通过判断状态值来切换不同的灯亮灭模式。定时器中断函数用来实现灯的闪
2.连接电路:将LED灯与单片机连接起来。一般情况下,将LED的正极连接到单片机的一个GPIO引脚,将LED的负极连接到电阻,然后将电阻的另一端连接到单片机的地(GND)引脚。确保连接牢固。3.编写程序:使用单片机的编程软件(如Arduino IDE、Keil等),编写控制LED灯的程序。以下是一个简单的示例程序(以Ardu
在无限循环中,不断检测K1和K2按键状态,以改变全局变量“freq”并控制LED灯的闪烁频率;然后使用一个计时器中断服务程序来控制LED灯的闪烁,具体实现方式请参考代码注释。最后,为了保证每个周期的闪烁持续时间与频率相符,应该在循环内部加入一个延时操作,等待一定时间再进入下一次循环。
当单片机LED灯一亮一灭间隔1秒时,可以使用以下代码实现:// 初始化IO口 P1 = 0xFF; // 设置延时时间 while (1) { P1 = 0x00; // 延时1秒 for (int i = 0; i < 10000; i++) { // 空循环 } P1 = 0xFF; // 延时1秒 for (int i = 0; i < 10000; i++) { // 空循
如何用单片机控制LED灯闪烁?
LED1 EQU P1.0 LED2 EQU P1.1 LED3 EQU P1.2 LED4 EQU P1.3 FLAG BIT 00H ORG 0000H LJMP MAIN ORG 000BH LIMP T0ISR ORG 0030H MAIN:MOV TMOD,#01H MOV TH0,#HIGH(65536-50000)MOV TL0,#LOW(65536-50000)SETB ET0 SETB EA CLR FLAG MOV R2,#0 LOOP:CLR LED1 CLR LED
;P1.4小时调整 P1.5分种调整 CODE_SEG SEGMENT CODE DATA_SEG SEGMENT DATA STACK_SEG SEGMENT IDATA K1 BIT P1.4 K2 BIT P1.5 RSEG DATA_SEG KEY_S: DS 1 KEY_V: DS 1 DIS_DIGIT: DS 1 SEC: DS 1 DIS_INDEX: DS 1 HOUR: DS 1 MIN
最好还是自己写,有成就感啊。依次点亮的话可以用循环移位加延时的方法,同时亮只要相应位输出相应电平即可,闪亮的话只要同时亮与全灭间加个延时可以解决。当然也可以用定时中断来定时移位或闪亮,一定要自己想法写出来的才能有深刻的印象。
void int0_int() interrupt 0 //外部中断0中断后程序会自动跳到这里来执行 { led0 = ~led0; //led0的状态取反 } void main(){ EX0 = 1; //开放外部中断0 EA = 1; //开放总中断 IT0 = 1; //下跳沿触发中断 while(1){ ;//就在这里等待中断,在这里CPU可以做其他的事情
[高分]求8051单片机外中断控制发光二极管闪烁的程序及其设计图。
for(n=115;n>0;n--);} void main(void){ unsigned char i,j;while(1){ if(S1==0){ delay_ms(5);if(S1==0){ while(!S1);for(j=0;j>2;i++){ for(i=0;i<7;i++){ P0=~(1<
void main(void){ uint i;uchar temp;while(1){ temp=0x01;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++);} 图需要你
bit LEDDirection = 1; /*声明位变量LEDDirection,用来指示点亮的方向,初始值为1*/ while(1) /*一直循环执行大括号里面的语句*/ { if(LEDDirection) /*当LEDDirection=1时,0000 0001左移LEDIndex位,取反后送给P2端口,点亮一个LED*/ P2 = ~(0x01<
;假设1:D1~D8八个彩灯接在P1口,输出低电平发光 ;假设2:系统晶振为12MHz ;假设3:N = 5 ;程序如下:ORG 0000H MOV R3, #5 ;N=5 LOOP0:MOV A, #0FFH MOV P1, #0FFH ;开始时全灭 ;---逐个点亮 MOV R2, #8 LOOP1: CLR C RLC A MOV P1, A CALL DL500MS DJNZ R
1)P2口的8个脚对应8个LED;设D1灯对应高位,D8灯对应低位;2)P1口的P1.0脚对应XO按钮;P1.1脚对应X1按钮;3)开始时,显示第一种方式:向P2口写入a=01111111,延时0.5S,a 循环右移一位,再延时0.5S,如此反复。4)当收到XO按钮信号后,向P2口写入a=01111111,延时1.5S,a 循环右移
用中断方法来控制流水灯的,,,教教我 是8个LED低电平灯亮接P2口,开始时D1到D8循环亮
通电瞬间,电流通过33R以及22R和发光管向10u充电PNP管同时E、B导通,330K电阻上产生压降,PNP管集电极输出电流通过1K电阻和10n电容流经NPN管B、E,使NPN管导通下面LED点亮,NPN管集电极电流增加,由于33K电阻上的压降与22R的压降差不足以点亮上面的发光管,所以,只有下面的一只LED亮。NPN管导通后其
通电瞬间,电流通过33R以及22R和发光管向10u充电PNP管同时E、B导通,330K电阻上产生压降,PNP管集电极输出电流通过1K电阻和10n电容流经NPN管B、E,使NPN管导通下面LED点亮,NPN管集电极电流增加,由于33K电阻上的压降与22R的压降差不足以点亮上面的发光管,所以,只有下面的一只LED亮。NPN管导通后其
首先,让我们从最基础的单片机控制开始。如果你手头有处理器,如微控制器(MCU)、DSP或ARM等,实现2Hz闪烁简直轻而易举。通过编程,只需使用一个I/O口驱动一个三极管,就能控制LED的亮灭。程序简单地设定I/O口每250毫秒输出一次高电平,接着是低电平,这样LED就会在500毫秒内完成一次闪烁,实现2Hz
用一个三极管控制LED灯让其按固定频率闪烁的原理,就是用1个三极管和电阻、电容组成振荡电路,负载为LED。电路如下:1、RC相移振荡电路 上图是典型的超前型RC相移振荡电路, 它是由一个反相放大器和一个移相反馈网络组成的。反馈网络通过它的某一特定频率的正弦电压移相180°,满足自激振荡的相位平衡条件。
如何用一个三极管控制LED灯让其按固定频率闪烁
1、利用定时/计数器T0从P1.0输出周期为1s的方波,让发光二极管以1HZ闪烁,设晶振频率为12MHz。。2、利用定时/计数器T1产生定时时钟,由P1口控制8个发光二极管,使8个指示灯依次一个一个闪动,闪动频率为10次/秒(8个灯依次亮一遍为一个周期),循环。3、同时用两个定时器控制蜂鸣器发声,定时器0控制
你好:TMOD=0x01,你打开的是定时器T0,却TR1=1启动定时器T1。希望我的回答能帮助到你。
if(++count>10) //没次中断count计数一次,当计数到10,说明100ms到 { count=0;P1=_corl_(num,1);} } 希望我的回答能帮助到你。
用定时/计数器T1定时50ms,晶振频率取12MHz,定时器初值为3CB0H,采用中断方式,用变量计数中断次数。P1口控制8个发光二极管LED灯,每50ms中断,控制一个灯亮/灭一次,中断两次为100ms,闪一次,一秒钟闪10次,闪烁频率为10。仿真图如下图所示。
用定时/计数器T1产生定时时钟,P1口控制8个发光二极管使8个灯依次闪烁,闪烁频率10次/秒,循环
你好,很简单啊: 先定义所需变量:unsigned char count,num; 然后num=0x01; 1.定时器初始化: void inition() { TMOD=0x10; TH1=(65536-10000)/256; //每10ms中断一次 TL1=(65536-10000)%256; //没10ms中断一次 ET1=1;EA=1; TR1=1; } 2.中断程序: void Timer1() interrupt 3 { TH1=(65536-10000)/256; TL1=(65536-10000)%256; if(++count>10) //没次中断count计数一次,当计数到10,说明100ms到 { count=0; P1=_corl_(num,1); } } 希望我的回答能帮助到你。你好: TMOD=0x01,你打开的是定时器T0,却TR1=1启动定时器T1。 希望我的回答能帮助到你。
淘宝买个LED控制电路,你想怎样控制都行
首先要设计led驱动电路,确定使用共阴极还是共阳极,配置好管脚后再根据定时器1使用的时钟频率计算定时器1的实际溢出频率10Hz时的定时器设定值。
很酷的流水灯 #include typedef unsigned char uchar; #define Ton 40 #define LED P0 sbit leds=P1^4; sbit LED0 = P0^0; sbit LED1 = P0^1; sbit LED2 = P0^2; sbit LED3 = P0^3; sbit LED4 = P0^4; sbit LED5 = P0^5; sbit LED6 = P0^6; sbit LED7 = P0^7; unsigned char Maikuan=0; static unsigned char ledon[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; uchar Occupy_led; //占空比越大,灯越亮 bit light; uchar m; void Inittime() { TMOD = 0x02; //定时器0,工作方式2,自动重装 TH0 = 256-Ton; TL0 = 256-Ton; ET0 = 1; EA = 1; TR0 = 1; } //定时器0中断 void time0() interrupt 1 using 0 { Maikuan++; } void main() { unsigned char i = 0,j = 0; //初始化i,j leds=0; Inittime(); while (1) { //第1,3,5,7个灯半亮,其余的全亮。 for(i=254; i>0; i--) { while ( Maikuan!=20) { LED = 0x00; } while ( Maikuan!=200) { LED = 0x55; } Maikuan = 0; } //最难的:8个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,直到第一个。如此循环往复。 for(j = 0;j<=7;j++) { i = 0; while(i!=255) // 由暗变亮 { if( Maikuan == 0) // 点亮 { LED = ledon[j]; } if(Maikuan == i) // 熄灭 { LED = 0xff; } if( Maikuan== 255) { i++; } } } for(j=7;j>=0;j--) { i = 0; while(i!=255) // 由亮变暗 { if(Maikuan == 0) // 熄灭 { LED = 0xff; } if( Maikuan == i) // 点亮 { LED = ledon[j]; } if( Maikuan == 255) { i++; } } } //所有的灯逐渐从暗到全亮,再由全亮到暗。 for (m=254; m>0; m--) { while (Maikuan!=Occupy_led) { LED = 0x00; } while (Maikuan!=127) { LED = 0xff; } Maikuan = 0; if (light) { Occupy_led++; } else { Occupy_led--; } if (Occupy_led==128) { Occupy_led = 127; light = !light; } if (Occupy_led>128) { Occupy_led = 0; light = !light; } } } }
没有问题我可以搞定。
这个很简单的,做毕业设计时间一般充足,建议你复习一下单片机知识很快就能自己写出来了,也可以在网上搜些相关的程序和资料参考,不难的
这个电路很简单,我说一下就可以了。数字式温度传感器用最常用的DS18B20,它只有3个管脚,一个接电源,一个接地,另一个接8051单片机就可以了。温度值用数码管显示。这样整个电路就接好了。如果楼主觉得我回答的可以别忘了给我加分哦,为了你的问题我花费了半天的时间啊。程序如下: #include #include #define uchar unsigned char #define uint unsigned int #define Self_Define_ISP_Download_Command 0x3D sfr IAP_CONTR=0xE7; sbit DQ = P3^5; //DS18B20接入口 uchar code table[]={ 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8,0x80,0x90} ; char bai,shi,ge; //定义变量 void Init_Com(void) { TMOD = 0x20; SM0=0; SM1=1; REN=1; TH1 = 0xFd; TL1 = 0xFd; TR1 = 1; EA=1; ES=1; } /*延时子函数*/ void delay(uint num) { while(num--) ; } /*************DS18b20温度传感器函数*********************/ Init_DS18B20(void) //传感器初始化 { uchar x=0; DQ = 1; //DQ复位 delay(10); //稍做延时 DQ = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us //450 DQ= 1; //拉高总线 delay(20); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(30); } //读一个字节 ReadOneChar(void) { uchar i=0; uchar dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay(8); } return(dat); } //写一个字节 WriteOneChar(unsigned char dat) { uchar i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay(10); DQ = 1; dat>>=1; } delay(8); } //读取温度 int ReadTemperature(void) { uchar a,b; uint t; float tt; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar();//低位 b=ReadOneChar();//高位 tt=(b*256+a)*0.0625*100;//2个8位合成16位 t=(int)tt; /*t=b; t<<=8; t=t|a; tt=t*0.0625; t= tt*10+0.5; */ return(t); } /*显示子函数*/ void display(int bai,int shi,int ge) { int temp; temp=ReadTemperature();//读温度 bai=temp/1000;//显示百位 shi=temp%1000/100;//显示十位 ge=temp%100/10;//显示个位 //xiao=temp%10; P2=0xfd; //位选 P0=0X7f; //显示小数点 delay(500); P2=0xfe; P0=table[bai];//显示千位 delay(500);//一小段延时动态显示 P2=0xfd; P0=table[shi];//显示百位 delay(500); P2=0xfb; P0=table[ge];//显示十位 delay(500); P2=0xf7;// 显示° P0=0x9c; // delay(50); } void main() { Init_Com(); while(1) { display(bai,shi,ge);//显示函数 } } void UART_Interrupt_Receive(void) interrupt 4 { unsigned char k=0; unsigned int a,b; if(RI==1) { RI=0; k=SBUF; if(k==Self_Define_ISP_Download_Command) { for(a=1000;a>0;a--) for(b=100;b>0;b--); //延时约1S IAP_CONTR = 0x60; } } else { TI=0; } }