西南科技大學單片機上機考試題答案_第1頁
西南科技大學單片機上機考試題答案_第2頁
西南科技大學單片機上機考試題答案_第3頁
西南科技大學單片機上機考試題答案_第4頁
西南科技大學單片機上機考試題答案_第5頁
已閱讀5頁,還剩18頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、/* * file 識別最大模擬輸入通道 * author 秘密作戰實驗室(FREES) * version v1.0 * date 2015-06-26 * 功 能:利用0809采集兩路模擬電壓, 將電壓值最大的通道號顯示在LED顯示器上。(硬件電路參見AD_CH2_1.DSN)。 * */#include <reg51.h>/51單片機頭文件#include <absacc.h>/宏定義#defineTIMER1DEF( 65536 - 50000 ) /定時時間#defineAD_Convert(i)(*(unsigned char volatile xdata

2、*) (0x3c00 + i) = 0) /返回片外地址#defineAD_Read(i)(*(unsigned char volatile xdata *) (0x3c00 + i) /全局變量定義int Flag=0;intbAD_Val_2 = 0;/ AD通道2轉換結果intbAD_Val_7 = 0;/ AD通道7轉換結果int table10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /共陽數碼管0-9 /* 函數名稱:delay(n)* 功 能:程序延時n ms* 入口參數:無* 出口參數:無*/void delay(i

3、nt n)/int i=0,j=0;for(i=n;i>0;i-)for(j=114;j>0;j-); /* 函數名稱:TimeT1()* 功 能:定時器1初始化 50ms定時* 入口參數:無 * 出口參數:無*/void TimeT1() TMOD=0X10; /定時器1 方式1TH1=TIMER1DEF/256;/裝定時初值高8位,定時50ms 計算公式 高位us=(65535-50000)/256TL1=TIMER1DEF%256;/裝定時初值低8位,定時50ms 計算公式 低位us=(65535-50000)%256PT1=1; /定時器1 中斷優先級 高ET1=1; /定

4、時器1 中斷控制位 TR1=1; /定時器1 啟動控制位/* 函數名稱:main()* 功 能:程序入口* 入口參數:無* 出口參數:無*/void main(void)/-加油/ 初始化P1=0Xff;/外部中斷初始化IT1=1; /脈沖觸發方式1:負跳變沿有效0:EX1=1; /外部中斷1中斷控制位TimeT1(); /定時器1初始化EA = 1; / 開中斷delay(500);while( 1 ) / 主循環 delay(50); if(bAD_Val_2>=bAD_Val_7) P1=table2; if(bAD_Val_7>bAD_Val_2) P1=table7;/*

5、 函數名稱:INT_INT1()* 功 能:INT1中斷服務程序,使用工作寄存器組1* 入口參數:無* 出口參數:無*/voidINT_INT1(void)interrupt 2 using 1if(Flag=1) bAD_Val_2=AD_Read(2);if(Flag=2) bAD_Val_7=AD_Read(7);/* 函數名稱:INT_T1()* 功 能:T1中斷服務程序,使用工作寄存器組1* 入口參數:無* 出口參數:無*/voidINT_T1() interrupt 3 using 1static intbCount = 3 ; -bCount; TH1=TIMER1DEF/256

6、; TL1=TIMER1DEF%256;if( bCount = 2)Flag=1;AD_Convert(2);if(bCount=1)Flag=2;AD_Convert(7);if(bCount=0) bCount=4;/* * file 按鍵掃描 * author 秘密作戰實驗室 * version v1.0 * date 2015-06-26 * 功 能:利用8255的PC口實現3X3鍵盤掃描(硬件電路參見3X3KEY_8255.DSN)。 當18號鍵獨立按下時,連接在PA口對應的LEDx點亮(即1號鍵按下時LDE1亮,2號鍵按下時LDE2亮), 當9號鍵按下時,所有LED點亮,當沒有鍵

7、按下時,所有LED熄滅。*/#include"reg52.h"#include"absacc.h" /Direct access to 8051sbit CS=P27; /片選段 #define PA XBYTE0x0000/定義端口A地址#define PB XBYTE0x0400/定義端口B地址#define PC XBYTE0x0800/定義端口C地址#define CN XBYTE0xC000/定義控制口地址unsigned char Key_Scanf(void)/按鍵掃描函數unsigned char key=0;PC=0xFB;/把PC2置

8、0,PC1和PC0置1第一列if(PC=0xDB)key=1;if(PC=0xBB)key=4;if(PC=0x7B)key=7;PC=0xFD;/把PC1置0,PC2和PC0置1第二列if(PC=0xDD)key=2;if(PC=0xBD)key=5;if(PC=0x7D)key=8;PC=0xFE;/把PC0置0,PC2和PC1置1第三列if(PC=0xDE)key=3;if(PC=0xBE)key=6;if(PC=0x7E)key=9;return(key);void main(void) /給我最親愛的女盆友 unsigned int a=0xff; CS=0;CN=0x88;/825

9、5初始化,寫控制字while(1)switch(Key_Scanf()case 0:PA=0xff;break; case 1:PA=0xfe;break;case 2:PA=0xfd;break; case 3:PA=0xfb;break;case 4:PA=0xf7;break;case 5:PA=0xef;break;case 6:PA=0xdf;break;case 7:PA=0xbf;break;case 8:PA=0x7f;break;case 9:PA=0x00;break;default:break; /* * file 50Hz鋸齒波 * author 秘密作戰實驗室 (Fr

10、ees) * version v1.0 * date 2015-06-26 * 功 能:利用0832同步輸出兩個頻率為50赫茲的鋸齒波(硬件電路參見DA_BUF2_1.DSN)。*/#include"reg52.h"#include"absacc.h"#define DA_1 XBYTE0x2000/設置DAC08321的選通地址#define DA_2 XBYTE0x2400/設置DAC08322的選通地址#define DA_S XBYTE0x3c00/設置DAC0832的選通地址unsigned int DAVAL=0;void delay(uns

11、igned int time)unsigned int i=0,j=0;for(i=0;i<time;i+)for(j=0;j<114;j+);void signal(unsigned char num)/WR=0;DA_1=num;DA_2=num;DA_S=0;void Timer0_Inits(void) /定時器0初始化函數TMOD|=0x01;TH0=(65535-200)/256;TL0=(65535-200)%256;TR0=1;ET0=1;EA=1;void main(void)Timer0_Inits(); while(1)/signal(DAVAL);void

12、time0() interrupt 1TH0=(65535-200)/256;TL0=(65535-200)/256;DAVAL+; signal(DAVAL);if(DAVAL>=255)DAVAL=0;/* * file Pwm發生器 * author 秘密作戰實驗室 * version v1.0 * date 2015-06-26 * 功 能:在硬件電路PWM.DSN中實現P1.7輸出PWM波。周期T=100ms,初始占空比(T1/T)為50%, 按鍵KEY1每次增加占空比10%(直到90%),KEY2每次減小占空比10%(直到10%)。 */#include"reg52

13、.h"sbit Key0=P10;/P10sbit Key1=P11;/P11sbit PWM=P17;unsigned char num=0,Duty=5;void Delay(unsigned int time)unsigned int i=0,j=0;for(i=0;i<time;i+)for(j=0;j<114;j+);void Key_Scanf(void)/if(Key0=0)Delay(20);if(Key0=0)Duty-=1;while(!Key0);if(Key1=0)Delay(20);if(Key1=0)Duty+=1;while(!Key1);D

14、uty=Duty>1?Duty:1;Duty=Duty<9?Duty:9;void Timer0_Inits(void)TMOD|=0x01;TH0=(65535-10000)/256;TL0=(65535-10000)%256;TR0=1;ET0=1;EA=1;void main(void)Timer0_Inits();while(1)Key_Scanf();void PIT0(void) interrupt 1TH0=(65535-10000)/256;TL0=(65535-10000)%256;+num;if(num<=Duty) PWM=1;else PWM=0;if

15、(num>9)num=0;/* * file 編碼顯示器 * author 秘密作戰實驗室 * version v1.0 * date 2015-06-26 * 功 能: 利用8255擴展并行端口(硬件電路參見CodeDisplay_8255.DSN)。 當KEY按下時,利用8255的PC口輸入二進制值編碼(6位), 將該值轉換成十進制后顯示在2位7段LED顯示器上。 */#include"reg52.h"#include"absacc.h"sbit CS=P27; #define PA XBYTE0x0000#define PB XBYTE0x0

16、400#define PC XBYTE0x0800#define CN XBYTE0xC000unsigned table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;unsigned char number=0;void display(unsigned char num)/PA=0xff;PA=tablenum/10;/PB=0xff;PB=tablenum%10;void main(void) CS=0;CN=0x89; /8255初始化,寫控制字while(1)number=PC&0x3f;display(number);

17、/* * file 步進電機 * author 秘密作戰實驗室(FREE) * version v1.0 * date 2015-06-26 * 功 能: 在SMSpeed.DSN的電路上實現:當KEY2按下時,電機停止轉動,釋放時繼續轉動。 當KEY1按下時,電機以60轉/min的轉速正轉,釋放時以120轉/min的轉速反轉。 */#include"reg52.h"sbit Key1=P33;char num=0;unsigned int Speed=50000;/25000對應120r/min,50000對應60r/minchar dir=1; /電機旋轉方向定義voi

18、d delay(unsigned int time) unsigned int i,j; for(i=0;i<time;i+) for(j=0;j<114;j+);void Timer0_Init(void) TMOD|=0x09;TH0=(65536-Speed)/256;TL0=(65536-Speed)%256;TR0=1;ET0=1;EA=1;void moto(char a)switch(a)case 0:P1=0x01;break;case 1:P1=0x02;break;case 2:P1=0x04;break;case 3:P1=0x08;break;default

19、:break;void main() Timer0_Init();while(1)if(Key1=0)delay(5);if(Key1=0)Speed=25000;dir=-1;while(!Key1);elsedir=1;Speed=50000;void time0(void) interrupt 1 TH0=(65536-Speed)/256; TL0=(65536-Speed)%256;num=num+dir;if(num>=4)num=0;if(num<0)num=3;moto(num);/* * file 步進輸出模擬電壓 * author 秘密作戰實驗室 * versi

20、on v1.0 * date 2015-06-26 * 功 能:利用0832在按鍵控制下步進輸出模擬電壓(硬件電路參見DA_BUF1_1.DSN)。要求每 按鍵一次遞增或遞減0.1V。設輸出最大值為4V,最小值為1V。 */#include"reg52.h"#include"absacc.h"sbit Key2=P16;sbit Key1=P17;#define DA_S XBYTE0x3c00unsigned char DAVAL=128;void delay(unsigned int time)unsigned int i=0,j=0;for(i=0

21、;i<time;i+)for(j=0;j<114;j+);void signal(unsigned char num)WR=0;DA_S=num;void main(void) while(1)if(Key1=0)delay(10);if(Key1=0)DAVAL+=5;/按鍵加減5個數字量,會小些誤差,因為0.1v對應的數字量是5.1,會有累計誤差while(!Key1);/但word上面要求加減5個數字量,如果老師問起你還可以將這個問題,會有加分哦/- 嘿嘿if(Key2=0)delay(10);if(Key2=0)DAVAL-=5;while(!Key2);DAVAL=DAV

22、AL>200?200:DAVAL;/三目運算符,對DAVAL進行限幅DAVAL=DAVAL<50?50:DAVAL;signal(DAVAL);/* * file 單個模擬電壓等級識別 * author 秘密作戰實驗室 * version v1.0 * date 2015-06-26 * 功 能: 利用0809采集單路模擬電壓,將其分級(10級),并將分級數(09)顯示在LED 顯示器上。(硬件電路參見AD_CH1_1.DSN)。 */#include <reg51.h>/宏定義#defineTIMER1DEF( 65536 - 50000 )#defineAD_Con

23、vert(i)(*(unsigned char volatile xdata *) (0x3c00 + i) = 0)#defineAD_Read(i)(*(unsigned char volatile xdata *) (0x3c00 + i) /全局變量定義intbAD_Val = 0;/ 轉換結果unsigned char code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/* 函數名稱:delay()* 功 能:延時n毫秒* 入口參數:無* 出口參數:無*/void delay(int time)int i=0,j

24、=0; for(i=time;i>0;i-)for(j=114;j>0;j-);/* 函數名稱:TimeT1()* 功 能:定時器1初始化,定時50ms* 入口參數:無* 出口參數:無*/void TimeT1() TMOD=0X10; /定時器1 方式1 TH1=TIMER1DEF/256; TL1=TIMER1DEF%256; PT1=1;/定時器1 中斷優先級 高 ET1=1;/定時器1 中斷控制位 TR1=1;/* 函數名稱:main()* 功 能:程序入口* 入口參數:無* 出口參數:無*/void main(void)P1=0Xff; / 初始化TimeT1();IT1

25、=1; /脈沖觸發方式EX1=1;EA =1; / 開中斷delay(500);while( 1 )/ 主循環 delay(50); P1=table10*bAD_Val/256;/* 函數名稱:INT_INT1()* 功 能:INT1中斷服務程序,使用工作寄存器組1* 入口參數:無* 出口參數:無*/voidINT_INT1(void)interrupt 2 using 1 bAD_Val=AD_Read(4);/* 函數名稱:INT_T1()* 功 能:T1中斷服務程序,使用工作寄存器組1* 入口參數:無* 出口參數:無*/voidINT_T1() interrupt 3 using 1s

26、taticintbCount = 2; TH1=TIMER1DEF/256; TL1=TIMER1DEF%256;if( -bCount = 0)/ 判斷100毫秒時間到 bCount=2; AD_Convert(4);/* * file 單個模擬電壓監測 * author 秘密作戰實驗室 * version v1.0 * date 2015-06-26 * 功 能: 在VoltageMonitor_1.DSN的電路中測量由電位器產生的模擬電壓,當電壓小于1V時, 使連接在P1.0上的(黃)色LED亮;當電壓大于4V時,使連接在P1.1上的(紅)色 LED亮當電壓在14V時,所有LED熄滅。

27、要求:當信號變化后,必須在100毫秒內做出響應。 */#include <reg51.h>/宏定義#defineTIMER1DEF( 65536 - 50000 )#defineAD_Convert(i)(*(unsigned char volatile xdata *) (0x2000 + i) = 0)#defineAD_Read(i)(*(unsigned char volatile xdata *) (0x2000 +i)/全局變量定義intbAD_Val = 0;/ 轉換結果sbit P1_0=P10;sbit P1_1=P11;/* 函數名稱:delay()* 功 能:

28、延時n毫秒* 入口參數:無* 出口參數:無*/void delay(int time) int i,j; for(i=0;i<time;i+) for(j=0;j<114;j+);/* 函數名稱:TimeT1()* 功 能:定時器1初始化,定時50ms* 入口參數:無* 出口參數:無*/void TimeT1() TMOD=0X10; /定時器1 方式1 TH1=TIMER1DEF/256; TL1=TIMER1DEF%256; PT1=1;/定時器1 中斷優先級 高 ET1=1;/定時器1 中斷控制位 TR1=1;/* 函數名稱:main()* 功 能:程序入口* 入口參數:無*

29、 出口參數:無*/void main(void)P1=0xcf;/ 初始化IT1=1;/脈沖觸發方式EX1=1;TimeT1();EA = 1;/ 開中斷delay(500);while( 1 ) / 主循環 if(bAD_Val<=51) P1_0=0; if(bAD_Val>=204) P1_1=0; if(bAD_Val>51&&bAD_Val<204)P1_0=1;P1_1=1;/* 函數名稱:INT_INT1()* 功 能:INT1中斷服務程序,使用工作寄存器組1* 入口參數:無* 出口參數:無*/voidINT_INT1(void)inter

30、rupt 2 using 1 bAD_Val=AD_Read(6); / 此處添加讀和保存AD轉換結果的語句(結果保存到bAD_Val)/* 函數名稱:INT_T1()* 功 能:T1中斷服務程序,使用工作寄存器組1* 入口參數:無* 出口參數:無*/voidINT_T1() interrupt 3 using 1staticintbCount = 2;/ 秒計數 TH1=TIMER1DEF/256;/ 重置定時常數的語句TL1=TIMER1DEF%256;if( -bCount = 0) / 判斷100毫秒時間到 bCount=2; /重置秒計數的語句 AD_Convert(6);/啟動AD

31、轉換的語句 /* * file 漢字顯示 * author 秘密作戰實驗室(FREE) * version v1.0 * date 2015-06-26 * 功 能:在8X8的LED點陣顯示器上顯示漢字“大”(硬件電路參見Displayer_dot.DSN)。 */#include"reg52.h"unsigned char Line=0x10,0x10,0xff,0x10,0x28,0x24,0x42,0x81;unsigned char Row=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80;void delay(unsigned int

32、 time) unsigned int i,j; for(i=0;i<time;i+) for(j=0;j<114;j+);void SendData(unsigned char dat) SBUF = dat; while(!TI); TI = 0; void SendString(unsigned char *s) while(*s!='0')/ 0 表示字符串結束標志,通過檢測是否字符串末尾 SendData(*s+); void display(void)unsigned char i=0;for(i=0;i<8;i+)SendData(Linei);

33、P1=Rowi;delay(70);void main(void)SCON=0x00;P1=0x00;/關閉顯示while(1) display();/* 文件名:兩個模擬信號差超限時報警* 功 能:利用0809采集兩路模擬電壓,當兩電壓值相差超過1V時,藍色LED亮, 此時若低通道號的電壓值大,紅色LED亮;若高通道號的電壓值大,則黃色LED亮。 (硬件電路參見AD_CH2_2.DSN)。 */#include <reg51.h>/宏定義#defineTIMER1DEF( 65536 - 50000 )#defineAD_Convert(i)(*(unsigned char vo

34、latile xdata *) (0x3c00 + i) = 0)#defineAD_Read(i)(*(unsigned char volatile xdata *) (0x3c00 +i)/全局變量定義unsigned intbAD_Val_1=0; / 轉換結果unsigned intbAD_Val_5=0;unsigned int flag=0;sbit P1_0=P10;sbit P1_3=P13;sbit P1_5=P15;/* 函數名稱:delay()* 功 能:延時n毫秒* 入口參數:無* 出口參數:無*/void delay(int time) int i,j; for(i=0;i<time;i+) for(j=0;j<114;j+);/* 函數名稱:TimeT1()* 功 能:T1定時器初始化* 入口參數:無* 出口參數:無*/void TimeT1()IT1=1;ET1=1;EX1=1;PT1=1; TMOD=0X10;TH1=TIMER1DEF/256; TL1=TIMER1DEF%256; TR1=1;EA =1;/* 函數名稱:main()* 功 能:程序入口* 入口參數:無* 出口參數:無*/void main(void)

溫馨提示

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

評論

0/150

提交評論