导航:首页 > 操作系统 > 基于51单片机的智能控制灯的设计

基于51单片机的智能控制灯的设计

发布时间:2022-06-29 19:23:26

‘壹’ 基于51单片机控制交通灯的电路图与C语言程序

思路:

红灯停,绿灯行,黄灯闪烁提示行人红绿灯即将切换。四个方向各有一个红、黄、绿显示和两个数码管。

东西道为人行道(20秒),南北道为车行道(60秒),黄灯延时最后三秒时,闪烁并切换。

三、硬件电路设计

此电中路设计采用AT89C51单片机,74LS47(数码管驱动)74LS373(数码管驱动输出锁存),8个数码管显示其延时值,四个红、黄、绿指示灯。硬件设计关键在于,延时显示时,要考虑到当个位数字显示时,要确保十位数字显示输出的不变。因此,可加输出锁存器。在延时最后三秒时,要让黄灯进行闪烁,并同时显示数字(这一步在软件设计上很关键)。

四、软件程序(C语言)

以下是整个设计的软件程序,直接可以编译成*。Hex代码。通过以上电路,下载到单片机,可直接运行。

//*****************************//

//程序名:十字路口交通灯控制

//编写人:黄庭剑

//初写时间:2009年1月2日

//程序功能:南北为车行道,延时60秒;东西方向为人行道,延时20秒,且在最后3秒黄灯显示2秒钟再实现切换.

//CPU说明:AT89C51型单片机;24MHZ晶体振荡器

//完成时间:2009年1月6日

//*****************************//

#include<stdio.h>

#include<reg51.h>

#include<intrins.h>

sfrp0=0x80;

sfrp1=0x90;

sfrp2=0xA0;

sfrp3=0xb0;//这部分内容其实在“#include<reg51.h>”里已经有,但里面定义的必须区分大小写,在这里,因为我程序采用的是小写,reg51.h里对各个端口与寄存器的定义都是大写,所以在编译连接时,会报错,所以,在本设计程序里,我只用到了端口,在这里也就只定义了四个,而没有去改reg51.h里面的内容。其实两者是一样的。

sbitsw=p0^0;

sbitOE=P0^6;

sbitLE=P0^7;//74LS373锁存器控制端定义

chardisplay[]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};//p1口的数码管时间显示调用,利用74L74BCD码,8位驱动输出;

//函数声明begin

voiddelay1(intcount);

voiddelay_long(intnumber1,intnumber2);

voidpeople_car_drive();

//函数声明end

//***********************//延时子程序

voiddelay1(intcount)

{inti;

for(i=count;i>0;i--)

{;}

}

voiddelay_long(intnumber1,intnumber2)

{

inta,b;

for(a=number1;a>0;a--)

{

for(b=number2;b>0;b--)

{_nop_();}

}

}

//**********************//延时子程序

voidpeople_car_drive()

{

intp_1=2,i,j=9,p_2=6;//****************//行人通行时,延时20秒

p2=0x09;//南北红灯亮

p3=0x24;//东西绿灯亮

while(p_1-->0)

{LE=1;

OE=0;

if(p_1==0){OE=1;}//当十位数减到0时,只显示个位数

p1=display[p_1];

delay1(1000);

LE=0;

j=9;

for(i=10;i>0;i--)

{

if(p_1==0&&j==3)break;//减到3时退出循环,让其黄灯闪烁显示

p1=display[j--];

delay_long(16000,2);

if(sw==1)return;

}

}

//*******************************************************************************//

p2=0x12;//南北黄灯闪烁三秒,以提醒行人注意

p3=0x12;

p1=display[3];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);

p2=0x12;

p3=0x12;

p1=display[2];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);

p2=0x12;

p3=0x12;

p1=display[1];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);

//*****************以下是车辆通行时延时60秒//

p2=0x24;//南北绿灯亮

p3=0x09;//东西红灯亮

while(p_2-->0)

{LE=1;

OE=0;

if(p_2==0){OE=1;}//当十位数减到0时,只显示个位数

p1=display[p_2];

delay1(1000);

LE=0;

j=9;

for(i=10;i>0;i--)

{

if(p_2==0&&j==3)break;//减到2时退出循环

p1=display[j--];

delay_long(16000,2);

if(sw==1)return;

}

}

p2=0x12;//南北黄灯闪烁三秒,以提醒行人注意

p3=0x12;

p1=display[3];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);

p2=0x12;

p3=0x12;

p1=display[2];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);

p2=0x12;

p3=0x12;

p1=display[1];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);//南北黄灯闪烁三秒完毕

}

voidmain()//主函数入口处

{

p0=0x01;

p1=0x00;

p2=0x00;

p3=0x00;//初始化各端口

{while(1)

{

if(sw==0)

{people_car_drive();}

else

{

p2=0x00;

p3=0x00;//关闭所有交通灯

}

}

}

}

详情访问:http://hi..com/hjiannew/

‘贰’ 设计一个STC51单片机控制的RGB三基色LED灯光模式控制系统。

你最起码要做一个恒流源,给LED供电。D/A转换模块。控制电流的大小。然后调节个个灯的电流变化就可以了,应该有那种调光IC卖的,让单片机直接控制调光IC就可以了。

调光IC自带恒流输出,这样就省事了。

‘叁’ 求基于单片机的智能照明系统的程序设计

这是我做的光敏电阻电压采集设计,可以将监测到的电压值显示在led上面,同时也能把它发给PC,用串口调试就能接受,4800b/s里面可能对你有些启发

/*-------------------------------------------------------------------------
AD0809的工作频范围为10KHZ-1280KHZ,当频率范围为500KHZ时,其转换速度为128us
飞翔的雄鹰-----2010.11.27
电路连接为直通型,a,b,c直接接地,选择模拟输入0通道
更改情况:增加了与PC的串行通讯
将P3.0和P3.1让出换为P3.6和P3.7 2010.11.29
---------------------------------------------------------------------------*/

#include<reg52.h>
unsigned char t,m,s,x,ior,cn; //电子表的各个位信号 x显示字位置控制
unsigned int foat,i; // 6位有效数字eg:4.56845
unsigned char ior;
unsigned char a[5]={0,0,0,0,0}; //注意5个数数组内是5而不是4
sbit start=P3^4; //启动AD
sbit OE=P3^7; //启动输出数据
sbit EOC=P3^3; //转换结束
sbit CLK=P3^6; //AD始终模拟
bit Recdat;
code unsigned char ledcod[]={0x7e,0x12,0xbc,0xb6,0xd2,0xE6,0xee,0x32,0xfe,0xf6};
code unsigned char ledcod1[]={0x7f,0x13,0xbd,0xb7,0xd3,0xE7,0xef,0x33,0xff,0xf7};//带小数点的字形码
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |=0x02;
TH0=0xd1;
TL0=0xd1; //定时0.05ms
EA=1;
ET0=1;
TR0=1;
}
/*------------------------------------------------
串口初始化子程序
------------------------------------------------*/
void InitCom(void) //初始化串口
{
SCON|=0x50; //0101 0000B,工作方式1,8位UART,波特率可变,允许接收
TMOD|=0x20; //T1工作于方式2自动重装
TCON|=0x40; //定时器1开始计数TR1=1
TH1=250; //T1计数初值 波特率为4800
TL1=250;
RI=0;TI=0; //清发送接收标志
ES=1; // 开串口
}
/*--------------------------------------------------
显示子程序
---------------------------------------------------*/
void display(unsigned char num)
{

switch(num)
{
case 0:
{
ior=foat/10000; //3
a[0]=ior;
P1=ledcod1[ior];
P0=0x7e;
x++;
}
break;
case 1:
{
ior=(foat-10000*a[0])/1000;
P1=ledcod[ior];
a[1]=ior; //5
P0=0xfd;
x++;
}
break;
case 2:
{
ior=(foat-10000*a[0]-1000*a[1])/100;
P1=ledcod[ior];
a[2]=ior; //3
P0=0xfb;
x++;
}
break;
case 3:
{
ior=(foat-10000*a[0]-1000*a[1]-100*a[2])/10;
P1=ledcod[ior];
a[3]=ior; //1
P0=0xf7;
x++;
}
break;
case 4:
{
ior=foat-10000*a[0]-1000*a[1]-100*a[2]-10*a[3]; //6
P1=ledcod[ior];
a[4]=ior;
P0=0xef;
x++;
}
break;
case 5:
{
ior=foat-10000*a[0]-1000*a[1]-100*a[2]-10*a[3]; //6
P1=ledcod[ior];
P0=0xdf;
x++;
}
break;
default:
break;
}
}
/*------------------------------------------------
串口发送
------------------------------------------------- */
void ComOut(void) //向串口发送数据
{ unsigned char i;
for(i=0;i<5;i++)
{
SBUF=a[i]; //发送数据t
while(!TI); //等待发送完成
TI=0;
}
SBUF=0x0;
while(!TI); //等待发送完成
TI=0;
SBUF=0x0;
while(!TI); //等待发送完成
TI=0;
SBUF=0x0;
while(!TI); //等待发送完成
TI=0;
}
/*-----------------------------------------------------
延时函数
------------------------------------------------------*/
void delay(unsigned int i)
{
while(i--);
}
/********************主函数************************/
main()
{
Recdat=0;
x=0;
P2=0xff; //P2口工作于读,所以先写1,阻断内部的cmos
EOC=1; //
Init_Timer0();
InitCom();
while(1)
{
if(i==79) //开始的时候这里没加采样时间(79*0.05=3.94ms),导致始终无法采样到信号
{
delay(8000); //为了使数码管的数字让人眼能够分辨。增加了这个延时
start=0;
start=1; //AD在上升沿复位,在下降沿开始转换(ST端给出一个至少有100ns宽的正脉冲信号 )
start=0;
}
delay(8); //转换时间为20us
if(EOC==1) //查询高电平的到来。转换完毕AD0809的EOC会输出一个高电平
{
OE=1; //打开--将数据发出到单片机的P2口
delay(2);
foat=P2*196;
OE=0; //输出数据线呈高阻状态
}
if(Recdat)
{
Recdat=0;
ComOut();
}

}

}
/*****************************************************/
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 2
{
i++;
CLK=~CLK; //为AD转换提供时钟周期 0.05ms 20khz
if(i==80) //每0.05ms*50=2.5ms 调用一次显示
{
i=0;
if(x==6)
{ x=0;}
display(x);
}
}
/*---------------------------------------------------
串口中断接收
----------------------------------------------------*/
void ComINT() interrupt 4 using 2 //中断接收程序
{
if(RI) //判断是否接收完,接收完成后,由硬件置RI位
{
cn=SBUF; //读入缓冲区
RI=0; //清标志
Recdat=1; //有数据,建立标志
}
}

‘肆’ 以AT89C51单片机为控制器的智能交通灯控制系统,基于51单片机的交通信号灯模拟系统控制的仿真图及C程序

你好!

这样的效果可以吗

‘伍’ 基于51单片机的光控路灯系统设计

关键是外围电路,单片机编程没有什么,也就一个if语句吧。

‘陆’ 基于51单片机的LED彩灯控制器设计

电源电路+单片机最小系统+三极管驱动电路+程序编写。这几步就可以了,应该是很简单的在网上找找资料就有了哦

‘柒’ 基于51单片机的教室智能照明控制系统

毕业设计拿来主义,看到就烦,为什么这么简单的东西都不肯花点时间做一下。当然,如果你是女生还情有可原。

阅读全文

与基于51单片机的智能控制灯的设计相关的资料

热点内容
pythonswampy示例 浏览:95
有没有什么语音讲书看书的app 浏览:995
文件夹怎么做标题 浏览:33
腾讯云服务器如何防止被攻击 浏览:881
六棱柱的体积算法 浏览:935
淘宝什么云服务器好用 浏览:340
pythonoa项目 浏览:307
android杜比音效 浏览:341
杀手47为什么连接不了服务器 浏览:108
静态路径命令 浏览:533
一直编译不过怎么办 浏览:829
汽车串联并联算法 浏览:458
助眠解压的声音音频小哥哥 浏览:277
pythoncmd换行 浏览:376
linux取消行号 浏览:355
安卓原生系统官网是什么 浏览:444
底部主图源码 浏览:878
服务器崩了有什么提示 浏览:780
远程海康服务器用什么浏览器 浏览:232
解压报纸图片 浏览:956