《单片机控制技术项目式教程(第2版)》习题答案 - 王璇 项目8-11_第1页
《单片机控制技术项目式教程(第2版)》习题答案 - 王璇 项目8-11_第2页
《单片机控制技术项目式教程(第2版)》习题答案 - 王璇 项目8-11_第3页
《单片机控制技术项目式教程(第2版)》习题答案 - 王璇 项目8-11_第4页
《单片机控制技术项目式教程(第2版)》习题答案 - 王璇 项目8-11_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

《单片机控制技术项目式教程(第2版)》习题答案项目8知识思考与项目训练答案选择题:1.B2.A3.D4.A5.A6.C7.B8.A(二)填空题:1.并行通信,串行通信2.起始位,数据位,奇偶效验位,停止位3.TXD,RXD4.SBUF5.RXD6.电平转换(三)简答题:什么是串行通信?它有哪些特点?有哪几种帧格式?答:串行通信是组成数据的所有位通过一条数据线一位一位地传送的通信方式。其突出优点是只需一对传送线,大大降低了传送成本;其缺点是传送速度相对较慢。串行通信适用于远距离通信。字符帧也称数据帧,由起始位、数据位、奇偶校验位和停止位等4部分组成,分为无空闲字符帧和有空闲字符帧。51单片机的串行口由哪些功能部件组成?各有什么作用?答:51单片机的串行口由特殊功能寄行器SBUF、SCON、PCON组成。SBUF是51单片机内部的接收、发送缓冲器;SCON用来控制串行口的工作方式和状态;PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器。51单片机串行口有几种工作方式?各工作方式的波特率如何确定?答:51单片机的串行口有4种工作方式,分别是方式0、方式1、方式2和方式3,这些工作方式由SCON中的SM0、SM1两位编码决定。工作方式帧格式波特率方式08位全是数据位,没有起始位、停止位固定,每个机器周期传送一位数据方式110位,其中1位起始位,8位数据位,1位停止位不固定,取决于T1溢出率和SMOD方式211位,其中1位起始位,9位数据位,1位停止位固定,即2SMOD×fosc/64方式3同方式2同方式1若晶振频率为fosc=11.0592MHz,采用串行口工作方式1,波特率为4800b/s,计算出用T1作为波特率发生器的方式字和计数初值。答:T1采用方式2,TMOD=0x20SMOD=0初值Ⅹ=256-2SMOD/32×fosc/(12×波特率)=256-20/32×11.0592×106/(12×4800)=250=0xFA所以初值为0xFA(四)项目训练:1.设fosc=11.0592MHz,试编写一段程序,对串口初始化,使之工作于方式l,波特率为1200b/s,用查询串行口状态的方法读出接收缓冲器的数据并回送到发送缓冲器。解:T1采用方式2,TMOD=0x20SMOD=0初值Ⅹ=256-2SMOD/32×fosc/(12×波特率)=256-20/32×11.0592×106/(12×1200)=232=0xE8程序设计:#include<reg51.h>voidmain(){unsignedcharc;SCON=0x50;TMOD=0x20;PCON=0x00;TH1=0xE8;TL1=0xE8;RI=0;TR1=1;while(1){if(RI){RI=0;c=SBUF;SBUF=c;if(TI)TI=0;}}}2.用Protues设计一个两个单片机通信的电路,甲机连接一只按键和一只发光二极管,乙机连接一只按键和一只一位的数码管,编写两个单片机通信的程序,甲机的按键通过串行口通信控制乙机的数码管显示”A”,”B”,”C”,”D”;乙机的按键通过串行口通信控制甲机的发光二极管闪烁。电路设计:甲机程序设计:#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitK1=P1^7;sbitD1=P1^0;//***************************************************************************//延时1msvoidDelay(uintx){uchari;while(x--)for(i=0;i<120;i++);}//***************************************************************************//向串口发送字符voidputc_to_SerialPort(ucharc){SBUF=c;while(TI==0);TI=0;}//***************************************************************************voidmain(){ucharOperation_NO=-1;SCON=0x50;//串口工作方式1TMOD=0x20;//T1工作方式2PCON=0x00;TH1=0xFD;//波特率9600TL1=0xFD;TI=0;RI=0;TR1=1;D1=1;while(1){if(K1==0){while(K1==0);Operation_NO=(Operation_NO+1)%4;}switch(Operation_NO){case0:putc_to_SerialPort('A'); break;case1:putc_to_SerialPort('B');break;case2:putc_to_SerialPort('C');break;case3:putc_to_SerialPort('D');break;} if(RI){RI=0;if(SBUF=='1'){while(RI==0) {D1=~D1; Delay(100); } }else D1=1;}Delay(100);}}乙机程序设计:#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitK2=P1^7;//***********************************************************************//延时1msvoidDelay(uintx){uchari;while(x--)for(i=0;i<120;i++);}//***********************************************************************//向串口发送字符voidputc_to_SerialPort(ucharc){SBUF=c;while(TI==0);TI=0;}//***********************************************************************voidmain(){ucharOperation_NO=0;P0=0x00;SCON=0x50;TMOD=0x20; PCON=0x00;TH1=0xFD;//波特率9600TL1=0xFD; TI=0;RI=0; TR1=1; while(1){if(K2==0){while(K2==0);if(++Operation_NO%2) putc_to_SerialPort('1'); else putc_to_SerialPort('0');} if(RI){RI=0;switch(SBUF){case'A':P0=0x77; break;case'B':P0=0x7C; break;case'C':P0=0x39; break;case'D':P0=0x5E; break;}}Delay(100);}}3.利用串口调试助手进行实验板与PC机的通信,PC机发送一段英文文字,如“Howareyou!”,希望在接收区显示同样的一段英文文字,如“Howareyou!”,请编写单片机串口通信程序。电路设计:用一根RS-232C串口线将下图的J1与PC机的串口连接起来,PC机打开stc-isp-15xx-v6.85H软件。程序设计:#include<AT89X51.h> #defineucharunsignedchar#defineuintunsignedintunsignedchara;bitflag=0; //定义发送数据标志位//串口初始化子程序voidinit(){ TMOD=0x20;//T1工作在方式2 TH1=0xFA; //波特率为9600b/s TL1=0xFA; TR1=1;//开启T1 SM0=0;//串口工作在方式1 SM1=1; REN=1; //允许串口接收 EA=1;//开总中断 ES=1;//开串口中断RI=0; }//串口发送数据子程序voidsend(){ES=0;SBUF=a;while(!TI);TI=0;flag=0;ES=1;}//串口接收数据子程序voidreceive()interrupt4{a=SBUF;RI=0;flag=1;}//主函数voidmain(){ init(); while(1) {if(flag==1)send();}}项目9知识思考与项目训练答案选择题:1.A2.D3.B4.A5.B6.C7.C8.B(二)填空题:1.分辨率、精度和转换速度2.电流输出D/A、电压输出D/A3.1/2n4.直通方式、单缓冲方式和双缓冲方式5.高电平、低电平(三)简答题:在单片机应用系统中为什么要进行A/D和D/A转换,它们的作用是什么?答:单片机只能发送和接收数字信号。在实时控制系统中,经常需要将计算机计算结果的数字量转换为连续变化的模拟量,用来控制、调节一些电路,实现对被控对象的控制,所以要进行D/A转换。另一面,各种传感器检测到的各种模拟量也需要转换成数字量才能被单片机接收进行处理,所以要进行A/D转换。使用DAC0832时,单缓冲方式如何工作?双缓冲方式如何工作?软件编程有什么区别?答:单缓冲方式,就是使DAC0832的两个8位数据寄存器中有一个处于直通方式,而另一个处于受控的锁存方式,或者两个8位数据寄存器处于同时受控的方式,即同时送数,同时锁存。在实际应用中,如果只有一路模拟量输出或虽有几路模拟量但并不要求同步输出的情况,就可采用单缓冲方式。用一条赋值语句就可以将单片机中的数据送给DAC芯片进行D/A转换:#defineDAC0832XBYTE[0x7FFF]DAC0832=0x08;双缓冲方式,就是把DAC0832的两个锁存器都接成受控锁存方式。DAC0832的WR1、WR2、CS和XFER都受单片机送来的信号的控制。在双缓冲方式下,单片机必须送两次写信号才能完成一次D/A转换。第一次写信号,将数据送入输入寄存器中锁存,第二次写信号才将此数据送入DAC寄存器锁存并输出进行D/A转换。所以应分配给DAC0832两个RAM地址,然后使用两条赋值语句,才能将一个数字量转换成模拟量:#defineDAC0832_1XBYTE[0xBFFF]#defineDAC0832_2XBYTE[0x7FFF]DAC0832_1=0x08;DAC0832_2=0x08;PCF8591的主要特点是什么?简述其工作原理。答:PCF8591是一个单片集成的具有I2C总线接口的8位A/D及D/A转换器,具有4路A/D输入,1路D/A输出。在PCF8591上输入输出的地址、控制和数据信号都是通过I²C总线以串行的方式进行传输。PCF8591的功能包括多路模拟输入、内置跟踪保持、8-bit模数转换和8-bit数模转换。PCF8591的最大转化速率由I²C总线的最大速率决定。PCF8591的主要特性如下:单独供电PCF8591的操作电压范围+2.5V~+6V低待机电流通过I²C总线串行输入/输出PCF8591通过3个硬件地址引脚寻址PCF8591的采样率由I²C总线速率决定4个模拟输入可编程为单端型或差分输入自动增量频道选择PCF8591的模拟电压范围从VSS到VDDPCF8591内置跟踪保持电路8-bit逐次逼近A/D转换器通过1路模拟输出实现DAC增益PCF8591的工作原理:PCF8591采用典型的I2C总线接口器件寻址方法,即总线地址由器件地址(1001)、引脚地址(由A0~A2接地或+5V来确定,接地代表0;接+5V代表1)、方向位(即R/W)组成。D/A转换的数据输入和A/D转换的数据输出都是通过I2C总线串行输入和输出的。因此PCF8951中I2C总线的通信格式包括写数据格式和读数据格式。I2C总线的特点和通信格式是怎样的?答:I2C总线由2根线:串行数据线(SDA)和串行时钟线(SCL)组成。连接到总线上的每一个器件都有一个唯一的地址,而且都可以作为一个发生器或接收器,SDA和SCL都是双向线路,分别通过一个电阻连接到电源(+5V)端。I2C总线上的数据传输速率在标准模式下可达100Kb/s,快速模式可达400Kb/s,高速模式下可达3.4Mb/s。连接到总线的器件数量只由总线的电容(400PF)限制决定。I2C总线写通信格式:1234567NN-1主机产生起始位发从机地址90H等待从机应答发送数据等待从机应答发送数据等待从机应答。。。。停止位I2C总线读通信格式:1234567NN-1主机产生起始位发从机地址91H等待从机应答接收从机发出的数据向从机应答接收从机发出的数据向从机应答。。。。主机产生停止位(四)项目训练:1.试采用DAC0832芯片设计单缓冲方式的D/A转换器接口电路,并编写程序,使DAC0832输出15个正向阶梯波。原理图设计:源程序设计:#include<reg51.h>#include<absacc.h>#defineuintunsignedint#defineucharunsignedchar#defineDAC0832XBYTE[0x7FFE]voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120;t++);}voidmain(){uchari;while(1){for(i=0;i<17;i++){DAC0832=i*17; DelayMS(10); }}}2.参照任务2,将图9.14的硬件电路作修改,设计成一个完整的信号发生器,通过按键控制输出锯齿波、三角波、方波或正弦波,并写出完整的程序。原理图设计:源程序设计:#include<reg52.h>sbitDACCS=P3^0;sbitDACWR=P3^1;//正弦波波表unsignedcharcodeSinWave[]={127,152,176,198,217,233,245,252,255,252,245,233,217,198,176,152,127,102,78,56,37,21,9,2,0,2,9,21,37,56,78,102};//三角波波表unsignedcharcodeTriWave[]={0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,255,240,224,208,192,176,160,144,128,112,96,80,64,48,32,16};//锯齿波表unsignedcharcodeSawWave[]={0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248};unsignedcharcode*pWave;//波表指针unsignedcharT1RH=1;//T1重载值的高字节unsignedcharT1RL=1;//T1重载值的低字节unsignedintfWave=0;voidSetWaveFreq(unsignedcharfreq);externvoidKeys_Scan();voidmain(){DACCS=0; DACWR=0; EA=1;//开总中断pWave=SinWave;//默认正弦波SetWaveFreq(10);//默认频率10Hzwhile(1){Keys_Scan();//调用按键驱动 }}/*按键动作函数,根据键码执行相应的操作,keycode-按键键码*/voidKeyAction(unsignedcharkeycode){staticunsignedchari=0;if(keycode==0x0D)//回车键,切换波形{//在3种波形间循环切换if(i==0){i=1;pWave=TriWave;}elseif(i==1){i=2;pWave=SawWave;}else{i=0;pWave=SinWave;}}elseif(keycode==0x26)//向上键,增加频率{if(fWave<250)//达到最大值25之前可递增频率值{fWave+=10;SetWaveFreq(fWave);}}elseif(keycode==0x28)//向下键,降低频率{if(fWave>10)//达到最小值2之前可递减频率值{fWave-=10;SetWaveFreq(fWave);}}}voidSetWaveFreq(unsignedcharfreq){ unsignedlongtmp; tmp=(11059200/12)/(freq*32); tmp=65536-tmp; tmp=tmp+33; T1RH=(unsignedchar)(tmp>>8); T1RL=(unsignedchar)tmp; TMOD&=0x0F; TMOD|=0X10; TH1=T1RH; TL1=T1RL; ET1=1; PT1=1; TR1=1;}/*T1中断服务函数,执行波形输出*/voidInterruptTimer1()interrupt3{staticunsignedchari=0;TH1=T1RH;//重新加载重载值TL1=T1RL;//循环输出波表中的数据 P0=pWave[i];i++;if(i>=32){i=0;}}项目10知识思考与项目训练答案(一)选择题:1.A2.D3.B4.C5.A6.C7.B(二)填空题:1.分辨率、转换时间、量程、精度2.逐次逼近(比较)式、双积分式3.84.延时法、查询法、中断法5.64位光刻ROM、温度传感器、6.低位(三)简答题:A/D转换器有哪些主要性能指标?它们在选择A/D转换器起怎样的作用?答:描述A/D转换器性能的指标参数很多,都是在选择A/D转换器时必须要考虑的,主要有以下几个:(1)分辨率:分辨率是指A/D转换器能分辨的最小模拟输入量。分辨率越高,转换时对输入量的微小变化的反应越灵敏。(2)转换时间:指A/D转换器完成一次转换所需的时间。转换时间是编程时必须考虑的参数。(3)量程:指A/D转换器所能转换的输入电压范围,如5V、10V等。(4)精度:指与数字输出量所对应的模拟输入量的实际值与理论值之间的差值。ADC0809与51单片机怎么连接?画出电路图。答:单片机与ADC0809连接时,主要考虑ADC0809的数字量输出线、通道选择地址线、转换结束信号线、输出允许信号线和启动转换信号线的连接。ADC0809的数字量输出线DB7~DB0通常与单片机的数据总线DB7~DB0直接相连。ADC0809的通道选择地址线C、B、A可以与单片机的数据总线DB2~DB0连接,也可以与单片机的地址总线AB2~AB0连接。ADC0809与51单片机连接电路图:简述DS18B20的特点。答:DS18B20的主要特征:全数字温度转换及输出;先进的单总线数据通信;可编程分辨率9~12可选,精度可达±0.5°C;12位分辨率时的最大工作周期为750ms;电压适应范围宽,+3.3V~+5.5V,可选择数据线寄生电源工作方式;检测温度范围为–55°C~+125°C;内置EEPROM,限温报警功能;64位光刻ROM,内置产品序列号,方便多机挂接;多样封装形式,适应不同硬件系统。DS18B20有哪些命令字?各有什么用处?答:DS18B20工作时,控制其工作的单片机可以使用各种命令对DS18B20进行操作,操作过程为:初始化、发功能命令、发存储器操作命令。(1)读ROM[33H]:这个命令允许总线控制器读到DS18B20的8位系列编码、唯一的序列号和8位CRC码。只有在总线上存在单只DS18B20的时候才能使用这个命令。(2)匹配ROM[55H]:这个是匹配ROM命令,后跟64位ROM序列,让总线控制器在多点总线上定位1只特定的DS18B20。(3)跳过ROM[CCH]:这条命令允许总线控制器不用提供64位ROM编码就使用存储器操作命令,在单点总线情况下,可以节省时间。(4)搜索ROM[F0H]:当1个系统初次启动时,总线控制器可能并不知道单线总线上有多少器件或它们的64位ROM编码。(5)报警搜索[ECH]:这条命令的流程和SearchROM相同。(6)写暂存存储器[4EH]:这个命令向DS18B20的暂存器TH和TL中写入数据,可以在任何时刻发出复位命令来中止写入。(7)读暂存存储器[BEH]:这个命令读取暂存器的内容。(8)拷贝暂存存储器[48H:这个命令把暂存器的内容拷贝到DS18B20的EEPROM存储器里,即把温度报警触发字节存入非易失性存储器里。(9)温度转换[44H]:这条命令启动1次温度转换而无需其他数据。(10)重新调出[B8H:这条命令把报警触发器里的值拷贝回暂存器。(11)读电源[B4H:若把这条命令发给DS18B20后发出读时间隙,器件就会返回它的电源模式:0为寄生电源,1为外部电源。单片机是怎样控制DS18B20的?DS18B20的初始化、写数据和读数据时序是怎样的?答:单片机与DS18B20连接后,通过软件对DS18B20写入命令字来进行控制。作为单总线器件,DS18B20与单片机间采用串行数据传输方式,要求严格按照时隙进行操作。主机使用时间隙来读写DS18B20的数据位和写命令字的位。DS18B20的初始化时序:主机总线发送一复位脉冲(最短为480μs的低电平信号),接着释放总线并进入接收状态。DS18B20在检测到总线的上升沿之后等待15~60μs,接着DS18B20发出存在脉冲(低电平持续60~240μs),主机接收到高电平后初始化成功。DS18B20的写数据时序:当主机总线从高拉至低电平时就产生写时间隙。从开始15μs之内应将所需写的位送到总线上,DS18B20在15~60μs间对总线采样,若为低电平,则写入的位是0;若为高电平,则写入的位是1。连续写2位间的间隙应大于1μs。每一位的发送都应该有一个至少15μs的低电平起始位,随后的数据“0”或“1”应该在45μs内完成。整个位的发送时间应该保持在60~120μs,否则不能保证通信的正常。图10.12DS18B20读数据时序图DS18B20的读数据时序:主机在将总线从高电平拉至低电平时,至少在1μs后将总线拉高,表示读时间隙的起始,随后在总线被释放后的15μs中DS18B20会发送内部数据位,这时控制如果发现总线为高电平表示读出“1”,如果总线为低电平则表示读出数据“0”,主机必须在45μs内完成读位,并在60~120图10.12DS18B20读数据时序图(四)项目训练:1.用AT89C51和ADC0809设计一个数字电压表,要求电压测量范围为0V~+5V,用一只4位共阳极的数码管显示电压值,精确到0.001V。电路原理图设计:源程序设计:#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint//***************************************************************************//共阳极数码管码表ucharcodeLEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//ADC0809控制脚定义sbitOE=P1^0;sbitEOC=P1^1;sbitST=P1^2;sbitCLK=P1^3;//***************************************************************************//延时1ms子程序voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}//***************************************************************************//显示转换结果子程序voidDisplay(uchard){floata;uintb;a=d*5/255;//计算出电压模拟量值b=a*1000+0.5;//电压值*1000,保留三位小数,四舍五入P2=0x08;//数码管第4位显示个位数P0=LEDData[b%10];DelayMS(5);P0=0xFF;P2=0x04;//数码管第3位显示十位数P0=LEDData[b%100/10];DelayMS(5);P0=0xFF;P2=0x02;//数码管第2位显示百位数P0=LEDData[b/100%10];//把小数点加入段码DelayMS(5);P0=0xFF;P2=0x01;//数码管第1位显示千位数和小数点P0=LEDData[b/1000]&0x7F;//把小数点加入段码DelayMS(5);P0=0xFF;}//***************************************************************************//主程序voidmain(){TMOD=0x02;//定时器0工作在方式2TH0=0x14;TL0=0x14;IE=0x82;//开T0中断TR0=1;P1=0x3F;//选择ADC0809的通道3(011)//高4位设通道地址为011(3),低4位为ST,EOC,OE等while(1){ST=0;ST=1;ST=0;//启动转换while(EOC==0);//等待转换结束OE=1;//允许输出Display(P3);//显示A/D转换结果OE=0;//关闭输出}}//***************************************************************************//T0中断子程序voidTimer0_INT()interrupt1{CLK=!CLK;//ADC0809时钟信号}2.用AT89C51和DS18B20设计一个温度计,用一只4位共阳极的数码管显示测量到的温度值,要求温度值保留两位小数。电路原理图设计:源程序设计:#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint//***************************************************************************//测温口定义sbittemp_ds=P3^0;//定义全局变量uinttemp;//存储整型温度值floatf_temp;//存储浮点型温度值//定义共阳极段码表unsignedcharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//***************************************************************************//延时子程序voiddelay(uintx){uinty;while(x--) for(y=160;y>0;y--);}//***************************************************************************//DS18B20初始化子程序,成功返回1,否则返回0intDS18B20_init(void){uinti;temp_ds=0;//发复位脉冲i=160;while(i>0)i--;temp_ds=1;i=8;while(i>0)i--;}//***************************************************************************//从DS18B20读1位数据bittempreadbit(void){uinti;bitdat;temp_ds=0;//拉低控制线i++;temp_ds=1;//拉高控制线i++;i++;dat=temp_ds;//读1为数据i=10;while(i>0)i--;temp_ds=1;//拉高控制线return(dat);}//***************************************************************************//从DS18B20读一个字节uchartempreadbyte(void){uchari,j,dat;dat=0;for(i=1;i<=8;i++)//读到的8位组成1字节{j=tempreadbit();dat=(j<<7)|(dat>>1);}return(dat);}//***************************************************************************//向DS18B20写一位数据voidtempwritebit(bitinstruc_data){inttime;if(instruc_data){temp_ds=0;//拉低控制线time=3;while(time>0)time--;temp_ds=1;//拉高控制线time=8;while(time>0)time--;}else{temp_ds=0;//拉低控制线time=14;while(time>0)time--;time--;}temp_ds=1;//拉高控制线time++;time++;}//***************************************************************************//向DS18B20写一个字节数据voidtempwritebyte(ucharinstru){inti;for(i=1;i<=8;i++)//将1字节拆分位8位,1位1位地写给DS18B20{tempwritebit(instru&0x01);instru=instru>>1;}}//***************************************************************************//读取寄存器中存储的温度数据uintget_temp(){uchartemp_L,temp_H;DS18B20_init();delay(1);tempwritebyte(0xcc);//写跳过ROM指令tempwritebyte(0xbe);//写入读暂存器指令temp_L=tempreadbyte();//读温度低8位temp_H=tempreadbyte();//读温度高8位temp=temp_H<<8|temp_L;//获取温度数据f_temp=temp*0.0625;//12位温度数据,分辨率为0.0625;temp=f_temp*100+0.5;//乘100是小数点后保留两位,加0.5是减小误差returntemp;}//***************************************************************************//显示子程序voiddis_temp(uintt){uinti;i=t/1000;//将千位显示在数码管第1位P0=table[i];P2=0x01;delay(5);P0=0xFF;i=t%1000/100;//将百位和小数点显示在数码管第2位P0=table[i]&0x7F;P2=0x02;delay(5);P0=0xFF;i=t%100/10;//将十位显示在数码管第3位P0=table[i];P2=0x04;delay(5);P0=0xFF;i=t%10;//将个位显示在数码管第4位P0=table[i];P2=0x08;delay(5);P0=0xFF;}//***************************************************************************//主函数voidmain(){DS18B20_init();while(1){DS18B20_init();delay(1);tempwritebyte(0xcc);//写跳过ROM指令tempwritebyte(0x44);//启动转换dis_temp(get_temp());//调用显示子函数}}项目11知识思考与项目训练答案(一)选择题:1.D2.B3.C4.D5.A6.C7.A8.B(二)填空题:1.程序存储器(Flash)、高速A/D转换、PWM/PCA2.电源电路3.P1M1、P1M04.IAP_CONTR、IRC_CLKO5.ADC_START、ADC_FLAG6.简答题:STC15F2K60S2系列单片机的最小工作系统如何设计?答:STC15F2K60S2系列单片机的最小工作系统包括电源、复位和时钟,在单片机的电源和地之间加入+5V电源,在IAP_CONTR寄存器和IRC_CLKO寄存器中设置软件复位和内部时钟,最小工作系统就构成。2.STC15F2K60S2系列单片机提供了多少个中断请求源,它们分别是什么?答:STC15F2K60S2系列单片机提供了14个中断请求源,它们分别是:外部中断0()、定时器0中断、外部中断1()、定时器1中断、串口1中断、A/D转换中断、低压检测(LVD)中断、PCA/CCP中断、串口2中断、SPI中断、外部中断2(INT2)、外部中断3(INT3)、定时器T2中断以及外部中断4(INT43.简述STC15F2K60S2系列单片机的定时/计数器的4种工作模式和特点。答:STC15F2K60S2系列单片机内部设置了3个定时器:3个16位定时器/计数器T0和T1以及定时器T2。T0有4种工作模式:模式0(16位自动重装载模式),模式1(16位不可重装载模式),模式2(8位自动重装模式),模式3(两个8位定时器/计数器)。T1除模式3外,其他工作模式与T0相同,T1在模式3时无效,停止计数。T2的工作模式固定为16位自动重装载模式。T2可以当定时器使用,也可以当串口的波特率发生器和可编程时钟输出。4.简述STC15F2K60S2系列单片机内部A/D转换器工作的过程?答:STC15F2K60S2系列单片机内部A/D转换器工作的过程如下:先给ADC上电,也就是置位ADC控制寄存器中的ADC_POWER位,由ADC控制寄存器ADC_CONTR中的CHS2~CHS0确定由哪路模拟通道输入,通过模拟多路开关,将通过ADC0~7的模拟量输入送给比较器。用数/模转换器(DAC)转换的模拟量与输入的模拟量通过比较器进行比较,将比较结果保存到逐次比较寄存器,并通过逐次比较寄存器输出转换结果。A/D转换结束后,最终的转换结果保存到ADC转换结果寄存器ADC_RES和ADC_RESL,同时,置位ADC控制寄存器ADC_C0NTR中的A/D转换结束标志位ADC_FLAG,以供程序查询或发出中断申请。ADC的转换速度由ADC控制寄存器中的SPEED1和SPEED0确定。(四)项目训练:1.用STC15F2K60S2单片机的定时/计数器T1软件模拟高速PWM,单片机工作频率24MHz,要求从单片机的P3.5(T0CLKO)高速输出不断变化占空比的PWM信号。要求PWM占空比最小为24T/周期,最大为(周期-24T)/周期,T为时钟周期。电路设计:单片机连接电源,从P3.4引出PWM波形。程序设计://***************************************************************************#defineMAIN_Fosc24000000UL //定义主时钟24MHz#definePWM_DUTY6000 /*定义PWM的周期为6000T,T为时钟周期,因为主频使用24MHZ的,则PWM频率为4000HZ。*/#define PWM_HIGH_MIN 24 //限制PWM输出的最小占空比。#define PWM_HIGH_MAX(PWM_DUTY-PWM_HIGH_MIN) //限制PWM输出的最大占空比。//***************************************************************************typedef unsignedchar u8;typedef unsignedint u16;typedef unsignedlong u32;//***************************************************************************sbit P_PWM=P3^4;//定义PWM输出引脚。u16 pwm; //定义PWM输出高电平的时间的变量,用户操作PWM的变量。u16 PWM_high,PWM_low; //PWM中间变量//***************************************************************************//延时函数,这里只支持1~255ms.自动适应主时钟voiddelay_ms(u8ms){u16i; do{i=MAIN_Fosc/13000; while(--i) ;}while(--ms);}//***************************************************************************//计算PWM重装值函数void LoadPWM(u16i){ u16 j; if(i>PWM_HIGH_MAX) i=PWM_HIGH_MAX; //如果写入大于最大占空比数据,则强制为最大占空比。 if(i<PWM_HIGH_MIN) i=PWM_HIGH_MIN; //如果写入小于最小占空比数据,则强制为最小占空比。 j=65536UL-PWM_DUTY+i; //计算PWM低电平时间 i=65536UL-i; //计算PWM高电平时间 EA=0; PWM_high=i; //装载PWM高电平时间 PWM_low=j; //装载PWM低电平时间 EA=1;}//***************************************************************************//主函数voidmain(void){ P0M1=0; P0M0=0; //设置为准双向口 P1M1=0; P1M0=0; //设置为准双向口 P2M1=0; P2M0=0; //设置为准双向口 P3M1=0; P3M0=0; //设置为准双向口 P4M1=0; P4M0=0; //设置为准双向口 P5M1=0; P5M0=0; //设置为准双向口 P6M1=0; P6M0=0; //设置为准双向口 P7M1=0; P7M0=0; //设置为准双向口 P_PWM=0; P3M1&=~(1<<4); //P3.4设置为PWM输出 P3M0|=(1<<4); TR1=0; //停止计数 ET1=1; //允许中断 PT1=1; //高优先级中断 TMOD=0x00; //T1工作模式0:16位自动重装,定时 AUXR|=0x80;//1T,不分频 INT_CLKO|=0x02; //P3.4输出时钟 TH1=0; TL1=0; TR1=1; //T1开始运行 EA=1; pwm=PWM_DUTY/10; //给PWM一个初值,这里为10%占空比 LoadPWM(pwm); //计算PWM重装值 while(1) { while(pwm<(PWM_HIGH_MAX-8)) { pwm+=8; //PWM逐渐加到最大 LoadPWM(pwm); delay_ms(8); } while(pwm>(PWM_HIGH_MIN+8)) { pwm-=8; //PWM逐渐减到最小 LoadPWM(pwm); delay_ms(8); } }}//***************************************************************************//T0中断函数voidtimer0_int(void)interrupt1{ if(P_PWM) { TH1=(u8)(PWM_low>>8); //如果是输出高电平,则装载低电平时间。 TL1=(u8)PWM_low; } else { TH1=(u8)(PWM_high>>8); //如果是输出低电平,则装载高电平时间。 TL1=(u8)PWM_high; }}//***************************************************************************2.用STC15F2K60S2单片机设计一个电压测量系统,测量P1.0管脚上输入的可调电阻分压电压,单片机工作频率为22.1184MHz。用一只4位共阴极的数码管来显示检测到的电压值,要求电压值保留两位小数。电路设计:在单片机P1.0口接入R1可变电阻的滑动点,可调分压,采用单片机的I/O方式控制74HC595驱动4位数码管,控制74HC595的数据和时钟线从单片机的P4.0、P4.3和P5.4引出。软件设计://***************************************************************************#include "STC15Fxxxx.H"//用户定义宏#defineMAIN_Fosc22118400L //定义主时钟22.1184MHz#defineDIS_DOT0x0A//在段码表中0~9数字与0.~9.的间隔数#defineTimer0_Reload(65536UL-(MAIN_Fosc/1000))//T0中断频率,1000次/秒//***************************************************************************typedef unsignedchar u8;typedef unsignedint u16;typedef unsignedlong u32;//***************************************************************************/*共阴极LED段码表,包括01234567890.1.2.3.4.5.6.7.8.9.*/u8codet_display[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF}; //位码表u8codeT_COM[]={0x01,0x02,0x04,0x08}; //***************************************************************************//IO口定义sbit P_HC595_SER=P4^0; //HC595的14 脚SER数据输入sbit P_HC595_RCLK=P5^4; //HC595的12脚RCLk锁存时钟sbit P_HC595_SRCLK=P4^3; //HC595的11脚SRCLK数据时钟移位//***************************************************************************//本地变量声明u8 LED4[4]; //显示缓冲u8 display_index; //显示位索引bit B_1ms; //1ms标志u8 msecond;u16 Get_ADC10bitResult(u

温馨提示

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

评论

0/150

提交评论