版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
-.z单片机最小系统设计制作训练3.1单片机最小系统设计制作单片机最小系统电路板硬件设计单片机的主要功能是负责整个系统的控制,不承当复杂的数据处理任务,因此在设计单片机最小系统时通常选用AT89C5l、AT89C52、AT89S51、AT89S52〔S系列芯片支持ISP功能〕等型号的8位单片机作为MCU一个典型的单片机最小系统一般由时钟电路、复位电路、片外RAM、片外ROM、按键、数码管、液晶显示器、外部扩展接口等局部组成,图3.1、图3.2分别给出了单片机最小系统的构造框图、原理图。图3.1单片机最小系统的构造框图图3.2原理图单片机最小系统时钟、复位、译码电路简介1、时钟源电路单片机内部具有一个高增益反相放大器,用于构成振荡器。通常在引脚*TALl和*TAL2跨接石英晶体和两个补偿电容构成自激振荡器,构造如图2中Y1、C16、C17。可以根据情况选择6MHz、12MHz或24MHz等频率的石英晶体,补偿电容通常选择30pF左右的瓷片电容。2、复位电路单片机小系统采用上电自动复位和手动按键复位两种方式实现系统的复位操作。上电复位要求接通电源后,自动实现复位操作。手动复位要求在电源接通的条件下,在单片机运行期间,用按钮开关操作使单片机复位。其构造如图2中R24、R26、C18和K17。上电自动复位通过电容C18充电来实现。手动按键复位是通过按键将电阻R26与VCC接通来实现。3、地址译码电路最小系统上的全部硬件除EEPROM以外均是采用总线方式进展扩展的,每一个硬件均占用特定的物理地址。为了减少芯片的使用数量和降低PCB板布线的复杂度,本系统使用小规模可编程逻辑器件GAL代替74系列芯片实现译码电路。具体硬件见图2中U24。3.2键盘显示电路设计键盘接口电路及程序设计单片机键盘通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。也就是说,它能提供标准的TTL逻辑电平,以便与通用数字系统的逻辑电平相容。小系统上设置了一个2行乘8列的阵列式键盘,系统硬件电路如图4所示。电路构造采用总线扩展方式进展设计,同时使用P13和P14进展行选择,按键信号通过一片74LS245挂接到数据总线上,片选信号为KEY_CS,为其分配的物理地址为0*A100。图3.3键盘接口电路由于系统的键盘接口采用的是总线方式,因此读取按键数值变得相当方便,下面是使用C编写的读取键盘程序:*defineKEY*BYTE[0*A100]//键盘地址sbitfirst_row=P1^4;//键盘第一行控制sbitsecond_row=P1^3;//键盘第二行控制ucharM_key;//键盘数值暂存单元first_row=0;//读取第一行键盘数值second_row=1;M_key=KEY;first_row=1;//读取第二行键盘数值second_row=0;M_key=KEY;系统采用定时扫描的方式〔扫描间隔为4ms,内部定时器定时中断间隔为2ms,每两次定时中断进展一次键盘扫描〕进展键盘识别,设计程序时通常要进展以下四个方面的处理:〔1〕每隔4ms读取一次键盘的数值,判断有无按键按下。具体方法是令first_row=0,second_row=0,M_key=KEY,判断M_key的值是否为0*FF,如果等于0*FF说明没有按键按下,如果不等于0*FF说明有按键按下。〔2〕去除按键的机械抖动影响。通过设置状态标志位first_getkey来判断连续两次扫描键盘是否都检测到有按键按下。如果没有连续两次都检测到按键按下则按照键抖动处理;否则,认为确实有按键按下。〔3〕准确输出按键值keynum,并提供获得有效按键标志getkey。〔4〕防止按键冲突。在获得有效按键以后设定状态标志位keyon来实现每次只处理一个按键,且无论一次按键时间有多长,系统仅执行一次按键功能程序。键盘识别程序流程如图3.4所示。程序代码将在介绍完数码管显示器以后统一给出。图3.4键盘识别程序流程数码管接口电路及程序设计本系统共设置了8个7段码数码管显示器,电路构造如图3.5所示。图3.58个7段码数码管显示器电路电路构造同样采用总线扩展方式进展设计,其中使用的数码管为连4位的共阳型数码管。通过芯片U15〔74HC573〕锁存,为数码管提供段码数据。通过芯片U14〔74HC573〕、U13〔74HC138〕以及三极管Q1—Q8将低三位地址A2..0进展硬件译码,为每个数码管提供一个唯一的物理地址,具体地址为0*A000—0*A007。此外本电路构造还考虑了不同数码管进展显示切换时的消隐问题,在编写程序时不用通过额外的处理进展消隐。由于为每个数码管都分配了一个固定的物理地址,在编写程序时只要将相应的段码数据写入到对应的地址当中便可以完成显示,例如要在第二个数码管上显示“1〞,使用C语言办成实现如下:*define7SEG_LED2*BYTE[0*A001]//第二个数码管的地址定义7SEG_LED2=0*F9;//将“1”的段码数据“0*F9//存器U15上,同时低三位地址A2..0“001//经过硬件译码使位码LED2为高。通过上面一条语句便可以实现在第二个数码管上显示“1〞的操作。但由于全部数码管的段码线共用,在同一时刻只能点亮一个数码管,所以在实际应用中必须采用动态扫描的方式进展8个数码管的显示。具体实现方法是使用内部定时器每2ms产生一次定时中断,系统在每进入到一次定时中断后更新一次显示内容,对于每个数码管来说其显示的周期为16ms,由于显示频率足够高人眼感觉不到闪烁的存在。数码管显示程序流程如下:图3.6数码管显示程序流程在编写程序时考虑到单片机的资源利用情况,使用一个定时器为键盘扫描和数码管显示更新提供定时效劳,定时中断函数流程如图3.7所示。定时器定时间隔为2ms,每次进入中断调用一次显示更新函数,每两次进入中断调用一次扫描键盘函数。图3.8给出了利用以上给出的键盘扫描和数码管显示以及中断函数实现一个最简单系统的主程序流程图。在主程序中通过查询方式判断getkey〔获得有效按键标志位,当获得一个有效按键后键盘扫描函数讲其置为1〕,当获得有效按键后令所有的数码管显示按键的数值。图3.7定时中断函数流程图3.8主程序流程图C程序代码如下:*include<absacc.h>*include<reg51.h>*include<intrins.h>*defineucharunsignedchar/*数码管物理地址*/*defineLED1*BYTE[0*A000]*defineLED2*BYTE[0*A001]*defineLED3*BYTE[0*A002]*defineLED4*BYTE[0*A003]*defineLED5*BYTE[0*A004]*defineLED6*BYTE[0*A005]*defineLED7*BYTE[0*A006]*defineLED8*BYTE[0*A007]/*键盘物理地址*/*defineKEY*BYTE[0*A100]/*扫描键盘使用的变量*/sbitfirst_row=P1^4;//键盘第一行控制sbitsecond_row=P1^3;//键盘第二行控制bitfirst_getkey=0,control_readkey=0;//读键盘过程中的标志位bitgetkey=0;//获得有效键值标志位,等于1时代表得到一个有效键值bitkeyon=0;//防止按键冲突标志位ucharkeynum=0;//获得的有效按键值存放器/*数码管显示使用的变量和常量*/ucharlednum=0;//数码管显示位控制存放器ucharled[8]={0,0,0,0,0,0,0,0};//数码管显示内容存放器ucharcodesegtab[18]={0*c0,0*f9,0*a4,0*b0,0*99,0*92,0*82,0*f8,0*80,0*90,0*88,0*83,0*c6,0*a1,0*86,0*8e,0*8c,0*ff};//七段码段码表//"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","P","black"/*函数声明*/voidleddisp(void);//数码管显示更新函数voidreadkey(void);//键盘扫描函数/*T0定时中断处理函数*/voidintT0()interrupt1{TH0=-4230/256;//定时器中断时间间隔2msTL0=-4230%256;leddisp();//每次定时中断显示更新一次if(control_readkey==1)//每两次定时中断扫描一次键盘{readkey();}control_readkey=!control_readkey;}/*主函数*/voidmain(void){TMOD=0*01;//设定定时器T0工作模式为模式1TH0=-4230/256;//定时器中断时间间隔2msTL0=-4230%256;TCON=0*10;ET0=1;EA=1;while(1)//等待获得有效按键{if(getkey==1)//判断是否获得有效按键{getkey=0;//当获得有效按键时,去除标志位。led[0]=keynum;//令全部数码管显示按键值led[1]=keynum;led[2]=keynum;led[3]=keynum;led[4]=keynum;led[5]=keynum;-.zled[6]=keynum;led[7]=keynum;}}}-.z/***************************************************键盘扫描函数原型:voidreadkey(void);功能:当获得有效按键时,令getkey=1,keynum为按键值****************************************************/voidreadkey(void){ucharM_key=0;////键盘数值暂存单元first_row=0;second_row=0;M_key=KEY;if(M_key!=0*ff)//如果有连续两次按键按下,认为有有效按键按下。消除按键抖动{if(first_getkey==0){first_getkey=1;}else//当有有效按键按下时,进一步识别是哪一个按键{if(keyon==0)//防止按键冲突,当还有未释放的按键时不对其它按键动作响应{first_row=0;//扫描第一行按键second_row=1;M_key=KEY;if(M_key!=0*ff){switch(M_key){case0*fe:keynum=0*00;break;case0*fd:keynum=0*01;break;case0*fb:keynum=0*02;break;case0*f7:keynum=0*03;break;case0*ef:keynum=0*04;break;case0*df:keynum=0*05;break;case0*bf:keynum=0*06;break;case0*7f:keynum=0*07;break;}}else{second_row=0;//扫描第二行按键first_row=1;M_key=KEY;switch(M_key){case0*fe:keynum=0*08;break;case0*fd:keynum=0*09;break;case0*fb:keynum=0*0a;break;case0*f7:keynum=0*0b;break;case0*ef:keynum=0*0c;break;case0*df:keynum=0*0d;break;case0*bf:keynum=0*0e;break;case0*7f:keynum=0*0f;break;}}getkey=1;//获得有效按键数值keyon=1;//防止按键冲突,当获得有效按键时将其置1}}}else{first_getkey=0;keyon=0;//防止按键冲突,当所有的按键都释放时将其清0}}/***************************************************数码管显示函数原型:voidleddisp(void);功能:每次调用轮流显示一位数码管****************************************************/voidleddisp(void){switch(lednum)//选择需要显示的数码位{case0:LED1=segtab[led[0]];break;case1:LED2=segtab[led[1]];break;case2:LED3=segtab[led[2]];break;case3:LED4=segtab[led[3]];break;case4:LED5=segtab[led[4]];break;case5:LED6=segtab[led[5]];break;case6:LED7=segtab[led[6]];break;case7:LED8=segtab[led[7]];break;}if(lednum==0)//更新需要显示的数码管位置{lednum=7;}else{lednum=lednum-1;}}液晶接口电路及程序设计传统的显示器件数码管已经不能满足显示复杂操作界面的要求。因此最小系统中除了数码管显示器以外,还接入了一个液晶显示模块,其型号为SGM12864C,可以显示64行128列的点阵数据,通过编写相应的程序可以显示英文、汉字或图形,可以实现比拟复杂的用户操作界面。硬件接口电路如图3.9所示。液晶模块的构造及操作控制请参阅SMG12864C.PDF。图3.9硬件接口电路在硬件设计中使用译码电路提供的LCD_R_CS、LCD_L_CS、LCD_E为液晶模块提供片选及使能信号。使用系统的地址信号A0控制向液晶写入的是命令字还是数据字。此外将液晶的读写控制端接地,制止从液晶中读数据,在向液晶中写入一个数据或命令后延时一段时间再向其中写入新的数据,防止由于液晶处在忙状态导致写入错误的情况发生。根据地址译码器提供的地址以及信号A0,可以得出向液晶左右两个控制器中写入命令和数据的物理地址,下面给出在C语言中的具体定义:*defineLCD_L_DATA*BYTE[0*A201]//左半边液晶数据地址*defineLCD_R_DATA*BYTE[0*A301]//右半边液晶数据地址*defineLCD_L_mand*BYTE[0*A200]//左半边液晶命令地址*defineLCD_R_mand*BYTE[0*A300]//右半边液晶命令地址为了使液晶能够显示字符、汉字以及图形,需要对其进展正确的设置,具体过程如下:〔1〕在系统上电后对其进展初始化设置。向左右两局部控制器写入控制字0*C0,设置显示的初始行。向左右两局部控制器写入控制字0*3F,将液晶的左右两局部显示开启。此局部功能由后面给出程序中的lcd_initial()函数完成。〔2〕在液晶指定位置显示给定的数据。完成液晶的初始化以后,通过写入命令字确定显示的列地址和页地址,然后写入需要显示的数据。以下给出了在液晶指定位置显示大小为8*8字符、16*16汉字以及128*64图形的C语言程序,用户可以根据需要利用函数lcd_write_byte()编写显示任意大小图形和文字的函数。*include<absacc.h>*include<reg51.h>*include<intrins.h>*defineucharunsignedchar*defineLCD_L_DATA*BYTE[0*A201]//左半边液晶数据地址*defineLCD_R_DATA*BYTE[0*A301]//右半边液晶数据地址*defineLCD_L_mand*BYTE[0*A200]//左半边液晶命令地址*defineLCD_R_mand*BYTE[0*A300]//右半边液晶命令地址ucharcodeG[8]={0*00,0*00,0*3e,0*41,0*49,0*49,0*7a,0*00};/*G*/ucharcodeU[8]={0*00,0*00,0*3f,0*40,0*40,0*40,0*3f,0*00};/*U*/ucharcodeO[8]={0*00,0*00,0*3e,0*41,0*41,0*41,0*3e,0*00};/*O*//*--宋体12;此字体下对应的点阵为:宽*高=16*16--*//*--文字:国--*/ucharcodeguo[32]={0*00,0*FE,0*02,0*0A,0*8A,0*8A,0*8A,0*FA,0*8A,0*8A,0*8A,0*0A,0*02,0*FE,0*00,0*00,0*00,0*FF,0*40,0*48,0*48,0*48,0*48,0*4F,0*48,0*49,0*4E,0*48,0*40,0*FF,0*00,0*00};/*--文字:防--*/ucharcodefang[32]={0*00,0*FE,0*22,0*5A,0*86,0*02,0*08,0*08,0*F9,0*8E,0*88,0*88,0*88,0*08,0*08,0*00,0*00,0*FF,0*04,0*08,0*47,0*20,0*18,0*07,0*00,0*00,0*40,0*80,0*7F,0*00,0*00,0*00};/*--文字:科--*/ucharcodeke[32]={0*10,0*12,0*92,0*72,0*FE,0*51,0*91,0*00,0*22,0*CC,0*00,0*00,0*FF,0*00,0*00,0*00,0*04,0*02,0*01,0*00,0*FF,0*00,0*04,0*04,0*04,0*02,0*02,0*02,0*FF,0*01,0*01,0*00};/*--文字:技--*/ucharcodeji[32]={0*08,0*08,0*88,0*FF,0*48,0*28,0*00,0*C8,0*48,0*48,0*7F,0*48,0*C8,0*48,0*08,0*00,0*01,0*41,0*80,0*7F,0*00,0*40,0*40,0*20,0*13,0*0C,0*0C,0*12,0*21,0*60,0*20,0*00};/*--文字:大--*/ucharcodeda[32]={0*20,0*20,0*20,0*20,0*20,0*20,0*A0,0*7F,0*A0,0*20,0*20,0*20,0*20,0*20,0*20,0*00,0*00,0*80,0*40,0*20,0*10,0*0C,0*03,0*00,0*01,0*06,0*08,0*30,0*60,0*C0,0*40,0*00};/*--文字:学--*/ucharcode*ue[32]={0*40,0*30,0*10,0*12,0*5C,0*54,0*50,0*51,0*5E,0*D4,0*50,0*18,0*57,0*32,0*10,0*00,0*00,0*02,0*02,0*02,0*02,0*02,0*42,0*82,0*7F,0*02,0*02,0*02,0*02,0*02,0*02,0*00};/**********************************液晶驱动函数声明***********************************/voidlcd_initial(void);voidlcd_write_byte(uchar*pos,ucharypos,uchar*byte);voidlcd_write_char(ucharchar_*pos,ucharchar_ypos,uchar*char_source_addr);voidlcd_write_hanzi(ucharhanzi_*pos,ucharhanzi_ypos,uchar*hanzi_source_addr);voidlcd_clear(void);voidlcd_fill(void);voiddelay(uchartime_nop);voidmain(void){lcd_initial();//初始化液晶lcd_clear();//液晶清屏lcd_write_char(0,0,G);//显示"A"lcd_write_char(1,0,U);//显示"B"lcd_write_char(2,0,O);//显示"C"lcd_write_hanzi(2,2,guo);//显示"国"lcd_write_hanzi(4,2,fang);//显示"防"lcd_write_hanzi(6,2,ke);//显示"科"lcd_write_hanzi(8,2,ji);//显示"技"lcd_write_hanzi(10,2,da);//显示"大"lcd_write_hanzi(12,2,*ue);//显示"学"while(1){}}/*******************************************************************延时函数函数原型:voiddelay(uchartime_nop);功能:延时time_nop个nop********************************************************************/voiddelay(uchartime_nop){uchari;for(i=0;i<time_nop;i++){_nop_();}}/******************************************************************************LCD初始化原型:voidlcd_initial(void);功能:将LCD进展初始化,设置初始行并开显示******************************************************************************/voidlcd_initial(void){delay(5);LCD_L_mand=0*C0;//设置显示初始行delay(5);LCD_R_mand=0*C0;delay(5);LCD_L_mand=0*3F;//开显示delay(5);LCD_R_mand=0*3F;delay(5);}/******************************************************************************向LCD中写入一个字节数据函数原型:voidlcd_write_byte(uchar*pos,ucharypos,ucharbyte);功能:将一个字节数据byte写入液晶的〔*pos,ypos〕的位置处此处将液晶的显示区按照二维坐标进展定义,*pos为横坐标从左到右顺序为0-127,ypos为纵坐标从上到下顺序为0-7。******************************************************************************/voidlcd_write_byte(uchar*pos,ucharypos,uchar*byte){if(*pos<=63)//坐标位置处在液晶的左半局部{delay(5);LCD_L_mand=*pos+0*40;//设定写入数据的列地址delay(5);LCD_L_mand=ypos+0*B8;//设定写入数据的行地址delay(5);LCD_L_DATA=*byte;//向(*pos,ypos)处写数据delay(5);}else//坐标位置处在液晶的右半局部{delay(5);LCD_R_mand=(*pos-64)+0*40;//设定写入数据的列地址delay(5);LCD_R_mand=ypos+0*B8;//设定写入数据的行地址delay(5);LCD_R_DATA=*byte;//向(*pos,ypos)处写数据delay(5);}}/******************************************************************************在LCD指定位置显示一个ASIIC字符函数字符大小为8*8原型:voidlcd_write_char(ucharchar_*pos,ucharchar_ypos,uchar*char_source_addr);功能:将一个字符数据写入液晶的〔char_*pos,char_ypos〕的位置处此处将液晶的显示区按照二维坐标进展定义,char_*pos为横坐标从左到右顺序为0-15,char_ypos为纵坐标从上到下顺序为0-7。******************************************************************************/voidlcd_write_char(ucharchar_*pos,ucharchar_ypos,uchar*char_source_addr){uchari=0;for(i=0;i<=7;i++){lcd_write_byte(char_*pos*8+i,char_ypos,char_source_addr+i);}}/******************************************************************************在LCD指定位置显示一个汉字函数字符大小为16*16原型:voidlcd_write_hanzi(ucharhanzi_*pos,ucharhanzi_ypos,uchar*hanzi_source_addr);功能:将一个汉字数据写入液晶的〔hanzi_*pos,hanzi_ypos〕的位置处,此处将液晶的显示区按照二维坐标进展定义,hanzi_*pos为横坐标从左到右顺序为0-14(以半个汉字符为单位),hanzi_ypos为纵坐标从上到下顺序为0-6(以半个汉字符为单位)。******************************************************************************/voidlcd_write_hanzi(ucharhanzi_*pos,ucharhanzi_ypos,uchar*hanzi_source_addr){uchari=0;for(i=0;i<=15;i++)//写汉字的上半局部{lcd_write_byte(hanzi_*pos*8+i,hanzi_ypos,hanzi_source_addr+i);}for(i=0;i<=15;i++)//写汉字的下半局部{lcd_write_byte(hanzi_*pos*8+i,hanzi_ypos+1,hanzi_source_addr+16+i);}}/******************************************************************************LCD清屏原型:voidlcd_clear(void);功能:将LCD清屏******************************************************************************/voidlcd_clear(void){uchari,j;ucharbyte[1]={0*00};for(i=0;i<=127;i++){for(j=0;j<=7;j++){lcd_write_byte(i,j,byte);}}}/******************************************************************************LCD填充原型:voidlcd_fill(void);功能:将LCD填充为黑色******************************************************************************/voidlcd_fill(void){uchari,j;-.zucharbyte[1]={0*FF};for(i=0;i<=127;i++){for(j=0;j<=7;j++){lcd_write_byte(i,j,byte);}}}3.4单片机与D/A、A/D转换电路制作A/D、D/A转换器是单片机电路经常要用到的器件。在电子设计中,很多时候需要处理模拟量,对模拟量进展控制。这就要使用到A/D、D/A转换器,将模拟量转换成数字量,由单片计进展处理,再将数字量转换为模拟量,对外围设备进展控制。由于单片机本身工作速度慢,不能连接高速A/D、D/A转换器,同时为了节省单片机IO口资源,本节仅就低速串行转换器进展介绍。如果需要使用高速A/D、D/A转换器,请使用FPGA对其进展控制。串行模数转换器应用串行输出的A/D芯片由于节省单片机的I/O口线,越来越多地被采用。如具有SPI三线接口的TLC1549、TLC1543、TLC2543、MA*187等,具有2线IIC接口的MA*127、PCF8591〔4路8位A/D,还含1路8位D/A)等。本小节以串行A/D转换器芯片TLC1549为例简要介绍串行A/D转换器的接口电路以及驱动程序的设计。1、TLC1549的工作方式及时序TLC1549有6种工作方式,如表2所示。其中方式1和方式3属同一类型,方式2和方式4属同一类型。一般来说,时钟频率高于280kHz时,可认为是快速工作方式;低于280kHz时,可认为是慢速工作方式。因此,如果不考虑I/OCLOCK周期大小,方式5与方式3一样,方式6与方式4一样。表2TLC1549的工作方式工作方式1工作时序图如图3.10所示。图中从EQ\*jc2\o\ad(\s\up17(————),CS)下跳到DATA输出数据要有1.3μs的延时;连续进展A/D转换时,在上次转换结果输出的过程中,同时完本钱次转换的采样,这样大大提高了A/D转换的速率。如果I/OCLOCK的时钟频率为2.1MHz,则完成一次A/D转换的时间大约为26μs。如果用连续模拟信号进展采样转换,显然其转换速率是很高的。图3.10方式1工作时序2、TLC1549与单片机最小系统的接口电路设计使用单片机小系统控制TLC1549,主要通过扩展接口J4完成,J4各管脚信号定义请参见图3.2小系统原理图。需要控制的芯片管脚有三个,分别为EQ\*jc2\o\ad(\s\up17(————),CS)、I/OCLOCK和DATAOUT,选用J4中的P10、P11和P12〔实际是单片机P1口中的三个I/O管脚〕分别控制TLC1549三个管脚。使用单片机的I/O模拟图12中的操作时序,完成对TLC1549的控制。接口电路如图3.11所示。在电路中使用VCC作为A/D的参考电平,由于VCC的不稳定会降低转换精度,因此可以选用专用的参考电压芯片,提高转换精度。图3.11接口电路3、A/D转换接口程序设计编写驱动TLC1549的程序,就是通过软件的方法控制P10、P11和P12,产生如图3.10中的操作时序,完成一次A/D转换。使用C编写的采样函数如下:*include<absacc.h>*include<reg51.h>*include<intrins.h>*defineucharunsignedchar*defineuintunsignedintsbitAD_CS=P1^0;//TLC1549片选信号sbitAD_IOCLOCK=P1^1;//TLC1549时钟信号sbitAD_DATAOUT=P1^2;//TLC1549数据输出信号/*A/D转换函数声明*/uintad_convert(void);voiddelay(uchartime_nop);voidmain(void){uintad_data_10bit;//低10位为有效数据AD_CS=1;//初始化TLC1549AD_IOCLOCK=0;while(1){ad_data_10bit=ad_convert();delay(50);//完成一次采样后要延时21us,等待下一次采样结果转换完成}}/*************************************************************AD转换函数函数原型:uintad_convert(void);功能:驱动TLC1549完成一次A/D采样返回值为AD转换结果,使用16bit的uint型数据表示,低10位有效.*************************************************************/uintad_convert(void){uchari;uintAD_DATA=0;AD_CS=0;for(i=0;i<=9;i++){AD_IOCLOCK=0;if(AD_DATAOUT==1){AD_DATA=AD_DATA*2+1;}else{AD_DATA=AD_DATA*2;}AD_IOCLOCK=1;}AD_IOCLOCK=0;AD_CS=0;return(AD_DATA);}/*******************************************************************延时函数函数原型:voiddelay(uchartime_nop);功能:延时time_nop个nop********************************************************************/voiddelay(uchartime_nop){uchari;for(i=0;i<time_nop;i++){_nop_();}}串行数模转换器应用单片机实现控制是以数字信号或模拟信号的形式通过I/O口送给被控对象的。模拟信号的产生通常需要D/A转换器的参与。本小节以串行D/A转换芯片T
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年安徽淮南寿县蜀山现代产业园投资有限公司招聘笔试参考题库附带答案详解
- 中考数学一轮复习考点练习考向23 多边形及其内角和(含答案详解)
- 2025年度钢管租赁与环保处理服务合同
- 2025年度个人环保产品销售代理合同
- 2025版天然气供应合同技术服务范本模板3篇
- 2025-2030全球汽车NVH测试解决方案行业调研及趋势分析报告
- 2025年全球及中国掺杂碘化铯闪烁晶体行业头部企业市场占有率及排名调研报告
- 2025-2030全球工业数控木材激光切割机行业调研及趋势分析报告
- 2025年度个人投资理财借款合同2篇
- 2025版新车销售与车主增值服务合作合同范本3篇
- 声纹识别简介
- 基于Android的天气预报系统的设计与实现
- 冲锋舟驾驶培训课件
- 中石化浙江石油分公司中石化温州灵昆油库及配套工程项目环境影响报告书
- 搞笑朗诵我爱上班台词
- 汽轮机热平衡图功率的核算方法
- 宾馆旅客财物保管制度
- 钻孔桩水下混凝土灌注记录(自动生成)1
- nord stage 2用户手册简体中文版
- 5A+Chapter+2+Turning+over+a+new+leaf 英语精讲课件
- 商业计划书(BP)行业与市场的撰写秘籍
评论
0/150
提交评论