LED流水灯线路图.docx
《LED流水灯线路图.docx》由会员分享,可在线阅读,更多相关《LED流水灯线路图.docx(65页珍藏版)》请在冰豆网上搜索。
LED流水灯线路图
附件:
图1-1LED灯闪亮时间间隔600ms电路图
程序1-1:
ORG0000H
START:
CLRP1.0
LCALLDELAY
SETBP1.0
LCALLDELAY
LJMPSTART
DELAY:
MOVR5,#60//延时子程序,延时600ms
D1:
MOVR6,#20
D2:
MOVR7,#248
DJNZR7,$
DJNZR6,D2
DJNZR5,D1
RET
END
图2-1LED流水灯线路图
程序2-1:
ORG0000H
LJMPMAIN
ORG0100H
DELAY1:
MOVR7,#200
D1:
MOVR6,#200
D2:
DJNZR6,D2
DJNZR7,D1
RET
DELAY2:
MOVR7,#250
D4:
MOVR6,#250
D5:
DJNZR6,D2
DJNZR7,D4
RET
D3:
MOVP2,A
LCALLDELAY1
RLA
MOVP2,A
LCALLDELAY1
DJNZR5,D3
LCALLDELAY1
MOVP2,#0
LCALLDELAY2
RET
MAIN:
MOVR5,#7
MOVA,#11111110B
LCAllD3
LJMPMAIN
END
图3-1LED数字显示倒计时电路图
程序3-1:
ORG0000H
LJMPMAIN
ORG0100H
CHART:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DELAY:
MOVR7,#10
DEL1:
MOVR6,#200
DEL2:
MOVR5,#248
DJNZR5,$
DJNZR6,DEL2
DJNZR7,DEL1
RET
LOOP:
MOVDPTR,#CHART
MOVA,R2
MOVCA,@A+DPTR
MOVP2,A
LCALLDELAY
DECR2
DJNZR1,LOOP
RET
MAIN:
MOVR1,#10
MOVR2,#9
LCALLLOOP
LJMPMAIN
END
图4-1LED加减按键电路图
程序4-1:
ORG0000H
LJMPSTART
ORG0030H
START:
MOVR2,#1
LOOP:
CALLDISP
JBP1.6,NEXT
CALLDL10MS
JBP1.6,NEXT
JNBP1.6,$
DJNZR2,NEXT
MOVR2,#10
NEXT:
JBP1.7,LOOP
CALLDL10MS
JBP1.7,LOOP
JNBP1.7,$
INCR2
CJNER2,#11,LOOP
JMPSTART
;----------------------------------------
DISP:
MOVA,R2
DECA
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP2,A
RET
DL10MS:
MOVR6,#20
DJNZR7,$
DJNZR6,$-2
RET
;----------------------------------------
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H
DB92H,82H,0F8H,80H,90H
;----------------------------------------
END
图5-1电压超限预警电路图
程序5-1:
ORG0000H
NOLED:
MOVP2,#0
START:
JBP1.0,LED
CALLNOLED
LED:
MOVP2,#1
JMPSTART
END
图6-1电压超限预警报警显示电路图
程序6-1:
#include
#defineucharunsignedchar
#defineuintunsignedint
//===========================
//ADC0809相关引脚定义
//===========================
#defineADC_DATAP1
sbitADC_EOC=P3^3;
sbitADC_CLK=P3^4;
sbitADC_START=P3^6;
sbitADC_OE=P3^7;
//===========================
//4位共阳数码管相关
//===========================
ucharcodeseg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9小数点不亮
ucharcodeseg_dot[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//0~9小数点亮
#defineSEG_DATAP2//数码管段选码,共阳数码管,低电平选通段选码
sbitSEG_SEL_0=P0^3;//数码管位选:
第0位,共阳数码管,高电平选通位选码
sbitSEG_SEL_1=P0^2;//数码管位选:
第1位
sbitSEG_SEL_2=P0^1;//数码管位选:
第2位
sbitSEG_SEL_3=P0^0;//数码管位选:
第3位
//===========================
//警报:
LED与蜂鸣器引脚
//===========================
sbitLED_Y=P0^5;//低电平亮
sbitBEEP=P0^4;//高电平响
sbitLED_R=P0^6;
sbitLED_G=P0^7;
#defineBEEP_ONBEEP=1
#defineBEEP_OFFBEEP=0
#defineLED_Y_ONLED_Y=0
#defineLED_Y_OFFLED_Y=1
#defineLED_R_ONLED_R=0
#defineLED_R_OFFLED_R=1
#defineLED_G_ONLED_G=0
#defineLED_G_OFFLED_G=1
//===========================
//粗略延时函数AT89C51&12MHz
//===========================
voiddelayms(unsignedintms)
{
unsignedchara,b,c;
while(ms--)
{
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
}
/*
//===========================
//粗略延时函数STC12C5A60S2&12MHz
//===========================
voiddelayms(unsignedintms)
{
unsignedchara,b,c;
while(ms--)
{
for(c=1;c>0;c--)
for(b=222;b>0;b--)
for(a=12;a>0;a--);
}
}
*/
//===========================
//定时器初始化,配置ADC0809时钟
//===========================
voidtimer_init(void)
{
//配置定时器0
ET0=1;
TMOD&=0xF0;
TMOD|=0x02;//定时器0,模式2,自动重装定时器
TH0=200;//自动重装值
TL0=200;
TR0=1;
//配置定时器1
ET1=1;
TMOD&=0x0F;//清除定时器1配置,不改动定时器0的配置
TMOD|=0x10;//定时器1模式一,不改动定时器0的模式
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
TR1=1;
EA=1;
}
//===========================
//定时器0中断,为ADC0809提供时钟信号
//===========================
voidtimer0()interrupt1
{
ADC_CLK=~ADC_CLK;
}
//============================
//ADC0809转换函数
//============================
ucharADC0809_GET(void)
{
ADC_START=0;
ADC_OE=0;
ADC_START=1;
ADC_START=0;
while(ADC_EOC==0);
ADC_OE=1;
returnADC_DATA;
}
//============================
//定时器1中断函数,用于刷新数码管
//============================
uchart1_flag=0;//用于标记显示第几位数码管
ucharseg0=0;//第0位数码管的值
ucharseg1=1;//第1位数码管的值
ucharseg2=2;//第2位数码管的值
ucharseg3=3;//第3位数码管的值
voidtimer1()interrupt3
{
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
SEG_SEL_0=0;
SEG_SEL_1=0;
SEG_SEL_2=0;
SEG_SEL_3=0;
SEG_DATA=0xff;
if(t1_flag==0)
{
SEG_SEL_0=1;//选通第0位数码管
SEG_SEL_1=0;
SEG_SEL_2=0;
SEG_SEL_3=0;
SEG_DATA=seg_dot[seg0];//显示带小数点的数
}
elseif(t1_flag==1)
{
SEG_DATA=seg[seg1];
SEG_SEL_0=0;
SEG_SEL_1=1;//选通第1位数码管
SEG_SEL_2=0;
SEG_SEL_3=0;
}
elseif(t1_flag==2)
{
SEG_DATA=seg[seg2];
SEG_SEL_0=0;
SEG_SEL_1=0;
SEG_SEL_2=1;//选通第2位数码管
SEG_SEL_3=0;
}
elseif(t1_flag==3)
{
SEG_DATA=seg[seg3];
SEG_SEL_0=0;
SEG_SEL_1=0;
SEG_SEL_2=0;
SEG_SEL_3=1;//选通第3位数码管
}
t1_flag++;//自加1
t1_flag=t1_flag%4;//让t1_flag在0和3之间循环
}
//============================
//显示电压值,输入0~255,显示0.000~5.000
//============================
uintprint_volt(ucharnum)
{
uintvolt=0;
volt=num/255.0*5000+0.5;//除255.0和除255有很大区别,除255.0会自动转换为float型,小数才能保持,而volt/255=0,+0.5四舍五入。
seg0=volt/1000%10;
seg1=volt/100%10;
seg2=volt/10%10;
seg3=volt%10;
returnvolt;
}
//============================
//主函数
//============================
voidmain(void)
{
ucharadc_num=0;//ADC采集到的值
uintvolt=0;//电压值0~5000,代表(0~5)V
timer_init();//定时器0、定时器1初始化。
LED_Y_OFF;
LED_R_OFF;
LED_G_ON;
BEEP_OFF;
while
(1)
{
adc_num=ADC0809_GET();
volt=print_volt(adc_num);//在数码管上显示电压值,并返回一个0~5000的值,用于判断是否要报警。
if(volt>2500)
{
LED_G_OFF;
LED_Y_OFF;
LED_R_ON;
BEEP_ON;
}
elseif(volt>2400)
{
LED_Y_ON;
LED_G_OFF;
LED_R_OFF;
BEEP_OFF;
}
else
{
LED_G_ON;
LED_Y_OFF;
LED_R_OFF;
BEEP_OFF;
}
delayms(100);
}
}
图7-1128*64LCD读取系统时间并显示
程序7-1:
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
/********各种指令的宏定义********/
#defineLLCD_CMD_WRPBYTE[0x10]//LCD左半部写的命令rs=0,wr=0
#defineLLCD_CMD_RDPBYTE[0x11]//读命令rs=0,wr=0
#defineLLCD_DATA_WRPBYTE[0x12]//写数据rs=1,wr=0
#defineLLCD_DATA_RDPBYTE[0x13]//读数据rs=1,wr=1
#defineRLCD_CMD_WRPBYTE[0x20]//LCD右半部部分
#defineRLCD_CMD_RDPBYTE[0x21]//
#defineRLCD_DATA_WRPBYTE[0x22]//
#defineRLCD_DATA_RDPBYTE[0x23]//
#defineWRITE_SECOND0x80
#defineWRITE_MINUTE0x82
#defineWRITE_HOUR0x84
#defineWRITE_DAY0x86
#defineWRITE_MOUTH0x88
#defineWRITE_YEAR0x8c
#defineREAD_SECOND0x81
#defineREAD_MINUTE0x83
#defineREAD_HOUR0x85
#defineREAD_DAY0x87
#defineREAD_MOUTH0x89
#defineREAD_YEAR0x8d
#defineWRITE_PROTECT0x8E
/*************************/
sbitSCK=P1^1;
sbitDIO=P1^0;
sbitCE=P1^2;
sbitK1=P1^5;
sbitK2=P1^6;
sbitK3=P1^7;
sbitbusy=P0^7;
ucharsec,min,hour,day,mouth,year,print;
ucharbuffer[16];
codeucharshuzi1[]={
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//.
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//空
};
codeucharshijian1[]={
0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,
0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,
0x00,0xF8,0x01,0x06,0x00,0xF0,0x92,0x92,0x92,0x92,0xF2,0x02,0x02,0xFE,0x00,0x00,
0x00,0xFF,0x00,0x00,0x00,0x07,0x04,0x04,0x04,0x04,0x07,0x40,0x80,0x7F,0x00,0x00,
};
codeucharriqi1[]={
0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00,
0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,
0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00,
};
voidlcd_busy_rd(ucharright)
{
if(right==1)
RLCD_CMD_RD;
else
LLCD_CMD_RD;
while(busy);
}
/**********写指令***********/
voidlcd_comd_wr(ucharcmdcode,ucharright)//写指令
{
lcd_busy_rd(right);
if(right==1)
RLCD_CMD_WR=cmdcode;
else
LLCD_CMD_WR=cmdcode;
}
/********对LCD进行读写***********/
voidlcd_data_wr(ucharldata,ucharright)//
{
lcd_busy_rd(right);
if(right==1)
RLCD_DATA_WR=ldata;
else
LLCD_DATA_WR=ldata;
}
/********延时函数*******/
voiddelay(uintnms)
{
uinti;
while(nms--)
for(i=0;i<500;i++);
}
/****lcd初始化*******/
voidlcd_init(void)
{
uintk;
lcd_comd_wr(0x3e+1,0);//左半部显示开
lcd_comd_wr(0xc0+0,0);//左半部顶行