单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 28515|回复: 141
打印 上一主题 下一主题
收起左侧

十字路口交通灯单片机设计报告【代码+Proteus仿真】

  [复制链接]
跳转到指定楼层
楼主
diudiu 发表于 2013-6-26 16:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51hei论坛是我见过的最好的单片机论坛,资料很多,回复也及时,我今天也发几个自己的作品,交通灯设置 全套资料
希望大家多多支持51hei.






仿真文件和源代码下载: C51代码 Proteus原理图 .rar (22.57 KB, 下载次数: 1521)
设计报告下载:http://www.51hei.com/f/单片机课程设计报告-十字路口交通灯控制.pdf


评分

参与人数 15黑币 +56 收起 理由
xuyingjian123 + 5 很给力!
if_2 + 2 很给力!
qrwds + 2 共享资料的黑币奖励!
warten + 5 赞一个!
zly747857549 + 1 共享资料的黑币奖励!
用户名已被占用 + 5 赞一个!
丿Sapphire + 5 共享资料的黑币奖励!
jyx310528930 + 1 赞一个!
3535435345 + 5 回帖助人的奖励!
maybea + 5 共享资料的黑币奖励!
天圆地方 + 4 赞一个!
352159468 + 5 赞一个!
qq1158078864 + 1 很给力!
791712429 + 5 很给力!
亘黑鹿 + 5 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏18 转播转播 分享分享5 分享淘帖 顶13 踩
回复

使用道具 举报

沙发
 楼主| diudiu 发表于 2013-6-26 16:16 | 只看该作者
#include<reg51.H>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={	 //共阴极数码管码表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,

0xC9,0xFF,0x40};//设置码,测试码,不计时码

void delay(uint x);//延时函数
void display(uchar,uchar,uchar,uchar);	//数码管显示函数
void mkeys();	//键盘函数
void traffic();	//交通灯函数

uchar num,num1,num2,  //1南北 2东西
shi1,ge1,shi2,ge2,
value1,value2,//南北 绿灯时间 黄灯时间
value3,value4,//东西 绿灯时间 黄灯时间
count1,count2,flag1,flag2; //南北标记 东西标记

void main()
{	
		
		TMOD=0x01;
		TH0=(65536-45872)/256;
		TL0=(65536-45872)%256;
		EA=1;
		ET0=1;
		TR0=1;
		/*初状态*/
		value1=15;		 //南北 黄绿灯默认值
		value2=5;	  
		value3=10;	  //东西 黄绿灯默认值
		value4=5;

		num1=value1; //南北数码管先绿灯时间
		num2=value2+value1;//东西红灯时间
		shi1=num1/10;
		ge1=num1%10;
		shi2=num2/10;
		ge2=num2%10;
		P1=0x41;//初始状态:东西红灯 南北绿灯	  20 15

		while(1){
			if(num==20)	   //定时器1s
			{
				num=0;
				num1--;
				num2--;
				traffic();
					
				shi1=num1/10;
				ge1=num1%10;

				shi2=num2/10;
				ge2=num2%10;

			}
			  mkeys();
			  	display(shi1,ge1,shi2,ge2);
			  
		}

}

void traffic() //红绿灯主控制程序
{
	if(num1==0){
			count1++;
			if(count1==1){
				P1=0x42;//东西红灯 南北黄灯	5 5
				num1=value2;
			}
			if(count1==2){
				num1=value3+value4;//东西绿灯 南北红灯	10 15
				P1=0x14;
			}
			if(count1==3){
				P1=0x41;// 东西黄灯 南北红灯	5 5
				num1=value4;
				count1=0;							
			}
	}
	if(num2==0){
			count2++;
			if(count2==1){ 
				//P1=0x14;//东西绿灯 南北红灯
				num2=value3;
			}
			if(count2==2){
				P1=0x24;//东西黄灯 南北红灯 
				num2=value4;
			}
			if(count2==3){
				num2=value1+value2; //东西红灯 南北绿灯
				num1=value1;
				count2=0;
			}
					
	}
}

void display(uchar shi1,uchar ge1,uchar shi2,uchar ge2)	//数码管显示子函数
{		
		uchar temp;
		temp=P2;
		P2=0xfe;
		P0=table[shi1];
		delay(5);
		
		P2=0xfd;
		P0=table[ge1];
		delay(5);
	
		P2=0xfb;
		P0=table[shi2];
		delay(5);
		
		P2=0xf7;
		P0=table[ge2];
		delay(5);		
}

void delay(uint x)//延时子函数
{
	uint i,j;
	for(i=x;i>0;i--)
		for(j=110;j>0;j--);
}

void mkeys()  //4*4矩阵键盘功能子函数
{
	uchar temp,key;
	P3=0xfe;//第一行线
	temp=P3;
	temp=temp&0xf0;
	if(temp!=0xf0)
	{
		delay(10);
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0){
			temp=P3;
			switch(temp)
			{
				case 0xee:
					key=0;
					break;
				case 0xde:
					key=1;
					break;
				case 0xbe:
					key=2;
					break;
				case 0x7e:
					key=3;
					break;
			}
		while(temp!=0xf0)
		{
			temp=P3;
			temp=temp&0xf0;
		}
		if(key==0) {//按键1:暂停
			TR0=~TR0;  //定时器取反
			flag1=~flag1;//南北能够设置标志 0有效
			flag2=~flag2;//东西能够设置标志
		}

		if(key==1&&flag1==0){	//按键2:设置时间按钮
			TR0=0;
			P1=0x44;//禁止东南西北车辆 全为红灯 可以设置
			shi1=ge1=shi2=ge2=16;
		}

		if(key==2&&flag2==0){//按键3:设置完成 重启
			TR0=1;
			num=0;	 //定时器 初始化
			P1=0x41; //重新开始初状态
			num1=value1; //南北数码管先绿灯时间
			num2=value2+value1;//东西红灯时间
			shi1=num1/10;
			ge1=num1%10;
			shi2=num2/10;
			ge2=num2%10;
		}

		if(key==3&&P1==0x44){ //按键4:测试交通灯各个设备的好坏
			P1=0xff;
			delay(1000);
			P1=~P1;
			shi1=ge1=shi2=ge2=17;
			P1=0x44;
		}

		}
	}

	P3=0xfd;//第二行线
	temp=P3;
	temp=temp&0xf0;
	if(temp!=0xf0)
	{
		delay(10);
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0){
			temp=P3;
			switch(temp)
			{
				case 0xed:
					key=0;
					break;
				case 0xdd:
					key=1;
					break;
				case 0xbd:
					key=2;
					break;
				case 0x7d:
					key=3;
					break;
			}
		while(temp!=0xf0)
		{
			temp=P3;
			temp=temp&0xf0;
		}
		 
		if(key==0&&P1==0x44){	//按键5:设置南北绿灯时间+

			num1=value1;
			if(num2!=159){ //@@@@保证交通合理,红灯最大值计时159s,绿灯不再增加
				num1++;
				value1=num1;
			}

			shi1=num1/10;
			ge1=num1%10;

			num2=value1+value2;//显示东西红灯时间
			shi2=num2/10;
			ge2=num2%10;


		}
		if(key==1&&P1==0x44){	//按键6:设置南北黄灯时间+
			num1=value2;
			if(num2!=159){
				num1++;
				value2=num1;
			}

			shi1=num1/10;
			ge1=num1%10;
			num2=value1+value2;//显示东西红灯时间
			shi2=num2/10;
			ge2=num2%10;

		} 
		if(key==2&&P1==0x44&&value1>3){	//按键7:设置南北绿灯时间- @@@@保证交通合理,绿灯最小值计时3s,绿灯不再减少
			num1=value1;

			num1--;
			value1=num1;

			shi1=num1/10;
			ge1=num1%10;
			num2=value1+value2;//显示东西红灯时间
			shi2=num2/10;
			ge2=num2%10;

		}
		if(key==3&&P1==0x44&&value2>3){	//按键8:设置南北黄灯时间-	  
			num1=value2;

			num1--;
			value2=num1;

			shi1=num1/10;
			ge1=num1%10;
			num2=value1+value2;//显示东西红灯时间
			shi2=num2/10;
			ge2=num2%10;

		}
		}
	
	}
   ////||||||||||||||||||

	P3=0xfb;//第三行线
	temp=P3;
	temp=temp&0xf0;
	if(temp!=0xf0)
	{
		delay(10);
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0){
			temp=P3;
			switch(temp)
			{
				case 0xeb:
					key=0;
					break;
				case 0xdb:
					key=1;
					break;
				case 0xbb:
					key=2;
					break;
				case 0x7b:
					key=3;
					break;
			}
		while(temp!=0xf0)
		{
			temp=P3;
			temp=temp&0xf0;
		}
		if(key==0&&P1==0x44){	//按键9:设置东西绿灯时间+
	
			num2=value3;
			if(num1!=159){
				num2++;
				value3=num2;
			}

			shi2=num2/10;
			ge2=num2%10;

			num1=value3+value4;//显示南北红灯时间
			shi1=num1/10;
			ge1=num1%10;



		}
		if(key==1&&P1==0x44){	//按键10:设置东西黄灯时间+
			num2=value4;

			if(num1!=159){
				num2++;
				value4=num2;
			}

			shi2=num2/10;
			ge2=num2%10;
			num1=value3+value4;//显示南北红灯时间
			shi1=num1/10;
			ge1=num1%10;

		} 
		if(key==2&&P1==0x44&&value3>3){	//按键11:设置东西绿灯时间-
			num2=value3;

			num2--;
			value3=num2;

			shi2=num2/10;
			ge2=num2%10;

			num1=value3+value4;//显示南北红灯时间
			shi1=num1/10;
			ge1=num1%10;


		}
		if(key==3&&P1==0x44&&value4>3){	//按键12:设置东西黄灯时间-
			num2=value4;

			num2--;
			value4=num2;

			shi2=num2/10;
			ge2=num2%10;
			num1=value3+value4;//显示南北红灯时间
			shi1=num1/10;
			ge1=num1%10;


		}
		}
	
	}

	P3=0xf7;//第四行线		  2未用
	temp=P3;
	temp=temp&0xf0;
	if(temp!=0xf0)
	{
		delay(10);
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0){
			temp=P3;
			switch(temp)
			{
				case 0xe7:
					key=0;
					break;
				case 0xd7:
					key=1;
					break;
				case 0xb7:
					key=2;
					break;
				case 0x77:
					key=3;
					break;
			}
		while(temp!=0xf0)
		{
			temp=P3;
			temp=temp&0xf0;
		}
		if(key==0&&P1==0x44){	//按键13:南北紧急情况:南北绿灯常亮 东西红灯常亮
			P1=0x41;
			shi1=ge1=shi2=ge2=18;	

		}
		if(key==1&&P1==0x44){	//按键14:东西紧急情况:东西绿灯常亮 南北红灯常亮
			P1=0x14;
			shi1=ge1=shi2=ge2=18;	
		} 
		if(key==2&&P1==0x44){//按键15:
			
		}
		if(key==3&&P1==0x44){//按键16:
			
		}
		}
	
	}



}
void T0_time() interrupt 1 	//定时器T0 中断子程序
{
	TH0=(65536-45872)/256;
	TL0=(65536-45872)%256;
	num++;
}
回复

使用道具 举报

板凳
八戒调皮 发表于 2013-7-1 18:59 | 只看该作者
挺好好的
回复

使用道具 举报

地板
冰蓝色de激情 发表于 2013-7-3 16:36 | 只看该作者
谢谢谢谢谢谢谢谢谢谢
回复

使用道具 举报

5#
李强 发表于 2013-7-21 19:28 | 只看该作者
好好学习啊
回复

使用道具 举报

6#
的爱我 发表于 2013-12-18 11:46 | 只看该作者
你妹,程序错那么多
回复

使用道具 举报

7#
942770740 发表于 2013-12-26 22:47 | 只看该作者
回复

使用道具 举报

8#
GZMNGZS 发表于 2013-12-31 15:47 | 只看该作者
{:soso_e179:}{:soso_e102:}
回复

使用道具 举报

9#
y5201314 发表于 2014-4-1 23:50 | 只看该作者
怎一个霸气了得,谢谢分享!
回复

使用道具 举报

10#
ya123chiang 发表于 2014-5-6 08:40 | 只看该作者
謝......................
回复

使用道具 举报

11#
delux3344 发表于 2014-5-13 13:25 | 只看该作者
好好学习啊
回复

使用道具 举报

12#
omegaxzeroaxl 发表于 2014-5-28 08:22 | 只看该作者
感謝大大分享 最近需要!
回复

使用道具 举报

13#
omegaxzeroaxl 发表于 2014-5-28 08:22 | 只看该作者
在次謝謝大大!
回复

使用道具 举报

14#
busuzhike 发表于 2014-5-28 15:45 | 只看该作者
nice!!
回复

使用道具 举报

15#
woahaookc 发表于 2014-6-6 23:49 | 只看该作者
adaskkdklas
回复

使用道具 举报

16#
疯幸紫 发表于 2014-6-12 00:11 来自手机 | 只看该作者
谢谢分享!
回复

使用道具 举报

17#
疯幸紫 发表于 2014-6-12 08:06 来自手机 | 只看该作者
有汇编吗?
回复

使用道具 举报

18#
灬飞翔的巧克力 发表于 2014-9-26 20:28 | 只看该作者
厉害!
回复

使用道具 举报

19#
唉丶芒果 发表于 2014-10-15 13:20 | 只看该作者
这个好用吗
回复

使用道具 举报

20#
唉丶芒果 发表于 2014-10-15 16:15 | 只看该作者
可以使用麽
回复

使用道具 举报

21#
ismail 发表于 2014-12-29 22:06 | 只看该作者
正是我需要的
回复

使用道具 举报

22#
ws85246 发表于 2015-1-13 15:56 | 只看该作者
学习参考一下
回复

使用道具 举报

23#
goray2015 发表于 2015-2-19 20:47 | 只看该作者
程序调试过了吗?
回复

使用道具 举报

24#
goray2015 发表于 2015-2-19 20:48 | 只看该作者
感谢!
回复

使用道具 举报

25#
ismail 发表于 2015-3-25 18:17 | 只看该作者
有汇编语言的程序吗?
回复

使用道具 举报

26#
幸福的王铁柱 发表于 2015-4-16 16:36 | 只看该作者

这个不错啊,学习了,谢谢分享
回复

使用道具 举报

27#
51hei论坛 发表于 2015-4-19 22:11 | 只看该作者
bucuoo
回复

使用道具 举报

28#
1178294203 发表于 2015-4-20 10:47 | 只看该作者
谢谢了
回复

使用道具 举报

29#
一双滑板鞋 发表于 2015-5-7 21:37 | 只看该作者
谢谢分享
回复

使用道具 举报

30#
a_fei 发表于 2015-5-10 14:45 | 只看该作者
回复

使用道具 举报

31#
水生 发表于 2015-5-10 23:09 | 只看该作者
谢谢楼主慷慨分享
回复

使用道具 举报

32#
yyyyooo 发表于 2015-5-11 12:39 | 只看该作者
谢谢,分享了
回复

使用道具 举报

33#
哎呀蜈蚣 发表于 2015-5-13 15:26 | 只看该作者
期待能够多看看,不错挺好的   支持
回复

使用道具 举报

34#
众生作废 发表于 2015-5-14 20:29 | 只看该作者

可以使用麽
回复

使用道具 举报

35#
陈志扬 发表于 2015-5-17 09:04 | 只看该作者
diudiu 发表于 2013-6-26 16:16
#include&lt;reg51.H>
#define uchar unsigned char
#define uint unsigned int

good
回复

使用道具 举报

36#
双人旅途 发表于 2015-5-29 14:05 | 只看该作者
51hei 有你更精彩!!
回复

使用道具 举报

37#
双人旅途 发表于 2015-5-29 14:05 | 只看该作者
51hei 有你更精彩!!
回复

使用道具 举报

38#
双人旅途 发表于 2015-5-29 14:05 | 只看该作者
51hei 有你更精彩!!
回复

使用道具 举报

39#
单纯的负担 发表于 2015-6-17 17:07 | 只看该作者
数码管不亮,没用啊
回复

使用道具 举报

40#
constanly 发表于 2015-6-24 14:19 | 只看该作者
车流量动态的话如何设计
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表