單片機原理及應(yīng)用(C51版) 習(xí)題答案匯 張春光 第3-7章_第1頁
單片機原理及應(yīng)用(C51版) 習(xí)題答案匯 張春光 第3-7章_第2頁
單片機原理及應(yīng)用(C51版) 習(xí)題答案匯 張春光 第3-7章_第3頁
單片機原理及應(yīng)用(C51版) 習(xí)題答案匯 張春光 第3-7章_第4頁
單片機原理及應(yīng)用(C51版) 習(xí)題答案匯 張春光 第3-7章_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第3章習(xí)題答案已知片內(nèi)RAM的30H單元和40H單元各存放了一個8位無符號數(shù),試編寫程序比較這兩個數(shù)的大小。若(30H)≥(40H),則將地址為20H的內(nèi)存單元置0;否則,則將地址為20H的內(nèi)存單元置1。方法一:#defineucharunsignedchardataucharx_at_0x30;datauchary_at_0x40;dataucharz_at_0x20;voidmain(){ if(x>=y)z=0x00; elsez=0x01; while(1);}方法二:#include<absacc.h>#definexDBYTE[0x30]#defineyDBYTE[0x40]#definezDBYTE[0x20]voidmain(){ if(x>=y)z=0x00; elsez=0x01; while(1);}2.已知片內(nèi)RAM的20H單元中存放著一個無符號數(shù)X,試編寫程序求出下式的函數(shù)值Y,并將結(jié)果存放在21H單元中。方法一:#defineucharunsignedchardataucharx_at_0x20;datauchary_at_0x21;voidmain(){ if(x>0x10)y=0xaa; elseif(x==0x10)y=0x00; elsey=0xff; while(1);}方法二:#include<absacc.h>#definexDBYTE[0x20]#defineyDBYTE[0x21]voidmain(){ if(x>0x10)y=0xaa; elseif(x==0x10)y=0x00; elsey=0xff; while(1);}3.已知片內(nèi)RAM的20H單元中存放著一個有符號數(shù)X,試編寫程序求出下式的函數(shù)值Y,并將結(jié)果存放在21H單元中。方法一:datacharx_at_0x20;datachary_at_0x21;voidmain(){ if(x==0)y=0x00; elseif((x&0x80)==0)y=0x01; elsey=0xff; while(1);}方法二:#include<absacc.h>#definexDBYTE[0x20]#defineyDBYTE[0x21]voidmain(){ if(x==0)y=0x00; elseif((x&0x80)==0)y=0x01; elsey=0xff; while(1);} 試編寫程序,將片內(nèi)RAM以30H為起始地址的10個單元中的數(shù)據(jù)求和,并將結(jié)果送入40H單元。假設(shè)和不大于255。參考程序:#defineucharunsignedchardataucharbuffer[10]_at_0x30;dataucharsum_at_0x40;voidmain(){ uchari; for(i=0;i<10;i++) sum+=buffer[i]; while(1);}試編寫程序,查找片內(nèi)RAM以30H為起始地址10個單元數(shù)據(jù)的最小值,并將結(jié)果送入40H單元。參考程序:#defineucharunsignedchardataucharbuffer[10]_at_0x30;dataucharx_at_0x40;voidmain(){ uchari; x=0xff; for(i=0;i<10;i++) if(buffer[i]<x)x=buffer[i]; while(1);}試編寫程序,將片內(nèi)RAM30H~50H單元的數(shù)據(jù)塊,全部搬移到片外RAM從1000H起始的存儲區(qū)域,并將原數(shù)據(jù)區(qū)全部填為00H。參考程序:#defineucharunsignedchardataucharbuffer1[33]_at_0x30;xdatauchar buffer2[33]_at_0x1000;voidmain(){ uchari; for(i=0;i<33;i++) { buffer2[i]=buffer1[i]; buffer1[i]=0; } while(1);}試編寫程序?qū)⑵瑑?nèi)RAM以40H為起始地址的數(shù)據(jù)塊傳送到片外RAM以2000H為起始地址的區(qū)域,直到發(fā)現(xiàn)“$”字符,傳送停止。參考程序:(假設(shè)長度為10個單元)#defineucharunsignedchardataucharbuffer1[10]_at_0x40;xdataucharbuffer2[10]_at_0x2000;voidmain(){ uchari; i=0; while(buffer1[i]!=0x24) { buffer2[i]=buffer1[i]; i++; } while(1);}8.試編寫程序,求平方和c=a2+b2,設(shè)a、b分別存于內(nèi)部RAM的30H、31H兩個單元(假設(shè)a、b均小于10),計算結(jié)果存在內(nèi)部RAM的32H單元中。方法一:#defineucharunsignedchardataucharx_at_0x30;datauchary_at_0x31;dataucharz_at_0x32; ucharcodesquare[10]={0,1,4,9,16,25,36,49,64,81};ucharfuction(ucharnumber){ returnsquare[number];} voidmain() { z=fuction(x)+fuction(y); while(1);}方法二:#defineucharunsignedchar#include<absacc.h>#definexDBYTE[0x30]#defineyDBYTE[0x31]#definezDBYTE[0x32]ucharcodesquare[10]={0,1,4,9,16,25,36,49,64,81};ucharfuction(ucharnumber){ returnsquare[number];} voidmain() { z=fuction(x)+fuction(y); while(1);}6.對于圖4-5所示的電路,試編程實現(xiàn)如下功能:每按動K0按鍵一次,從左向右依次點亮8個發(fā)光二極管中的一個。參考程序:#include <reg51.h> //51系列單片機頭文件#include <intrins.h> //包含_crol_函數(shù)所在的頭文件#define ucharunsignedchar //宏定義uchar temp; //定義一個變量,用來給P1口賦值void main() //主函數(shù){ EA=1; //開總中斷 EX0=1; //開外中斷0 PX0=1; //外中斷0設(shè)成高級別中斷 IT0=1; //外中斷0設(shè)成邊沿觸發(fā) temp=0x7f; //賦初值,預(yù)備右邊第一個燈亮while(1);}void int0()interrupt0using0//外部中斷1的中斷服務(wù)函數(shù){P1=temp;temp=_cror_(temp,1)}7.對于圖4-5所示的電路,試編程實現(xiàn)如下功能:當(dāng)無外部中斷請求時,每隔1s,從左向右依次點亮8個發(fā)光二極管中的1個;當(dāng)按鍵K0被按下時,上下4只發(fā)光二極管交替閃爍顯示(假設(shè)二極管點亮及熄滅的時間都是1s),閃爍8次后,返回中斷前狀態(tài);當(dāng)按鍵K1被按下時,8只發(fā)光二極管全部閃爍(假設(shè)二極管點亮及熄滅的時間都是1s),閃爍10次后,返回中斷前狀態(tài)。假設(shè)系統(tǒng)時鐘頻率為12MHz,外部中斷0為低優(yōu)先級,外部中斷1為高優(yōu)先級。參考程序:#include <reg51.h> //51系列單片機頭文件#include <intrins.h> //包含_crol_函數(shù)所在的頭文件#define ucharunsignedchar //宏定義#define uintunsignedint //宏定義uchar temp; //定義一個變量,用來給P1口賦值void delaynms(uintn) //延時nms函數(shù){uint i,j;for(i=0;i<n;i++)for(j=0;j<125;j++);}void main() //主函數(shù){ EA=1; //開總中斷 EX1=1; EX0=1; PX1=1; PX0=0; IT1=1; IT0=1; temp=0x7f; //賦初值,預(yù)備左邊第一個燈亮while(1){P1=temp; //輸出到P1口 temp=_cror_(temp,1); delaynms(1000); //延時1s}void int0()interrupt0{ucharm;for(m=0;m<8;m++){P1=0x0f; delaynms(1000); //延時1sP1=0xf0; delaynms(1000); }}void int1()interrupt2{ucharn;for(n=0;n<10;n++){P1=0; delaynms(1000); P1=0xff; delaynms(1000); }}8.假設(shè)多故障檢測電路如圖4-8所示,試編程實現(xiàn)如下功能:當(dāng)系統(tǒng)無故障時,4個故障源輸入端X1~X4全為高電平,對應(yīng)的4個顯示燈全滅;當(dāng)某個設(shè)備出現(xiàn)故障時,點亮對應(yīng)的發(fā)光二極管。其中,發(fā)光二極管LED1~LED4對應(yīng)4個輸入端X1~X4,X1~X4與P1口的P1.0~P1.3引腳相連,4個發(fā)光二極管LED1~LED4分別與P1口的P1.4~P1.7相連。圖4-8多故障檢測電路#include <reg51.h> //51系列單片機頭文件sbit X1=P1^0; //將X1定義為P1.0引腳sbit X2=P1^1; //將X2定義為P1.1引腳sbit X3=P1^2; //將X3定義為P1.2引腳sbit X4=P1^3; //將X4定義為P1.3引腳sbit LED1=P1^4; //將LED1定義為P1.4引腳sbit LED2=P1^5; //將LED2定義為P1.5引腳sbit LED3=P1^6; //將LED3定義為P1.6引腳sbit LED4=P1^7; //將LED4定義為P1.7引腳void main() //主函數(shù){ EA=1; //開總中斷 EX1=1; //開外中斷0 IT1=1; //外中斷0設(shè)成邊沿觸發(fā) P1=0xff; //令發(fā)光二極管熄滅,同時在輸入數(shù)據(jù)前先向?qū)?yīng)口輸出“1”while(1); //循環(huán)等待}void int1()interrupt2 //外部中斷0的中斷服務(wù)函數(shù){if(X1==0)LED1=0; //判斷設(shè)備X1是否故障?if(X2==0)LED2=0; //判斷設(shè)備X2是否故障?if(X3==0)LED3=0; //判斷設(shè)備X3是否故障?if(X4==0)LED3=0; //判斷設(shè)備X4是否故障?}3.假設(shè)系統(tǒng)時鐘頻率為12MHz,利用定時器T0編程實現(xiàn)如下功能:使P1.0引腳上輸出一個周期為40ms的方波。計算初值X:X=216-20000us/1us=65536-20000=45536=B1E0H因此T0的初值為TH0=0B1H,TL0=0E0H。參考程序:#include <reg51.h> //51系列單片機頭文件sbit P1_0=P1^0 ; //位定義void main() //主函數(shù){ TMOD=0x01; //設(shè)T0工作在方式1,定時模式TH0=0xb1; //裝入計數(shù)初值TL0=0xe0;EA=1; //開總中斷 ET0=1; //T0開中斷 TR0=1; //啟動T0 while(1); //等待中斷}void counter0()interrupt1 //T0的中斷服務(wù)函數(shù){P1_0=!P1_0; //P1.0位取反TH1=0xb1; //重新裝載計數(shù)初值TL1=0xe0;}4.假設(shè)系統(tǒng)時鐘頻率為6MHz,編程實現(xiàn)用定時器T1產(chǎn)生定時脈沖,每隔2ms從P1.5引腳輸出脈寬為3個機器周期的正脈沖。計算初值X:X=65536-2000us/2us=65536-1000=64536=FC18H因此T1的初值為TH1=0FCH,TL1=18H。參考程序(采用中斷工作方式):#include <reg51.h> //51系列單片機頭文件#include<intrins.h> //包含_nop_函數(shù)所在的頭文件sbit P1_5=P1^5 ; //位定義void main() //主函數(shù){ TMOD=0x10; //設(shè)T1工作在方式1,定時模式TH1=0xfc; //裝入計數(shù)初值TL1=0x18;EA=1; //開總中斷 ET1=1; //T0開中斷 TR1=1; //啟動T0P1_5=0; //將輸出口P1的第0位清0(輸出脈沖的起始值) while(1); //等待中斷}void timer1()interrupt3 //T1的中斷服務(wù)函數(shù){P1_5=1; //產(chǎn)生脈沖信號高電平_nop_();_nop_(); P1_5=0; //產(chǎn)生脈沖信號低電平 TH1=0xfc; //重新裝載計數(shù)初值TL0=0x18;}5.假設(shè)系統(tǒng)時鐘頻率為12MHz,利用定時器T1編程實現(xiàn)如下功能:要求從P2.1引腳輸出一個脈沖波形,高電平持續(xù)3ms,低電平持續(xù)10ms。分析:(1)選擇工作方式:因為Tcy=12/fosc=1us,由定時器各種工作方式的特性,可計算出方式1最長可定時65.536ms,方式2、3最長可定時256us。本題中定時時間t1=3ms、t2=10ms選擇T0的工作方式1來完成此任務(wù)。假設(shè)此時T1不工作,則方式控制字為TMOD=01H。(2)計算初值X:高電平初值:X1=65536-3000us/1us=65536-3000=62536=F448H因此T0的初值為TH0=0F4H,TL0=48H。低電平初值:X2=65536-10000us/1us=65536-10000=55536=D8F0H因此T0的初值為TH0=0D8H,TL0=0F0H。參考程序(采用中斷工作方式):#include <reg51.h> //51系列單片機頭文件sbit P2_1=P2^1 ; //位定義bitflag=0;//定義一個位變量,實現(xiàn)高低電平切換void main() //主函數(shù){ TMOD=0x01; //設(shè)T0工作在方式1,定時模式EA=1; //開總中斷 ET0=1; //T0開中斷 TH0=0xd8; //裝入低電平計數(shù)初值TL0=0xf0;P2_1=0; //將輸出口P2的第1位清0TR0=1; //啟動T0,(輸出低電平開始) while(1); //等待中斷}void timer0()interrupt1 //T0的中斷服務(wù)函數(shù){flag=!flag; if(flag==0){P2_1=0; TH0=0xd8; //裝入低電平計數(shù)初值TL0=0xf0;}else{P2_1=1; TH0=0xf4; //裝入高電平計數(shù)初值TL0=0x48;} }6.假設(shè)系統(tǒng)時鐘頻率為12MHz,改寫例5-7的程序,使之變成通過定時器0實現(xiàn)8個發(fā)光二極管每隔2s從左向右依次循環(huán)點亮。計算計數(shù)初值:X=65536-50000us/1us=15536=3CB0H因此TH0=3CH,TL0=B0H。(3)20次計數(shù)的實現(xiàn):采用循環(huán)程序的方法實現(xiàn)中斷20次計數(shù)。參考程序:#include <reg51.h> //51系列單片機頭文件#include <intrins.h> //包含_cror_函數(shù)所在的頭文件#define ucharunsignedchar //宏定義uchar num; //循環(huán)計數(shù)器初值void main() //主函數(shù){ TMOD=0x01; //設(shè)T0工作在方式1,定時模式TH0=0x3c; //裝入計數(shù)初值TL0=0xb0;EA=1; //開總中斷 ET0=1; //T0開中斷 TR0=1; //啟動T1num=0; //記錄中斷次數(shù) P2=0xfe; //點亮最右邊發(fā)光二極管while(1); //等待中斷}void timer0()interrupt1 //T0的中斷服務(wù)函數(shù){num++; //中斷次數(shù)加1if(num==40) //判斷是否到達循環(huán)次數(shù),50ms×20=1s{num=0; //重新計數(shù)P2=_cror_(P2,1); //左環(huán)移一次}TH0=0x3c; //重新裝載計數(shù)初值TL0=0xb0;}7.假設(shè)系統(tǒng)時鐘頻率為12MHz,利用定時器T0設(shè)計兩個不同頻率的方波,P1.0輸出頻率為200Hz,P1.1輸出頻率為100Hz。因為連個方波的頻率是倍數(shù)關(guān)系,所以只計算頻率高的初值。計算初值X:X=65536-2500us/1us=65536-2500=63036=F63CH因此T0的初值為TH0=0F6H,TL0=3CH。參考程序(采用中斷工作方式):#include <reg51.h> //51系列單片機頭文件sbit P200=P1^0 ; //位定義sbit P100=P1^1 ;unsignedcharx=0;void main() //主函數(shù){ TMOD=0x01; //設(shè)T0工作在方式1,定時模式EA=1; //開總中斷 ET0=1; //T0開中斷 TH0=0xf6; //裝入低電平計數(shù)初值TL0=0x3c;TR0=1; //啟動T0,(輸出低電平開始) while(1); //等待中斷}void timer0()interrupt1 //T0的中斷服務(wù)函數(shù){P200=!P200;x++; if(x==2)//進兩次中斷后取反{P100=!P100;x=0;}TH0=0xf6; //裝入低電平計數(shù)初值TL0=0x3c;} }8.假設(shè)系統(tǒng)時鐘頻率為12MHz,利用定時器T0編程實現(xiàn)如下功能:要求從P1.7引腳輸出一個脈沖頻率為2kHz、占空比為7:10的脈沖寬度調(diào)制(PWM)信號。計時的時間為整個周期的1/10,1?2000?10=50us,因而采用T0的方式2計算初值X:X=256-50us/1us=256-50=206因此T0的初值為TH0=206,TL0=206。參考程序(采用中斷工作方式):#include <reg51.h> //51系列單片機頭文件sbit P1.7=P1^7 ; //位定義void main() //主函數(shù){unsignedcharx=0; TMOD=0x02; //設(shè)T0工作在方式1,定時模式EA=1; //開總中斷 ET0=1; //T0開中斷 TH0=206; //裝入低電平計數(shù)初值TL0=206;TR0=1; //啟動T0,(輸出低電平開始) while(1); //等待中斷}void timer0()interrupt1 //T0的中斷服務(wù)函數(shù){x++; if(x<7)//進兩次中斷后取反{P1.7=1;}elseif(x<10){P1.7=0;}elsex=0;}設(shè)計一個MCS-51單片機的雙機通信系統(tǒng),試編程將甲機片內(nèi)RAM的30H~3FH的數(shù)據(jù)塊通過串行口發(fā)送到乙機片外RAM的1000H~100FH單元中去,要求接收和發(fā)送均采用中斷方式。設(shè)晶振頻率為11.0592MHz,波特率為2400b/s。(1)求初值:假設(shè)SMOD=0(2)參考程序(中斷方式)//甲機發(fā)送#include <reg51.h> #define ucharunsignedchardataucharbuffer1[16]_at_0x30;uchari; void main() {i=0;SCON=0x40;TMOD=0x20;TH1=0xf4;TL1=0xf4;TR1=1;EA=1;ES=1;SBUF=buffer1[i];//啟動串行發(fā)送while(1);}voidsend()interrupt4{TI=0;i++;SBUF=buffer1[i];if(i==15)ES=0;}//乙機接收#include<reg51.h> #define ucharunsignedcharxdatauchar buffer2[16]_at_0x1000;uchari; void main() { i=0;SCON=0x50;TMOD=0x20;TH1=0xf4;TL1=0xf4;TR1=1;EA=1;ES=1;while(1);}voidreceiver()interrupt4{RI=0;buffer2[i]=SBUF;i++;if(i==16)ES=0;}參考程序(查詢方式)//甲機發(fā)送#include <reg51.h> #define ucharunsignedchardataucharbuffer1[16]_at_0x30;uchari; void main() {SCON=0x40;TMOD=0x20;TH1=0xf4;TL1=0xf4;TR1=1;for(i=0;i<16;i++){SBUF=buffer1[i];//啟動串行發(fā)送while(!TI);TI=0;}while(1);}//乙機接收#include<reg51.h> #define ucharunsignedcharxdatauchar buffer2[16

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論