1、xxxxxxxxx基于AT89S52交通灯设计学 院: 专业班级: 姓 名: 学 号: 指导老师:学 院: 专业班级: 姓 名: 学 号: 指导老师:电子信息工程XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX摘要交通灯在我们日常生活中随处可见,它在交通系统中处于至关重要的位置。 后用吸枪慢慢清理。这不仅浪费时间而且还可能破坏万能板。在焊接过程中还出 现短路问题,一不小心锡丝用多了就有可能造成两个点之间的短路问题,这一点 说明了焊接能力还有待提升。实验的结果是成功的,模拟出了交通灯的功能,各个按键的功能也和模拟时致,看着数字的跳动自己信息也感到十分开心。虽然想过
2、在这个交通灯里加入 一些额外的功能,但终究由于自己知识的局限性而放弃,有点遗憾,不过能够学 到东西就好。此次试验增长了自己的单片机知识外也让我知道实践和理论学习的 差异。实践过程中学到的知识自己记得会更加牢固一些,不容易忘记。总的来说, 单片机的制作让我收获不小。附1源程序代码#include #define uchar unsigned char#define uinl unsigned iniuchar data buf4;uchar data scc_dx=20;东西数默认 uchar data sec_nb=30;南北默认值 uchar data set_timedx=20;uchar
3、 data set_timenb=30;ini n;uchar data b;定时器中断次数sbit 口才1八6;定义5组开关sbit k2=PlA7;sbit k3 = P2A7;sbit k4=P3A0;sbit k5=P3Al;sbit Yellow_nb=P2A5;南北黄灯标志sbit YelIow_dx=P2A2;东西黄灯标志sbit Green_nb=P2A4;sbit Green_dx=P2A 1;sbit Buzz=P3A7;bit Buzzer_Indicate;bit time=O;灯状态循环标志bitset= 1 ;调时方向切换键标志uchar code table 11
4、 =共阴极字型码0x3f, /-00x06, /-I0x5b, /-20x4f, /-30x66, /-40x6d, /50x7d, /-60x07, /-70x7f, /-80x6f, /-90x00 /-NULL);函数的声明局部void delay(inl ms);/延时子程序void key。;/按键扫描子程序void key_lol();/键处理子程序void key_to2();void key_to3();void display。;显示子程序void logo(); 开机 LOGOvoid Buzzer();主程序void main()TMOD=0X01;TH0=0XD8;TL
5、()=()XF();EA=1;ET()=1;TR0=l;EX0=l;EX1 = 1;logo();P2=0Xc3;/开始默认状态,东西绿灯,南北黄灯 sec_nb=sec_dx+5;while(l)key(); 调用按键扫描程序 displayO; /调用显示程序 Buzzer();函数的定义局部void key() 按键扫描子程序if(kl!=l)(delay(lO);if(kl!=l)(while(kl !=1)(key_tol();for(n=0;n40;n+) displayO;)if(k2!=l)(delay(lO);if(k2!=l)(whilc(k2!=l)key_to2();f
6、or(n=0;n40;n+) displayO;I)1if(k3!=l)TRO=1;启动定时器Buzzer_lndicate=O;sec_nb=set_timenb; 从中断回复,仍显示设置过的数值 sec_dx=set_timedx;if(time=O) P2=0X99 ;sec_nb=sec_dx+5; else P2=()xC3;sec_dx=sec_nb+5; )if(k4!=l)(delay(5);if(k4!=l)while(k4!=l);set=!set;I)if(k5!=l)|delay(5);if(k5!=1)(while(k5!=1) key_to3();)void dis
7、play。/显示子程序(buf(l=sec_dx/10; 第1位 东西秒十位 buf2=sec_dx%10; /第2位 东西秒个位 bufl3=sec_nb/10; 第3位 南北秒十位 buf0=sec_nb%10;第4位 南北秒个位Pl=0xff;/初始灯为灭的P0=0x00;Pl=0xfe;/片选 LCD1PO=tablebufl;delay(l);Pl=()xff;P0=0x00;Pl=()xfd;片选 LCD2P0=tablebuf2l;delay(l);Pl=0xff;P0=0x00;片选LCD3片选LCD3Pl=OXfb;P0=tablebuf3;delay(l);Pl=Oxff;
8、PO=OxOO;Pl=0Xf7;PO=tablelbuflOJ;片选 LCD4delay( 1);)void tiineO(void) interrupt 1 using 1 定时中断子程序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_dxniedx=100)set_timcdx=l;/加到 100 置 1sec_nb=set_timenb ; 设置的数值赋给东西南北sec_dx=sel_timedx;void key_to2()/键
9、盘处理子程序之-TR0=0;关定时器if(set=O)set_timenb; 南北减 IS elseset_timedx-; 东西减 ISif(set_timenb=O) set_timenb=99; if( set_limedx=O)seti medx=99;/减到 1 重置 99sec_nb=set_timenb ; /设置的数值赋给东西南北 scc_dx=sct_tinicdx;)void key_to3()键盘处理之紧急车通行(TR0=0;P2=0Xc9;sec_dx=00;sec_nb=00;Buzzer_Indicate= 1;)void intO(void) interrupt
10、0 using 1 只允许东西通行(TR()=();P2=0Xc3;Buzzer_Indicate=O;sec_dx=00;sec_nb=00;)只允许南北通行void inti (void) interrupt 2 using 1TR0=0;P2=0X99;Buzzer_Indicate=O;sec_nb=()();sec_dx=00;Ivoid logo。/开机的 Logo - for(n=0;n50;n+)P0=0x40;Pl=Oxfe;delay(l);Pl=()xfd;delay(l);Pl=()Xfb;delay(l);P1=OXP;delay(l);Pl = Oxff;I)voi
11、d Buzzer()(if(Buzzcr_lndicatc= 1) Buzz=!Buzz;else Buzz=0;)void delay(int ms)延时子程序(uintj,k;for(j=0;jms;j+) for(k=0;k 124;k+);)附2原理图3 AB/TX:JZ_12”N: 11 ”1: 1。P3fl.!2sPN-27PZ衿 pnMzs pz.:z PZjZ3P77Z2P2J21 pzB- (32PD?33PD.36P3.7/R0PI.?F1j6?3smP1SF3.4HDP14F3ariTiP1JP32fmT0B1 ZTVTPIN 4 4rJ.lr l/SVP3OTJVOr
12、1 .1P1DPZ7快修PZJ&AUP2STAO百PZ.4/At2ALEPZ?8 11P8BIPZAtlpz.v/epzmePQ.TfAOTfSTPDAMPDSTAC6PO.4/A04poAcaXTA12P02ifAtQPO.VAOIPDI1ACOXTAL1附录资料:不需要的可以自行删除C语言编译环境中的调试功能及常见错误提示调试功能1.常用健 + + :激活系统菜单:将光标在编辑窗口和、信息窗口之间切换:加载vload一个文件:查看程序运行结果:得到有关编辑器在线帮助:得到有关C语言的在线帮助 + :终止正在运行的程序 2.块操作 KB:定义块首 KK:定义块尾 KV:块移动 KC:块复制
13、KY:块删除 KH:取消块定义3.查找、替换和删除操作 QF:查找字符串 QA:查找并替换字符串Option: G (全程),B (向文件头),N (直接替换) Y :删除一行 QY:删除从光标位置到行末的所有字符编译中的常见错误例析(1)警告类错误XXXdeclare but never used 变量XXX已定义但从未用过。XXXis assigned a value which is never used 变量 XXX 已赋值但从 未用过。Code has no effect 程序中含有没有实际作用的代码。Non-portable pointer conversion不适当的指针转换,可
14、能是在应该使用指针的地方用了一个非0的数 值。Possible use of XXXbefore definition表达式中使用了未赋值的变里Redeclaration of main一个程序文件中主函数main不止一个。Suspicious pointer conversion 可疑的指针转换。通常是使用了基本类 型不匹配的指针。Unreachable code程序含有不能执行到的代码。(2)错误或致命错误Compound statement missing in function main 程序结尾缺少括 号。/expected; (expected等复合语句或数组初始化的结尾缺少)JC
15、ase outside of switch case 不属于 Switch 结构,多由于 switch 结 构中的花括号不配对所致。Case statement missing / switch结构中的某个case之后缺少冒号。Constant expression required定义数组时指定的数组长度不是常量表达式。Declaration syntax error结构体或联合类型的定义后缺少分号。Declaration was expected 缺少说明,通常是因为缺少分界符如逗号、 分号、右圆括号等所引起的。Default outside switch Default 局部放到了 sw
16、itch 结构之外,一般是 因为花括号不匹配而引起的。do statement must have while do 语句中缺少相应的 while 局部。Expression syntax表达式语法错。如表达式中含有两个连续的运算符 Extra parameter in call fun7调用函数fun时给出了多余的实参。Function should return a value 函数应该返回一个值,否那么与定义时的 说明类型不匹配。Illegal use of pointer指针被非法引用,一般是使用了非法的指针运算。Invalid pointer addition 指针相加非法。一个指针
17、(地址)可以和一个 整数相加,但两个指针不能相加。Lvalue required赋值运算的左边是不能寻址的表达式。Misplaced else程序遇到了没有配对的elseNo matching表达式中的括号不配对。Pointer required on left side of_ 在运算的左边只能允许一个 福针而不能是一个一般的结构 体变量或联合类型的变量。Statement missing;程序遇到了后面没有分号的语句。Too few parameters in call调用某个函数时实参数目不够。Unable to open include file XXXXXXXX. XXX 头文件找不
18、到。Unexpected 或:或在不希望的地方使用了或:。Undefined symbol Xin function fun 函数 fun 中的左量 X 没有定义。5 ,连接中的常见错误主要错误类似于undefined symbol _print in modula xxx(print 没有 定义),通常是函数名书写错误。6 ,运行中的常见错误Abnormal program termination程序异常终止。通常是由于内存使用不当所致。Floating point error : Domain 或 Divide by 0 运算结果不是一个数或 被。除Null pointer assignm
19、ent 对未初始化的指针赋值,程序有严重错误。User break在运行程序时终止。7 .程序的跟踪调试利用Run菜单可以进行程序的跟踪调试交通灯的使用大大减少了交通繁忙路口的事故发生,给行人和车辆提供一个平安 的交通环境,人们的生命和财产平安有了保障。本设计旨在模拟十字路口的交通 灯,以AT89s51单片机为基础,结合按键和数码管等元器件设计出一个简单且 完全的交通灯系统。关键词:交通灯AT89S52单片机目录(1)GO to Cursor ()一一选择该选项使程序执行到光标所在行首先将光标移到某行(一般为可执行),选择该功能项,那么程 序执行到该行的前一行暂停。此时程序处于跟踪调试状态,并
20、有亮条 显示在暂停处,此时可以查询变量或表达式的值。(2) Trace into ()一一执行一条语句或一行暂停此时程序处于跟踪调试状态,并有亮条显示在暂停处。该选项 可跟踪到被调函数的内部。(3) Step over ()一一执行一条语句或一行暂停此时程序处于跟踪调试状态,并有亮条显示在暂停处。该选项 将自定义函数当作一个语句执行,不跟踪到函程序的内部。(4) Debug 菜单程序处于跟踪状态时,可使用该菜单的选项。其主要是使用Evaluate一一目的是查询或更新变量或表达式 的值。选择Evaluate功能后,系统弹出一个对话框。该对话框包含 三个选项区域:Evaluate域可以输入一个含有
21、目前代码中(程序暂 停区的作用域)正在使用的变量名、或含变量的表达式、或常量表达 式。按回车键后,在Result域中显示变量或表达式的值。还可以用 New value域进行调试。如果调试程序时发现Result域显示的某变量或表达式的值不 正确,并能估计出该变量或表达式的值,那么可以将该值输入到New value域,继续执行程序,其目的是肯定错误发生处是否在当前位置 之前。如果输入这个正确的值并将程序继续执行完毕而结果正确,说 明在目前暂停处之前已经发生错误而之后无错误。(5) Break/Watch一一用于设置断点和监视表达式。选择Add Watch功能选项,系统将弹出一个菜单,在Add Wa
22、tch框中输入变量名或表达式,按回车键后,系统在屏幕底部开 辟一个窗口并显示该变量或表达式的值。【常见错误信息语句索引】Ambiguous operators need parentheses:不明确的运算需要用括号括起Ambiguous symbol xxx:不明确的符号Argument list syntax erro:参数表语法错误Array bounds missing in function main 缺少数组界限符Array bounds missing :丧失数组界限符Array size too large :数组尺寸太大Bad character in paramenters
23、 :参数中有不适当的字符Bad file name format in include directive :包含命令中文件名格式不正 确Bad ifdef directive synatax :编译预处理 ifdef 有语法错Bad undef directive syntax :编译预处理 undef 有语法错Bit field too large :位字段太长Call of non-function :调用未定义的函数Call to function with no prototype :调用函数时没有函数的说明Cannot modify a const object :不允许修改常量对
24、象Case outside of switch :漏掉了 case 语句Case syntax error :Case 语法错误Code has no effect :代码不可述不可能执行到Compound statement missing:分程序漏掉Conflicting type modifiers :不明确的类型说明符Constant expression required :要求常量表达式Constant out of range in comparison :在比拟中常量超出范围Conversion may lose significant digits :转换时会丧失意义的数字C
25、onversion of near pointer not allowed :不允许转换近指针Could not find file xxx:找不到 XXX 文件Declaration missing ;:说明缺少;Declaration syntax error :说明中出现语法错误Default outside of switch :Default 出现在 switch 语句之外Define directive needs an identifier :定义编译预处理需要标识符Division by zero :用零作除数Do statement must have while : Do-
26、while 语句中缺少 while 局部Enum syntax error :枚举类型语法错误Enumeration constant syntax error :枚举常数语法错误Error directive :xxx :错误的编译预处理命令Error writing output file :写输出文件错误Expression syntax error :表达式语法错误Extra parameter in call :调用时出现多余错误File name too long :文件名太长Function call missing ):函数调用缺少右括号Faction definition o
27、ut of place :函数定义位置错误Faction should return a value :函数必需返回一个值Goto statement missing label :Goto 语句没有标号Hexadecimal or octal constant too large : 16 进制或 8 进制常数太大Illegal character x:非法字符 xIllegal initialization :非法的初始化Illegal octal digit :非法的8进制数字Illegal pointer subtraction :非法的指针相减Illegal structure op
28、eration :非法的结构体操作Illegal use of floating point :非法的浮点运算Illegal use of pointer :指针使用非法Improper use of a typedefsymbol :类型定义符号使用不恰当In-line assembly not allowed :不允许使用行间汇编Incompatible storage class :存储类别不相容Incompatible type conversion :不相容的类型转换Incorrect number format :错误的数据格式Incorrect use of defaultDef
29、ault使用不当Invalid indirection无效的间接运算Invalid pointer addition 指针相加无效Irreducible expression tree无法执行的表达式运算Lvalue required需要逻辑值0或非0值Macro argument syntax error 宏参数语法错误Macro expansion too long宏的扩展以后太长Mismatched number of parameters in definition 定义中参数个数不匹 配Misplaced break此处不应出现break语句Misplaced continue 此处
30、不应出现 continue 语句Misplaced decimal point此处不应出现小数点Misplaced elif directive 不应编译预处理 elifMisplaced else此处不应出现elseMisplaced else directive此处不应出现编译预处理elseMisplaced endif directive此处不应出现编译预处理endifMust be addressable必须是可以编址的Must take address of memory location 必须存储定位的地址No declaration for function xxx没有函数 xx
31、x 的说明No stack缺少堆栈No type information没有类型信息Non-portable pointer assignment不可移动的指针(地址常数)赋值Non-portable pointer comparison不可移动的指针(地址常数)比拟Non-portable pointer conversion不可移动的指针(地址常数)转换Not a valid expression format type 不合法的表达式格式Not an allowed type不允许使用的类型Numeric constant too large 数值常太大Out of memory内存不够
32、用Parameter xxx is never used 能数 xxx 没有用至ijPointer required on left side of -符号的左边必须是指针Possible use of xxx before definition 在定义之前就使用了 xxx (警告)Possibly incorrect assignment 赋值可能不正确Redeclaration of xxx重复定义了 xxxRedefinition of xxx is not identical xx 的两次定义不一致Register allocation failure 寄存器定址失败Repeat co
33、unt needs an lvalue重复计数需要逻辑值Size of structure or array not known结构体或数给大小不确定Statement missing ;语句后缺少”;Structure or union syntax error X构体或联合体语法错误Structure size too large结构体尺寸太大Sub scripting missing 下标缺少右方括号Superfluous & with function or array 函数或数组中有多余的Suspicious pointer conversion 可疑的指针转换Symbol limi
34、t exceeded 符号超限Too few parameters in call函数调用时的实参少于函数的参数不Too many default cases Default 太多(switch 语句中一个)Too many error or warning messages 错误或警告信息太多Too many type in declaration 说明中类型太多Too much auto memory in function函数用到的局部存储太多Too much global data defined in file 文件中全局数据太多Two consecutive dots两个连续的句点
35、Type mismatch in parameter xxx 数 xxx 类型不匹酉己Type mismatch in redeclaration of xxx xx 重定义的类型不匹配Unable to create output file xxx无法建立输出文件 xxxUnable to open include file xxx无法翻开被包含的文件 xxxUnable to open input file xxx无法翻开输入文件 xxxUndefined label xxx没有定义的标号 xxxUndefined structure xxx没有定义的结构 xxxUndefined sym
36、bol xxx没有定义的符号 xxxUnexpected end of file in comment started on line xxx 从 xxx 行开 始的注解尚未结束文件不能结束Unexpected end of file in conditional started on line xxx 从 xxx 开 始的条件语句尚未结束文件不能结束Unknown assemble instruction 未知的汇编结构Unknown option未知的操作Unknown preprocessor directive: xxx不认识的预处理命令 xxxUnreachable code无路可达
37、的代码Unterminated string or character constant 字符串缺少弓I号User break用户强行中断了程序Void functions may not return a value Void 类型的函数不应有返回值Wrong number of arguments调用函数的参数数目错xxx not an argument xxx 不是参数xxx not part of structure xxx 不是结构体的一局部xxx statement missing ( xxx 语句缺少左括号xxx statement missing ) xxx 语句缺少右括号xx
38、x statement missing ; xxx 缺少分号xxx declared but never used 说明了 xxx 但没有使用xxx is assigned a value which is never used 给 xxx 赋了值但未用过Zero length structure结构体的长度为零【注意】L不同编译环境的功能或提示可能有差异;2.局部说明为“经验性”的,.一、设计任务4二、AT89s52单片机及其他元器件简介4(DAT89s52 单片机4三、系统硬件电路设计6(1)时钟电路设计6(2)复位电路设计6(3)灯控制电路设计7(4)按键控制电路设计7四、元件清单及实物
39、图81、程序清单82、原理图9五、实验心得9附1源程序代码10附2原理图16一、设计任务(1)、设计一个十字路口的交通灯控制电路,要求南北方向和东西方向两条交叉 道路上的车辆交替运行,每次通行时间都设30秒,时间可设置修改。(2)、在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道,且黄灯亮时, 要求每秒亮一次。(3)、有紧急车辆要求通过时,系统要能禁止东西和南北两条路上所有的车辆通 行。二、AT89s52单片机及其他元器件简介(1)AT89S52 单片机17 正 75亘 亘 77W2826252422273233343536373839P3.7/RDP3.6/WRP3.5/T1P3.4/
40、T0P3.3/iNTiP3.2/INT0P3.1/TXDP3.0/RXDP2.7/A15 P2.6/A14 P2.5/A13P2.4/A12P2.3/A11P2.2/A10P2.1/A9P2.0/A8P0.7/AD7P0.6/AD6P0.5/AD5P0.4/AD4P0.3/AD3P0.2/AD2P0.1/AD1P0.0/AD0P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0EA ALE PSENRSTXTAL2XTAL1 8AT89S52是一种低功耗、高F性能CM0S8位微控制器。片上Flash允许程序存储器在系统可编 工程,亦适于常规编程器。在单芯片 上,拥有灵巧的8位CPU
41、和在系 统可编程Flash,使得AT89s52为 众多嵌入式控制应用系统提供高 灵活、超有效的解决方案。AT89S52具有以下标准功能:8K 字节 Flash, 256 字节 RAM, 32 位I/O 口线,看门狗定时器,2个 数据指针,三个16位定时器/计数 一 器,一个6位向量2级中断结构, 全双工串行口,片内晶振及时钟电 路。空闲模式下,CPU停止工作, 9 允许RAM、定时器计数器、串口、 一中断继续工作。鉴于以上的优点本系统采用AT89S52作为主控芯 片,实现对整个系统的控制。1819(2)芯片 74LS24574LS245是我们常用的芯片,用来驱动led 普 或者其他的设备,它是
42、8路同相三态双向总线收 号 发器,可双向传输数据。当19脚E为H时,A、B 五 为高阻。为1.时,DIR为LH寸,数据由B传向A; 17 DIR为H时,由A传向Bo 77 12 1123T56789AOAlA2A3A4A5A6A7BOBlB2B3B4B5B6B7坦)豆 74LS245 DIR(3)两位共阴数码管16脚和11脚对应A、15 脚和10脚对应B、3脚和8脚 对应C、2脚和6脚对应D、1 脚和5脚对应E、18脚和12脚 对应F、17脚7脚对应G、4脚 和9脚对应DPo公共脚为14 脚和13脚,分别对应左边和右 边显示的数字。三、系统硬件电路设计(D时钟电路设计如下图,采用内部 时钟产生
43、方式,在XTALI 和XTAL2两端跨接晶体或 陶瓷振荡器,与内部反相 器构成稳定的自击震荡。 其发出的时钟脉冲直接送 入片内定时控制部件。(2)复位电路设计如上图所示,采用上电+按钮电平复位方式,当按下按钮时,RST管脚高电 平触发。为保证复位可靠,RC时间常数应大于两个机器周期,电容取10uf,电 阻取1000欧。(3)灯控制电路设计如上图所示,交通灯状态显示电路由东西南北四个方向各三个LED灯组成, 分别显示四个方向上红、黄、绿三个状态,用以指示十字路口各方向车辆的行驶。 通过软件编程,可使路口交通变化情况为:南北方向和东西方向两条交叉道路上 的车辆交替运行,主干道每次通行时间都设为30秒。在绿灯转为红灯时,要求 黄灯先亮5秒钟,才能变换运行车道;黄灯亮时每秒闪亮一次。(4)按键控制电路设计开关控制由7个连接到单片机的控制按钮组成。通过软件编程,使得各个开 关的功能如上图所示,基本满足了交通灯的需要。、元件清单及实物图1、程序清单名称规格数量单片机AT8