版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机接口与控制技术实验报告中南大学机电工程学院机械1304班俞文龙实验一穿行静态显示实验实验目的1.掌握数字、字符转换成显示段码的软件译码方法2.静态显示的原理和相关程序的编写3.掌握C51程序设计方法二、实验说明输入给定程序,配置选项,调试并运行程序,观察程序控制下仿真器输出的变化。选中此项keil为硬件仿真设置Port串口:一般为COM3,Baudrate波特率为最大值:115200bit/s,最后确认显示器由8个共阴极LED数码管组成。输入只有两个信号,它们是串行数据线DIN和移位信号CLK。8个串/并移位存放器芯片74LS164首尾相连。每片的并行输出作为LED数码管的段码。74LS164为8位串入并出移位存放器,1、2为串行输入端,QA~QH为并行输出端,CLK为移位时钟脉冲,上升沿移入一位;CLR为清零端,低电平时并行输出为零。用C51进行程序设计,选择汇编或者C语言编程均可,要求程序结构清晰,模块化结构,反复调用局部做成子模块,有必要的注释。编写程序上机调试通过,实验报告要求提交程序流程图及源程序。三、实验内容本实验需要用到单片机的最小应用系统〔F1区〕和串行静态显示模块〔I3区〕。使用单片机最小应用系统模块,用导线将连接P3.0〔RXD〕、P3.1〔TXD〕连接到串行静态显示模块的DIN、CLK端。用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机锁紧插座中,请注意仿真器的方向:缺口朝上。请指导老师检查接线后再翻开模块电源。翻开KeiluVision2仿真软件,首先建立本实验的工程文件,接着添加源程序,进行编译,直到编译无误。全速运行程序。8LED显示“89C51”。程序停止运行时,显示不变,说明静态显示模块具有数据锁存功能。四、实验程序及原理图#include<reg51.h>sbitDin=P1^0;sbitClk=P1^1;voiddelay(void){unsignedinti;for(i=0;i<10;i++);}voidmain(void){unsignedchari,j,chr,sel;unsignedcharcodeTab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9显示代码unsignedcharxs[8]={5,0,1,6,2,3,2,8};for(i=0;i<8;i++){chr=Tab[xs[i]];//sel=0x06; for(j=0;j<8;j++) { Din=chr&sel; Clk=0;//P1.·同步时钟 sel=sel>>1; delay(); Clk=1;delay(); }}while(1);}
五实验体会通过实验,再次熟悉了51单片机的仿真软件,更加的熟练使用软件。同时,也掌握数字、字符转换成显示段码的软件译码方法,初步学会了软件译码方法。对静态显示的原理和相关程序的编写有了进一步的认识。根本掌握C51程序设计方法实验二交通灯模拟实验串行静态显示实验一、实验目的1.掌握ULN2003芯片工作原理2.掌握十字路口交通灯控制方法二、实验说明输入给定程序,配置选项,调试并运行程序,观察程序控制下仿真器输出的变化。选中此项keil为硬件仿真设置Port串口:一般为COM3,Baudrate波特率为最大值:115200bit/s,最后确认ULN2003是大电流驱动阵列,由七个硅NPN达林顿管组成,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统,可直接驱动继电器等负载。输入5VTTL电平,输出可达500mA/50V。用C51进行程序设计,选择汇编或者C语言编程均可,要求程序结构清晰,模块化结构,反复调用局部做成子模块,有必要的注释。编写程序上机调试通过,实验报告要求提交程序流程图及源程序。三、实验内容及步骤〔完成分值:60分/单个程序〕本实验需要用到本实验需要用到单片机最小应用系统〔F1区〕和汽车信号灯/交通灯/舞台灯模块〔D1区〕。用十字路口交通灯控制模块。单片机最小应用系统的P2口JD2F接至汽车信号灯/交通灯/舞台灯模块的JD4D。汽车信号灯/交通灯/舞台灯模块的DIN、CLK分别对应的接单片机最小应用系统的P1.1、P1.0口。翻开相关模块电源。用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机锁紧插座中,请注意仿真器的方向:缺口朝上。请指导老师检查接线后再翻开模块电源。翻开KeiluVision2仿真软件,首先建立本实验的工程文件,接着添加源程序,进行编译,直到编译无误。全速运行程序。观察交通灯的模拟情况。东西向绿灯亮假设干秒,黄灯闪烁3次后红灯亮,南北向由红灯变为绿灯,假设干秒后南北向黄灯闪烁3次此后变红灯,东西向变绿灯,如此重复。LED灯控制说明:P2.7控制东西向红灯;P2.6控制东西向黄灯;P2.5控制东西向绿灯;P2.4控制南北向红灯;P2.3控制南北向黄灯;P2.2控制南北向绿灯。四、电路原理图及实验程序#include<reg51.h>#include<absacc.h>#defineucharunsignedcharuchardataR2,R3,R4;sbitLED_G2=P2^2;//南北绿灯sbitLED_Y2=P2^3;//南北黄灯sbitLED_R2=P2^4;//南北红灯sbitLED_G1=P2^5;//东西绿灯sbitLED_Y1=P2^6;//东西黄灯sbitLED_R1=P2^7;//东西红灯voiddelay(intcount){unsignedinti; for(i=0;i<count;i++);}//状态1voidstate1(){LED_G1=1;//东西绿灯亮LED_Y1=0;LED_R1=0;LED_G2=0;LED_Y2=0;LED_R2=1;//南北红灯亮}//状态2voidstate2(){LED_Y1=0;LED_R1=0;LED_G2=0;LED_Y2=0;LED_R2=1;//南北红灯亮}//状态3voidstate3(){LED_G1=0;LED_R1=0;LED_G2=0;LED_Y2=0;LED_R2=1;//南北红灯亮LED_Y1=1;//东西黄灯亮}//状态4voidstate4(){LED_G1=0;LED_Y1=0;LED_R1=1;//东西红灯亮LED_G2=1;//南北绿灯亮LED_Y2=0;LED_R2=0;}//状态5voidstate5(){LED_G1=0;LED_Y1=0;LED_R1=1;//东西红灯亮LED_Y2=0;LED_R2=0;}//状态6voidstate6(){LED_G1=0;LED_Y1=0;LED_R1=1;//东西红灯亮LED_G2=0;LED_R2=0;LED_Y2=1;//南北黄灯亮}voidmain(){P2=0x00;//关闭不相关的LEDP0=0xff;P1=0xff;TMOD=0x01;//置T0工作方式1TH0=0x3c;//置T0定时初值50mSTL0=0xb0;TR0=1;//启动T0EA=0;LOOP:R2=20;//置1S计数初值50mS*20=1SR3=20;//红灯20Sstate1();//调用状态1WAIT1:while(!TF0);TF0=0;TH0=0x3c;TL0=0xb0;TR0=1;//启动T0R2--; if(R2>0)gotoWAIT1;//判1S到否?未到继续状态1R2=20;//置50mS计数初值R3--;if(R3>0)gotoWAIT1;//状态1维持20S//***************************************************R2=5;//置50mS计数初值5*4=20R3=3;//绿灯闪3SR4=4;//闪烁间隔200mSWAIT2:state2();//调用状态2if(!TF0)gotoWAIT2;//查询50mS到否TF0=0;TH0=0x3c;//恢复T0定时初值50mSTL0=0xb0;R4--;if(R4>0)gotoWAIT2;//判200mS到否?未到继续状态2LED_G1=~LED_G1;//东西绿灯闪R4=4;//闪烁间隔200mSR2--;if(R2>0)gotoWAIT2;//判1S到否?未到继续状态2R2=5;//置50mS计数初值R3--;if(R3>0)gotoWAIT2;//状态2维持3S//***************************************************R2=20;//置50mS计数初值R3=2;//黄灯2SWAIT3:state3();//调用状态3if(!TF0)gotoWAIT3;//查询30mS到否TF0=0;TH0=0x3c;//恢复T0定时初值50mSTL0=0xb0; R2--;if(R2>0)gotoWAIT3;//判1S到否?未到继续状态3R2=20;//置50mS计数初值R3--;if(R3>0)gotoWAIT3;//状态3维持2S//;***************************************************R2=20;//置50mS计数初值R3=20;//黄灯2SWAIT4:state4();//调用状态4if(!TF0)gotoWAIT4;//查询30mS到否TF0=0;TH0=0x3c;//恢复T0定时初值50mSTL0=0xb0; R2--;if(R2>0)gotoWAIT4;//判1S到否?未到继续状态3R2=20;//置50mS计数初值R3--;if(R3>0)gotoWAIT4;//状态4维持20S /////////////////////////////////////R2=5;//置50mS计数初值5*4=20R4=4;//闪烁间隔200mSR3=3;//绿灯闪3SWAIT5:state5();//调用状态35if(!TF0)gotoWAIT5;//查询50mS到否TF0=0;TH0=0x3c;//恢复T0定时初值100mSTL0=0xb0;R4--;if(R4>0)gotoWAIT5;//判200mS到否?未到继续状态5LED_G2=~LED_G2;//南北绿灯闪R4=4;//闪烁200mSR2--;if(R2>0)gotoWAIT5;R2=5;//置100mS计数初值R3--;if(R3>0)gotoWAIT5;//状态5维持3S//;***************************************************R2=20;//置50mS计数初值R3=2;//黄灯2SWAIT6:state6();//调用状态6if(!TF0)gotoWAIT6;//查询100mS到否TF0=0;TH0=0x3c;//恢复T0定时初值100mSTL0=0xb0;R2--;if(R2>0)gotoWAIT6;//判1S到否?未到继续状态6R2=20;//置100mS计数初值R3--;if(R3>0)gotoWAIT6;//状态6维持2gotoLOOP;//大循环}五实验心得体会通过实验及仿真,根本熟悉了解了ULN2003芯片工作原理,通过软件的仿真,了解了交通灯的运行原理,同时,对于51单片机的应用有了进一步的认识。实验三串行A/D转换实验一、实验目的1.掌握单片机I/O的编程方法2.掌握TLC549芯片使用方法二、实验说明输入给定程序,配置选项,调试并运行程序,观察程序控制下仿真器输出的变化。选中此项keil为硬件仿真设置Port串口:一般为COM3,Baudrate波特率为最大值:115200bit/s,最后确认TLC549是美国德州仪器公司生产的8位串行A/D转换器芯片,可与通用微处理器、控制器通过CLK、CS、DATAOUT三条口线进行串行接口。具有4MHz片内系统时钟和软、硬件控制电路,转换时间最长17μs,TLC549为40000次/s。总失调误差最大为±0.5LSB,典型功耗值为6mW。采用差分参考电压高阻输入,抗干扰,可按比例量程校准转换范围,VREF-接地,VREF+-VREF-≥1V,可用于较小信号的采样。用C51进行程序设计,选择汇编或者C语言编程均可,要求程序结构清晰,模块化结构,反复调用局部做成子模块,有必要的注释。编写程序上机调试通过,实验报告要求提交程序流程图及源程序。三、实验内容及步骤〔完成分值:100分/单个程序〕本实验需要用到本实验用到单片机最小系统〔F1区〕、串行静态数码显示〔I3区〕、电位器〔A2区〕和串行A/D转换〔H6区〕。串行静态数码显示的DIN、CLK分别接单片机最小系统的P1.0、P1.1口;单片机最小系统的P2.1、P2.0分别接串行A/D转换的DATA、CLK,串行A/D转换的CS-549接P2.2,AIN接电位器〔A2区〕0~5V可调输出端。翻开单片机最小系统的电源开关,串行A/D转换的JT1H电源短路帽打在VCC处。用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机锁紧插座中,请注意仿真器的方向:缺口朝上。请指导老师检查接线后再翻开模块电源。翻开KeiluVision2仿真软件,首先建立本实验的工程文件,接着添加源程序,进行编译,直到编译无误。全速运行程序。数码管显示电压转化的数字量,调节模拟信号输入端的电位器旋钮。观察数码管数字随着旋钮旋转而线性变化。注意:电位器旋钮容易被拧坏,不要过分旋转旋钮。四、电路原理图实验程序#include<reg51.h>#defineuintunsignedint#defineucharunsignedchar//sbitclock=P2^0;//sbitdout=P2^1;//sbitcs=P2^2;sbitTLC549_CLK=P2^0;sbitTLC549_DOUT=P2^1;sbitTLC549_CS=P2^2;sbitDin=P1^0;sbitClk=P1^1;unsignedcharcodeTab[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71,0x00};//0-Fvoiddelay(intcount){unsignedinti; for(i=0;i<count;i++);}//显示函数voiddisplay(uchardatax){ uchari,j,chr,sel;ucharxs[8]={16,16,16,16,16,16,16,16};//针对实验中8个串口LED静态显示器 xs[7]=x&0x0f; xs[6]=x&0xf0; xs[6]=x>>4;for(i=0;i<8;i++){chr=Tab[xs[i]];// sel=0x80; for(j=0;j<8;j++) { Clk=0;//P1.1发出同步信号Din=chr&sel; Clk=1;sel=sel>>1; }}}unsignedcharTLC549_ReadByte(void){ unsignedcharvalue=0,i=0; TLC549_DOUT=1; for(i=0;i<8;i++) { if(TLC549_DOUT==1) value|=(0x80>>i); TLC549_CLK=1; TLC549_CLK=0; delay(50); }returnvalue;}unsignedcharTLC549_GetValue(void){ unsignedcharConvertValue; TLC549_CS=0; ConvertValue=TLC549_ReadByte(); TLC549_CS=1; delay(150);returnConvertValue;}voidmain(){uchari,dataad; while(1){ad=TLC549_GetValue(); display(ad); for(i=0;i<255;i++)delay(100); }}五实验心得与体会通过实验,认识掌握TLC549芯片使用方法,并且运用实验程序做出了正确的结果。同时,对于单片机的i/o编程有了认识,掌握单片机I/O的编程方法。实验四DS18B20温度传感器实验一、实验目的了解温度传感器电路的工作原理了解温度控制的根本原理掌握一线总线接口的使用二、实验说明输入给定程序,配置选项,调试并运行程序,观察程序控制下仿真器输出的变化。选中此项keil为硬件仿真设置Port串口:一般为COM3,Baudrate波特率为最大值:115200bit/s,最后确认Dallas半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。DS18B20内部结构主要由四局部组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置存放器。DS18B20的管脚排列如下,DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端〔在寄生电源接线方式时接地〕。DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。本实验在读取温度的根底上,完成类似空调恒温控制的实验。用加热电阻代替加热电机。温度值通过LED静态显示电路以十进制形式显示出来,制冷采用自然冷却。用C51进行程序设计,选择汇编或者C语言编程均可,要求程序结构清晰,模块化结构,反复调用局部做成子模块,有必要的注释。编写程序上机调试通过,实验报告要求提交程序流程图及源程序。三、实验内容及步骤〔完成分值:100分/单个程序〕本实验需要用到本实验需要用到单片机最小应用系统〔F1区〕、串行静态显示〔I3区〕和温度传感器模块〔C3区〕。DS18B20的CONTROL接最小应用系统P1.4,OUT接最小应用系统P2.0。最小系统的P1.0,P1.1接串行静态显示的DIN,CLK端。翻开相关模块电源。用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机锁紧插座中,请注意仿真器的方向:缺口朝上。请指导老师检查接线后再翻开模块电源。翻开KeiluVision2仿真软件,首先建立本实验的工程文件,接着添加源程序,进行编译,直到编译无误。全速运行程序。程序正常运行后,按下自锁开关‘控制’SIC。LED数显为“XX”为十进制温度测量值,“XX”为十进制温度设定值,按下自锁开关“控制”SIC那么加热源开始加热,温度也随着变化,当加热到设定的控制温度时如40度时,停止加热。注意:实验完成以后务必关闭该模块,防止没有控制无限加热造成模块损坏四、电路原理图实验程序#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitDQ=P2^0;//ds18b20与单片机连接口sbitDin=P1^0;//sbitCLK=P1^1;//unsignedcharcodeLED_Map[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71,0,0x40};//0-F,,-uchardatadisdata[5];uinttvalue;//温度值uchartflag;//温度正负标志voiddelay(intcount){unsignedinti; for(i=0;i<count;i++);}//数码显示voiddisplay(){ucharLED_code[5];uchari,j,chr,sel;///////////////for(i=0;i<4;i++)LED_code[i]=LED_Map[disdata[i]];//LED_code[i]=LED_Map[0]; if((LED_code[0]==0)&&(tflag==1)&&(LED_code[1]!=0))LED_code[0]=0x40;//显示负号 if((LED_code[1]==0)&&(tflag==1))LED_code[0]=0x40;for(i=0;i<4;i++){chr=LED_code[3-i];//if(i==1)chr=chr|0x80; sel=0x80;for(j=0;j<8;j++) { Din=chr&sel; CLK=0; sel=sel>>1; delay(1); CLK=1;delay(1); } }}/******************************ds1820程序***************************************/voiddelay_18B20(unsignedinti)//延时1微秒{ while(i--);}voidds1820rst()/*ds1820复位*/{unsignedcharx=0; DQ=1;//DQ复位 delay_18B20(4);//延时 DQ=0;//DQ拉低 delay_18B20(100);//精确延时大于480us DQ=1;//拉高 delay_18B20(40); }uchards1820rd()/*读数据*/{unsignedchari=0; unsignedchardat=0; for(i=8;i>0;i--) {DQ=0;//给脉冲信号 dat>>=1; DQ=1;//给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); } return(dat);}voidds1820wr(ucharwdata)/*写数据*/{unsignedchari=0;for(i=8;i>0;i--){DQ=0;DQ=wdata&0x01;delay_18B20(10);DQ=1;wdata>>=1;}}////////////////////////////////////////////////////////read_temp()/*读取温度值并转换*/{uchara,b;ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0x44);//*启动温度转换*/ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0xbe);//*读取温度*/a=ds1820rd();b=ds1820rd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0x0fff)tflag=0;else{tvalue=~tvalue+1;//求负数绝对值tflag=1;}tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数 return(tvalue);}/*******************************************************************/voidds1820disp()//温度值显示{disdata[0]=tvalue/1000;//百位数disdata[1]=tvalue%1000/100;//十位数disdata[2]=tvalue%100/10;//个位数disdata[3]=tvalue%10;//小数位if(disdata[0]==0) { disdata[0]=0x10;//如果百位为0,不显示 if(disdata[1]==0) { disdata[1]=0x10;//如果百位为0,十位为0也不显示 } }display();}/********************主程序*************************/voidmain(){uinti; while(1) { read_temp();//读取温度ds1820disp();//显示 for(i=0;i<255;i++)delay(100); }}五实心得体会通过软件编及仿真,了解了温度传感器电路的工作原理,编程过程中,熟悉并了解温度控制的根本原理,以及熟悉了解并掌握了一线总线接口的使用实验五步进电机控制实验一、实验目的1.了解步进电机控制的根本原理2.掌握控制步进电机转动的编程方法3.了解单片机控制外部设备的常用电路二、实验说明输入给定程序,配置选项,调试并运行程序,观察程序控制下仿真器输出的变化。选中此项keil为硬件仿真设置Port串口:一般为COM3,Baudrate波特率为最大值:115200bit/s,最后确认步进电动机有三线式、五线式、六线式三种,但其控制方式均相同,必须以脉冲电流来驱动。假设每旋转一圈以20个励磁信号来计算,那么每个励磁信号前进18度,其旋转角度与脉冲数成正比,正、反转可由脉冲顺序来控制。步进电动机的励磁方式可分为全步励磁及半步励磁,其中全步励磁又有1相励磁及2相励磁之分,而半步励磁又称1-2相励磁。图为步进电动机的控制等效电路,适应控制A、B、/A、/B的励磁信号,即可控制步进电动机的转动。每输出一个脉冲信号,步进电动机只走一步。因此,依序不断送出脉冲信号,即可步进电动机连续转动。用C51进行程序设计,选择汇编或者C语言编程均可,要求程序结构清晰,模块化结构,反复调用局部做成子模块,有必要的注释。编写程序上机调试通过,实验报告要求提交程序流程图及源程序。三、实验内容及步骤〔完成分值:100分/单个程序〕本实验需要用到本实验需要用到单片机最小应用系统〔F1区〕、步进电机模块〔M2区〕和查询式键盘〔B2区〕。单片机最小应用系统的P1.0、P1.1、P1.2、P1.3口分别接步进电机模块的SA、SB、SC、SD。最小系统的P2.0、P2.1、P2.2分别对应的接查询式键盘的K0、K1、K2键。翻开相关模块的电源开关。用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机锁紧插座中,请注意仿真器的方向:缺口朝上。请指导老师检查接线后再翻开模块电源。翻开KeiluVision2仿真软件,首先建立本实验的工程文件,接着添加源程序,进行编译,直到编译无误。全速运行程序。按下K0键电机正转,K1反转,K2电机STOP。四、电路原理图实验程序#include<reg52.h>#defineucharunsignedchar#defineuintunsignedint voiddelay(uinta);constucharstep_table1[]={0x01,0x02,0x04,0x08};//sbitzhengzhuang=P2^0;sbitfanzhuang=P2^1;sbitstop=P2^2;voiddelay(uinta){uinti,j;for(i=a;i>0;i--)for(j=122;j>0;j--);}voidmain(){uchari,flag0;while(1){zhengzhuang=1;fanzhuang=1; stop=1; flag0=0; if((!zhengzhuang)&&(fanzhuang)&&(stop))flag0=1; if((zhengzhuang)&&(!fanzhuang)&&(stop))flag0=2; if(!stop)flag0=3; if(flag0!=0) { for(i=0;i<4;i++){if(flag0==1) P1=step_table1[i]; if(flag0==2) P1=step_table1[3-i]; if(flag0==3) P1=0; P1=~P1;delay(100);} }}}五实验心得体会本次实验成功的实现了步进电机的正反转控制,对仿真软件以及51单片机编译软件能更加熟练地运用,试验中,了解了步进电机的根本原理,掌握控制步进电机转动的编程方法。对试验台中外部电路也有了进一步的人是和了解,了解了单片机控制外部设备的常用电路。实验六直流电机控制实验串行静态显示实验一、实验目的1.了解脉宽调制〔PWM〕的原理2.学习用PWM输出模拟量驱动直流电机3.熟悉51系列单片机的延时程序二、实验说明输入给定程序,配置选项,调试并运行程序,观察程序控制下仿真器输出的变化。选中此项keil为硬件仿真设置Port串口:一般为COM3,Baudrate波特率为最大值:115200bit/s,最后确认PWM是单片机上常用的模拟量输出方法,用占空比不同的脉冲驱动直流电机转动,从而得到不同的转速。程序中通过调整输出脉冲的占空比来调节直流电机的转速。使用光电测速元件测速,当它与圆盘上的空位相靠近时,光电元件输出低电平,当它被遮住时,光电元件输出高电平。圆盘转动一周时那么产生12个脉冲,直流电机转动时,光电元件输出连续的脉冲信号,单片机记录其脉冲信号,就可以测出直流电机的转速。另外增加显示电路,可把电机的转速显示出来。用C51进行程序设计,选择汇编或者C语言编程均可,要求程序结构清晰,模块化结构,反复调用局部做成子模块,有必要的注释。编写程序上机调试通过,实验报告要求提交程序流程图及源程序。顺便说一下:易念恩老师处有大量关于各种单片机的资料〔8G以上〕,如果确实有兴趣在这方面开展可以带上USB3.0的U盘或者移动硬盘〔USB2.0拷贝太慢〕找易老师拷贝资料。三、实验内容及步骤〔完成分值:60分/单个程序〕本实验需要用到本实验需要用到单片机最小应用系统〔F1区〕、串行静态显示〔I3区〕和直流电机驱动模块〔M1区〕。单片机最小应用系统的P1.7接直流电机驱动模块的PWM输入口Control,最小系统的INTO接直流电机驱动模块PULSEOUT,最小系统的P1.0、P1.1接串行静态显示的DIN、CLK。翻开相关模块电源。用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机锁紧插座中,请注意仿真器的方向:缺口朝上。请指导老师检查接线后再翻开模块电源。翻开KeiluVision2仿真软件,首先建立本实验的工程文件,接着添加源程序,进行编译,直到编译无误。全速运行程序。观察直流电机转速,一段时间后控制在程序设定的值30转/S的左右。四、电路原理图实验程序#include<reg51.h>typedefunsignedcharuchar; typedefunsignedintuint; sbitPWM_out=P1^7; sbitmRun=P2^0; sbitDin=P1^0;//sbitCLK=P1^1;// uintperiod=300; uinttime=0; uintPWM_h=100; uintcount=0; uintspeed=0; uintdat_t=0; uchardispflag=0; uchardatadisdata[8];unsignedcharcodeLED_Map[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71,0,0x40};//0-F,,-voiddelay(intcount){unsignedinti; for(i=0;i<count;i++);}//数码显示voiddisplay(){ucharLED_code[8];uchari,j,chr,sel;///////////////for(i=0;i<8;i++)LED_code[i]=LED_Map[disdata[i]];//LED_code[i]=0x3f; for(i=0;i<8;i++){chr=LED_code[i];// if(i==1)chr=chr|0x80; sel=0x80;for(j=0;j<8;j++) { Din=chr&sel; CLK=0; sel=sel>>1; delay(1); CLK=1;delay(1); } }}voidspeed_disp()//速度显示 {//speed=123; disdata[0]=speed/100;//取10位disdata[1]=speed%100/10;//取个位disdata[2]=speed%10;//取个位 disdata[3]=16; disdata[4]=16; disdata[5]=16; disdata[6]=16; disdata[7]=16;if(disdata[2]==0) { disdata[2]=0x10;//如果十位为零那么不显示 }display();}voidint0()interrupt0using0 { count++; if(dat_t>=1000) {speed=(count-1)*10/12; dispflag=1; count=0; dat_t=0; } } voidtimer0()interrupt1using1{ TH0=0xfc;//定时器装载初值,设置脉冲信号的占空比1ms(65536-1000=fc18)TL0=0x18; time++; dat_t++; if(time>period)time=0; if(time<=PWM_h)/*高电平持续时间结束,变低*/PWM_out=1; /*经过反相器反相*/ elseif((time>PWM_h)&&(time<=period))/*周期时间到,变高*/{ //time=0;PWM_out=0; /*经过反相器反相*/ } //if(time==period)time=0;}voidmain(){ucharflag0=0;P1=0x00;PWM_out=0;speed=0;speed_disp();TMOD=0x01;/*定时器0方式1*/TH0=0xfc;//定时器装载初值,设置脉冲信号的占空比1ms(65536-1000=fc18)TL0=0x18;dat_t=0;ET0=1;/*开定时器0中断*/TR0=1;/*启动定时器0*/IT0=1;EX0=1;EA=1;while(1){ if(mRun==0) { EA=1;/*开CPU中断*/ flag0=1; if(dispflag==1) { dispflag=0; speed_disp(); } } if(mRun==1) { EA=0; /*关CPU中断*/ PWM_out=0; if(flag0==1) { speed=0; speed_disp(); flag0=0; } }}}附加题修改程序,使电机从高速到低速再到高速,反复循环程序#include<reg51.h>typedefunsignedcharuchar; typedefunsignedintuint; sbitPWM_out=P1^7; sbitmRun=P2^0; sbitDin=P1^0;//sbitCLK=P1^1;// uintperiod=300; uinttime=0; uintPWM_h=80; uintcount=0; uintspeed=0; uintdat_t=0; uintturn_flag=1; uchardispflag=0; uchardatadisdata[8];unsignedcharcodeLED_Map[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71,0,0x40};//0-F,,-voiddelay(intcount){unsignedinti; for(i=0;i<count;i++);}//数码显示voiddisplay(){ucharLED_code[8];uchari,j,chr,sel;///////////////for(i=0;i<8;i++)LED_code[i]=LED_Map[disdata[i]];//LED_code[i]=0x3f; for(i=0;i<8;i++){chr=LED_code[i];// if(i==1)chr=chr|0x80; sel=0x80;for(j=0;j<8;j++) { Din=chr&sel; CLK=0; sel=sel>>1; delay(1); CLK=1;delay(1); } }}voidspeed_disp()//速度显示 {//speed=123; disdata[0]=speed/100;//取10位disdata[1]=speed%100/10;//取个位disdata[2]=speed%10;//取个位 disdata[3]=16; disdata[4]=16; disdata[5]=16; disdata[6]=16; disdata[7]=16;if(disdata[2]==0) { disdata[2]=0x10;//如果十位为零那么不显示 }display();}voidint0()interrupt0using0 { count++; if(dat_t>=1000) {speed=(count-1)*10/12; dispflag=1; count=0; dat_t=0; } } voidtimer0()interrupt1using1{ TH0=0xfc;//定时器装载初值,设置脉冲信号的占空比1ms(65536-1000=fc18)TL0=0x18; time++; dat_t++; if(time>period)time=0; if(time<=PWM_h)/*高电平持续时间结束,变低*/PWM_out=1; /*经过反相器反相*/ elseif((time>PWM_h)&&(time<=period))/*周期时间到,变高*/{ //time=0;PWM_out=0; /*经过反相器反相*/ } //if(time==period)time=0;}voidmain(){ucharflag0=0;P1=0x00;PWM_out=0;speed=0;speed_disp();TMOD=0x01;/*定时器0方式1*/TH0=0xfc;//定时器装载初值,设置脉冲信号的占空比1ms(65536-1000=fc18)TL0=0x18;dat_t=0;ET0=1;/*开定时器0中断*/TR0=1;/*启动定时器0*/IT0=1;EX0=1;EA=1;while(1){ if(mRun==0) { EA=1;/*开CPU中断*/ flag0=1; if(dispflag==1) { dispflag=0; speed_disp(); PWM_h=200; turn_flag=0; if((PWM_h<200)&(turn_flag==1)) { PWM_h+=20; } turn_flag=0; if((20<=PWM_h<300)&&(turn_flag==0)) { PWM_h-=20; } //if(PWM_h<=20)turn_flag=1; } // if(t_flag>=1000){ //PWM_h++; //t_flag==0;} } if(mRun==1) { EA=0; /*关CPU中断*/ PWM_out=0; if(flag0==1) { speed=0; speed_disp(); flag0=0; } }}}2. 参加控制开关,不同开关控制对应电机高转速、中等转速、低转速。程序#include<reg51.h>typedefunsignedcharuchar; typedefunsignedintuint; sbitPWM_out=P1^7; sbitmRun=P2^0; sbitDin=P1^0;//sbitCLK=P1^1;//sbitdi=P2^5;sbitzhong=P2^6;sbitgao=P2^7; uintperiod=300; uinttime=0; uintPWM_h=80; uintcount=0; uintspeed=0; uintdat_t=0; uintturn_flag=1; uchardispflag=0; uchardatadisdata[8];unsignedcharcodeLED_Map[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71,0,0x40};//0-F,,-voiddelay(intcount){unsignedinti;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年来宾道路客运输从业资格证考试真题保过
- 2024年客运从业资格证考试题目和答案解析
- 2024年晋中资格证客运题库
- 2024年景德镇客运从业资格证考试模拟考试
- 2023届新高考化学选考一轮总复习学案-热点1 离子方程式的正误判断
- 2024年广州海珠区住宅装修工程合同
- 2024年建筑工程合同详解版
- 《第八单元 世界经济的全球化趋势》试卷及答案-高中历史必修2-人教版-2024-2025学年
- 不同埋深下盾构输水隧洞预应力双层衬砌模型试验
- 提升泵站施工组织设计方案
- 《区块链应用技术》课程教学大纲
- 工程变更洽商记录样板
- 内蒙古蒙特威生物科技有限公司3000吨酪蛋白及衍生产品项目环评报告表
- 12河北安装定额说明和计算规则
- [中建]郑州机场航站楼扩建工程施工组织设计(图文158页)
- 呼和浩特市智慧城市建设情况216(共8页)
- 装配式建筑PPT培训讲义(图文并茂)
- 油库设计-毕业设计论文
- 新教材高中历史选择性必修一全册知识点总结
- (完整)学生课堂自我评价表
- 图书馆本科教学水平合格评估汇报
评论
0/150
提交评论