首页 单片机整套实验及程序(交通灯_跑马灯等)

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

举报
开通vip

单片机整套实验及程序(交通灯_跑马灯等)实验1跑马灯实验一、实验目的初步学会ProteusISIS和uVision2单片机集成开发环境的使用;初步掌握采用汇编语言与C语言开发单片机系统的程序结构;掌握80C51单片机通用I/O口的使用;掌握单片机内部定时/计数器的使用及编程方法以及中断处理程序的编写方法。二、实验设备及器件硬件:PC机,HNIST-1型单片机实验系统软件:ProteusISIS单片机仿真环境,uVision2单片机集成开发环境三、实验内容编写一段程序,采用P1口作为控制端口,使与P1口相接的四个发光二极管(D1、D2、D3、D4)按照一定...

单片机整套实验及程序(交通灯_跑马灯等)
实验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个发光二极管,发光二极管按照一定次序发光,相邻发光二极管的发光时间间隔可以通过定时器控制,还可以通过软件延时实现。五、软件 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 图与参考程序主程序流程图如下:开始初始化(定时器、中断、 标志 禁止坐卧标志下载饮用水保护区标志下载桥隧标志图下载上坡路安全标志下载地理标志专用标志下载 位设置)Flag=1?流水灯操作结束YN参考程序#include#include#defineucharunsignedchar#defineuintunsignedintucharaa,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;//打开外中断0TR0=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的定时,然后在此基础上实现所需要的定时时间。五、软件流程图与参考源程序软件设计思想:在编程时,我们一般把一个独立的功能设计成一个子程序或者说函数。对于不同的设计者而言,对软件功能的划分角度不同,对应的函数功能也存在差异。开始南北绿灯东西红灯25南北黄灯东西红灯5东西绿灯南北红灯25东西黄灯南北红灯5结束定时器图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;i30){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本实验硬件所采用共阴极数码管码表数字数码管代码数字数码管代码数字数码管代码00xfc60xbeC0x9c10x6070xe0d0x7a20xda80xfeE0x9e30xf290xf6F0x8e40x66A0xee无显示0x0050xb6b0x3e一般而言,为了减少硬件开销,降低成本,单片机系统通常采用LED动态扫描显示方式。本实验电路原理图如下图3.5所示。图3.5LED动态显示电路原理图五、部分软件流程图与参考程序●流程图开始初始化P0口,P1口及变量num.判断num是否小于16否num=0是显示table[num];num++.延时图3.6软件流程图●源程序.#include//包含头文件#defineucharunsignedchar#defineuintunsignedint//宏定义sbitdula=P1^4;//端口定义ucharnum,y;uintx;//定义变量ucharcodetable[]={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//宏定义#defineuintunsignedintsbitSCK=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;D138_B=1;D138_C=1;Delay(1);break;case7:D138_A=1;D138_B=1;D138_C=1;Delay(1);break;}}voidmain(void){TMOD=0x01;//设置定时器的工作方式;TH0=(65536-3000)/256;TL0=(65536-3000)%256;//设置初值,每次定时中断3ms;EA=1;//开启总中断;ET0=1;//开启定时器0中断;TR0=1;//启动定时器;P0=0x00;while(1){;}}voidextern0()interrupt1{TH0=(65536-3000)/256;TL0=(65536-3000)%256;Set138(hang[a]);Set595(lie[b][a]);_nop_();_nop_();a++;if(a==8){a=0;}timecount++;if(timecount==330)//每次到了330次中断后,又重新开//始计时,每次差不多1s;即每隔1s显示一个数字;{timecount=0;b++;if(b==10){b=0;}}}六、实验思考题可否不用这两个芯片,直接用I/O口来控制点阵的行与列来达到我们的目的,并分析这样做的优缺点。查阅资料,比较74LS164与74LS595这两个串入并出芯片的特点。若显示的数字出现左右倒相,上下倒位,请分析可能的原因,以及解决的方法。8*8LED点阵显示器采用动态显示原理。分析其驱动工作过程。实验5矩阵式键盘显示一、实验目的掌握矩阵式键盘的工作原理以及与单片机的接口方法;掌握矩阵式键盘的按键识别方法(扫描法与线反转法),并能够编写相应键盘处理程序实现按键的识别。二、实验仪器硬件:PC机,HNIST-1型单片机实验系统软件:ProteusISIS单片机仿真环境,uVision2单片机集成开发环境三、实验内容编写程序:读取矩阵式键盘按键键码,并通过数码管显示。显示要求:四个数码管同时显示同一字符:(1)按0—9号键显示数字0—9;(2)按A—F号键显示字母A—F。四、实验原理单片机的P2口作为矩阵式键盘扫描I/O口,对键盘进行逐行扫描,若检测到按键,则将得到的扫描结果返回给CPU,转换成相应的数码管显示代码,通过数码管显示子程序在数码管上显示按键。实验原理如下图3.8所示。图3.8键盘扫描电路原理图五、软件流程图与参考程序流程图图3.9键盘扫描显示主程序流程图图3.10键盘扫描程序流程图参考源程序#include#defineuintunsignedint#defineucharunsignedcharucharnum,temp,i;ucharcodetable[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0};ucharcodetable1[]={0xf7,0xfb,0xfd,0xfe};sbitale=P1^4;voiddisplay(ucharaa);ucharkeyscan();/************************************************************延时子程序************************************************************/voiddelay(uintz){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}voidmain(){num=17;while(1){display(keyscan());}}/************************************************************数码管显示************************************************************/voiddisplay(ucharaa){ale=1;P0=table[aa-1];ale=0;}/************************************************************键盘扫描************************************************************/ucharkeyscan(){for(i=1;i<5;i++){P2=table1[i-1];temp=P2;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P2;switch(temp){case0xe7:num=1;break;case0xd7:num=2;break;case0xb7:num=3;break;case0x77:num=4;break;case0xeb:num=5;break;case0xdb:num=6;break;case0xbb:num=7;break;case0x7b:num=8;break;case0xed:num=9;break;case0xdd:num=10;break;case0xbd:num=11;break;case0x7d:num=12;break;case0xee:num=13;break;case0xde:num=14;break;case0xbe:num=15;break;case0x7e:num=16;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}}returnnum;}六、实验思考题如何实现键盘信号的可靠采集?请叙述原理,并请简要说明如果系统软件采用前后台的程序结构,采集按键信号安排在后台程序(主程序)和安排在定时中断服务程序中有什么差异?请简要叙述如何处理按键连击。实验6马达调速控制一、实验目的掌握步进电机的工作原理、控制方式和调速方法,以及其与单片机的接口和驱动编程方法。掌握直流电机的开启控制与转动速度控制方法。二、实验仪器硬件:PC机、HNIST-1型单片机实验系统软件:uVision2单片机集成开发环境三、实验内容与原理实验内容:编写程序,通过单片机的P1口控制步进电机的控制端,使其按照一定的控制方式进行转动。实验原理◆步进电机的控制单片机的P1口输出脉冲信号,驱动步进电机旋转。引入开关,实现对步进电机(马达)的启停、转向和速度控制。旋转方向控制步进电机以四相四拍方式工作,若按次序通电为正转,按次序通电为反转。旋转速度控制每改变1次节拍,步进电机旋转18度。调节脉冲的周期就可以控制步进电机的转速。图3.11步进电机控制原理图◆直流电机的控制直流电机的转动由DAC0800来控制,当DAC0800的输出为高电平时直流电机开始转动,当DAC0800的输出为低电平时直流电机停止转动。图3.12直流电机控制原理图四、实验步骤1、连线、编程步进电机的插头接J3;BA~BD接89S52的P1.1~P1.4;开关K8接P1.7,K1-K7接8051的P1.0-P1.6;DAC0800的B0-B7口接P2。DAC0800输出接直流电机的输入。调试程序,观察步进电机运行情况启停开关K1:步进电机开始转动,是正转2圈,反转2圈的循环运行。启停开关K8:直流电机开启,步进电机停止。调速开关K7~K2供6转速,调速时开关打开-关闭实现一次调速。K2,K4,K6调速时步进电机是正转,K3,K5,K7调速时步进电机是反转。五、软件流程图与参考程序●流程图是否有开关开启判断开关开启的是K1-K8中的那个??步进电机开始运转,正反各2圈循环,直流电机停止。步进电机不动,直流电机运转。不同的开关对应六种不同速度选择。直流电机停止。开始YNK11K8K1-K17图3.13软件流程图●参考源程序/*本步进电机步进角为7.5度.一圈360度,需要48个脉冲完成!!!*//*************************************程序名:main.c*功能:步进电机正转,反转**单位:湖南理工物电系创新基地*Allrightsreserved**开始时间:2009.07.22*结束时间:2009.07.22*版本信息:**备注:A,/A,B,/B口分别接单片机的P1^1,P1^2,P1^3,P1^4。*备注;P0口接key1-key8八个开关并空制着八个转速*备注:控制直流电机的是DAC0800.*备注:B0-B7接的是P2口。输出接的是直流电机的输入.**************************************/#include#defineucharunsignedchar//宏定义方便使用#defineuintunsignedintvoidmotor_move(uint);//函数的声明voidmotor_back(uint);voiddelay(uint);uintkeyscan();voidzhiliu();uchara=0,key=0,key1,temp;//变量定义/*正转次序:Aa组--aB组--Bb组--bA组(即一个脉冲,正转7.5度)*//*倒转次序:bA组--Aa组--aB组--Bb组(即一个脉冲,正转7.5度)*//*开启开关时步进电机停止工作关闭开关时步进电机调好转速转动*/constuchartime_move[]={0xe7,0xed,0xf9,0xf3};//正转时序7.5度constuchartime_back[]={0xe7,0xf3,0xf9,0xed};//倒转时序7.5度constuchartime[]={0,5,10,20,40,60,80,100};//定义不同的时速uintcodetable[]={0x00,0xff};//给直流电机的信号//主程序voidmain(){while(1){P2=0x00;key=keyscan();//接受开关信号if(key==1){motor_move(2);//正转2圈可自行调转圈数delay(100);motor_back(2);//反转2圈可自行调转圈数delay(100);key=keyscan();//接受开关信号}elseif(key==8)//当开关打开的是第八个时直流电机启动,步进电机停止{zhiliu();}elseif((key!=0)&&(key!=8))//判断是否有开关信号{key=keyscan();//再次判断开关信号key1=key&0x11;//判断是否为偶数if(key1==0x00)//如果是偶数就正转{motor_move(1);//正转2圈可自行调转圈数}else//否则就反转{motor_back(1);//反转2圈可自行调转圈}}}}//=============正转n圈(每转一步7.5度)===========voidmotor_move(uintn){uchari;uintj;for(j=0;j<12*n;j++)for(i=0;i<4;i++){P1=0xe1;//驱动ds75452n芯片P1=time_move[i];//....delay(time[key]);}}//=============倒转n圈(每转一步7.5度)==========voidmotor_back(uintn){uchari;uintj;for(j=0;j<12*n;j++)for(i=0;i<4;i++){P1=0xe1;//驱动ds75452n芯片P1=time_back[i];//....delay(time[key]);}}//延时t毫秒,11.0592MHz时钟,延时约0.5msvoiddelay(uintt){uintk;while(t--){for(k=0;k<60;k++);}}uintkeyscan()//接受开关信号并编码{P0=0xff;temp=P0;temp=temp&0xff;while(temp!=0x00)//再次判断是否打开开关{delay(1);temp=P0;temp=temp&0xff;switch(temp)//判断开关信号并将转速变量赋值{case0x01:a=1;break;case0x02:a=2;break;case0x04:a=3;break;case0x08:a=4;break;case0x10:a=5;break;case0x20:a=6;break;case0x40:a=7;break;case0x80:a=8;break;}while(temp!=0x00)//判断开关是否关闭{temp=P0;temp=temp&0xff;}}return(a);//返回值可调转速}voidzhiliu()//直流电机的开启与停止{uchari;for(i=0;i<2;i++){P2=table[i];delay(1000);}P2=0x00;//关闭直流电机}六、实验思考题●怎样克服步进电机及直流电机和负载的惯性?●说明如何控制直流电机的正、反转,用程序实现之。实验7串行模数转换器实验一、实验目的掌握串行模数转换器TLC549芯片性能以及A/D转换器的选择准则;利用芯片技术手册,掌握TLC549与单片机的接口方法;掌握串行ADC的驱动程序设计方法.二、实验仪器硬件:PC机、HNIST-1型单片机实验系统软件:uVision2单片机集成开发环境三、实验内容搭建串行模数转换平台,编写程序,通过单片机的I/O口控制串行A/D转换芯片TLC549实现模拟电压信号的采集;调节电位器,调整TLC549的输入模拟参考电压,(调节模数转换模块中的电位器),运行程序实现A/D转换和模拟电压信号的采集;编写液晶的程序,使转换得到的数据送入液晶显示。四、实验原理TLC549介绍及其接口电路TLC549是一款高性能的8位串行A/D转换器,它以8位开关电容逐次逼近的方法实现A/D转换,本实验采用该芯片采集模拟电压量,然后将采集到的模拟量转换为数字量后送至液晶显示其数值。TLC549在该实验系统中的电路连接如下图3.14所示。图3.14TLC549与单片机接口电路图3.15TLC549引脚示意图TLC549通过J5_1端口采集模拟量,由于TLC549是采用三线串行接口方式与单片机连接的,所以通过J5_3端口将CLK、D0、/CS与单片机的I/O口连接来控制A/D转换。然后将转换后的量经处理送液晶显示。接口电路说明:1.用连接线连接模拟量产生模块中的V0口和模数转换模块中的IN接口2.用连接线将模数转换模块的CLK、D0、/CS分别接至单片机的P36、P35、P343.用连接线将液晶模块的E、RW、R分别接至单片机的P22、P21、P20,并将D0~D7端口对应接入单片机的P00~P07口。4.调节模数转换模块中的电位器,使TLC549的输入参考电压为+5V。5.将编写好的程序烧入单片机运行,调节模拟量产生模块中的W1旋钮,便可以在液晶上看到对应的电压值大小。五、软件流程图与参考程序MCU信号流图液晶TLC549模拟量图3.16信号流图参考源程序:/*************************************文件名:tlc549驱动程序*功能:tlc549采集模拟电压并于液晶上显示大小*作者:刘烈报*单位:湖南理工物电系创新基地*Allrightsreseverd*开始时间:2009.08.6**************************************/#include#include#defineucharunsignedchar#defineuintunsignedint#defineulongunsignedlonguchargetdata,PSB;ucharcodetable0[]=“TLC549”;ucharcodetable[]=“输入电压:”;/*************************TLC549配制**************************/sbittlc_clk=P3^6;sbittlc_data=P3^5;sbittlc_cs=P3^4;/***********************************************液晶的配置************************************************/#defineDATABUSP0sbitRS_LCD=P2^0;sbitRW_LCD=P2^1;sbitE_LCD=P2^2;/***********************************************函数初始化************************************************/voiddelay(uintz);voidDelay1us(uchar);voidinit();voidwrite_com(uchar);voidwrite_data(uchar);voidsetPosition(uchar,uchar);voidwriteString(uchar*str);voidTlc_549(void);ucharread_tlc(void);/*----------------------主函数------------------------*/voidmain(){init();setPosition(0,0);//设置第一行显示地址writeString(table0);while(1){setPosition(1,0);//设置”输入电压”显示地址writeString(table);Tlc_549();}}/*---------------------延时函数----------------------*/voiddelay(uintz){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}voidDelay1us(uchari){while(--i){_nop_();_nop_();}}/*-------------------LCD初始化函数----------------------*/voidinit(){PSB=1;write_com(0x30);//基本指令,扩充指令为34Hdelay(5);write_com(0x0c);//光标是否显示语句delay(5);write_com(0x01);//清屏delay(5);}/*-------------------液晶子函数-----------------------*//*写命令*/voidwrite_com(ucharcom){RS_LCD=0;RW_LCD=0;E_LCD=0;delay(1);DATABUS=com;delay(1);E_LCD=1;delay(1);E_LCD=0;}/*写数据*/voidwrite_data(uchardate){RS_LCD=1;RW_LCD=0;E_LCD=1;delay(1);DATABUS=date;delay(1);E_LCD=1;delay(1);E_LCD=0;}/*设置显示开始地址*/voidsetPosition(ucharx,uchary){ucharp;switch(x%4){case0:p=0x80;break;//第一行开始地址case1:p=0x90;break;//第二行case2:p=0x88;break;//第三行case3:p=0x98;break;//第四行}p+=y;write_com(p);}/*写入字符串数据*/voidwriteString(uchar*str){uchari=0;while(str[i]!='\0'){write_data(str[i++]);delay(400);}}/*-----------------------TLC549子函数-----------------------*/ucharread_tlc(void){uchari,j,k;tlc_clk=0;tlc_cs=0;for(i=0;i<8;i++){j=j<<1;k=tlc_data;//共移出8位数据tlc_clk=1;tlc_clk=0;j=j+k;}tlc_cs=1;returnj;//返回转换结果}/*--------------------------------------------------*/voidTlc_549(void){ulongtemp,getdata,ge,x1,x2;uchari;while(1){/*读20次,取平均值*/getdata=0;for(i=0;i<20;i++){getdata+=read_tlc();}getdata/=20;/*电压显示处理*/temp=((ulong)getdata*500)/256;//将十六进制转换为十进制ge=temp/100;//个位x1=(temp%100)/10;//第一位小数x2=(temp%100)%10;//第二位小数write_com(0x95);//显示数据的地址地write_data(0x30+ge);write_data(0x2e);//显示小数点write_data(0x30+x1);write_data(0x30+x2);write_data(0x56);//显示单位/*50ms更新一次数据*/delay(500);}}六、实验思考题查看TLC549技术手册,说明TLC549操作过程。在采集模拟信号时,一般不可避免会受到噪声干扰,我们一般要做什么处理?根据本实验编写处理相关程序。实验8DS18B20温度传感器实验目的熟悉数字温度传感器DS18B20的工作原理和使用方法;掌握单总线的读/写控制方法。实验仪器硬件:PC机、HNIST-1型单片机实验系统软件:uVision2单片机集成开发环境实验内容编写程序,通过单片机的P3.5口实现对DS18B20的控制,实现数字温度的采集与显示;记录采集的温度数据,分析实验结果的正确与否。实验原理本实验采用AT89S52单片机P3.5口控制温度传感器DS18B20的温度测量,以四位数码感形式输出测量温度,原理图如下图3.17所示:图3.17DS18B20与单片机接口原理图DS18B20特性介绍DS18B20是DALLAS公司生产的单总线数字温度传感器,它的体积小、适用电压更宽、更经济。DS18B20是世界上第一片支持”单总线”接口的温度传感器。单总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。它的测量温度范围为-55~+125℃,在-10~+85℃范围内,精度为±0、5℃。现场温度直接以”一线总线”的数字方式传输大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。与前一代产品不同,新的产品支持3~5、5V的电压范围,使系统设计更灵活、方便。而且新一代产品更便宜,体积更小。DS18B20可以程序设定9~12位的分辨率,精度为±0、5℃。可以选择更小的封装方式,更宽的电压适用范围分辨率设定及用户设定的报警温度存储在E2PROM中,掉电后依然保存。DS18B20的性能是新一代产品中最好的,性能价格比也非常出色,继”单总线”的早期产品后,DS18B20开辟了温度传感器技术的新概念。DS18B20和DS18B22使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。◆DS18B20的内部结构DS18B20内部结构主要由4部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL,配置寄存器。DS18B20的管脚排列如下图3.18所示:图3.18DS18B20引脚结构与封装图DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。表212位转化后得到的12位数据表2是12位转化后得到的12位数据,存储在18B20的2个8bit的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0℃,则这5位为0,只要将测到的数值乘于010625即可得到实际温度;如果温度小于0℃,则这5位为1,测到的数值需要取反加1再乘于010625即可得到实际温度。例如:+125℃的数字输出为07D0H,+25、0625℃的数字输出为0191H,-25、0625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。表3 温度与数字输出的对应关系◆DS18B20温度传感器的存储器DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2RAM,后者存放高温和低温触发器TH,TL和结构寄存器。暂存存储器包含了8个连续字节,前2个字节是测得的温度信息,第1个字节的内容是温度的低8位,第2个字节是温度的高8位。第3个和第4个字节是TH,TL的易失性拷贝,第5个字节是结构寄存器的易失性拷贝,这3个字节的内容在每一次上电复位时被刷新。第6,7,8个字节用于内部计算。第9个字节是冗余检验字节。根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过3个步骤:每一次读写之前都要对DS18B20进行复位;复位成功后发送一条ROM指令;最后发送RAM指令。这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500μs,然后释放,DS18B20收到信号后等待16~60μs左右,后发出60~240μs低脉冲,主CPU收到此信号表示复位成功。◆DS18B20使用中的注意事项DS18B20虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:(1)DS18B20从测温结束到将温度值转换成数字量需要一定的转换时间,这是必须保证的,不然会出现转换错误的现象,使温度输出总是显示85。(2)在实际使用中发现,应使电源电压保持在5V左右。若电源电压过低,会使所测得的温度与实际温度出现偏高现象,经过试验发现,一般在5V左右。(3)较小的硬件开销需要相对复杂的软件进行补偿,由于DS18B20与微处理器间采用串行数据传送,因此,在对DS18B20进行读写编程时,必须严格保证读写时序,否则将无法读取测温结果。(4)在DS18B20测温程序设计中,向DS18B20发出温度转换命令后,程序总要等待DS18B20的返回信号,一旦某个DS18B20接触不好或断线,当程序读该DS18B20时,将没有返回信号,程序进入死循环。这一点在进行DS18B20硬件连接和软件设计时也要给予一定的重视。对DS18B20的一般控制流程 整个对DS18B20的操作都是以”复位”、”等待应答”、”读一字节”、”写一字节”这几个操作为基础的,所以他们是使DS18B20能否正常测温的关键。对不同的操作只要发出相应的命令控制字即可,详情请参看有关技术文档。典型的测温流程如下图所示:图3.19DS18B20控制流程实验过程连线:温度传感器输入输出口OUT接P3.5口;打开电源,观察数码管显示的温度;改变温度传感器DS18B20附近温度,观察数码管上温度的变化。流程图与程序设计流程图◆主函数部分:图3.20主函数流程图◆温度测量部分:图3.21温度测量流程图◆数据计算处理部分整数部分图3.22数据处理-整数部分小数部分图3.23数据处理-小数部分●源程序/*************************************************************************************************程序名:main.c*************************************功能:温度传感器测量温度***********************
本文档为【单片机整套实验及程序(交通灯_跑马灯等)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥11.0 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
1519356641
我是物理老师
格式:doc
大小:613KB
软件:Word
页数:0
分类:
上传时间:2021-03-11
浏览量:35