当前位置:文档之家› 2020年(交通运输)单片机整套实验及程序(交通灯_跑马灯等)

2020年(交通运输)单片机整套实验及程序(交通灯_跑马灯等)

(交通运输)单片机整套实验及程序(交通灯_跑马灯等)实验1 跑马灯实验一、实验目的●初步学会Proteus ISIS和uVision2单片机集成开发环境的使用;●初步掌握采用汇编语言与C语言开发单片机系统的程序结构;●掌握80C51单片机通用I/O口的使用;●掌握单片机内部定时/计数器的使用及编程方法以及中断处理程序的编写方法。

二、实验设备及器件●硬件:PC机,HNIST-1型单片机实验系统●软件:Proteus ISIS单片机仿真环境,uVision2单片机集成开发环境三、实验内容●编写一段程序,采用P1口作为控制端口,使与P1口相接的四个发光二极管(D1、D2、D3、D4)按照一定的方式点亮。

如点亮方式为:先点亮D1,延时一段时间,再顺序点亮D2……D4,然后又是D4……D1,同时只能有一个灯亮;然后每隔一段时间一次使相邻两个灯亮,三个灯亮,四个灯亮,最后闪烁三次,接着循环变化。

●基于Proteus ISIS仿真环境完成上述功能的仿真。

●基于uVision2单片机集成开发环境与硬件平台完成程序的脱机运行。

四、实验原理图图3.1 跑马灯实验电路原理图电路原理图如上图3.1所示,AT89S52的P1.0~P1.3控制4个发光二极管,发光二极管按照一定次序发光,相邻发光二极管的发光时间间隔可以通过定时器控制,还可以通过软件延时实现。

五、软件流程图与参考程序●主程序流程图如下:●参考程序#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar aa,num,speed,flag;uchar code table[]={0x0e,0x0d,0x0b,0x07};uchar code table1[]={0x0a,0x05,0x09,0x06};uchar codetable2[]={0x0c,0x09,0x03,0x08,0x01,0x0e,0x0c,0x08,0x00};void delay(uint z)//延时函数{uint x;uchar y;for(x=z;x>0;x--)for(y=200;y>0;y--);}void init()//条件初始化函数{ flag=0;speed=10;//控制跑马灯流水速度TMOD=0x01;//中断方式TH0=(65535-50000)/256;TL0=(65536-50000)%256;//初值EA=1;//打开总中断ET0=1;//打开外中断0TR0=1;}void main(){init();//调用初始化函数while(1){if(flag){delay(2000);//调用延时函数for(num=0;num<4;num++)//从左至右间隔一个依次闪烁{P1=table[num];delay(2000);}for(num=3;num>0;num--)//从左至右间隔一个依次闪烁{P1=table[num];delay(2000);}for(num=0;num<4;num++)//从左至右间隔两个依次闪烁{P1=table1[num];delay(2000);}for(num=3;num>0;num--)//从左至右间隔两个依次闪烁{P1=table1[num];delay(2000);}for(num=0;num<6;num++)//两个,三个,四个跑马灯依次闪烁{P1=table2[num];delay(2000);}for(num=0;num<5;num++)//闪烁5次{P1=0xff;//全暗delay(2000);P1=0X00;//全亮delay(2000);}speed=speed-3;//变速if(speed==4){speed=10;}}}}void timer0() interrupt 1//中断函数{TH0=(65535-50000)/256;TL0=(65536-50000)%256;aa++;if(aa==speed){aa=0;flag=1;}}六、实验思考题●请用汇编指令完成本实验内容,深刻理解汇编语言程序设计结构。

●在本实验中,I/O口作为输出口使用,如果把I/O口的某些口线作为输入口使用时,如何获得输入引脚状态?请举例说明。

●在画软件流图时,各种不同形式方框意义是否相同?请举例示之。

●请简要叙述中断服务程序功能并画出其流程图。

●在采用I/O口作为输出口时要考虑哪些因素?如果负载变化,如何设计单片机与负载之间的接口电路?实验2 交通灯实验一、实验目的●进一步掌握Proteus ISIS和uVision2单片机集成开发环境的使用;●进一步掌握单片机内部定时/计数器的使用及编程方法以及中断处理程序的编写方法●掌握单片机的I/O口编程使用。

二、实验设备及器件●硬件:PC机,HNIST-1型单片机实验系统,USB下载线一根、连接线若干●软件:Proteus ISIS单片机仿真环境,uVision2单片机集成开发环境三、实验内容●编写一段程序,实现用单片机的I/O口控制12个发光二极管(四组,每组有红绿蓝三个发光二极管),使发光二极管按照一定的规则模拟交通灯功能。

●基于Proteus ISIS仿真环境完成上述功能的仿真。

●基于uVision2单片机集成开发环境与硬件平台完成程序的脱机运行。

四、实验原理图3.2 交通灯实验原理图用单片机的IO口控制4组红绿蓝共12个发光二极管,使发光二极管按照一定规则与次序发光与闪亮以实现模拟交通灯的功能。

假设初始状态为:(南北通行状态)南北绿灯、东西红灯(25s);后转为过度状态:南北黄灯、东西红灯(5s);再转为东西通行状态:东西绿灯、南北红灯25(s)。

再转为过渡状态:东西黄灯、南北红灯(5s),然后循环往复。

硬件原理图如上图3.2所示。

由于发光二极管的导通电压为1.7V,所以在电源与二极管之间加一个电阻,目的是保护二极管;实验中利用定时计数器实现1S的定时,然后在此基础上实现所需要的定时时间。

五、软件流程图与参考源程序软件设计思想:在编程时,我们一般把一个独立的功能设计成一个子程序或者说函数。

对于不同的设计者而言,对软件功能的划分角度不同,对应的函数功能也存在差异。

图3.3 软件结构图参考源程序如下:#include<reg52.h>//头文件#define uint unsigned int#define uchar unsigned char//定义下方便使用sbit kong=P1^4;//位声明数码管锁存控制端uchar code table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//数字0-9编码uint tt,temp=0;/************************************************延时函数**************************************************/void delay(uint x){uchar i,k;for(i=0;i<x;i++)for(k=0;k<100;k++);}/**************************************************初始化函数***************************************************/ void init(){temp=0;tt=0;TMOD=0x01;//定时器工作方式TH0=(65536-50000)/256;TL0=(65536-50000)%256;//装初值EA=1;//开总中断ET0=1;//开定时器中断TR0=1;//启动定时器中断}/************************************************* 数码管显示函数*************************************************/ void display(uint x1){uchar i,c;uint cod[4];cod[3]=x1/1000;cod[2]=x1%1000/100;cod[1]=x1%1000%100/10;cod[0]=x1%10 ;//求个数码管的值c=0x01;for(i=0;i<4;i++){P1=c;//数码管的显示选择P0=table[cod[i]];//送要显示的值kong=1;//打开锁存c=c<<1;//左移一位选择下一个数码管kong=0;//关闭锁存delay(10);}}/****************************************交通灯驱动函数*****************************************/void jiaotong(){ // uint t=0;if(temp==0)temp=60;//给temp装值,也即是交通灯循环一次要的时间if(temp>30){if(temp<=35){display(temp-30);P2=0Xf5;//南北黄灯、东西红灯(5s)}else{display(temp-30);P2=0xdd; //南北绿灯、东西红灯(25s)}}else{ if(temp<=5){display(temp);P2=0xee; //东西黄灯、南北红灯(5s) }else{display(temp);P2=0xeb; //东西绿灯、南北红灯25(s)}}if(tt==20) //判断时间是否过了1s{tt=0;temp--;//倒计数}}/************************************************ 主函数************************************************/ void main(){init();//初始化函数调用while(1)//主循环{jiaotong();//交通灯函数调用}}//中断函数void timer0() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256; //重新装初值tt++;}六、实验思考题●如何实现扩充功能,实现救护车优先通过十字路口?请叙述硬件设计与软件设计原理。

●在利用单片机片内定时器实现精确定时时,是否会产生误差?如果存在误差请分析误差产生原因以及减小误差方法。

相关主题