《单片机原理与应用》课程设计指导书(项目一下发).doc
-
资源ID:78755169
资源大小:231KB
全文页数:13页
- 资源格式: DOC
下载积分:20金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
《单片机原理与应用》课程设计指导书(项目一下发).doc
单片机应用技术课程设计指导书适用班级:13级大专指导老师: 张 慧盐城工业职业技术学院电子教研室2014.8 目 录1、 目的及意义2、 设计要求3、设计方案4、系统框图5、硬件电路图6、软件设计7、心得体会选题一:交通灯的设计1、目的及意义 掌目的及意义握单片机开发流程,能够独立完成单片机小系统的开发。学会查找资料,设计硬件电路,编写相应软件,电路调试,撰写设计报告,提高分析问题、解决问题的能力,为以后就业打下坚实的专业基础。2、设计要求 1)在十字路口东西南北方向各设置红、黄、绿三种信号灯;正常情况下,东西、南北方向正常放行。当东西方向 放行、南北方向禁行时,东西方向绿灯亮25秒,然后黄灯闪烁5秒,南北方向红灯亮30秒;当南北方向放行、东西方向禁行时,南北方向绿灯亮30秒,然后黄灯闪烁5秒,东西方向红灯亮35秒。如此循环,实现交通灯定时控制2)交通灯开机时数码管有“-”的LOGO显示3)系统需要设置停止按键,按下则LED显示00,所有方向的灯均为红灯4)系统需要具有调节东西和南北方向通行时间的功能5)系统需要设置东西和南北方向的按键,若南北方向按键按下,则仅南北方向绿灯,不再按照定时时间变换红绿灯;若东西方向按键按下,则仅东西方向绿灯,不再按照定时时间变换红绿灯6)统需要设置确认键,该按键按下时系统进入正常定时和红绿灯变换状态3、设计方案在十字路口的交通灯设计中,根据路口的交通状况,优先选择了利用STC89C51芯片,由于STC89C51芯片无需扩展,具备了MCS51系列单片机的所有优点,且有在线下载的功能。红、绿灯的点亮功能,时间显示功能都是由89C51芯片来控制的。P0口控制数码管的段码,选择P1口的四个口送四个数码管的位码,P3口控制按键,P2口控制红绿灯。4、系统框图5、硬件电路图(protel99软件绘制)和仿真图(proteus软件与keil软件联调)硬件电路图仿真图6、软件设计#include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar data buf4;uchar data sec_dx=20; /东西数默认uchar data sec_nb=30;/南北默认值uchar data set_timedx=20;/设置东西方向的时间uchar data set_timenb=30;/设置南北方向的时间int n;uchar data countt0;/定时器0中断次数/定义5组开关sbit k4=P37; /切换方向sbit k1=P35;/时间加sbit k2=P36;/时间减sbit k3=P34;/确认sbit k5=P31;/禁止/ P32/只允许东西方向通行,中断0/ P33/只允许南北方向通行,中断1sbit Red_nb=P26;/南北红灯标志sbit Yellow_nb=P25;/南北黄灯标志sbit Green_nb=P24; /南北绿灯标志sbit Red_dx=P23;/东西红灯标志sbit Yellow_dx=P22;/东西黄灯标志sbit Green_dx=P21;/东西绿灯标志sbit Buzz=P30;bit Buzzer_Indicate;bit set=0;/调时方向切换键标志 =1时,南北,=0时,东西bit dx_nb=0;/东西南北控制位bit shanruo=0;uchar code table11=/共阴极字型码0x3f, /-00x06, /-10x5b, /-20x4f, /-30x66, /-40x6d, /-50x7d, /-60x07, /-70x7f, /-80x6f, /-90x00 /-NULL;/函数的声明部分void delay(int ms);/延时子程序void key();/按键扫描子程序void key_to1();/键处理子程序void key_to2();void key_to3();void display();/显示子程序void logo(); /开机LOGOvoid Buzzer();/主程序void main()TMOD=0X11; /定时器设置TH0=0X3C;/定时器0置初值 0.05STL0=0XB0;EA=1;/开总中断ET0=1;/定时器0中断开启TR0=1;/启动定时0EX0=1;/开外部中断0EX1=1;/开外部中断1 logo();P2=0Xc3;/ 开始默认状态,东西绿灯,南北黄灯 sec_nb=sec_dx+5; /默认南北通行时间比东西多5秒while(1) key(); /调用按键扫描程序display(); /调用显示程序Buzzer();/函数的定义部分void key(void)/按键扫描子程序 if(k1!=1)/当K1(时间加)按下时display(); /调用显示,用于延时消抖if(k1!=1) TR0=0; /关定时器shanruo=0;P2=0x00;if(set=0)set_timedx+; /南北加1Selseset_timenb+; /东西加1Sif(set_timenb=100)set_timenb=1;if(set_timedx=100)set_timedx=1; /加到100置1sec_nb=set_timenb ; /设置的数值赋给东西南北sec_dx=set_timedx;/ do display();while(k1!=1);if(k2!=1)/当K2(时间减)按键按下时display(); /调用显示,用于延时消抖if(k2!=1) TR0=0; /关定时器shanruo=0;P2=0x00;if(set=0)set_timedx-; /南北减1Selseset_timenb-; /东西减1Sif(set_timenb=0)set_timenb=99;if(set_timedx=0 )set_timedx=99; /减到1重置99sec_nb=set_timenb ; /设置的数值赋给东西南北sec_dx=set_timedx; do display(); /调用显示,用于延时while(k2!=1);if(k3!=1)/当K3(确认)键按下时display(); /调用显示,用于延时消抖if(k3!=1)TR0=1; /启动定时器Buzzer_Indicate=0;sec_nb=set_timenb;/从中断回复,仍显示设置过的数值sec_dx=set_timedx;/显示设置过的时间if(set=0)/时间倒时到0时 P2=0X00;/东西绿灯,南北红灯Green_dx=1;Red_nb=1;sec_nb=sec_dx+5; /回到初值else P2=0x00;/南北绿灯,东西红灯Green_nb=1;Red_dx=1;sec_dx=sec_nb+5; if(k4!=1)/当K4(切换)键按下 display(); /调用显示,用于延时消抖if(k4!=1) TR0=0;set=!set;/取反set标志位,以切换调节方向dx_nb=set;dodisplay(); while(k4!=1);if(k5!=1)/当K5(禁止)键按下时 display(); /调用显示,用于延时消抖 if(k5!=1) TR0=0;/关定时器P2=0x00;Red_dx=1;Red_nb=1;/全部置红灯sec_dx=00;/四个方向的时间都为00sec_nb=00;Buzzer_Indicate=1;dodisplay(); while(k5!=1); void display(void) /显示子程序buf1=sec_nb/10; /第1位 东西秒十位buf2=sec_nb%10; /第2位 东西秒个位buf3=sec_dx/10; /第3位 南北秒十位buf0=sec_dx%10; /第4位 南北秒个位P1=0xff; / 初始灯为灭的P0=0x00;P1=0xfe; /片选LED1P0=tablebuf1;/送东西时间十位的数码管编码delay(1);/延时P1=0xff;/关显示P0=0x00;P1=0xfd; /片选LED2P0=tablebuf2;delay(1);P1=0xff;P0=0x00;P1=0Xfb; /片选LED3P0=tablebuf3;delay(1);P1=0xff;P0=0x00;P1=0Xf7;P0=tablebuf0;/片选LED4delay(1);void time0(void) interrupt 1 using 1 /定时中断子程序TH0=0X3C;/重赋初值TL0=0XB0;TR0=1;/重新启动定时器countt0+;/软件计数加1if(countt0=20) / 定时器中断次数=20时(即1秒时)countt0=0;/清零计数器sec_dx-;/东西时间减1sec_nb-;/南北时间减1if(sec_nb<=5)&&(dx_nb=0)&&(shanruo=1) /东西黄灯闪 Green_dx=0;Yellow_dx=!Yellow_dx; if(sec_dx<=5)&&(dx_nb=1)&&(shanruo=1) /南北黄灯闪 Green_nb=0;Yellow_nb=!Yellow_nb; if(sec_dx=0&&sec_nb=5) /当东西倒计时到0时,重置5秒,用于黄灯闪烁时间sec_dx=5;shanruo=1;if(sec_nb=0&&sec_dx=5)/当南北倒计时到0时,重置5秒,用于黄灯闪烁时间sec_nb=5;shanruo=1;if(dx_nb=0&&sec_nb=0)/当黄灯闪烁时间倒计时到0时, P2=0x00;/重置东西南背方向的红绿灯Green_nb=1;Red_dx=1;dx_nb=!dx_nb;shanruo=0;sec_nb=set_timenb;/重赋南北方向的起始值sec_dx=set_timenb+5;/重赋东西方向的起始值if(dx_nb=1&&sec_dx=0)/当黄灯闪烁时间到P2=0X00;/重置东西南北的红绿灯状态Green_dx=1;Red_nb=1;dx_nb=!dx_nb;shanruo=0;sec_dx=set_timedx;/重赋东西方向的起始值sec_nb=set_timedx+5;/重赋南北方向的起始值/外部中断0void int0(void) interrupt 0 using 1 /只允许东西通行TR0=0;/关定时器P2=0x00;Green_dx=1;/东西方向置绿灯Red_nb=1;/南北方向为红灯Buzzer_Indicate=0;sec_dx=00;/四个方向的时间都为00sec_nb=00;/外部中断1void int1(void) interrupt 2 using 1 /只允许南北通行 TR0=0;/关定时器P2=0x00;Green_nb=1;/置南北方向为绿灯Red_dx=1;/东西方向为红灯Buzzer_Indicate=0;sec_nb=00;/四个方向的时间都为00sec_dx=00;void logo()/开机的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;void Buzzer() if(Buzzer_Indicate=1) Buzz=!Buzz; else Buzz=0;void delay(int ms)/延时子程序uint j,k;for(j=0;j<ms;j+)/延时ms for(k=0;k<124;k+);/大约1毫秒的延时