单片机课程设计双机通信交通灯_第1页
单片机课程设计双机通信交通灯_第2页
单片机课程设计双机通信交通灯_第3页
单片机课程设计双机通信交通灯_第4页
单片机课程设计双机通信交通灯_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

本文格式为Word版,下载可任意编辑——单片机课程设计双机通信交通灯《单片机课程设计》设殳计报告题目双机通信专业:

电子信息工程班级:

班学号:

631

姓名:指导老师:重庆交通大学信息科学与工程学院设计时间:年1月1日到年1月9号

2/14

1.设计任务说明在课程测验(交通灯)的根基上,实现双机通信:

1、可以是PC机与单片机的通信,通过PC机上的软件(如串口调试助手等)

操纵单片机交通灯的设置(如变更不同路口红绿灯时间等参数的设置)

;2、也可通过一个单片机系统操纵另一个单片机系统交通灯的设置(如变更不同路口红绿灯时间等参数的设置)。

3、也可完成经指导老师批准的其它题目,如:

(1)

用单片机及A/D转换芯片实现的数字电压表(2)

用单片机及D/A转换芯片实现的波形发生器2.总体设计本人选择做双机通信交通灯,通过两个按键分别设置红灯、绿灯的时间参数。当然,设置时间参数的是其中一块单片机,操纵数码管和红绿灯亮暗的的变化又是另外一块单片机。

3.细致设计总设计图如下:

R122]"・.届ESP兀冏LD-IED.D1

「/MruirULlHiUUML1AD1PD2MD2金L2PD耶旳bDJAbi

PQWP6RSTPDJ^iCT

P2.1JCR9

pai^inPEN卩刊川AIEP2.^%12EAP2SM.13陋加*

P2JA15PHP3H/RXP3.1/DCiP1^P3Z/1N1EPL?Pt*F33/fRrTTPd.RDP15叮屯LP1J6P3OHRPk?PS.T/RN-

CUM;昨丘』》临5ILD-gD2a?3L--Z2._2J_n

LIZl122135口25_3L...26__2L...3LD1111213li_|iLLf讎」绿灯时间操纵红灯时间J2_13.ii_.JS_,dpomo口XTAL1*■L1AD1

XTA12PD.i^bi

PE.S^05

PDTMTIRSrT

卩211陶

p士訓jn

P2.3W^11FSEWP2.UW.12ALEP2^ll3Eft帆础*

P2TJIK15

p^nmxDpinP3/I/TVDP1.1P^lSINTTnP1^

柑测TTF1JP3.4/TIiF1.4旧旳_F15旧JEW尺P1

Pl.T

LED-VfeLLQWL18FGIDF1

2

J

*

5

6

T

丄.BIDr-iiJ:*in

31ABCDE

3/14

LED-REDD1R2220IEtGREENIIHLrIXYELLOWCLOCK=12.0MHz30C51乙机)

4.程序及说明流程图:

开头乙单片机循环运行红绿灯,分别对应60秒,30秒等待中断

4/14

中断处理:进入中断甲机按键按下,对应的红绿灯时间自动减一甲机将数据通过串行端口传送给乙单片机乙单片机短暂地显示刚设置好的红绿灯时间参数乙单片机进入下一次循环显示的时候,重新取新的时间参数

甲单片机程序代码如下:

#ineludereg51.h#defineucharunsignedchar#defineuintunsignedintucharx=100;〃红灯最长时间设置为99秒uchary=51;//绿灯最长时间设置为50秒uchart;/***********串行口发送与接收中断处理函数**********************************************/voidinit(){IP=0x02;//中断优先级设置(T0中断为最高优先级,然后是INT0,最后是INT1)TMOD=0X21;//T1定时计数器工作于方式2,作为波特率发生器,SMOD此处默认取0//T0工作方式1,16位计数TH仁0Xe6;TL1=0Xe6;//8位自动重装,波特率设置为1200TR1=1;//启动T1定时计数器SCON=0x40;//串行方式1,串行接收遏止

5/14

EX0=1;//开启外部中断0EX1=1;//开启外部中断1IT0=1;//INT0,外部中断0,下降沿触发IT1=1;//INT1,外部中断1,下降沿触发EA=1;//开总中断}

voidtimer1()interrupt1{

//TMOD=0x01;TR0=0;TH0=(65536-10000)/256;//对于12MHz的晶振,此处定时50ms赋值0X3cb0TL0=(65536-10000)%256;//若定时10ms,赋值0XD8F05m赋值0Xec78TR0=1;//启动定时器T0工作t--;}

/***********外部中断0函数**********************************************/voidint0()interrupt0//对应红灯时间参数设置{

TH0=(65536-10000)/256;//对于12MHz的晶振,此处定时50ms赋值0X3cb0TL0=(65536-10000)%256;//若定时10ms,赋值0XD8F05m赋值0Xec78ET0=1;//开T0中断苦求t=6;//设定延时长短TR0=1;//启动定时器T0工作while(t);//延时消抖TR0=0;//遏止T0定时器工作,防止后面程序运行时被中断IE0=0;//再次清外部中断0苦求标志x--;if(x==10)x=99;TI=0;//清发送中断苦求标志,先发再查SBUF=1;//作为标识标志,发送给乙机while(!TI);//查询方式TI=0;SBUF=x;

定时器0函数//工作方式1,16位计数外部中断1函数}

6/14

**********************************************/voidint1()interrupt2//对应绿灯时间参数设置{

TH0=(65536-10000)/256;//对于12MHz的晶振,此处定时50ms赋值0X3cb0TL0=(65536-10000)%256;//若定时10ms,赋值0XD8F05m赋值0Xec78ET0=1;//开T0中断苦求TR0=1;//启动定时器T0工作t=6;while(t);//延时消抖TR0=0;IE1=0;//再次清外部中断1苦求标志y--;if(y==10)y=50;TI=0;SBUF=0;while(!TI);//查询方式TI=0;SBUF=y;}

/***********main(){

init();while(1);}

乙单片机代码如下:

#includereg51.h#defineucharunsignedchar#defineuintunsignedintuchart=0;//用于timer0函数,设置数码管显示的数字跳变的时间间隔ucharw=0;//切换红绿灯标志位uchark=255;//用于串口中断处理,甲机的按键按一次,那么向乙机发送两个单字节数据//前一个数据用于辨识将要设置的时间参数属于红灯还是绿灯//后一个数据是想要设置的时间参数,直接赋值给相应的色灯ucharf1;//用于串口中断处理,辨识设置的时间参数属于红灯还是绿灯

函数

7/14

ucharf2=0;//标志位,表示有串行中断发生时,要将已设置好的时间参数显示出来,1有效uintn;//用于设定要设置的时间参数在数码管上显示停留的时间长短codetab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//阴//codetab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//阳作为高位数码管的公共端作为低位数码管红灯数据输出位设置sbitgreen=P2A3;sbityellow=P2A4;//sbitr_ed=P0A5;//sbitg_reen=P0A6;//sbity_ellow=P0A7;//ucharr_g_y;

voidinit(){

IP=0x10;//中断优先级设置(串口中断为最高优先级)TMOD=0X21;//T1定时计数器工作于方式2,作为波特率发生器,SMOD此处默认取0//T0定时计数器工作于方式1,用于定时TH1=0Xe6;TL1=0Xe6;//8位自动重装TR1=1;//启动T1定时计数器SCON=0x50;//串行方式1,串行接收允许TH0=(65536-50000)/256;//定时50msTL0=(65536-50000)%256;EA=1;//开总中断ET0=1;//开T0中断苦求

ES=1;//允许串行口中断

TR0=1;I//启动定时器TO工作

}

/**********延时函数二个是绿灯的时长参数ucharg;//作为数组的下标,如data_2[g]

uinti;//用于动态显示字符

uintj;//用于动态显示字符

/***********初始化函数uchara=60;//直接赋值给数码管的数据uchardata_2[]={60,30};//数组的第一个数据是红灯的时长参数,第uchar数码管共uchar数码管共sbitd仁P2P;〃d1sbitd2=P2A1;〃d2sbitred=P2A2;//

8/14

********************************************"voiddelay(uintz){uinti;for(i=0;iz;i++);voiddisplay(ucharc){uchara=c;i=a/10;j=a%10;//以下是动态显示,d1=0;d2=1;//若是共阳,位选d1,d2取值相反P1=tab[i];delay(30);P1=0;delay(30);d1=1;d2=0;P1=tab[j];delay(30);P1=0;delay(30);}

************/voidtimer0()interrupt1{

TR0=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;t++;if(t==7){a=a-1;t=0;}if(a=5t%2==0){yellow=~yellow;if(a==0){w++;red=~red;green=~green;yellow=0;if(w%2==1)a=data_2[1];

数码管动态//若是共阳,位选d1,d2取值相反定时}

9/14

elsea=data_2[0];}

/***********串行口发送与接收中断处理函数**********************************************/voidt_r()interrupt4{

TR0=0;//暂停定时器工作,进入红绿灯时间设置状态//写接收数据的程序f2=1;n=1000;//设置变更后的时间参数在数码管上显示停留的时间,每次中断后,n务必重新赋值,//保证其在数码管上的显示数据停留一个固定的时间段显示处理程序写在主函数中RI=0;//清接收中断苦求标志//r_ed=red;//g_reen=green;//y_ellow=yellow;//r_g_y=P1;k++;//奇数,偶数次的接收数据,存放于不同位置if(k%2==0)//全局变量k初值为255,上一条指令自加后,为0;模除2,余0,为偶数,{//那么本次中断的目的是辨识将要设置的时间参数属于红灯还是绿灯f1=SBUF;if(f1==1)g=0;//辨识将要设置的时间参数属于红灯还是绿灯,此处为红灯elseg=1;//此处为绿灯。

}

else//模除2,余1,为奇数,那么本次中断的目的是{//把要设置的时间参数赋值给相应的色灯。

data_2[g]=SBUF;//接收数据,设置相应色灯的时间参数//while(n--)//短暂延时,显示您所设置的时间参数,

//display(data_2[g]);//

}

TR0=1;//重新开启定时器主函

voidmain(){}

10/14

green=0;yellow=0;red=1;init();while(1){if(f2==1){

ET0=0;//作用如下一行//TR0=0;//暂停定时器工作,(主函数中怎么将TR0清零无效,??????)/**switch(g)//switch语句用来处理发送给乙单片机的LED灯变化数据{

case0:{red=1;green=0;yellow=0;}break;case1:{red=0;green=1;yellow=0;}break;default:;}

**/while(n--)display(data_2[g]);//短暂延时,显示您所设置的时间参数//red=r_ed;green=g_reen;yellow=y_ellow;//P1=r_g_y;、//单步调试都可以,proteus仿真就不行??whyf2=0;//TR0=1;//重新开启定时器ET0=1;}

display(a);//始终点亮数码管,并等待定时中断和串行口中断}}

5.系统测试

11/14

程序初始化红灯最长显示时间EI-HECi..4t1rto:[U-■■苔二由-lHla^9RBHd:

.i.■■■*njn

■1

■■*■■■*Ii.|^l-WIBilly!cLpc^izHi科=氨;i..ri■卩pgmp匚祁PC-SfASFVAM

PQ7UII7pmjASPS/昭PZ2TA1DPl小F孟祁阿FZJ*AOrAi4P^T^JLtCP^JQ"PCIFZinxi60秒(图如上)

红灯结果5秒钟黄灯闪烁(如上图)

.LEDABD:TAL3■^|.|..|.|||.|.|..^.|-FZ-WlfffLE-C.ELUW^.产訓Q耳即IjABCDEFGDF12:TAL1J.LED^HE^MPQnADiC卩04*人站PD3A7FDaAfrlPDL^AD*P6S瞋祐RDKAGMipni^AvP2ITA3F2.IWP23A1CP33TAH1F2.4!A13陀來口R.srr红灯60秒钟完后,绿灯显示30秒钟(如上图)

12/14

绿灯结果5秒钟时,黄灯闪烁(如上图)

任何时刻,皆可以设置红灯的时间参数(如上图)

分析:本程序为了不至于红灯时间太短时,就直接导致黄灯5秒闪烁,而将红灯时间参数设置范围定位10到99秒钟,按键每按一次时间参数自动减一,数码管显示刚刚设置好的时间参数1至2秒钟,然后回到断点,持续显示之前的交通灯状态;等到下一次循环到来时,显示新的已设置好的时间参数。FD^AbClH.1MD1FD^ADZruj-L"jRD.M

温馨提示

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

评论

0/150

提交评论