|
單片機(jī)課程設(shè)計(jì)報(bào)告書(shū) 設(shè)計(jì)題目:基于51單片機(jī)的簡(jiǎn)易計(jì)算器 學(xué)生姓名: 學(xué)生學(xué)號(hào): 所在班級(jí): 自動(dòng)化 指導(dǎo)教師: 目錄 引言 3 第一章 設(shè)計(jì)目的及方案 1.設(shè)計(jì)目的 3 2.設(shè)計(jì)方案 3 第二章 硬件基礎(chǔ) 1.AT89S52簡(jiǎn)介 4 2.L1602簡(jiǎn)介 4 3.4*4鍵盤(pán)矩陣簡(jiǎn)介 5 第三章 程序設(shè)計(jì) 6 第四章 系統(tǒng)總述 1.系統(tǒng)流程圖 11 2.系統(tǒng)電路圖 12 3.實(shí)物連接圖 12 第五章 總結(jié)體會(huì) 13 引言 眾所周知單片機(jī)是一種集成在電路芯片,是采用超大 規(guī)模集成電路技術(shù)把具有數(shù)據(jù)處理能力的中央處理器CPU隨機(jī)存儲(chǔ)器RAM、只讀存儲(chǔ)器ROM、多種I/O口和中斷系統(tǒng)、定時(shí)器/計(jì)時(shí)器等功能(可能還包括顯示驅(qū)動(dòng)電路、脈寬調(diào)制電路、模擬多路轉(zhuǎn)換器、A/D轉(zhuǎn)換器等電路)集成到一塊硅片上構(gòu)成的一個(gè)小而完善的計(jì)算機(jī)系統(tǒng)。 目前,一個(gè)學(xué)習(xí)與應(yīng)用單片機(jī)的高潮正在工廠、學(xué)校及企事業(yè)單位大規(guī)模地興起。過(guò)去習(xí)慣于傳統(tǒng)電子領(lǐng)域的工程師、技術(shù)員正面臨著全新的挑戰(zhàn),如不能在較短時(shí)間內(nèi)學(xué)會(huì)單片機(jī),勢(shì)必會(huì)被時(shí)代所遺棄,只有勇敢地面對(duì)現(xiàn)實(shí),挑戰(zhàn)自我,加強(qiáng)學(xué)習(xí),爭(zhēng)取在較短的時(shí)間內(nèi)將單片機(jī)技術(shù)融會(huì)貫通,才能跟上時(shí)代的步伐。 它所給人帶來(lái)的方便也是不可否定的,它在一塊芯片內(nèi)集成了計(jì)算機(jī)的各種功能部件,構(gòu)成一種單片式的微型計(jì)算機(jī)。20世紀(jì)80年代以來(lái),國(guó)際上單片機(jī)的發(fā)展迅速,其產(chǎn)品之多令人目不暇接,單片機(jī)應(yīng)用不斷深入,新技術(shù)層出不窮。20世紀(jì)末,電子技術(shù)獲得了飛速的發(fā)展,在其推動(dòng)下,現(xiàn)代電子產(chǎn)品幾乎滲透了社會(huì)的各個(gè)領(lǐng)域,有力地推動(dòng)了社會(huì)生產(chǎn)力的發(fā)展和社會(huì)信息化程度的提高,同時(shí)也使現(xiàn)代電子產(chǎn)品性能進(jìn)一步提高,產(chǎn)品更新?lián)Q代的節(jié)奏也越來(lái)越快。 設(shè)計(jì)目的: 本設(shè)計(jì)要制作的是單片機(jī)于生活中最為常見(jiàn)的一種應(yīng)用—簡(jiǎn)易計(jì)算器。這要求我們以單片機(jī)為核心,在熟悉、掌握各種外圍接口電路芯片的工作原理和控制方法的前提下根據(jù)所學(xué)的知識(shí)以及編寫(xiě)程序來(lái)選取合適的器件設(shè)計(jì)簡(jiǎn)易計(jì)算器使之實(shí)現(xiàn)加減乘除以及清零的功能。 設(shè)計(jì)方案: 根據(jù)計(jì)算器的功能要求,選擇AT89C51為主控機(jī),通過(guò)擴(kuò)展必要的外圍接口電路,實(shí)現(xiàn)對(duì)計(jì)算器的設(shè)計(jì)。外部主要由4*4矩陣鍵盤(pán)和一個(gè)液晶顯示屏構(gòu)成,內(nèi)部由一塊AT89S52單片機(jī)構(gòu)成。計(jì)算器電路包括四個(gè)部分:選用LCD作為顯示部分,矩陣鍵盤(pán)作為輸入部分,運(yùn)算模塊,單片機(jī)控制部分。模塊圖如圖所示: 
本簡(jiǎn)易計(jì)算器AT89S52單片機(jī)作為核心。簡(jiǎn)易計(jì)算器顯示電路由LCD1602組成, 制作一個(gè)單片機(jī)計(jì)時(shí)裝置需要的材料需要有軟硬件的支持,硬件方面AT89S52單片機(jī),晶振,液晶屏LCD1602,鍵盤(pán)等部分構(gòu)成。軟件部分在keil環(huán)境下用C語(yǔ)言編寫(xiě)。本系統(tǒng)可進(jìn)行簡(jiǎn)易的計(jì)算。電路采用AT89S52單片機(jī)作為核心,功耗小,能在3V的低壓工作,電壓可選用3~5V電壓供電。 第二章 硬件基礎(chǔ) 1.AT89S52簡(jiǎn)介: 主要性能:
與MCS-51單片機(jī)產(chǎn)品兼容 8K字節(jié)在系統(tǒng)可編程Flash存儲(chǔ)器 1000次擦寫(xiě)周期 全靜態(tài)操作:0Hz~33MHz 三級(jí)加密程序存儲(chǔ)器 32個(gè)可編程I/O口線 三個(gè)16位定時(shí)器/計(jì)數(shù)器 八個(gè)中斷源 全雙工UART串行通道 低功耗空閑和掉電模式 掉電后中斷可喚醒 看門(mén)狗定時(shí)器 雙數(shù)據(jù)指針 掉電標(biāo)識(shí)符 功能特性描述: AT89S52是一種低功耗、高性能CMOS8位微控制器,具有8K 在系統(tǒng)可編程Flash 存儲(chǔ)器。使用Atmel 公司高密度非易失性存儲(chǔ)器技術(shù)制造,與工業(yè)80C51 產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲(chǔ)器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得AT89S52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。 AT89S52具有以下標(biāo)準(zhǔn)功能: 8k字節(jié)Flash,256字節(jié)RAM,32 位I/O 口線,看門(mén)狗定時(shí)器,2 個(gè)數(shù)據(jù)指針,三個(gè)16 位定時(shí)器/計(jì)數(shù)器,一個(gè)6向量2級(jí)中斷結(jié)構(gòu),全雙工串行口,片內(nèi)晶振及時(shí)鐘電路。另外,AT89S52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式。空閑模式下,CPU停止工作,允許RAM、定時(shí)器/計(jì)數(shù)器、串口、中斷繼續(xù)工作。掉電保護(hù)方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機(jī)一切工作停止,直到下一個(gè)中斷或硬件復(fù)位為止。 2.1602液晶顯示器簡(jiǎn)介: 液晶(Liquid Crystal)是一種高分子材料,因其特殊的物理、化學(xué)、光學(xué)特性,廣泛應(yīng)用輕薄顯示器上。 液晶顯示器(Liquid Crystal Display,LCD)的主要原理是以電流刺激液晶分子產(chǎn)生點(diǎn)、線、面并配合背部燈管構(gòu)成畫(huà)面。 各種型號(hào)的液晶通常是按照顯示字符的行數(shù)或液晶點(diǎn)陣的行、列數(shù)來(lái)命名。例如,1602表示每行顯示16個(gè)字符,一共可以顯示兩行。這類液晶通常稱為字符型液晶,只能顯示ASCII碼字符。12232表示液晶顯示畫(huà)面由122列、32行組成,共有122*32個(gè)點(diǎn)來(lái)顯示各種圖形。用戶可以通過(guò)程序控制這些點(diǎn)中任何一個(gè)點(diǎn)顯示或不顯示,從而構(gòu)成各種圖形畫(huà)面。因此,12232稱為圖形型液晶。 液晶體積小,功耗低,顯示操作簡(jiǎn)單。但其有致命的弱點(diǎn),即使用溫度范圍很窄。通用型液晶工作溫度為0到+55攝氏度,存儲(chǔ)溫度為-20到+60攝氏度。 主要參數(shù): 顯示容量:16*2個(gè)字符 芯片工作電壓:4.5~5.5V 工作電流:2.0mA 模塊最佳工作電壓:5.0V 字符尺寸:2.95*4.35(WXH)mm RAM地址映射圖: 
向圖中的 00~0F、40~4F 地址中的任意處寫(xiě)入顯示數(shù)據(jù)時(shí),液晶可立即顯示出來(lái); 當(dāng)寫(xiě)入到 10~27 或 50~67 地址時(shí),必須通過(guò)移屏指令將他們一移入可顯示區(qū)域方可正常 顯示。 實(shí)驗(yàn)箱4*4鍵盤(pán)實(shí)物圖: 4*4鍵盤(pán)電路圖:  
編碼后按鍵功能:

3.實(shí)物連接圖: 
單片機(jī)是我所學(xué)專業(yè)的主要課程之一,不僅培養(yǎng)了我綜合運(yùn)用所學(xué)知識(shí),發(fā)現(xiàn),提出,分析和解決實(shí)際問(wèn)題的能力,而且提高了我實(shí)際動(dòng)手操作能力.現(xiàn)實(shí)生活中,單片機(jī)在應(yīng)用可以說(shuō)得是無(wú)處不在。因此在大學(xué)中說(shuō)掌握單片機(jī)的開(kāi)發(fā)技術(shù)是十分重要的,也是十分必要的。 我在剛剛拿到課程設(shè)計(jì)題目時(shí)有點(diǎn)迷惘,畢竟在前幾周的理論學(xué)習(xí)中沒(méi)有扎實(shí)的掌握單片機(jī)的理論知識(shí),面對(duì)芯片和五顏六色的導(dǎo)線,不知道如何下手,好在通過(guò)上網(wǎng)和圖書(shū)館查閱相關(guān)資料,自己認(rèn)真鉆研以及虛心詢問(wèn)同學(xué),終于解決了一個(gè)又一個(gè)的困難和障礙,成功完成了任務(wù)。 通過(guò)本次的單片機(jī)課程設(shè)計(jì),不僅豐富了我的理論知識(shí),而且在實(shí)踐過(guò)程中更令我學(xué)會(huì)了堅(jiān)持、耐心和努力。此次單片機(jī)課程設(shè)計(jì)需要運(yùn)用到許多之前所學(xué)過(guò)的知識(shí),令我認(rèn)識(shí)到自己以前學(xué)習(xí)的一些不足之處,例如對(duì)以前所學(xué)知識(shí)的理解不夠深刻,掌握得不夠牢固,運(yùn)用不夠靈活。這讓我懂得了認(rèn)真學(xué)習(xí)的重要性,以及要孜孜不倦地鉆研所學(xué)過(guò)的知識(shí),做得融會(huì)貫通,不能一覽而過(guò),不求甚解。在邊學(xué)習(xí)邊動(dòng)手的過(guò)程中,我對(duì)AT89S52單片機(jī)的構(gòu)造以及原理有了進(jìn)一步的了解,同時(shí)也加深和鞏固了我對(duì)單片機(jī)匯編語(yǔ)言的認(rèn)識(shí)。除此之外,由于是第一次做單片機(jī),因此在此次課程設(shè)計(jì)的過(guò)程中,無(wú)論是電路繪制還是匯編語(yǔ)言編寫(xiě)都難免遇到了不少困難和障礙,例如匯編語(yǔ)言編寫(xiě)出錯(cuò)、電路元件無(wú)從入手等。在面對(duì)困難和障礙時(shí),我慶幸自己沒(méi)有選擇退縮和逃避,而是通過(guò)各種方法,迎難而上,以堅(jiān)持、耐心和努力勇敢無(wú)畏地面對(duì)困難,克服困難,解決困難。讓我發(fā)現(xiàn)問(wèn)題、分析問(wèn)題、解決問(wèn)題以及動(dòng)手實(shí)踐的能力都有了很大的提高,并了解到理論知識(shí)與實(shí)踐相結(jié)合的重要意義。 從這次的課程設(shè)計(jì)中,我才真正明白理論結(jié)合實(shí)際的道理,在以后的學(xué)習(xí)中,更要把理論聯(lián)系實(shí)際,把我們所學(xué)的理論知識(shí)用到實(shí)際當(dāng)中,學(xué)習(xí)單機(jī)片機(jī)即是如此,出色的程序最終用實(shí)際操作來(lái)實(shí)現(xiàn)才是完美。十分慶幸擁有這次課程設(shè)計(jì),讓我受益匪淺。
單片機(jī)源程序如下:
- #include<reg52.h>
- #include<stdio.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define CHECK_BUSY
- sbit RS = P2^4;
- sbit RW = P2^5;
- sbit EN = P2^6;
- void Delay10ms(unsigned int c)
- {
- unsigned char a,b;
- for (;c>0;c--)
- {
- for(b=38;b>0;b--)
- {for(a=130;a>0;a--);
- }
- }
- }
- //判忙函數(shù)
- bit LCD_Check_Busy()
- {
- #ifdef CHECK_BUSY
- P0= 0xFF;
- RS=0;
- RW=1;
- EN=0;
- _nop_();
- EN=1;
- return (bit)(P0 & 0x80);
- #else
- return 0;
- #endif
- }
- //命令函數(shù)
-
- void write_com(uchar com)
- {
- while(LCD_Check_Busy());
- RS=0;
- RW=0;
- EN=1;
- P0= com;
- _nop_();
- EN=0;
- }
- //數(shù)據(jù)函數(shù)
-
- void write_dat(uchar dat)
- {
- while(LCD_Check_Busy());
- RS=1;
- RW=0;
- EN=1;
- P0= dat;
- _nop_();
- EN=0;
- }
- //字符函數(shù)
-
- void LCD_Write_Char(uchar x,uchar y,uchar dat)
- {
- if (y == 0)
- {
- write_com(0x80 + x);
- }
- else
- {
- write_com(0xC0 + x);
- }
- write_dat( dat);
- }
- //字符串函數(shù)
- void Write_String(uchar x,uchar y,uchar *s)
- {
-
- while (*s)
- {
- LCD_Write_Char(x,y,*s);
- s++;
- x++;
- }
- }
- //初始化函數(shù)
-
- void LCD_Init()
- {
- write_com(0x38);
- Delay10ms(20);
- write_com(0x06);
- Delay10ms(20);
- write_com(0x0C);
- write_com(0x01);
- }
- //按鍵掃描函數(shù)
-
- uchar KeyScan()
- {
- unsigned char cord_h,cord_l;
- P3=0x0f;
- cord_h=P3&0x0f;
- if(cord_h!=0x0f)
- {
- Delay10ms(40);
- if((P3& 0x0f)!=0x0f)
- {
- cord_h=P3&0x0f;
- P3=cord_h|0xf0;
- cord_l=P3&0xf0;
- while((P3&0xf0)!=0xf0);//等待松開(kāi)并輸出
- return(cord_h+cord_l);//鍵盤(pán)最后組合碼值
- }
- }
- return(0xff);
- }
- unsigned char KeyPro()
- {
- switch(KeyScan())
- {
- case 0x7e:return '1';break;//按下相應(yīng)的鍵所顯示相應(yīng)的值
- case 0x7d:return '2';break;
- case 0x7b:return '3';break;
- case 0x77:return '+';break;
- case 0xbe:return '4';break;
- case 0xbd:return '5';break;
- case 0xbb:return '6';break;
- case 0xb7:return '-';break;
- case 0xde:return '7';break;
- case 0xdd:return '8';break;
- case 0xdb:return '9';break;
- case 0xd7:return 'x';break;
- case 0xee:return '0';break;
- case 0xed:return '.';break;
- case 0xeb:return '=';break;
- case 0xe7:return '/';break;
- default:return 0xff;break;
- }
- }
- main()
- {
- unsigned char num,i,sign;
- unsigned char temp[16];
- bit firstflag;
- float a=0,b=0;
- unsigned char s;
- LCD_Init(); //初始化液晶屏
- Delay10ms(40);//延時(shí)
- write_com(0x01);
- Write_String(0,0,"I LIKE MCU");
- Write_String(0,1,"HBKJXY");
- for(s=0;s<25;s++)
- Delay10ms(300);
- write_com(0x01);
- while (1) //主循環(huán)
- {
- num=KeyPro(); //掃描鍵盤(pán)
- if(num!=0xff) //如果掃描是按鍵有效值則進(jìn)行處理
- {
- if(i==0)
- write_com(0x01);
- if(('+'==num)|| (i==16) || ('-'==num) || ('x'==num)|| ('/'==num) || ('='==num))//輸入數(shù)字最大值16,輸入符號(hào)表示輸入結(jié)束
- {
- i=0;
- if(firstflag==0)
- {
- sscanf(temp,"%f",&a);
- firstflag=1;
- }
- else
- sscanf(temp,"%f",&b);
- for(s=0;s<16;s++)
- temp[s]=0;
- LCD_Write_Char(0,1,num);
-
- if(num!='=') //判斷當(dāng)前符號(hào)位并做相應(yīng)處理
- sign=num;
- else
- {
- firstflag=0; //檢測(cè)到輸入=號(hào),判斷上次讀入的符號(hào)
- switch(sign)
- {
- case '+':a=a+b;
- break;
- case '-':a=a-b;
- break;
- case 'x':a=a*b;
- break;
- case '/':a=a/b;
- break;
- default:break;
- }
- sprintf(temp,"%g",a);
- Write_String(1,1,temp);//顯示到液晶屏
- sign=0;a=b=0; //數(shù)據(jù)清零
- for(s=0;s<16;s++)
- temp[s]=0;
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
基于51單片機(jī)的簡(jiǎn)易計(jì)算器 .docx
(422.11 KB, 下載次數(shù): 32)
2018-4-21 20:42 上傳
點(diǎn)擊文件名下載附件
51單片機(jī)
|