单片机整套实验及程序交通灯跑马灯等.docx
- 文档编号:6402366
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:109
- 大小:893.09KB
单片机整套实验及程序交通灯跑马灯等.docx
《单片机整套实验及程序交通灯跑马灯等.docx》由会员分享,可在线阅读,更多相关《单片机整套实验及程序交通灯跑马灯等.docx(109页珍藏版)》请在冰豆网上搜索。
单片机整套实验及程序交通灯跑马灯等
实验1跑马灯实验
一、实验目的
●初步学会ProteusISIS和uVision2单片机集成开发环境的使用;
●初步掌握采用汇编语言与C语言开发单片机系统的程序结构;
●掌握80C51单片机通用I/O口的使用;
●掌握单片机内部定时/计数器的使用及编程方法以及中断处理程序的编写方法。
二、实验设备及器件
●硬件:
PC机,HNIST-1型单片机实验系统
●软件:
ProteusISIS单片机仿真环境,uVision2单片机集成开发环境
三、实验内容
●编写一段程序,采用P1口作为控制端口,使与P1口相接的四个发光二极管(D1、D2、D3、D4)按照一定的方式点亮。
如点亮方式为:
先点亮D1,延时一段时间,再顺序点亮D2……D4,然后又是D4……D1,同时只能有一个灯亮;然后每隔一段时间一次使相邻两个灯亮,三个灯亮,四个灯亮,最后闪烁三次,接着循环变化。
●基于ProteusISIS仿真环境完成上述功能的仿真。
●基于uVision2单片机集成开发环境与硬件平台完成程序的脱机运行。
四、实验原理图
图3.1跑马灯实验电路原理图
电路原理图如上图3.1所示,AT89S52的P1.0~P1.3控制4个发光二极管,发光二极管按照一定次序发光,相邻发光二极管的发光时间间隔可以通过定时器控制,还可以通过软件延时实现。
五、软件流程图与参考程序
●主程序流程图如下:
●参考程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharaa,num,speed,flag;
ucharcodetable[]={0x0e,0x0d,0x0b,0x07};
ucharcodetable1[]={0x0a,0x05,0x09,0x06};
ucharcodetable2[]={0x0c,0x09,0x03,0x08,0x01,0x0e,0x0c,0x08,0x00};
voiddelay(uintz)//延时函数
{
uintx;
uchary;
for(x=z;x>0;x--)
for(y=200;y>0;y--);
}
voidinit()//条件初始化函数
{flag=0;
speed=10;//控制跑马灯流水速度
TMOD=0x01;//中断方式
TH0=(65535-50000)/256;
TL0=(65536-50000)%256;//初值
EA=1;//打开总中断
ET0=1;//打开外中断0
TR0=1;
}
voidmain()
{
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;}
}
}
}
voidtimer0()interrupt1//中断函数
{
TH0=(65535-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==speed)
{
aa=0;
flag=1;
}
}
六、实验思考题
●请用汇编指令完成本实验内容,深刻理解汇编语言程序设计结构。
●在本实验中,I/O口作为输出口使用,如果把I/O口的某些口线作为输入口使用时,如何获得输入引脚状态?
请举例说明。
●在画软件流图时,各种不同形式方框意义是否相同?
请举例示之。
●请简要叙述中断服务程序功能并画出其流程图。
●在采用I/O口作为输出口时要考虑哪些因素?
如果负载变化,如何设计单片机与负载之间的接口电路?
实验2交通灯实验
一、实验目的
●进一步掌握ProteusISIS和uVision2单片机集成开发环境的使用;
●进一步掌握单片机内部定时/计数器的使用及编程方法以及中断处理程序的编写方法
●掌握单片机的I/O口编程使用。
二、实验设备及器件
●硬件:
PC机,HNIST-1型单片机实验系统,USB下载线一根、连接线若干
●软件:
ProteusISIS单片机仿真环境,uVision2单片机集成开发环境
三、实验内容
●编写一段程序,实现用单片机的I/O口控制12个发光二极管(四组,每组有红绿蓝三个发光二极管),使发光二极管按照一定的规则模拟交通灯功能。
●基于ProteusISIS仿真环境完成上述功能的仿真。
●基于uVision2单片机集成开发环境与硬件平台完成程序的脱机运行。
四、实验原理
图3.2交通灯实验原理图
用单片机的IO口控制4组红绿蓝共12个发光二极管,使发光二极管按照一定规则与次序发光与闪亮以实现模拟交通灯的功能。
假设初始状态为:
(南北通行状态)南北绿灯、东西红灯(25s);后转为过度状态:
南北黄灯、东西红灯(5s);再转为东西通行状态:
东西绿灯、南北红灯25(s)。
再转为过渡状态:
东西黄灯、南北红灯(5s),然后循环往复。
硬件原理图如上图3.2所示。
由于发光二极管的导通电压为1.7V,所以在电源与二极管之间加一个电阻,目的是保护二极管;实验中利用定时计数器实现1S的定时,然后在此基础上实现所需要的定时时间。
五、软件流程图与参考源程序
●软件设计思想:
在编程时,我们一般把一个独立的功能设计成一个子程序或者说函数。
对于不同的设计者而言,对软件功能的划分角度不同,对应的函数功能也存在差异。
图3.3软件结构图
●参考源程序如下:
#include
#defineuintunsignedint
#defineucharunsignedchar//定义下方便使用
sbitkong=P1^4;//位声明数码管锁存控制端
ucharcodetable[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//数字0-9编码
uinttt,temp=0;
/************************************************
延时函数
**************************************************/voiddelay(uintx)
{
uchari,k;
for(i=0;i for(k=0;k<100;k++) ; } /************************************************** 初始化函数 ***************************************************/ voidinit() { temp=0; tt=0; TMOD=0x01;//定时器工作方式 TH0=(65536-50000)/256; TL0=(65536-50000)%256;//装初值 EA=1;//开总中断 ET0=1;//开定时器中断 TR0=1;//启动定时器中断 } /************************************************* 数码管显示函数 *************************************************/ voiddisplay(uintx1) { uchari,c; uintcod[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); } } /**************************************** 交通灯驱动函数 *****************************************/ voidjiaotong() {//uintt=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--;//倒计数 } } /************************************************ 主函数 ************************************************/ voidmain() { init();//初始化函数调用 while (1)//主循环 { jiaotong();//交通灯函数调用 } } //中断函数 voidtimer0()interrupt1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256;//重新装初值 tt++; } 六、实验思考题 ●如何实现扩充功能,实现救护车优先通过十字路口? 请叙述硬件设计与软件设计原理。 ●在利用单片机片内定时器实现精确定时时,是否会产生误差? 如果存在误差请分析误差产生原因以及减小误差方法。 实验3数码管动态显示实验 一、实验目的 掌握数码管静态显示与动态显示原理以及数码管与单片机的接口原理。 学会利用单片机的I/O口实现数码管的动态显示。 二、实验仪器 硬件: PC机、HNIST-1型单片机实验系统 软件: ProteusISIS单片机仿真环境,uVision2单片机集成开发环境 三、实验内容 编写一段程序,采用P1口某些口线作为4位数码管的位控制端;采用P0口输出段码,实现4位数码管的测试(让4位数码管同时输出0~F); 编写程序,让4位数码管循环显示1—2—3—4(即让第一位显示”1”,然后第一位熄灭,第二位显示”2”……) 四、实验原理 使用LED数码显示器时,要注意区分数码管两种不同的接法(共阴LED和共阳LED),为了显示数字或字符,必须对数字或字符进行编码。 七段数码管加上一个小数点,共计8段,因此为LED显示器提供的编码正好是一个字节。 八段LED数码管显示器原理与结构如下图3.4所示。 对于共阴接法,要使某位LED显示相应数码,则使LED的对应段点亮,则对应控制电平为高,如: 要显示数字”0”,如果a~dp分别受P0.7~P0.0控制,则LED的a,b,c,,d,e,f需点亮,对应驱动电平为”1”,其他为”0”,则对应数码”0”的段码为”FCH”。 共阴极共阳极 图3.4八段LED数码管原理与结构图 LED显示器工作方式有两种: 静态显示方式和动态显示方式。 静态显示的特 点是每个数码管的段码必须需要一个数据锁存器锁存,当送入字形码后,显示字形可一直保持,直到送入新字形码为止,显示亮度较强。 而动态显示是多个LED轮流显示,但由于人眼的视觉惰性,使人感觉各LED同时显示不同字符。 表3.1本实验硬件所采用共阴极数码管码表 数字 数码管代码 数字 数码管代码 数字 数码管代码 0 0xfc 6 0xbe C 0x9c 1 0x60 7 0xe0 d 0x7a 2 0xda 8 0xfe E 0x9e 3 0xf2 9 0xf6 F 0x8e 4 0x66 A 0xee 无显示 0x00 5 0xb6 b 0x3e 一般而言,为了减少硬件开销,降低成本,单片机系统通常采用LED动态扫描显示方式。 本实验电路原理图如下图3.5所示。 图3.5LED动态显示电路原理图 五、部分软件流程图与参考程序 ●流程图 否 是 图3.6软件流程图 ●源程序. #include #defineucharunsignedchar #defineuintunsignedint//宏定义 sbitdula=P1^4;//端口定义 ucharnum,y; uintx;//定义变量uchar codetable[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe, 0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};//0到F的数码管管码 /********************主函数**********************/ voidmain() { while (1)//进入大循环 { P1=P1︱0x1f; for(num=0;num<16;num++)//判断是否到F { dula=1;//开启锁存器 P0=table[num];//送数码管管码 dula=0;//关闭锁存器 for(x=2000;x>0;x--) for(y=220;y>0;y--);//延时 } } } 六、实验思考题 ●本实验源程序是让4位LED同时显示相同的内容,完成其测试。 请编写程序让4位LED轮流显示从0~F的数码(即让第一位数码管显示0后,接着第二位数码管显示0,…,一个轮回结束后,让第一个显示1,…)。 ●请设计一个单片机控制的4位数码管的静态显示电路,解释其工作原理。 ●如何采用本实验电路以及单片机片内定时器实现一个简易时钟功能(精度较低),说明实现方式。 实验48*8LED点阵实验 一、实验目的 ●了解LED点阵显示原理; ●掌握LED点阵显示器件与单片机的接口电路设计原理; ●掌握LED显示器件显示驱动程序设计方法,能编写LED显示驱动程序。 二、实验设备及器件 ●硬件: PC机,HNIST-1型单片机实验系统 ●软件: ProteusISIS单片机仿真环境,uVision2单片机集成开发环境 三、实验内容 ●根据给定实验设备,选用相关模块,完成LED点阵显示实验系统的硬件平台构建; ●根据所构建硬件平台,编程实现点阵循环显示数字0~9。 四、实验原理 ●芯片介绍 1: 74LS138: 3线-8线译码器。 原理: 当一个选通端(G1)为高电平,另两个选通端(/G2A和/G2B)为低电平时,可将地址端(A、B、C)的二进制编码在一个对应的输出端以低电平译出,Y0-Y7为输出端。 另外,74LS138真值表请参看相关资料。 2: 74LS595: 串入并出8位输出移位锁存器。 以下为其引脚功能说明: QA--QH: 八位并行输出端,可以直接控制数码管的8个段(或者点阵LED的列线)。 QH': 级联输出端。 我将它接下一个595的SI端。 SER: 串行数据输入端。 /SCLR(10脚): 低电平时将移位寄存器的数据清零。 通常我将它接Vcc。 SCK(11脚): 上升沿时数据寄存器的数据移位。 QA-->QB-->QC-->...-->QH; 下降沿移位寄存器数据不变。 (脉冲宽度: 5V时,大于几十纳秒就行了。 通常都选微秒级) RCK(12脚): 上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。 通常我将RCK置为低点平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。 通常都选微秒级),更新显示数据。 /G(13脚): 高电平时禁止输出(高阻态)。 另外,74LS595操作时序请参考相关资料。 请根据操作时序,叙述操作过程。 ●实验原理图 如下图3.7所示。 图3.7点阵LED实验电路原理图 五、软件流程图与参考程序 ●软件流程图 首选确定所需要的子程序。 子程序主要包括: 一是74LS595芯片驱动程序,完成串入并出,控制LED点阵列的驱动;一个是驱动74LS138芯片的,实现LED点阵行的驱动;还有一个是延时函数。 读者可以根据相应芯片工作原理完成其驱动流程图绘制; 对于要显示的字符0~9的循环显示,显示间隔采用定时器实现,此时涉及到定时器中断服务子程序的编写,另外,LED点阵列驱动采用的是动态显示原理,也需要定时器定时; 对于主程序而言就很简单了,主要是完成一些初始化工作。 ●源程序: #include #include #defineucharunsignedchar//宏定义 #defineuintunsignedint sbitSCK=P0^0;//芯片端口连线定义 sbitRCK=P0^1; sbitSER=P0^2; sbitD138_A=P0^5; sbitD138_B=P0^6; sbitD138_C=P0^7; ucharcodehang[8]={1,2,3,4,5,6,7,8};//点阵行数组定义 ucharcodelie[10][8]={//数字0~9列代码 {0x00,0x7c,0x82,0x82,0x82,0x7c,0x00,0x00},//0 {0x00,0x00,0x84,0xfe,0x80,0x00,0x00,0x00},//1 {0x00,0xe4,0x92,0x92,0x92,0x8c,0x00,0x00},//2 {0x00,0x44,0x92,0x92,0x92,0x6c,0x00,0x00},//3 {0x00,0x10,0x18,0x14,0xfe,0x10,0x10,0x00},//4 {0x00,0x4e,0x8a,0x8a,0x8a,0x72,0x00,0x00},//5 {0x00,0x7c,0x92,0x92,0x92,0x64,0x00,0x00},//6 {0x00,0x02,0x02,0xfa,0x06,0x02,0x00,0x00},//7 {0x00,0x6c,0x92,0x92,0x92,0x6c,0x00,0x00},//8 {0x00,0x4c,0x92,0x92,0x92,0x7c,0x00,0x00}//9 }; uinttimecount; uchara,b; voidDelay(uchartime)//延时函数 { uchari,j; for(i=time;i>0;i--) for(j=320;j>0;j--); } voidSet595(unsignedcharData)//74LS595驱动函数 { unsignedchari; for(i=0;i<8;i++) { SCK=0;//先置为低 SER=Data&0x80;//取数据的最高位 Data<<=1;//将数据的次高位移到最高位,为下一次取数据做准备 SCK=1;//再置为高,产生移位时钟上升沿,上升沿时数据 //寄存器的数据移位 } RCK=0; _nop_(); RCK=1; } voidSet138(unsignedcharData)//138芯片二进制译码选择行输出 { switch(Data) { case0: D138_A=0; D138_B=0; D138_C=0; Delay (1);break; case1: D138_A=1; D138_B=0; D138_C=0; Delay (1);break; case2: D138_A=0; D138_B=1; D138_C=0; Delay (1);break; case3: D138_A=1; D138_B=1; D138_C=0; Delay (1);break; case4: D138_A=0; D138_B=0; D138_C=1; Delay (1);break; case5: D138_A=1; D138_B=0; D138_C=1; Delay (1);break; case6: D138_A=0; D1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 整套 实验 程序 交通灯 跑马