




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机课程设计设计报告题目: 双机通信 专业: 电子信息工程 班级: 班 学号: 631 姓名: 指导老师: 重庆交通大学信息科学与工程学院设计时间:年 1 月 1 日到 年 1 月 9 号1设计任务说明 在课程实验(交通灯)的基础上,实现双机通信:1、可以是PC机与单片机的通信,通过PC机上的软件(如串口调试助手等)控制单片机交通灯的设置(如改变不同路口红绿灯时间等参数的设置);2、也可通过一个单片机系统控制另一个单片机系统交通灯的设置(如改变不同路口红绿灯时间等参数的设置)。3、也可完成经指导老师批准的其它题目,如: (1)用单片机及A/D转换芯片实现的数字电压表 (2)用单片机及D/A转
2、换芯片实现的波形发生器2. 总体设计本人选择做双机通信-交通灯,通过两个按键分别设置红灯、绿灯的时间参数。当然,设置时间参数的是其中一块单片机,控制数码管和红绿灯亮暗的的变化又是另外一块单片机。3. 详细设计总设计图如下:4程序及说明流程图:开始乙单片机循环运行红绿灯,分别对应60秒,30秒等待中断结束进入中断中断处理:甲机按键按下,对应的红绿灯时间自动减一甲机将数据通过串行端口传送给乙单片机乙单片机短暂地显示刚设置好的红绿灯时间参数乙单片机进入下一次循环显示的时候,重新取新的时间参数中断结束甲单片机程序代码如下:#include <reg51.h>#define uchar un
3、signed char#define uint unsigned intuchar x=100;/红灯最长时间设置为99秒uchar y=51;/绿灯最长时间设置为50秒uchar t;/*串行口发送与接收中断处理函数*/void init() IP=0x02; /中断优先级设置(T0中断为最高优先级,然后是INT0,最后是INT1)TMOD=0X21; /T1定时计数器工作于方式2,作为波特率发生器,SMOD此处默认取0/T0工作方式1,16位计数TH1=0Xe6;TL1=0Xe6; /8位自动重装,波特率设置为1200TR1=1; /启动T1定时计数器SCON=0x40; /串行方式1,串
4、行接收禁止EX0=1; /打开外部中断0EX1=1; /打开外部中断1IT0=1; /INT0,外部中断0,下降沿触发IT1=1; /INT1,外部中断1,下降沿触发EA=1; /开总中断/*定时器0函数*/void timer1() interrupt 1/TMOD=0x01; /工作方式1,16位计数 TR0=0;TH0=(65536-10000)/256; /对于12MHz的晶振,此处定时50ms,赋值0X3cb0TL0=(65536-10000)%256; /若定时10ms,赋值0XD8F0;5ms,赋值0Xec78TR0=1;/启动定时器T0工作t-;/*外部中断0函数*/void
5、int0() interrupt 0 /对应红灯时间参数设置 TH0=(65536-10000)/256; /对于12MHz的晶振,此处定时50ms,赋值0X3cb0TL0=(65536-10000)%256; /若定时10ms,赋值0XD8F0;5ms,赋值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;/作为标识标志,发送给乙机whi
6、le(!TI);/查询方式TI=0;SBUF=x;/*外部中断1函数*/void int1() interrupt 2 /对应绿灯时间参数设置 TH0=(65536-10000)/256; /对于12MHz的晶振,此处定时50ms,赋值0X3cb0TL0=(65536-10000)%256; /若定时10ms,赋值0XD8F0;5ms,赋值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
7、=0;SBUF=y;/*主函数*/main()init();while(1);乙单片机代码如下:#include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar t=0; /用于timer0函数,设置数码管显示的数字跳变的时间间隔uchar w=0; /切换红绿灯标志位uchar k=255; /用于串口中断处理,甲机的按键按一次,则向乙机发送两个单字节数据 /前一个数据用于辨识将要设置的时间参数属于红灯还是绿灯 /后一个数据是想要设置的时间参数,直接赋值给相应的色灯uchar f1; /用于串口
8、中断处理,辨识设置的时间参数属于红灯还是绿灯uchar f2=0; /标志位,表示有串行中断发生时,要将已设置好的时间参数显示出来,1有效uint n;/用于设定要设置的时间参数在数码管上显示停留的时间长短code uchar tab=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/数码管共阴/code uchar tab=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90;/数码管共阳sbit d1=P20; /d1作为高位数码管的公共端sbit d2=P21; /d2作为低位数码管sbit
9、 red=P22; /红灯数据输出位设置sbit green=P23;sbit yellow=P24;/sbit r_ed=P05;/sbit g_reen=P06;/sbit y_ellow=P07;/uchar r_g_y;uchar a=60; /直接赋值给数码管的数据uchar data_2=60,30;/数组的第一个数据是红灯的时长参数,第二个是绿灯的时长参数uchar g;/作为数组的下标,如data_2guint i;/用于动态显示字符uint j;/用于动态显示字符/*初始化函数*/void init() IP=0x10; /中断优先级设置(串口中断为最高优先级) TMOD=0
10、X21; /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; /启动定时器T0工作/*延时函数*/ void delay(uint z) uint i;for(i=0;i<z;i+);/*数码管动态显示*/
11、void display(uchar c) uchar a=c; i=a/10;j=a%10;/以下是动态显示, d1=0;d2=1;/若是共阳,位选d1,d2取值相反 P1=tabi; delay(30); P1=0; delay(30); d1=1;d2=0;/若是共阳,位选d1,d2取值相反 P1=tabj; delay(30); P1=0; delay(30); /*定时器0*/ void timer0() interrupt 1 TR0=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;t+;if(t=7)a=a-1;t=0;if
12、(a<=5 && t%2=0) yellow=yellow;if(a=0)w+;red=red;green=green;yellow=0;if(w%2=1) a=data_21;else a=data_20;/*串行口发送与接收中断处理函数*/void t_r() interrupt 4 TR0=0;/暂停定时器工作,进入红绿灯时间设置状态/写接收数据的程序f2=1;n=1000; /设置改变后的时间参数在数码管上显示停留的时间,每次中断后,n必须重新赋值, /保证其在数码管上的显示数据停留一个固定的时间段显示处理程序写在主函数中RI=0; /清接收中断请求标志/r_ed
13、=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_2g=SBUF; /接收数据,设置相应色灯的时间参数/while(n-) /短暂
14、延时,显示您所设置的时间参数,【在串行中断处理函数中不要停留太久,如100us】/display(data_2g);/【防止中断处理中串行数据接收出错】 TR0=1;/重新打开定时器/*主函数*/ void main() green=0; yellow=0;red=1; init(); while(1) if(f2=1)ET0=0; /作用如下一行/TR0=0;/暂停定时器工作,(主函数中怎么将TR0清零无效,?)/*switch(g) /switch语句用来处理发送给乙单片机的LED灯变化数据 case 0:red=1;green=0;yellow=0;break; case 1:red=0
15、;green=1;yellow=0;break; default: ;*/while(n-)display(data_2g); /短暂延时,显示您所设置的时间参数/red=r_ed;green=g_reen;yellow=y_ellow;/P1=r_g_y; 、/单步调试都可以,proteus仿真就不行?whyf2=0;/TR0=1;/重新打开定时器ET0=1;display(a);/始终点亮数码管,并等待定时中断和串行口中断5系统测试程序初始化红灯最长显示时间60秒(图如上)红灯最后5秒钟黄灯闪烁(如上图)红灯60秒钟完后,绿灯显示30秒钟(如上图)绿灯最后5秒钟时,黄灯闪烁(如上图)任何时刻,皆可以设置红灯的时间参数(如上图)分析:本程序为了不至于红灯时间太短时,就直接导致黄灯5秒闪烁,而将红灯时间参数设置范围定位10到99秒钟,按键每按一次时间参数自动减一,数码管显示刚刚设置好的时间参数1至2秒钟,然后回到断点,继续显示之前的交通灯状态;等到下一次循环到来时,显示新的已设置好的时间参数。绿灯最长时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 专业装修公司合同样本
- 临街电梯出租合同样本
- led施工合同样本
- 公司货物销售合同样本
- 二手车汽车收购合同样本
- 人工机械租赁公司合同样本
- 关于车辆审合同样本
- 2025YY企业合同简易劳动合同范本
- 2025至2030年中国卷绕头成形板市场现状分析及前景预测报告
- 2025至2030年中国单螺旋浸渍式混合机行业投资前景及策略咨询报告001
- 直击重点的2024年ESG考试试题与答案
- DB45T 1056-2014 土地整治工程 第3部分:验收技术规程
- 特种设备重大事故隐患判定准则
- 信息技术行业安全保障措施及系统稳定性维护
- 电力安全一把手讲安全课
- (2025)驾照C1证考试科目一必考题库及参考答案(包过版)
- 2025年泰兴经济开发区国有企业招聘笔试参考题库含答案解析
- 2025年人民法院信息技术服务中心招聘应届高校毕业生高频重点提升(共500题)附带答案详解
- 无线通信射频收发系统设计研究
- 造纸厂管理规章制度
- 护理授权管理制度内容
评论
0/150
提交评论