51单片机c语言交通灯设计报告_第1页
51单片机c语言交通灯设计报告_第2页
51单片机c语言交通灯设计报告_第3页
51单片机c语言交通灯设计报告_第4页
51单片机c语言交通灯设计报告_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

xxxxxxxxx基于AT89S52交通灯设计学院:电子信息工程专业班级:xxxxxxxxxxxxxx姓名:xxxx学号:xxxxxxxxxxx指导老师:xxxxxxxxxx摘要交通灯在我们日常生活中随处可见,它在交通系统中处于至关重要的位置。交通灯的使用大大减少了交通繁忙路口的事故发生,给行人和车辆提供一个安全的交通环境,人们的生命和财产安全有了保障。本设计旨在模拟十字路口的交通灯,以AT89S51单片机为基础,结合按键和数码管等元器件设计出一个简单且完全的交通灯系统。关键词:交通灯AT89S52单片机目录一、设计任务 3二、AT89S52单片机及其他元器件简介 3(1)AT89S52单片机 3三、系统硬件电路设计 5(1)时钟电路设计 5(2)复位电路设计 5(3)灯控制电路设计 6(4)按键控制电路设计 6四、元件清单及实物图 71、程序清单 72、原理图 8五、实验心得 8附1源程序代码 9附2原理图 15一、设计任务(1)、设计一个十字路口的交通灯控制电路,要求南北方向和东西方向两条交叉道路上的车辆交替运行,每次通行时间都设30秒,时间可设置修改。(2)、在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道,且黄灯亮时,要求每秒亮一次。(3)、有紧急车辆要求通过时,系统要能禁止东西和南北两条路上所有的车辆通行。二、AT89S52单片机及其他元器件简介(1)AT89S52单片机AT89S52是一种低功耗、高性能CMOS8位微控制器。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能:8K字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6位向量2级中断结构,全双工串行口,片内晶振及时钟电路。空闲模式下,CPU停止工作,允许RAM、定时器计数器、串口、中断继续工作。鉴于以上的优点本系统采用AT89S52作为主控芯片,实现对整个系统的控制。

(2)芯片74LS24574LS245是我们常用的芯片,用来驱动led或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。当19脚E为H时,A、B为高阻。E为L时,DIR为L时,数据由B传向A;DIR为H时,由A传向B。

(3)两位共阴数码管16脚和11脚对应A、15脚和10脚对应B、3脚和8脚对应C、2脚和6脚对应D、1脚和5脚对应E、18脚和12脚对应F、17脚7脚对应G、4脚和9脚对应DP。公共脚为14脚和13脚,分别对应左边和右边显示的数字。三、系统硬件电路设计(1)时钟电路设计如图所示,采用内部时钟产生方式,在XTAL1和XTAL2两端跨接晶体或陶瓷振荡器,与内部反相器构成稳定的自击震荡。其发出的时钟脉冲直接送入片内定时控制部件。(2)复位电路设计如上图所示,采用上电+按钮电平复位方式,当按下按钮时,RST管脚高电平触发。为保证复位可靠,RC时间常数应大于两个机器周期,电容取10uf,电阻取1000欧。(3)灯控制电路设计如上图所示,交通灯状态显示电路由东西南北四个方向各三个LED灯组成,分别显示四个方向上红、黄、绿三个状态,用以指示十字路口各方向车辆的行驶。通过软件编程,可使路口交通变化情况为:南北方向和东西方向两条交叉道路上的车辆交替运行,主干道每次通行时间都设为30秒。在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道;黄灯亮时每秒闪亮一次。(4)按键控制电路设计开关控制由7个连接到单片机的控制按钮组成。通过软件编程,使得各个开关的功能如上图所示,基本满足了交通灯的需要。四、元件清单及实物图1、程序清单名称规格数量单片机AT89S521排阻9脚10K1晶振11.0592MHz1发光二极管GREEN3发光二极管RED3发光二极管YELLOW3数码管两位共阴2电阻1K1电阻10K6按键8电解电容10uF1独石电容22pF2电源插头1排座20脚1排座40脚1双排针2.54间距单排针2.54间距排线15cm16根实验板10*15cm12、原理图五、实验心得这次交通灯的制作是我学会了不少的东西,首先是proteus和keil的使用。单片机程序的编写和原理图的仿真都是在这两个软件的运行下才可以进行的。这个实验最重要的是让我对51系列的单片机有了更深层次的了解,这一学期开接触单片机的时候觉得这是一门极其高深的课程,老师讲的什么基本完全不懂,课后看仍旧是一头雾水。通过交通灯的学习和制作,对单片机有了初步的了解,知道了它的组成、工作原理等等。在软件编写这一块,开始时遇到了很大的难题,因为两百行的程序,哪怕有一个错误,修改起来也不是十分方便。时常没有心思去寻找和改正错误,所以软件这一块花了很大的一部分时间。几次调试后总算出现“0warning”和“0error”的字样。焊接也是比较麻烦,由于万能板买小了,再加上需要连接的线有很多根,所以首先必须考虑到元器件的排布问题,尽量让自己的焊接的时候方便一点。借鉴别人的经验,数码管和排阻之间用排线相连接,很大程度上节省焊接的时间,并且让板子看起来更加整洁、美观。除了学会很多东西以为,也发现了自己的不足。由于自己在这一方面只是的短缺,所以很多问题都需要查阅资料或者向别的同学请教。比如说proteus和keil的使用方法,都是看着别人操作几遍之后才慢慢学会。还有在焊接这一方面也存在着很大问题。由于焊接在万能板反面,所以有时候会把单片机的引脚看错,然后用吸枪慢慢清理。这不仅浪费时间而且还可能破坏万能板。在焊接过程中还出现短路问题,一不小心锡丝用多了就有可能造成两个点之间的短路问题,这一点说明了焊接能力还有待提升。实验的结果是成功的,模拟出了交通灯的功能,各个按键的功能也和模拟时一致,看着数字的跳动自己信息也感到十分开心。虽然想过在这个交通灯里加入一些额外的功能,但终究由于自己知识的局限性而放弃,有点遗憾,不过能够学到东西就好。此次试验增长了自己的单片机知识外也让我知道实践和理论学习的差别。实践过程中学到的知识自己记得会更加牢固一些,不容易忘记。总的来说,单片机的制作让我收获不小。附1源程序代码#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintuchardatabuf[4];uchardatasec_dx=20;//东西数默认uchardatasec_nb=30;//南北默认值uchardataset_timedx=20;uchardataset_timenb=30;intn;uchardatab;//定时器中断次数sbitk1=P1^6;//定义5组开关sbitk2=P1^7;sbitk3=P2^7;sbitk4=P3^0;sbitk5=P3^1;sbitYellow_nb=P2^5; //南北黄灯标志sbitYellow_dx=P2^2; //东西黄灯标志sbitGreen_nb=P2^4;sbitGreen_dx=P2^1;sbitBuzz=P3^7;bitBuzzer_Indicate;bittime=0;//灯状态循环标志bitset=1;//调时方向切换键标志ucharcodetable[11]={ //共阴极字型码0x3f,//--00x06,//--10x5b,//--20x4f,//--30x66,//--40x6d,//--50x7d,//--60x07,//--70x7f,//--80x6f,//--90x00//--NULL};//函数的声明部分voiddelay(intms);//延时子程序voidkey();//按键扫描子程序voidkey_to1();//键处理子程序voidkey_to2();voidkey_to3();voiddisplay();//显示子程序voidlogo();//开机LOGOvoidBuzzer();//主程序voidmain(){ TMOD=0X01; TH0=0XD8; TL0=0XF0; EA=1; ET0=1; TR0=1; EX0=1; EX1=1;logo(); P2=0Xc3;//开始默认状态,东西绿灯,南北黄灯sec_nb=sec_dx+5; while(1) { key();//调用按键扫描程序 display();//调用显示程序 Buzzer(); } }//函数的定义部分voidkey() //按键扫描子程序{ if(k1!=1) { delay(10); if(k1!=1) { while(k1!=1) { key_to1(); for(n=0;n<40;n++) {display();} } } } if(k2!=1) { delay(10); if(k2!=1) { while(k2!=1) { key_to2(); for(n=0;n<40;n++) {display();} } } } if(k3!=1) { TR0=1;//启动定时器 Buzzer_Indicate=0; sec_nb=set_timenb; //从中断回复,仍显示设置过的数值 sec_dx=set_timedx; if(time==0) {P2=0X99;sec_nb=sec_dx+5;} else{P2=0xC3;sec_dx=sec_nb+5;} } if(k4!=1){ delay(5); if(k4!=1) { while(k4!=1); set=!set; } } if(k5!=1) { delay(5); if(k5!=1) { while(k5!=1) key_to3(); } }}voiddisplay()//显示子程序{ buf[1]=sec_dx/10;//第1位东西秒十位 buf[2]=sec_dx%10;//第2位东西秒个位 buf[3]=sec_nb/10;//第3位南北秒十位 buf[0]=sec_nb%10;//第4位南北秒个位 P1=0xff; //初始灯为灭的P0=0x00;P1=0xfe; //片选LCD1P0=table[buf[1]]; delay(1); P1=0xff;P0=0x00;P1=0xfd; //片选LCD2P0=table[buf[2]];delay(1); P1=0xff;P0=0x00; P1=0Xfb; //片选LCD3 P0=table[buf[3]]; delay(1); P1=0xff;P0=0x00; P1=0Xf7; P0=table[buf[0]]; //片选LCD4 delay(1);}voidtime0(void)interrupt1using1//定时中断子程序{ b++; if(b==19) //定时器中断次数 { b=0; sec_dx--; sec_nb--; if(sec_nb<=5&&time==0)//东西黄灯闪 {Green_dx=0;Yellow_dx=!Yellow_dx;} if(sec_dx<=5&&time==1)//南北黄灯闪 {Green_nb=0;Yellow_nb=!Yellow_nb;} if(sec_dx==0&&sec_nb==5) sec_dx=5; if(sec_nb==0&&sec_dx==5) sec_nb=5; if(time==0&&sec_nb==0) {P2=0x99;time=!time;sec_nb=set_timenb;sec_dx=set_timenb+5;} if(time==1&&sec_dx==0) {P2=0Xc3;time=!time;sec_dx=set_timedx;sec_nb=set_timedx+5;} } }voidkey_to1() //键盘处理子程序之+{ TR0=0; //关定时器 if(set==0) set_timenb++;//南北加1S else set_timedx++;//东西加1S if(set_timenb==100) set_timenb=1; if( set_timedx==100) set_timedx=1;//加到100置1 sec_nb=set_timenb; //设置的数值赋给东西南北 sec_dx=set_timedx; }voidkey_to2() //键盘处理子程序之-{ TR0=0;//关定时器 if(set==0) set_timenb--;//南北减1S else set_timedx--;//东西减1S if(set_timenb==0) set_timenb=99; if( set_timedx==0) set_timedx=99;//减到1重置99 sec_nb=set_timenb; //设置的数值赋给东西南北 sec_dx=set_timedx; }voidkey_to3()//键盘处理之紧急车通行{TR0=0;P2=0Xc9; sec_dx=00; sec_nb=00; Buzzer_Indicate=1;}voidint0(void)interrupt0using1 //只允许东西通行{ TR0=0; P2=0Xc3; Buzzer_Indicate=0; sec_dx=00; sec_nb=00;}voidint1(void)interrupt2using1 //只允许南北通行{ TR0=0; P2=0X99; Buzzer_Indicate=0; sec_nb=00; sec_dx=00;}voidlogo()//开机的Logo"----"{for(n=0;n<50;n++){P0=0x40;P1=0xfe; delay(1);P1=0xfd; delay(1); P1=0Xfb; delay(1); P1=0Xf7; delay(1);P1=0xff; }}voidBuzzer(){if(Buzzer_Indicate==1)Buzz=!Buzz;elseBuzz=0;}voiddelay(intms) //延时子程序{ uintj,k; for(j=0;j<ms;j++) for(k=0;k<124;k++);}附2原理图附录资料:不需要的可以自行删除C语言编译环境中的调试功能及常见错误提示调试功能1.常用健<F10> :激活系统菜单<F6> :将光标在编辑窗口和、信息窗口之间切换<F3> :加载<load>一个文件<Alt>+<F5> :查看程序运行结果<F1> :得到有关编辑器在线帮助<Ctrl>+<F1> :得到有关C语言的在线帮助<Ctrl>+<Break> :终止正在运行的程序2.块操作<Ctrl>KB:定义块首<Ctrl>KK:定义块尾<Ctrl>KV:块移动<Ctrl>KC:块复制<Ctrl>KY:块删除<Ctrl>KH:取消块定义3.查找、替换和删除操作<Ctrl>QF:查找字符串<Ctrl>QA:查找并替换字符串Option:G(全程),B(向文件头),N(直接替换)<Ctrl>Y:删除一行<Ctrl>QY:删除从光标位置到行末的所有字符编译中的常见错误例析(1)

警告类错误‘XXX’declarebutneverused变量XXX已定义但从未用过。‘XXX’isassignedavaluewhichisneverused变量XXX已赋值但从未用过。Codehasnoeffect程序中含有没有实际作用的代码。Non-portablepointerconversion不适当的指针转换,可能是在应该使用指针的地方用了一个非0的数值。Possibleuseof‘XXX’beforedefinition表达式中使用了未赋值的变量Redeclarationof‘main’一个程序文件中主函数main不止一个。Suspiciouspointerconversion可疑的指针转换。通常是使用了基本类型不匹配的指针。Unreachablecode程序含有不能执行到的代码。(2)

错误或致命错误Compoundstatementmissing}infunctionmain程序结尾缺少括号}。“}”expected;“(”expected等复合语句或数组初始化的结尾缺少“)”;“(”。Caseoutsideofswitchcase不属于Switch结构,多由于switch结构中的花括号不配对所致。Casestatementmissing‘:’switch结构中的某个case之后缺少冒号。Constantexpressionrequired定义数组时指定的数组长度不是常量表达式。Declarationsyntaxerror结构体或联合类型的定义后缺少分号。Declarationwasexpected缺少说明,通常是因为缺少分界符如逗号、分号、右圆括号等所引起的。DefaultoutsideswitchDefault部分放到了switch结构之外,一般是因为花括号不匹配而引起的。dostatementmusthavewhiledo语句中缺少相应的while部分。Expressionsyntax表达式语法错。如表达式中含有两个连续的运算符Extraparameterincall‘fun’调用函数fun时给出了多余的实参。Functionshouldreturnavalue函数应该返回一个值,否则与定义时的说明类型不匹配。Illegaluseofpointer指针被非法引用,一般是使用了非法的指针运算。Invalidpointeraddition指针相加非法。一个指针(地址)可以和一个整数相加,但两个指针不能相加。Lvaluerequired赋值运算的左边是不能寻址的表达式。Misplacedelse程序遇到了没有配对的elseNomatching表达式中的括号不配对。Pointerrequiredonleftsideof_>在“_>”运算的左边只能允许一个指针而不能是一个一般的结构体变量或联合类型的变量。Statementmissing;程序遇到了后面没有分号的语句。Toofewparametersincall调用某个函数时实参数目不够。Unabletoopenincludefile‘XXXXXXXX.XXX’头文件找不到。Unexpected}或:或{在不希望的地方使用了}或:{。Undefinedsymbol‘X’infunctionfun函数fun中的变量X没有定义。5.连接中的常见错误主要错误类似于“undefinedsymbol_printinmodulaxxx”(print没有定义),通常是函数名书写错误。6.运行中的常见错误Abnormalprogramtermination程序异常终止。通常是由于内存使用不当所致。Floatingpointerror:Domain或Divideby0运算结果不是一个数或被0除Nullpointerassignment对未初始化的指针赋值,程序有严重错误。Userbreak在运行程序时终止。7.程序的跟踪调试利用Run菜单可以进行程序的跟踪调试(1)

GOtoCursor(<F4>)——选择该选项使程序执行到光标所在行首先将光标移到某行(一般为可执行),选择该功能项,则程序执行到该行的前一行暂停。此时程序处于跟踪调试状态,并有亮条显示在暂停处,此时可以查询变量或表达式的值。(2)

Traceinto(<F7>)——执行一条语句或一行暂停此时程序处于跟踪调试状态,并有亮条显示在暂停处。该选项可跟踪到被调函数的内部。(3)

Stepover(<F8>)——执行一条语句或一行暂停此时程序处于跟踪调试状态,并有亮条显示在暂停处。该选项将自定义函数当作一个语句执行,不跟踪到函程序的内部。(4)

Debug菜单程序处于跟踪状态时,可使用该菜单的选项。其主要是使用Evaluate——目的是查询或更新变量或表达式的值。选择Evaluate功能后,系统弹出一个对话框。该对话框包含三个选项区域:Evaluate域可以输入一个含有目前代码中(程序暂停区的作用域)正在使用的变量名、或含变量的表达式、或常量表达式。按回车键后,在Result域中显示变量或表达式的值。还可以用Newvalue域进行调试。如果调试程序时发现Result域显示的某变量或表达式的值不正确,并能估计出该变量或表达式的值,则可以将该值输入到Newvalue域,继续执行程序,其目的是肯定错误发生处是否在当前位置之前。如果输入这个正确的值并将程序继续执行完毕而结果正确,说明在目前暂停处之前已经发生错误而之后无错误。(5)

Break/Watch——用于设置断点和监视表达式。选择AddWatch功能选项,系统将弹出一个菜单,在AddWatch框中输入变量名或表达式,按回车键后,系统在屏幕底部开辟一个窗口并显示该变量或表达式的值。【常见错误信息语句索引】Ambiguousoperatorsneedparentheses:不明确的运算需要用括号括起Ambiguoussymbol'xxx':不明确的符号Argumentlistsyntaxerror:参数表语法错误Arrayboundsmissing]infunctionmain缺少数组界限符"]"Arrayboundsmissing:丢失数组界限符Arraysizetoolarge:数组尺寸太大Badcharacterinparamenters:参数中有不适当的字符Badfilenameformatinincludedirective:包含命令中文件名格式不正确Badifdefdirectivesynatax:编译预处理ifdef有语法错Badundefdirectivesyntax:编译预处理undef有语法错Bitfieldtoolarge:位字段太长Callofnon-function:调用未定义的函数Calltofunctionwithnoprototype:调用函数时没有函数的说明Cannotmodifyaconstobject:不允许修改常量对象Caseoutsideofswitch:漏掉了case语句Casesyntaxerror:Case语法错误Codehasnoeffect:代码不可述不可能执行到Compoundstatementmissing{:分程序漏掉"{"Conflictingtypemodifiers:不明确的类型说明符Constantexpressionrequired:要求常量表达式Constantoutofrangeincomparison:在比较中常量超出范围Conversionmaylosesignificantdigits:转换时会丢失意义的数字Conversionofnearpointernotallowed:不允许转换近指针Couldnotfindfile'xxx':找不到XXX文件Declarationmissing;:说明缺少";"Declarationsyntaxerror:说明中出现语法错误Defaultoutsideofswitch:Default出现在switch语句之外Definedirectiveneedsanidentifier:定义编译预处理需要标识符Divisionbyzero:用零作除数Dostatementmusthavewhile:Do-while语句中缺少while部分Enumsyntaxerror:枚举类型语法错误Enumerationconstantsyntaxerror:枚举常数语法错误Errordirective:xxx:错误的编译预处理命令Errorwritingoutputfile:写输出文件错误Expressionsyntaxerror:表达式语法错误Extraparameterincall:调用时出现多余错误Filenametoolong:文件名太长Functioncallmissing):函数调用缺少右括号Fuctiondefinitionoutofplace:函数定义位置错误Fuctionshouldreturnavalue:函数必需返回一个值Gotostatementmissinglabel:Goto语句没有标号Hexadecimaloroctalconstanttoolarge:16进制或8进制常数太大Illegalcharacter'x':非法字符xIllegalinitialization:非法的初始化Illegaloctaldigit:非法的8进制数字Illegalpointersubtraction:非法的指针相减Illegalstructureoperation:非法的结构体操作Illegaluseoffloatingpoint:非法的浮点运算Illegaluseofpointer:指针使用非法Improperuseofatypedefsymbol:类型定义符号使用不恰当In-lineassemblynotallowed:不允许使用行间汇编Incompatiblestorageclass:存储类别不相容Incompatibletypeconversion:不相容的类型转换Incorrectnumberformat:错误的数据格式IncorrectuseofdefaultDefault使用不当Invalidindirection无效的间接运算Invalidpointeraddition指针相加无效Irreducibleexpressiontree无法执行的表达式运算Lvaluerequired需要逻辑值0或非0值Macroargumentsyntaxerror宏参数语法错误Macroexpansiontoolong宏的扩展以后太长Mismatchednumberofparametersindefinition定义中参数个数不匹配Misplacedbreak此处不应出现break语句Misplacedcontinue此处不应出现continue语句Misplaceddecimalpoint此处不应出现小数点Misplacedelifdirective不应编译预处理elifMisplacedelse此处不应出现elseMisplacedelsedirective此处不应出现编译预处理elseMisplacedendifdirective此处不应出现编译预处理endifMustbeaddressable必须是可以编址的Musttakeaddressofmemorylocation必须存储定位的地址Nodeclarationforfunction'xxx'没有函数xxx的说明Nostack缺少堆栈Notypeinformation没有类型信息Non-portablepointerassignment不可移动的指针(地址常数)赋值Non-portablepointercomparison不可移动的指针(地址常数)比较Non-portablepointerconversion不可移动的指针(地址常数)转换Notavalidexpressionformattype不合法的表达式格式Notanallowedtype不允许使用的类型Numericconstanttoolarge数值常太大Outofmemory内存不够用Parameter'xxx'isneverused能数xxx没有用到Pointerrequiredonleftsideof->符号->的左边必须是指针Possibleuseof'xxx'beforedefinition在定义之前就使用了xxx(警告)Possiblyincorrectassignment赋值可能不正确Redeclarationof'xxx'重复定义了xxxRedefinitionof'xxx'isnotidenticalxx的两次定义不一致Registerallocationfailure寄存器定址失败Repeatcountneedsanlvalue重复计数需要逻辑值Sizeofstructureorarraynotknown结构体或数给大小不确定Statementmissing;语句后缺少";"StructureorunionsyntaxerrorX构体或联合体语法错误Structuresizetoolarge结构体尺寸太大Subscriptingmissing]下标缺少右方括号Superfluous&withfunction

温馨提示

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

评论

0/150

提交评论