資料包:
單片機(jī)計(jì)算器仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
附 實(shí)驗(yàn)成績(jī)登記表
實(shí)驗(yàn)一:一位加法計(jì)算器實(shí)驗(yàn) 實(shí)驗(yàn)日期:2018年月日 實(shí)驗(yàn)地點(diǎn):第三實(shí)驗(yàn)樓機(jī)房 指導(dǎo)教師: 一、實(shí)驗(yàn)?zāi)康模?/strong> 1. 熟悉鍵盤(pán)工作原理; 2. 掌握單片機(jī)針對(duì)行列式鍵盤(pán)的編程方法; 3. 掌握七段數(shù)碼管的顯示原理及控制原理。 二、實(shí)驗(yàn)任務(wù): 【實(shí)驗(yàn)內(nèi)容】 以4*4行列式鍵盤(pán)為例,設(shè)計(jì)程序讀取一位整數(shù)、“+”或者“-”運(yùn)算符、另一位整數(shù)、“=”,然后在8位的七段數(shù)碼管上顯示出來(lái)。 【實(shí)驗(yàn)基本要求】 1. 根據(jù)要求設(shè)計(jì)出電路,做好元件的選型,并作好用于仿真的電路圖; 2. 獨(dú)立設(shè)計(jì)出程序,調(diào)試后,并保證仿真實(shí)現(xiàn)結(jié)果; 3. 作出設(shè)計(jì)的PCB設(shè)計(jì),在條件允許情況下,將作品制成實(shí)物; 4. 就設(shè)計(jì)寫(xiě)出相應(yīng)的實(shí)驗(yàn)設(shè)計(jì)報(bào)告,從選型、電路連接、程序設(shè)計(jì)思路、程序調(diào)試、系統(tǒng)仿真測(cè)試。字?jǐn)?shù)不得少于3000個(gè)。 三、實(shí)驗(yàn)過(guò)程及實(shí)驗(yàn)步驟:(手寫(xiě)完成:要求寫(xiě)出實(shí)驗(yàn)步驟,要求書(shū)寫(xiě)規(guī)范,字跡切勿潦草。)
實(shí)驗(yàn)考核等級(jí)(手寫(xiě)) |
| 說(shuō)明:請(qǐng)依據(jù)學(xué)生完成情況考核,等級(jí)為A、B、C、D、0。 | 實(shí)驗(yàn)總結(jié)(學(xué)生)
請(qǐng)手工填寫(xiě) |
| 實(shí)驗(yàn)評(píng)價(jià)(教師)
對(duì)應(yīng)后面打“√” | 熟練完成,實(shí)驗(yàn)結(jié)果正確,手冊(cè)書(shū)寫(xiě)整齊規(guī)范 |
| 基本完成,實(shí)驗(yàn)結(jié)果部分正確,書(shū)寫(xiě)較規(guī)范 |
| 部分完成(部分沒(méi)做),或書(shū)寫(xiě)不規(guī)范 |
| 沒(méi)有做(與題目無(wú)關(guān)、空白)或不寫(xiě)實(shí)驗(yàn)總結(jié)記0分 |
|
實(shí)驗(yàn)二:基于單片機(jī)的人體反應(yīng)速度測(cè)試儀設(shè)計(jì) 實(shí)驗(yàn)日期:2018年月日 實(shí)驗(yàn)地點(diǎn):第三實(shí)驗(yàn)樓機(jī)房 指導(dǎo)教師:一、實(shí)驗(yàn)?zāi)康模?/strong> 1. 理解單片機(jī)項(xiàng)目開(kāi)發(fā)的過(guò)程; 2. 進(jìn)一步掌握相關(guān)單片機(jī)外圍器件的驅(qū)動(dòng)設(shè)計(jì); 3. 掌握外圍電路的設(shè)計(jì)。 二、實(shí)驗(yàn)任務(wù): 【實(shí)驗(yàn)內(nèi)容摘要】 設(shè)計(jì)一個(gè)人體反應(yīng)速度測(cè)試的儀器。測(cè)試者按下按鍵后,測(cè)試燈亮起,測(cè)試隨之開(kāi)始。在測(cè)試過(guò)程中,測(cè)試者要注意觀察測(cè)試燈的變化,當(dāng)看到測(cè)試燈熄滅時(shí),測(cè)試者要迅速放開(kāi)測(cè)試按鍵,單片機(jī)會(huì)在數(shù)碼管上顯示測(cè)試者的反應(yīng)時(shí)間。若測(cè)試者在測(cè)試燈熄滅之前放開(kāi)測(cè)試按鍵,則系統(tǒng)自動(dòng)判為犯規(guī),并顯示出錯(cuò)信息。 【實(shí)驗(yàn)基本要求】 1. 根據(jù)要求設(shè)計(jì)出電路,做好元件的選型,并作好用于仿真的電路圖; 2. 獨(dú)立設(shè)計(jì)出程序,調(diào)試后,并保證仿真實(shí)現(xiàn)結(jié)果; 3. 作出設(shè)計(jì)的PCB設(shè)計(jì),在條件允許情況下,將作品制成實(shí)物; 4. 就設(shè)計(jì)寫(xiě)出相應(yīng)的實(shí)驗(yàn)設(shè)計(jì)報(bào)告,從選型、電路連接、程序設(shè)計(jì)思路、程序調(diào)試、系統(tǒng)仿真測(cè)試。字?jǐn)?shù)不得少于3000個(gè)。 三、實(shí)驗(yàn)過(guò)程及實(shí)驗(yàn)步驟:(手寫(xiě)完成:要求寫(xiě)出實(shí)驗(yàn)步驟,要求書(shū)寫(xiě)規(guī)范,字跡切勿潦草。)
實(shí)驗(yàn)考核等級(jí)(手寫(xiě)) |
| 說(shuō)明:請(qǐng)依據(jù)學(xué)生完成情況考核,等級(jí)為A、B、C、D、0。 | 實(shí)驗(yàn)總結(jié)(學(xué)生)
請(qǐng)手工填寫(xiě) |
| 實(shí)驗(yàn)評(píng)價(jià)(教師)
對(duì)應(yīng)后面打“√” | 熟練完成,實(shí)驗(yàn)結(jié)果正確,手冊(cè)書(shū)寫(xiě)整齊規(guī)范 |
| 基本完成,實(shí)驗(yàn)結(jié)果部分正確,書(shū)寫(xiě)較規(guī)范 |
| 部分完成(部分沒(méi)做),或書(shū)寫(xiě)不規(guī)范 |
| 沒(méi)有做(與題目無(wú)關(guān)、空白)或不寫(xiě)實(shí)驗(yàn)總結(jié)記0分 |
|
實(shí)驗(yàn)三:自動(dòng)換擋數(shù)字電壓表 實(shí)驗(yàn)日期:2018年月日 實(shí)驗(yàn)地點(diǎn):第三實(shí)驗(yàn)樓機(jī)房 指導(dǎo)教師:一、實(shí)驗(yàn)?zāi)康模?/strong> 1. 理解單片機(jī)項(xiàng)目開(kāi)發(fā)的過(guò)程; 2. 進(jìn)一步掌握相關(guān)單片機(jī)外圍器件的驅(qū)動(dòng)設(shè)計(jì); 3. 掌握外圍電路的設(shè)計(jì)。 二、實(shí)驗(yàn)任務(wù): 【實(shí)驗(yàn)內(nèi)容摘要】 設(shè)計(jì)一個(gè)數(shù)字電壓表,最大的測(cè)試范圍為0-20V,并且可以根據(jù)電壓的變化實(shí)現(xiàn)自動(dòng)選擇0-0.2V、0-2V和0-20V三個(gè)檔位的自動(dòng)更換,提高測(cè)量精度。 【實(shí)驗(yàn)基本要求】 1. 根據(jù)要求設(shè)計(jì)出電路,做好元件的選型,并作好用于仿真的電路圖; 2. 獨(dú)立設(shè)計(jì)出程序,調(diào)試后,并保證仿真實(shí)現(xiàn)結(jié)果; 3. 作出設(shè)計(jì)的PCB設(shè)計(jì),在條件允許情況下,將作品制成實(shí)物; 4. 就設(shè)計(jì)寫(xiě)出相應(yīng)的實(shí)驗(yàn)設(shè)計(jì)報(bào)告,從選型、電路連接、程序設(shè)計(jì)思路、程序調(diào)試、系統(tǒng)仿真測(cè)試。字?jǐn)?shù)不得少于3000個(gè)。 三、實(shí)驗(yàn)過(guò)程及實(shí)驗(yàn)步驟:(手寫(xiě)完成:要求寫(xiě)出實(shí)驗(yàn)步驟,要求書(shū)寫(xiě)規(guī)范,字跡切勿潦草。) 實(shí)驗(yàn)考核等級(jí)(手寫(xiě)) |
| 說(shuō)明:請(qǐng)依據(jù)學(xué)生完成情況考核,等級(jí)為A、B、C、D、0。 | 實(shí)驗(yàn)總結(jié)(學(xué)生)
請(qǐng)手工填寫(xiě) |
| 實(shí)驗(yàn)評(píng)價(jià)(教師)
對(duì)應(yīng)后面打“√” | 熟練完成,實(shí)驗(yàn)結(jié)果正確,手冊(cè)書(shū)寫(xiě)整齊規(guī)范 |
| 基本完成,實(shí)驗(yàn)結(jié)果部分正確,書(shū)寫(xiě)較規(guī)范 |
| 部分完成(部分沒(méi)做),或書(shū)寫(xiě)不規(guī)范 |
| 沒(méi)有做(與題目無(wú)關(guān)、空白)或不寫(xiě)實(shí)驗(yàn)總結(jié)記0分 |
|
實(shí)驗(yàn)四:俄羅斯方塊游戲機(jī)的設(shè)計(jì) 實(shí)驗(yàn)日期:2018年月日 實(shí)驗(yàn)地點(diǎn):第三實(shí)驗(yàn)樓機(jī)房 指導(dǎo)教師:一、實(shí)驗(yàn)?zāi)康模?/strong> 1.理解單片機(jī)項(xiàng)目開(kāi)發(fā)的過(guò)程; 2.進(jìn)一步掌握相關(guān)單片機(jī)外圍器件的驅(qū)動(dòng)設(shè)計(jì); 3.掌握外圍電路的設(shè)計(jì)。 二、實(shí)驗(yàn)任務(wù): 【實(shí)驗(yàn)內(nèi)容摘要】 仿照現(xiàn)實(shí)的俄羅斯方塊游戲機(jī),設(shè)計(jì)一個(gè)基于89C51的機(jī)器。 【實(shí)驗(yàn)基本要求】 1. 根據(jù)要求設(shè)計(jì)出電路,做好元件的選型,并作好用于仿真的電路圖; 2. 獨(dú)立設(shè)計(jì)出程序,調(diào)試后,并保證仿真實(shí)現(xiàn)結(jié)果; 3. 作出設(shè)計(jì)的PCB設(shè)計(jì),在條件允許情況下,將作品制成實(shí)物; 4. 就設(shè)計(jì)寫(xiě)出相應(yīng)的實(shí)驗(yàn)設(shè)計(jì)報(bào)告,從選型、電路連接、程序設(shè)計(jì)思路、程序調(diào)試、系統(tǒng)仿真測(cè)試。字?jǐn)?shù)不得少于3000個(gè)。 三、實(shí)驗(yàn)過(guò)程及實(shí)驗(yàn)步驟:(手寫(xiě)完成:要求寫(xiě)出實(shí)驗(yàn)步驟,要求書(shū)寫(xiě)規(guī)范,字跡切勿潦草。)
實(shí)驗(yàn)考核等級(jí)(手寫(xiě)) |
| 說(shuō)明:請(qǐng)依據(jù)學(xué)生完成情況考核,等級(jí)為A、B、C、D、0。 | 實(shí)驗(yàn)總結(jié)(學(xué)生)
請(qǐng)手工填寫(xiě) |
| 實(shí)驗(yàn)評(píng)價(jià)(教師)
對(duì)應(yīng)后面打“√” | 熟練完成,實(shí)驗(yàn)結(jié)果正確,手冊(cè)書(shū)寫(xiě)整齊規(guī)范 |
| 基本完成,實(shí)驗(yàn)結(jié)果部分正確,書(shū)寫(xiě)較規(guī)范 |
| 部分完成(部分沒(méi)做),或書(shū)寫(xiě)不規(guī)范 |
| 沒(méi)有做(與題目無(wú)關(guān)、空白)或不寫(xiě)實(shí)驗(yàn)總結(jié)記0分 |
|
單片機(jī)源程序如下:
- #include <reg51.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <math.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit pinRS=P2^0;
- sbit pinRW=P2^1;
- sbit pinE=P2^2;
- #define pindata P0
- #define clearscreen() writeinstruc(0x01)
- #define cursorreturn() writeinstruc(0x02)
- #define inputmode(temp) writeinstruc(temp)
- //temp取值如下:
- //0x04:減量方式,不移位
- //0x05:減量方式,移位
- //0x06:增量方式,不移位
- //0x07:增量方式,移位
- #define dispcontrol(temp) writeinstruc(temp)
- //temp取值如下:
- //0x08:顯示關(guān),光標(biāo)關(guān),閃爍關(guān)
- //0x0c:顯示關(guān),光標(biāo)關(guān),閃爍關(guān)
- //0x0d:顯示開(kāi),光標(biāo)關(guān),閃爍開(kāi)
- //0x0e:顯示開(kāi),光標(biāo)開(kāi),閃爍關(guān)
- //0x0f:顯示開(kāi),光標(biāo)開(kāi),閃爍開(kāi)
- #define dispshift(temp) writeinstruc(temp)
- //temp取值如下:
- //0x10:光標(biāo)左移
- //0x14:光標(biāo)右移
- //0x18:顯示整體左移
- //0x1c:顯示整體右移
- #define functionset(temp) writeinstruc(temp)
- //temp取值如下:
- //0x20:4位,1行,5*7
- //0x24:4位,1行,5*10
- //0x28:4位,2行,5*7
- //0x2c:4位,2行,5*10
- //0x30:8位,1行,5*7
- //0x34:8位,1行,5*10
- //0x38:8位,2行,5*7
- //0x3c:8位,2行,5*10
- #define setCGRAM_Add(address) writeinstruc(0x40|address)
- #define setDDRAM_Add(address) writeinstruc(0x80|address)//短延時(shí)
- //void shortdelay(uchar i);
- //長(zhǎng)延時(shí)
- //void longdelay(uint i);
- //P2口初始化
- //void initP2(bit i);
- //寄存器選擇信號(hào)
- //void setRS(bit i);
- //讀寫(xiě)操作控制
- //void setRW(bit i);
- //使能信號(hào)
- //void setE(bit i);
- //讀BF以及AC的值
- //uint read_BF_AC();
- //判忙
- //bit statuscheck();
- //寫(xiě)指令函數(shù)
- //void writeinstruc(uint instruc);
- //寫(xiě)數(shù)據(jù)到RAM
- //void writedata(uint data1);
- //從RAM中讀數(shù)據(jù)函數(shù)
- //uint readdata(void);
- //顯示程序 X為行號(hào),Y為列號(hào),date為要顯示的數(shù)據(jù)
- //void dispcharacter(int x,uint y,uint data1);
- //LCD復(fù)位函數(shù)
- //void LCDreset();
- #define uchar unsigned char
- uchar k=0,result1;
- void shortdelay(uchar i)//短延時(shí)
- {
- for(;i>0;i--);
- }
- //長(zhǎng)延時(shí)
- void longdelay(uint i)
- {
- uint j;
- for(;i>0;i--)
- {for(j=100;j>0;j--);}
- }
- //延時(shí)程序
- void delay(int i)
- {int j;
- for(;i>0;i--)
- for(j=0;j<100;j++);
- }
- //初試狀態(tài)
- void io_init()
- {P1=0xff;
- }
- //?---------------------------鍵盤(pán)掃描部分-----------------------------//
- unsigned char key_scan()
- { unsigned char key;
- unsigned char temp;
- uint flag;
- io_init();
- P1=0xf0;
- flag=0;
- loop: temp=P1^0xf0;
- while(temp)
- {
- P1=0xfe;
- delay(1);
- if((P1&0xfe)!=0xfe)
- switch(P1)
- {
- case 0xee: key=0x11;flag=1;break;//讀7鍵和值
- case 0xde: key=0x12;flag=1;break;
- case 0xbe: key=0x13;flag=1;break;
- case 0x7e: key=0x14;flag=1;break;//讀除鍵的值
- }
- if(flag)
- goto exit;
- else
- P1=0xfd;
- delay(1);
- if((P1&0xfd)!=0xfd)
- switch(P1)
- {
- case 0xed: key=0x21;flag=1;break;
- case 0xdd: key=0x22;flag=1;break;
- case 0xbd: key=0x23;flag=1;break;
- case 0x7d: key=0x24;flag=1;break; //讀4到乘的鍵值
- }
- if(flag)
- goto exit;
- else
- P1=0xfb;
- delay(1);
- if((P1&0xfb)!=0xfb)
- switch(P1)
- {
- case 0xeb: key=0x31;flag=1;break;
- case 0xdb: key=0x32;flag=1;break;
- case 0xbb: key=0x33;flag=1;break;
- case 0x7b: key=0x34;flag=1;break;//讀1到減的鍵值
- }
- if(flag)
- goto exit;
- else
- P1=0xf7;
- delay(1);
- if((P1&0xf7)!=0xf7)
- switch(P1)
- {
- case 0xe7: key=0x41;flag=1;break;//后退
- case 0xd7: key=0x42;flag=1;break;//0
- case 0xb7: key=0x43;flag=1;break;//等于
- case 0x77: key=0x44;flag=1;break;//加
- }
-
- exit: return key;
- }
- if(temp==0)
- goto loop;
- }
- //---------------------------------鍵盤(pán)掃描完--------------------------------------------//
- //---------------------------------顯示初始化?----------------------------------------//
- //P0口初始化
- void initpindata(bit i)
- {
- if(i==1) pindata=0xff;
- else pindata=0X00;
- }
- //寄存器選擇信號(hào)
- void setRS(bit i)
- {
- if(i==1) pinRS=1;
- else pinRS=0;
- }
- //讀寫(xiě)操作控制
- void setRW(bit i)
- {
- if(i==1) pinRW=1;
- else pinRW=0;
- }
- //使能信號(hào)
- void setE(bit i)
- {
- if(i==1) pinE=1;
- else pinE=0;
- }
- //讀BF以及AC的值
- uint read_BF_AC()
- {
- uint temp;
- initpindata(1);
- setRS(0);
- setRW(1);
- setE(1);
- shortdelay(1);
- temp=pindata;
- shortdelay(10);
- setE(0);
- return(temp);
- }
- //判忙
- bit statuscheck()
- {
- return((bit)(read_BF_AC()&0x80));
- }
- //寫(xiě)指令函數(shù)
- void writeinstruc(uint instruc)
- {
- while(statuscheck());
- initpindata(0);
- setRS(0);
- setRW(0);
- setE(0);
- pindata=instruc;
- //short delay(1);
- setE(1);
- shortdelay(10);
- setE(0);
- }
- //寫(xiě)數(shù)據(jù)到RAM
- void writedata(uint data1)
- {
- initpindata(0);
- setRS(1);
- setRW(0);
- setE(0);
- pindata=data1;
- setE(1);
- shortdelay(10);
- setE(0);
- }
- //從RAM中讀數(shù)據(jù)函數(shù)
- uint readdata(void)
- {
- uint temp;
- initpindata(1);
- setRS(1);
- setRW(1);
- setE(1);
- shortdelay(1);
- temp=pindata;
- shortdelay(10);
- setE(0);
- return(temp);
- }
- //顯示程序 X為行號(hào),Y為列號(hào),date為要顯示的數(shù)據(jù)
- void dispcharacter(int x,uint y,uint data1)
- {
- uint temp;
- while(statuscheck());
- temp=y&0x0f;
- x&=0x01;
- if(x) temp|=0x40;
- setDDRAM_Add(temp);
- writedata(data1);
- // writedata(data1);
- }
- //LCD復(fù)位函數(shù)
- void LCDreset()
- {
- clearscreen();
- cursorreturn();
- }
- //LCD初始化
- void initLCD()
- {
- LCDreset();
- inputmode(0x06);//增量方式,不移位
- dispcontrol(0x0c);//顯示開(kāi),光標(biāo)關(guān),閃爍關(guān)
- functionset(0x38);//8位,2行,5*7
- }
- //-----------------------------------準(zhǔn)備工作完成-----------------------------------//
- //-----------------------------------計(jì)算器-----------------------------------------//
- compute(char key1,i)
- {
- signed char m,n,c,act;
- long int num1,num2,result;
- signed char str[4][4]={{'7','8','9','/'},
- {'4','5','6','*'},
- {'1','2','3','-'},
- {'c','0','=','+'}};
- signed char str1[11],string1[2];
- m=(key1&0xf0);
- m=m/16;
- m=m-1;
- n=key1&0x0f;
- n=n-1;
- c=str[m][n];
- sprintf(string1,"%c",c);
- strcat(str1,string1);
- if((c=='+')||(c=='-')||(c=='*')||(c=='/'))
- {
- act=c;
- num1=atoi(str1);
- memset(str1,0,11);
- memset(string1,0,2);
- }
- if(c=='=')
- {
- num2=atoi(str1);
- switch(act)
- {
- case'+':
- { if(k==0)
- {result=num1+num2;k++;break;}
- else
- {result+=num2;k++;break;}
- }
- case'-':
- {if(k==0)
- {result=num1-num2;k++;break;}
- else
- {result-=num2;k++;break;}
- }
- case'*':
- {if(k==0)
- {result=num1*num2;k++;break;}
- else
- {result*=num2;k++;break;}
- }
- case'/':
- {if(k==0)
- {result=num1/num2;k++;break;}
- else
- { result/=num2;k++;break;}
- }
- }
- }
- if(c=='c')
- {
- act=0;
- num1=str1[0];
- num1=str1[8];
- memset(str1,0,11);
- memset(string1,0,2);
- num1=str1[0];
- num1=str1[8];
- k=0;
- }
- longdelay(350);
- switch(key1) //顯示部分
- {case 0x11: dispcharacter(0,i,'7');i++;break;
- case 0x12: dispcharacter(0,i,'8');i++; break;
- case 0x13: dispcharacter(0,i,'9');i++; break;
- case 0x14: dispcharacter(0,i,'/');i++;break;
- case 0x21: dispcharacter(0,i,'4');i++;break;
- case 0x22: dispcharacter(0,i,'5');i++;break;
- case 0x23: dispcharacter(0,i,'6');i++;break;
- case 0x24: dispcharacter(0,i,'*');i++;break;
- case 0x31: dispcharacter(0,i,'1');i++;break;
- case 0x32: dispcharacter(0,i,'2');i++;break;
- case 0x33: dispcharacter(0,i,'3');i++;break;
- case 0x34: dispcharacter(0,i,'-');i++;break;
- case 0x41: clearscreen(); break;
- case 0x42: dispcharacter(0,i,'0');i++;break;
- case 0x43: dispcharacter(0,i,'=');i++;
- m=result/10000;
- result1=result%10000;
- if(m!=0||result==0)
- {
- n=0;
- m=m+'0';
- dispcharacter(0,i,m);i++;
- }
- m=result1/1000;
- result1=result1%1000;
- if(m!=0||n==0)
- {
- m=m+'0';
- n=0;
- dispcharacter(0,i,m);i++;
- }
- m=result1/100;
- result1=result1%100;
- if(m!=0||n==0)
- {
- m=m+'0';
- n=0;
- dispcharacter(0,i,m);i++;
- }
- m=result1/10;
- result1=result1%10;
- if(m!=0||n==0)
- {
- m=m+'0';
- n=0;
- dispcharacter(0,i,m);i++;
- }
- m=result1;
- if(m!=0||n==0)
- m=m+'0';
- dispcharacter(0,i,m);i++;break;
- case 0x44: dispcharacter(0,i,'+');i++;break;
- }
- return(i);
- }
- //---------------------------------------------------------------------------------//
- //-------------------------------------主函數(shù)---------------------------------------//
- void main()
- {
- char key1,i;
- start:initpindata(0);
- P2=0X00;
- initLCD();
- i=0;
- scan:key1=key_scan();
- i=compute(key1,i);
- if(key1==0x41)
- goto start;
- else
- goto scan;
- }
復(fù)制代碼
所有資料51hei提供下載:
計(jì)算器仿真.zip
(95.86 KB, 下載次數(shù): 50)
2018-10-21 16:07 上傳
點(diǎn)擊文件名下載附件
|