《单片机C语言程序设计》课件第六部分 单片机接口电路设计_第1页
《单片机C语言程序设计》课件第六部分 单片机接口电路设计_第2页
《单片机C语言程序设计》课件第六部分 单片机接口电路设计_第3页
《单片机C语言程序设计》课件第六部分 单片机接口电路设计_第4页
《单片机C语言程序设计》课件第六部分 单片机接口电路设计_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六部分单片机接口电路设计26.1项目一:220V控制电路由于单片机是3.3V~5V供电系统,生活中经常要用单片机控制更高电压(12V、220V、380V等)的器件如:电灯、电机、热水器等。这时要有相应电路做隔离如:继电器、可控硅等。6.1.1继电器控制电路图6.1.1为继电器控制电路。当P3.0输出低电平时,PNP三极管导通,继电器的继圈吸合(常开点闭合);当P3.0输出高电平时,PNP三极管截止,继电器断开(常开点断开)。当继电器吸合或继开瞬间,在继电器线圈两端会产生高于+5V的感应电压叠加在PNP的E极,可能会烧坏PNP三极管,在继电器线圈两端并一个1N4007续流二极管(产生的感应电流将会通过1N4007流向+5V电源)用于保护PNP三极管。(Proteus库中的元件名:继电器:OZ-SH-105D;电灯:LAMP;二极管:1N4007;220V电源:VSINE(220V,1HZ))。36.1项目一:220V控制电路由于单片机是3.3V~5V供电系统,生活中经常要用单片机控制更高电压(12V、220V、380V等)的器件如:电灯、电机、热水器等。这时要有相应电路做隔离如:继电器、可控硅等。6.1.1继电器控制电路图6.1.1为继电器控制电路。当P3.0输出低电平时,PNP三极管导通,继电器的继圈吸合(常开点闭合);当P3.0输出高电平时,PNP三极管截止,继电器断开(常开点断开)。当继电器吸合或继开瞬间,在继电器线圈两端会产生高于+5V的感应电压叠加在PNP的E极,可能会烧坏PNP三极管,在继电器线圈两端并一个1N4007续流二极管(产生的感应电流将会通过1N4007流向+5V电源)用于保护PNP三极管。(Proteus库中的元件名:继电器:OZ-SH-105D;电灯:LAMP;二极管:1N4007;220V电源:VSINE(220V,1HZ))。【例6.1.1】硬件电路如图6.1.1所示,设计一个220V控制电路,采用单片机控制电灯亮灭。通过P1.0的按键控制P3.0的三极管,从而达到控制电灯LAMP的目的。5#include<REGX51.H>sbitkey=P1^0;sbitLamp=P3^0;voiddelay(unsignedinta){while(a--);}voidmain(){while(1){if(!key){delay(10000);if(!key){Lamp=!Lamp;}while(!key);}}}6.1.2可控硅控制电路

图6.1.2为可控硅控制电路。当P3.0输出低电平时,光耦MOC3051的4脚和6脚导通,220V电压经过100欧电阻和光耦流向可控硅L4004L3的G端,可控硅导通;当P3.0输出低电平时,光耦MOC3051的4脚和6脚不导通,220V电压无法流向可控硅L4004L3的G端,可控硅不导通。图6.1.2可以在可控硅两端并上RC吸收回路,当可控硅导通时电容放电,避免可控硅承受过高电压。(Proteus库中的元件名:继电器:OZ-SH-105D;电灯:LAMP;二极管:1N4007;220V电源:VSINE(220V,1HZ))。86.2项目二:PWM的电机转速控制

PWM(PulseWidthModulation,脉冲宽度调制)调速系统中,一般可以采用定宽调频、调宽调频、定频调宽3种方法改变控制脉冲的占空比,前两种方法在调速时改变了控制脉宽的周期,从而引起控制脉冲频率的改变,当该频率与系统的固有频率接近时将会引起振荡。为避免之,设计采用定频调宽改变占空比的方法来调节直流电动机电枢两端电压

【例6.2.1】硬件电路如图6.2.1所示,设计一个电机转速控制器:5个按键分别控制电机的加速、减速、正转、反转、停止;电机转速10级;采用共阴数码管显示转速级别。采用单片机定时计数器0,工作于方式1。10#include<REGX51.H>sbitUP=P1^0;//按键加速sbitDOWN=P1^1;//按键减速sbitRIGHT=P1^2;//按键正转sbitLEFT=P1^3;//按键反转sbitSTOP=P1^4;//按键停止sbitIN1=P2^5;//L298输入端1sbitIN2=P2^6;//L298输入端2sbitENA=P2^7;//L298使能端,用于PWM调速;unsignedcharnum[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管代码表charPWM=5;//占空比;charMOTO_STATE;//电机状态;charcounter;11voiddelay(unsignedinta)//延时程序,用于按键防抖;{ while(a--);}voidINIT()//初始化定时计数器{TMOD=0x01;//设置定时计数器0工作于方式1;TH0=(65536-1000)>>8;TL0=(65536-1000);//定时1000us,即1ms;TR0=1;//启动定时计数器0;ET0=1;//使能定时计数器0中断;EA=1;//中断总开关;}12voidkey_scan()//按键扫描程序;{if(!UP){delay(1000);if(!UP)//加快转速;{PWM++;if(PWM>9)PWM=9;//转速10级;}while(!UP);}if(!DOWN)//降低转速;{delay(1000);if(!DOWN){PWM--;if(PWM<=0)PWM=0;}while(!DOWN);}13if(!RIGHT)//正转;{delay(1000);if(!RIGHT){MOTO_STATE=1;}while(!RIGHT);}if(!LEFT)//反转;{delay(1000);if(!LEFT){MOTO_STATE=2;}while(!LEFT);}14if(!STOP)//停止;{delay(1000);if(!STOP){MOTO_STATE=0;}while(!STOP);}}voidmoto_ctrl()//电机状态控制;{ switch(MOTO_STATE){case0:IN1=1;IN2=1;break;//电机停止转动;case1:IN1=1;IN2=0;break;//电机正转;case2:IN1=0;IN2=1;break;//电机反转;default:MOTO_STATE=0;break;}}15voidmain(){INIT();//调用初始化函数,设置定时计数器0的工作状态;while(1){key_scan();//调用键盘扫描函数;moto_ctrl();//调用电机状态控制函数;P3=num[PWM];//显示;}}voidTimer0()interrupt1//定时计数器0中断服务函数;{TH0=(65536-1000)/256;TL0=(65536-1000)%256;counter++;//counter每1ms自加1;if(counter>=10){counter=0;}if(counter<PWM)ENA=1;//占空比调节;if(counter>=PWM)ENA=0;}

【例6.3.1】硬件电路如图6.3.1所示,设计一个双机通信程序:A机通过串行口向B机发送数据,B机接收到数据后在数码管显示;当A机的K1按下后B机显示的数据加1,当A机的K2按下后B机显示的数据减1;当B机接收到9时,向A机发送0xaa,A机收到0xaa后让P1.7对应的LED亮;当B机接收到的数据不是9时,向A机发送0x55,A机收到数据不是0xaa时,LED灭。6.3项目三:双机通信17A机程序:#include<REGX51.H>sbitUP=P1^0;//按键加sbitDOWN=P1^1;//按键减sbitLED=P1^7;charsend_data;unsignedchari;voiddelay(unsignedinta)//延时程序;{while(a--);} voidINIT()//初始化串行口中断;{TMOD=0X20;//设置定时计数器1工作于方式2;TR1=1;TH1=0Xfd;TL1=0Xfd;//波特率为9600bpsSCON=0X50;//方式1,REN=1;ES=1; //使能串口中断;EA=1; //中断总开关开启。}18voidkey_scan()//按键扫描程序;{ if(!UP) { delay(1000); if(!UP)//发送数字加; {send_data++;if(send_data>9)send_data=9;} while(!UP); } if(!DOWN)//发送数字减; { delay(1000); if(!DOWN) {send_data--;if(send_data<=0)send_data=0;} while(!DOWN); }}19voidmain(){INIT();while(1){ key_scan();//调用按键扫描函数;SBUF=send_data;delay(1000); if(i==0xaa)LED=0;elseLED=1;//A机接收到[谁接收?A机还是B机]0xaa时LED亮;}}voidSerial()interrupt4{if(RI){RI=0;i=SBUF;}//当B机接收到9时,会发0xaa回A机;elseTI=0;}20A机程序:#include<REGX51.H>sbitUP=P1^0;//按键加sbitDOWN=P1^1;//按键减sbitLED=P1^7;charsend_data;unsignedchari;voiddelay(unsignedinta)//延时程序;{while(a--);} voidINIT()//初始化串行口中断;{TMOD=0X20;//设置定时计数器1工作于方式2;TR1=1;TH1=0Xfd;TL1=0Xfd;//波特率为9600bpsSCON=0X50;//方式1,REN=1;ES=1; //使能串口中断;EA=1; //中断总开关开启。}21B机程序:#include<REGX51.H>unsignedcharnum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管代码表unsignedchari;voiddelay(unsignedinta)//延时程序;{while(a--);}voidINIT(){TMOD=0X20;//设置定时计数器1工作于方式2;TR1=1;TH1=0Xfd;TL1=0Xfd;//波特率为9600bpsSCON=0X50;//方式1,REN=1;ES=1; //使能串口中断;EA=1; //中断总开关开启。}22voidmain(){INIT();while(1){P1=num[i];if(i==9)SBUF=0xaa;//当B机收到[谁收到?A机还是B机]9时,发送0xaa;A机收到0xaa时LED亮;elseSBUF=0x55;//否则发送0x55,A机收到0x55时LED灭;delay(1000);}}voidSerial()interrupt4{i=SBUF;//接收数据;if(RI)RI=0;elseTI=0;//清零TIRI;}

液晶显示器是利用液晶能改变光线传输方向的特性来实现显示信息的器件。由于其体积小、功耗低、显示内容丰富等优点,因此在生活中的运用十分广泛。LCD1602是2*16的点阵字符型显示器,可以显示2行,每行16个字符,如图6.4.1所示。6.4项目四:液晶显示器接口指令功能:清除屏幕,将显示缓冲区的内容全部写入字符代码为20H的“空格”,将光标复位后移到屏幕的左上角。(1)清屏控制信号指令内容RSRWD7D6D5D4D3D2D1D00000000001(2)光标复位控制信号指令内容RSRWD7D6D5D4D3D2D1D0000000001X指令功能:光标复位,移到屏幕的左上角;AC地址计数器清零;DDRAM的内容不变。指令功能:设置当写入一个字节后,光标的移动方向和后面的内容是否移动。(3)显示内容的移动方式控制信号指令内容RSRWD7D6D5D4D3D2D1D000000001I/DSA、当I/D=1时,读或写完一个数据操作后,地址指针AC加l,光标右移1格。当I/D=0时,读或写完一个数据操作后,地址指针AC减1,光标左移1格。B、当S=1时,写一个数据操作后,整屏显示左移(I/D=1)或右移(I/D=0),光标不移动;当S=0时,写一个数据操作后,整屏显示不移动。(4)显示器开/关控制控制信号指令内容RSRWD7D6D5D4D3D2D1D00000001DCB指令内容:0x08~0x0f。指令功能:A、当D=0时,不显示DDRAM中的内容;当D=1时,显示DDRAM中的内容。B、C为光标控制开关。C=1,显示光标;C=0,不显示光标。C、字符闪烁控制开关。B=1,光标出现的字符会闪烁;B=0,表示字符不闪烁。(5)光标移位命令控制信号指令内容RSRWD7D6D5D4D3D2D1D0000001S/CR/LXX指令内容:0x10~0x1f。指令功能:光标移动或整幕移动。A、当S/C=1时,整屏字幕平移1个字符位;当S/C=0时,仅光标平移1个字符位。B、R/L=1,表示光标右移;R/L=0,表示光标左移。(6)功能设置命令控制信号指令内容RSRWD7D6D5D4D3D2D1D000001DLNFXX指令内容:0x20~0x3f。指令功能:A、当DL=1时,数据接口为8位;当DL=0时,数据接口为4位,使用D7~D4位分两次送入1个完整的字符数据。B、当N=1时,采用双行显示;当N=0时,采用单行显示。C、当F=1时,采用5×10点阵显示;当F=0时,采用5×7点阵显示。(7)字库CGRAM地址设置命令控制信号指令内容RSRWD7D6D5D4D3D2D1D00001CGRAM的地址指令编码:0x40~0x7f。指令功能:设置用户自定义的要读/写数据的CGRAM地址;地址使用(D5~D0)送出,可设定0~63共64个地址。(8)显示缓冲区DDRAM地址设置命令控制信号指令内容RSRWD7D6D5D4D3D2D1D0001DDRAM的地址指令编码:0x80~0xff。指令功能:设定当前要读/写数据的显示缓冲区DDRAM地址,地址使用(D6~D0)送出,可设定0~127共128个地址(9)忙碌标志位BF和地址计数器AC的值控制信号指令内容RSRWD7D6D5D4D3D2D1D000BFAC的值指令功能:A、当BF=1时,不接收单片机送来的指令或数据;当BF=0时,可以接收命令或数据。B、读取数据的内容,D6~D0的值表示AC值。(10)写数到CGRAM或DDRAM控制信号指令内容RSRWD7D6D5D4D3D2D1D010写入数据指令功能:先设定CGRAM或DDRAM的当前地址,再将数据写入D7~D0中,使液晶显示出字形或用户自定义的字符图形。(11)读CGRAM或DDRAM命令控制信号指令内容RSRWD7D6D5D4D3D2D1D011读出数据先设定CGRAM或DDRAM的当前地址中,读取其中的数据。在使用液晶时须进行初始化,步骤如下:(1)对液晶进行清屏,对DDRAM显示缓冲区的内容全写入空格,光标复位加到显示器左上角,AC地址计数器清零。(2)功能设置,选择LCD1602与单片机连接的方式(可选择8位),设置显示行数(一般为2行),设置字形大小(5*7点阵)。(3)显示器开/关控制,控制光标显示与否,字符闪烁与否。(4)设置显示内容的移动方式,设定光标移动方向和当前内容是否移动。6.4.2液晶显示接口电路与编程【例6.4.1】硬件电路如图6.4.2所示,设计一个LCD1602液晶显示程序:在第一行从第一个位置开始显示“GUET”;第二行第5个位置显示1个数字,该数字从0~9自加;第二行第8个位置显示光标闪烁。36#include<REGX51.H>unsignedcharnum[10]={'0','1','2','3','4','5','6','7','8','9'};//定义液晶端口#defineLCD_DATAP3sbitRS=P2^5;sbitRW=P2^6;sbitE=P2^7;voiddelay(unsignedinta)//延时函数;{while(a--);}voidlcd_busy()//检查LCD忙函数;{LCD_DATA=0xff;RS=0;RW=1;E=0;E=1;while(LCD_DATA&0X80){E=0;E=1;};//忙等待;}37voidwrite_com(unsignedcharcommand)//写命令函数;{lcd_busy();E=0;RS=0;RW=0;E=1;LCD_DATA=command;E=0;}voidwrite_data(unsignedcharlcd_data)//写数据函数;{lcd_busy();E=0;RS=1;RW=0;E=1;LCD_DATA=lcd_data;E=0;}38voidinit_lcd()//初始化LCD函数;{write_com(0x01);//清屏;write_com(0x38);//5*7点阵;write_com(0x0c);//显示器开,关标关闭,字符不闪烁。write_com(0x06);//字符不动,光标自动向右移1格。}voidmain(){unsignedchari;bitflag;init_lcd();39while(1){write_com(0x80);//第一行第1个地址;write_data('G');//显示G;write_data('U');//显示U;write_data('E');//显示E;write_data('T');//显示T;write_com(0xc5);//第二行第5个地址;write_data(num[i++]);//显示数字自加;if(i>9)i=0;delay(50000);write_com(0xc8);//第二行第8个地址;flag=!flag;if(flag)write_data(0xff); //光标elsewrite_data(0xfe);//反白}}6.5.1LTC1456的介绍

LTC1456是一个单电源供电,轨对轨输出,12位数字模拟转换器(DAC)。它包含一个轨对轨输出缓冲放大器和一个易于使用的线级联串行接口。LTC1456内部包含一个2.048V参考电压,可以输出电压从0V到4.095V。它的工作电源从4.5V到5.5V,散热2.2mw。LTC1456的引脚图如图6.5.1所示,其各引脚功能如下说明:6.5项目五:基于LTC1456的12位数模转换41CLK:串行接口的时钟端。DIN:串行数据输出端。串行时钟的上升沿时,DIN的数据锁存到移位寄存器中。CS/LD:串行接口使能和加载控制端。当CS/LD低电平时,数据被锁入。当CS/LD拉高时,加载的数据从移位寄存器的传入到DAC寄存器中并更新DAC输出。当CS/LD为高电平时,内部时钟禁用。DOUT:当串行时钟的上升沿时移位寄存器的输出有效。GND:电源地。CLR:清除输入的数据。当引脚拉低时,将异步清零内部移位寄存器和DAC寄存器,当引脚拉高时,芯片正常运行。vout高(引脚7):缓冲DAC输出。VCC(引脚8):正电源输入。4.5V≤VCC≤5.5v。【例6.5.1】硬件电路如图6.5.1所示,使用LTC1456输出锯齿波:43#include<REGX51.H>sbitDIN=P1^3;//定义LTC1456的DIN端口sbitCK=P1^5;//定义LTC1456的CLK端口sbitCS=P1^7;//定义LTC1456的CS端口voidDA_out(floatdat,bitflag){ unsignedchari=0; unsignedintdat_buf; if(flag){dat_buf=dat*1000;flag=0;} elsedat_buf=(int)dat; CS=1; CS=0; for(i=0;i<4;i++)dat_buf<<=1;//向左移4位,高4位无用; for(i=0;i<12;i++)//由高到低写入12位数据; {

DIN=(bit)(dat_buf&0x8000); CK=1; dat_buf<<=1;//向左移位; CK=0;} CS=1; CS=0;}44voidmain(){ unsignedinti=0; CK=0; CS=0; while(1) { // DA_out(1.234,1); DA_out(i,0); i++;if(i>100)i=0; }}6.6.1TLC2543的介绍

TLC2543是TI公司生产的11通道12位开关电容逐次逼近型串行A/D转换器。在工作温度范围内10μs转换时间;采样率为66kbps;线性误差+1LSB(max);有转换结束(EOC)输出;具有单、双极性输出;可编程的MSB或LSB前导;可编程的输出数据长度。TLC2543的引脚排列如图6.6.1所示,其各引脚功能如下说明:46AIN0~AIN10:模拟输入端。REF+:正基准电压端。REF-:负基准电压端。CS:为片选端。SDI:串行数据输入端。SDO:A/D转换结果的三态串行输出端。EOC:转换结束端。CLK:I/O时钟。VCC:正电源4.5V~5.5V。GND:电源地。(1)控制字的格式6.6.2TLC2543的接口电路与编程(2)转换过程【例6.6.2】硬件电路如图6.6.3所示,采用TLC2543的通道5对外部电压进行采集并通过LCD1602进行显示。根据图6.6.2时序图设置TLC2543的输出端DATAOUT采用12位的输出格式,输入端DATAINPUT应设置为01011000。49#include<REGX51.H>#include<LCD1602.H>sbitSDO=P1^3;sbitSDI=P1^4;sbitCS=P1^5;sbitCLK=P1^6;sbitEOC=P1^7;unsignedintad;floatvotage;unsignedintread_ad(unsignedcharchannel){ unsignedchari; unsignedintad=0; unsignedintad_value;unsignedcharCH_PORT;50CS=1;CS=0; CLK=0; CH_PORT=(channel<<4)|0x0c; for(i=0;i<12;i++) { if(SDO)ad|=0x01; SDI=(bit)(CH_PORT&0x80); CLK=1; CLK=0; CH_PORT<<=1; ad<<=1; } CS=1; ad_value=ad>>1; return(ad_value);}51voiddisplay(){write_com(0x80);write_data('A');write_data('D');write_data(num[5]);write_data(':');write_com(0x85);write_data('.');write_com(0x89);write_data('V');write_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论