单片机课程设计--红绿灯.docx_第1页
单片机课程设计--红绿灯.docx_第2页
单片机课程设计--红绿灯.docx_第3页
单片机课程设计--红绿灯.docx_第4页
单片机课程设计--红绿灯.docx_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机课程设计目录第一节 系统总体方案21.1设计要求21.2设计任务21.3 总体设计2第二节 硬件设计32.1单片机选型3引脚结构图32.2 硬件电路图4第三节 软件设计53.1 设计流程图53.2 紧急中断流程图63.3 设计程序及说明63.4 主要函数说明11第四节 Proteus软件仿真114.1 正常运行114.2 黄灯闪烁124.3通行转换124.4 设置信号灯时间13绿灯时间13黄灯时间134.5 设置后启动运行14第五节 课程设计体会14第六节 参考文献14附录151、同组人姓名152、实验分工151)程序设计:152)电路设计:15第一节 系统总体方案1.1设计要求1)南北方向(主干道)车道和东西方向(支干道)车道两条交叉道路上的车辆交替运行,主干道每次通行时间都设为80秒、支干道每次通行间为60秒。2)在绿灯转为红灯时,要求黄灯先亮3秒钟,才能变换运行车道;3)黄灯亮时,要求每秒闪亮一次。4)东西方向、南北方向车道除了有红、黄、绿灯指示外,每一种灯亮的时间都用显示器进行显示(采用计时的方法)。1.2设计任务1)东西、南北车辆交替运行2)绿灯转为红灯时,黄灯闪亮(间隔3秒)。3)能显示剩余时间。4)能对交通运行进行控制。5)能够对时间进行修改并正常运行。1.3 总体设计单片机按键电路复位电路晶振电路数码显示LED显示第二节 硬件设计2.1单片机选型AT89C51引脚结构图2.2 硬件电路图第三节 软件设计3.1 设计流程图调支路通行子程开 始中断初始化调主干道黄灯闪烁子程调主干道通行子程序调支路黄灯闪烁子程判断是否有开关中断?中断处理中断返回(到子程序处)NOYES3.2 紧急中断流程图断点入栈保护状态参数设置送状态字至端口状态响应断点返回开 始开 始3.3 设计程序及说明17#include #define uchar unsigned char #define uint unsigned int uchar code table= /共阴极数码管码表1-F 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=60; /南北 黄绿灯默认值 value2=3; value3=80; /东西 黄绿灯默认值 value4=3; num1=value1; /南北数码管先绿灯时间 num2=value2+value1;/东西红灯时间 shi1=num1/10; ge1=num1%10; shi2=num2/10; ge2=num2%10; P1=0x41;/初始状态:东西红灯 南北绿灯 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;/东西红灯 南北黄灯 num1=value2; if(count1=2) num1=value3+value4;/东西绿灯 南北红灯 P1=0x14; if(count1=3) P1=0x41;/ 东西黄灯 南北红灯 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=tableshi1; delay(5); P2=0xfd; P0=tablege1; delay(5); P2=0xfb; P0=tableshi2; delay(5); P2=0xf7; P0=tablege2; delay(5); void delay(uint x)/延时子函数 uint i,j; for(i=x;i0;i-) for(j=110;j0;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&value13) /按键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&value23) /按键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&value33) /按键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&value43) /按键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:编程预留 v

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论