資料包:
單片機計算器仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
附 實驗成績登記表
實驗一:一位加法計算器實驗 實驗日期:2018年月日 實驗地點:第三實驗樓機房 指導教師: 一、實驗目的: 1. 熟悉鍵盤工作原理; 2. 掌握單片機針對行列式鍵盤的編程方法; 3. 掌握七段數碼管的顯示原理及控制原理。 二、實驗任務: 【實驗內容】 以4*4行列式鍵盤為例,設計程序讀取一位整數、“+”或者“-”運算符、另一位整數、“=”,然后在8位的七段數碼管上顯示出來。 【實驗基本要求】 1. 根據要求設計出電路,做好元件的選型,并作好用于仿真的電路圖; 2. 獨立設計出程序,調試后,并保證仿真實現結果; 3. 作出設計的PCB設計,在條件允許情況下,將作品制成實物; 4. 就設計寫出相應的實驗設計報告,從選型、電路連接、程序設計思路、程序調試、系統仿真測試。字數不得少于3000個。 三、實驗過程及實驗步驟:(手寫完成:要求寫出實驗步驟,要求書寫規范,字跡切勿潦草。)
實驗考核等級(手寫) |
| 說明:請依據學生完成情況考核,等級為A、B、C、D、0。 | |
| | |
| |
| |
| |
|
實驗二:基于單片機的人體反應速度測試儀設計 實驗日期:2018年月日 實驗地點:第三實驗樓機房 指導教師:一、實驗目的: 1. 理解單片機項目開發的過程; 2. 進一步掌握相關單片機外圍器件的驅動設計; 3. 掌握外圍電路的設計。 二、實驗任務: 【實驗內容摘要】 設計一個人體反應速度測試的儀器。測試者按下按鍵后,測試燈亮起,測試隨之開始。在測試過程中,測試者要注意觀察測試燈的變化,當看到測試燈熄滅時,測試者要迅速放開測試按鍵,單片機會在數碼管上顯示測試者的反應時間。若測試者在測試燈熄滅之前放開測試按鍵,則系統自動判為犯規,并顯示出錯信息。 【實驗基本要求】 1. 根據要求設計出電路,做好元件的選型,并作好用于仿真的電路圖; 2. 獨立設計出程序,調試后,并保證仿真實現結果; 3. 作出設計的PCB設計,在條件允許情況下,將作品制成實物; 4. 就設計寫出相應的實驗設計報告,從選型、電路連接、程序設計思路、程序調試、系統仿真測試。字數不得少于3000個。 三、實驗過程及實驗步驟:(手寫完成:要求寫出實驗步驟,要求書寫規范,字跡切勿潦草。)
實驗考核等級(手寫) |
| 說明:請依據學生完成情況考核,等級為A、B、C、D、0。 | |
| | |
| |
| |
| |
|
實驗三:自動換擋數字電壓表 實驗日期:2018年月日 實驗地點:第三實驗樓機房 指導教師:一、實驗目的: 1. 理解單片機項目開發的過程; 2. 進一步掌握相關單片機外圍器件的驅動設計; 3. 掌握外圍電路的設計。 二、實驗任務: 【實驗內容摘要】 設計一個數字電壓表,最大的測試范圍為0-20V,并且可以根據電壓的變化實現自動選擇0-0.2V、0-2V和0-20V三個檔位的自動更換,提高測量精度。 【實驗基本要求】 1. 根據要求設計出電路,做好元件的選型,并作好用于仿真的電路圖; 2. 獨立設計出程序,調試后,并保證仿真實現結果; 3. 作出設計的PCB設計,在條件允許情況下,將作品制成實物; 4. 就設計寫出相應的實驗設計報告,從選型、電路連接、程序設計思路、程序調試、系統仿真測試。字數不得少于3000個。 三、實驗過程及實驗步驟:(手寫完成:要求寫出實驗步驟,要求書寫規范,字跡切勿潦草。) 實驗考核等級(手寫) |
| 說明:請依據學生完成情況考核,等級為A、B、C、D、0。 | |
| | |
| |
| |
| |
|
實驗四:俄羅斯方塊游戲機的設計 實驗日期:2018年月日 實驗地點:第三實驗樓機房 指導教師:一、實驗目的: 1.理解單片機項目開發的過程; 2.進一步掌握相關單片機外圍器件的驅動設計; 3.掌握外圍電路的設計。 二、實驗任務: 【實驗內容摘要】 仿照現實的俄羅斯方塊游戲機,設計一個基于89C51的機器。 【實驗基本要求】 1. 根據要求設計出電路,做好元件的選型,并作好用于仿真的電路圖; 2. 獨立設計出程序,調試后,并保證仿真實現結果; 3. 作出設計的PCB設計,在條件允許情況下,將作品制成實物; 4. 就設計寫出相應的實驗設計報告,從選型、電路連接、程序設計思路、程序調試、系統仿真測試。字數不得少于3000個。 三、實驗過程及實驗步驟:(手寫完成:要求寫出實驗步驟,要求書寫規范,字跡切勿潦草。)
實驗考核等級(手寫) |
| 說明:請依據學生完成情況考核,等級為A、B、C、D、0。 | |
| | |
| |
| |
| |
|
單片機源程序如下:
- #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:顯示關,光標關,閃爍關
- //0x0c:顯示關,光標關,閃爍關
- //0x0d:顯示開,光標關,閃爍開
- //0x0e:顯示開,光標開,閃爍關
- //0x0f:顯示開,光標開,閃爍開
- #define dispshift(temp) writeinstruc(temp)
- //temp取值如下:
- //0x10:光標左移
- //0x14:光標右移
- //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)//短延時
- //void shortdelay(uchar i);
- //長延時
- //void longdelay(uint i);
- //P2口初始化
- //void initP2(bit i);
- //寄存器選擇信號
- //void setRS(bit i);
- //讀寫操作控制
- //void setRW(bit i);
- //使能信號
- //void setE(bit i);
- //讀BF以及AC的值
- //uint read_BF_AC();
- //判忙
- //bit statuscheck();
- //寫指令函數
- //void writeinstruc(uint instruc);
- //寫數據到RAM
- //void writedata(uint data1);
- //從RAM中讀數據函數
- //uint readdata(void);
- //顯示程序 X為行號,Y為列號,date為要顯示的數據
- //void dispcharacter(int x,uint y,uint data1);
- //LCD復位函數
- //void LCDreset();
- #define uchar unsigned char
- uchar k=0,result1;
- void shortdelay(uchar i)//短延時
- {
- for(;i>0;i--);
- }
- //長延時
- void longdelay(uint i)
- {
- uint j;
- for(;i>0;i--)
- {for(j=100;j>0;j--);}
- }
- //延時程序
- void delay(int i)
- {int j;
- for(;i>0;i--)
- for(j=0;j<100;j++);
- }
- //初試狀態
- void io_init()
- {P1=0xff;
- }
- //?---------------------------鍵盤掃描部分-----------------------------//
- 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;
- }
- //---------------------------------鍵盤掃描完--------------------------------------------//
- //---------------------------------顯示初始化?----------------------------------------//
- //P0口初始化
- void initpindata(bit i)
- {
- if(i==1) pindata=0xff;
- else pindata=0X00;
- }
- //寄存器選擇信號
- void setRS(bit i)
- {
- if(i==1) pinRS=1;
- else pinRS=0;
- }
- //讀寫操作控制
- void setRW(bit i)
- {
- if(i==1) pinRW=1;
- else pinRW=0;
- }
- //使能信號
- 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));
- }
- //寫指令函數
- 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);
- }
- //寫數據到RAM
- void writedata(uint data1)
- {
- initpindata(0);
- setRS(1);
- setRW(0);
- setE(0);
- pindata=data1;
- setE(1);
- shortdelay(10);
- setE(0);
- }
- //從RAM中讀數據函數
- uint readdata(void)
- {
- uint temp;
- initpindata(1);
- setRS(1);
- setRW(1);
- setE(1);
- shortdelay(1);
- temp=pindata;
- shortdelay(10);
- setE(0);
- return(temp);
- }
- //顯示程序 X為行號,Y為列號,date為要顯示的數據
- 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復位函數
- void LCDreset()
- {
- clearscreen();
- cursorreturn();
- }
- //LCD初始化
- void initLCD()
- {
- LCDreset();
- inputmode(0x06);//增量方式,不移位
- dispcontrol(0x0c);//顯示開,光標關,閃爍關
- functionset(0x38);//8位,2行,5*7
- }
- //-----------------------------------準備工作完成-----------------------------------//
- //-----------------------------------計算器-----------------------------------------//
- 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);
- }
- //---------------------------------------------------------------------------------//
- //-------------------------------------主函數---------------------------------------//
- 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;
- }
復制代碼
所有資料51hei提供下載:
計算器仿真.zip
(95.86 KB, 下載次數: 50)
2018-10-21 16:07 上傳
點擊文件名下載附件
|