『壹』 單片機做計算器的程序
1、直接調用庫函數。
『貳』 如何用51單片機做計算器(要求用C語言編程) 由於是新手所以沒積分 對不住各位了
給你參考一下的,我最近做的:
我的實驗板上的鍵不夠,所以只能做加法運算,而且兩數之和不能大於十。
嘿嘿,沒錯這個給某種人用的。
//**********myh.h***********有兩個文件,一個是頭文件myh.h一個是js.c
#include<reg52.h>
typedefunsignedcharuchar;
typedefunsignedintuint;
typedefbitBOOL;
//**
sbitrs=P2^6;
sbitrw=P2^5;
sbite=P2^7;
//**
ucharKey_Down(void);//返回0到12的鍵盤的編碼
voiddelay(uchar);//延時
voidInit(void);
voidWrite_Cmd(uchar);
voidWrite_Data(uchar);
BOOLIf_Busy();
//**
ucharcodeLcd_tab[]="0123456789+=";
ucharcodeKey_tab[]={0xb7,0xbb,0xbd,0xbe,0xd7,0xdb,0xdd,0xde,0xe7,0xeb,0xed,0xee};
//**********
uintQ0;
uintQ1;
uintQ2;
//*************js.c********
#include"myh.h"
//**************
voidmain()
{ucharm_key;
ucharm_inc=0;
Init();
Write_Cmd(0x80);
while(1)
{Q1=0;
Q0=0;
Q2=0;
m_key=Key_Down();
Write_Cmd(0x01);
Write_Data(Lcd_tab[m_key]);
Q0=m_key;
m_key=Key_Down();
Write_Data(Lcd_tab[m_key]);
m_key=Key_Down();
Write_Data(Lcd_tab[m_key]);
Q1=m_key;
m_key=Key_Down();
Write_Data(Lcd_tab[m_key]);
Q2=Q0+Q1;
Write_Data(Lcd_tab[Q2]);
}
}
//************************
ucharKey_Down(void)
{ucharKey_number=0;
ucharm_cx;
ucharm_cy;
ucharm_cxy;
P3=0x0f;
m_cx=P3;
while(1)
{if(m_cx!=0x0f)
{delay(500);
m_cx=P3;
if(m_cx!=0x0f)
break;}
else{P3=0x0f;m_cx=P3;}
}
P3=0x0f;
m_cx=P3&0x0f;
P3=0xf0;
m_cy=P3&0xf0;
m_cxy=m_cx|m_cy;
for(Key_number=0;Key_number<12;Key_number++)
{if(m_cxy==Key_tab[Key_number])
break;
}
returnKey_number;}
//**********
voiddelay(uchartime)
{ucharj;
for(;time>0;time--)
for(j=0;j<200;j++);
}
//**************
voidinit()
{delay(10);
Write_Cmd(0x38);
delay(10);
Write_Cmd(0x38);
delay(10);
Write_Cmd(0x38);
delay(10);
Write_Cmd(0x0c);
delay(10);
Write_Cmd(0x06);
delay(10);
Write_Cmd(0x01);
}
//***********
voidWrite_Cmd(ucharcmd)
{//while(If_Busy());
e=0;
rw=0;
rs=0;
delay(4);
P0=cmd;
delay(4);
e=1;
delay(10);
e=0;
}
//***
voidWrite_Data(uchardat)
{//while(If_Busy());
e=0;
rw=0;
rs=1;
delay(4);
P0=dat;
delay(4);
e=1;
delay(10);
e=0;
}
//**
BOOLIf_Busy()
{
BOOLresult;
rw=1;
rs=0;
e=1;
delay(4);
result=(BOOL)(P2&0x80);
e=0;
returnresult;
}
『叄』 單片機的簡易計算器
單片機計算器
基本功能介紹:
簡單的加減乘除的運算。
時間顯示功能,而且能實現計算器模塊和時間模塊之間的任意切換。
按鍵音卻換功能。
原理;
多功能單片機計算器是一個實現加減乘除的和時間功能的計算器,主要的硬體組成由,一個AT89s52單片機晶元,一個LED液晶(1602液晶),一個4*4鍵盤,和4個特殊功能按鍵。
一個時鍾晶元(DS1302),一個蜂鳴器。
單個硬體模塊個的介紹
AT89S52:
主要控制晶元,它是由8kflash,256BRAM,6個中斷源,詳情參考AT89S52的技術文檔.
1602液晶
1602液晶模塊內部的字元發生存儲器(CGROM)已經存儲了160個不同的點陣字元圖形,這些字元有:阿拉伯數字、英文字母的大小寫、常用的符號等,每一個字元都有一個固定的代碼,比如大寫的英文字母「A」的代碼是01000001B(41H),顯示時模塊把地址41H中的點陣字元圖形顯示出來,我們就能看到字母「A」,而且可以實現一些復雜的字元操作:1:清顯示,游標復位到地址00H位置,2:游標和顯示模式設置 游標移動方向,高電平右移,低電平左移,屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效 3:顯示開關控制,控制整體顯示的開與關,高電平表示開顯示,低電平表示關顯示,控制游標的開與關,高電平表示有游標,低電平表示無游標,控制游標是否閃爍,高電平閃爍,低電平不閃爍4:游標或顯示移位,高電平時移動顯示的文字,低電平時移動游標5:功能設置命令 DL:高電平時為4位匯流排,低電平時為8位匯流排 N:低電平時為單行顯示,高電平時雙行顯示 F: 低電平時顯示5x7的點陣字元,高電平時顯示5x10的點陣字元(高低電平在相應的指令上實現),詳情可參考1602的技術文檔。
1602採用標準的16腳介面: 第1腳:VSS為地電源第2腳:VDD接5V正電源第3腳:V0為液晶顯示器對比度調整端,接正電源時對比度最弱,接地電源時對比度最高,對比度過高時會產生「鬼影」,使用時可以通過一個10K的電位器調整對比度第4腳:RS為寄存器選擇,高電平時選擇數據寄存器、低電平時選擇指令寄存器。第5腳:RW為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和RW共同為低電平時可以寫入指令或者顯示地址,當RS為低電平RW為高電平時可以讀忙信號,當RS為高電平RW為低電平時可以寫入數據。第6腳:E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執行命令。 第7~14腳:D0~D7為8位雙向數據線。 第15~16腳:空腳。
1602液晶和單片機的接法
4*4鍵盤,和4個特殊功能按鍵
K(切換鍵) No(復位鍵)
(時間設置鍵) C(清除鍵) +
1 2 3 —
4 5 6 *
7 8 9 %(除)
—/+ 0 。 =
前4個為特殊功能鍵,
後十六個採用鍵盤掃描接法,
掃描原理:
首先給p3口賦11111110(0xfe),然後再讀取p3口的值,如果為11101110(0xee)說明是第一排第一個被按下,如果是11011110(0xde)說明是第一排第二個被按下,如果是10111110(0xbe)說明是第一排第三個被按下,如果是0111110(0x7e)說明是第一排第四個被按下,
判斷二三四排的按鍵,都採用同樣的方法,只要分別給P3口賦不同的值即可,在讀取p3口的值,在判斷。用這樣的方法即可實現4*4鍵盤的掃描,只要有鍵按下,就可以知道是那個鍵按下,通過這種方法可大大節省單片機的io口的資源。詳情可參考網上的鍵盤掃描原理
時鍾晶元(DS1302)
DS1302 是DALLAS 公司推出的涓流充電時鍾晶元內含有一個實時時鍾/日歷和31 位元組靜態RAM ,通過簡單的串列介面與單片機進行通信實時時鍾/日歷電路提供秒分時日日期月年的信息每月的天數和閏年的天數可自動調整時鍾操作可通過AM/PM 指示決定採用24 或12 小時格式DS1302 與單片機之間能簡單地採用同步串列的方式進行通信僅需用到三個口線1 RES 復位2 I/O 數據線3 SCLK串列時鍾時鍾/RAM 的讀/寫數據以一個位元組或多達31 個位元組的字元組方式
實時時鍾具有能計算2100 年之前的秒分時日日期星期月年的能力還有閏年調整的能力(詳情可參考DS1302的技術文檔
管腳描述
X1 X2 32.768KHz 晶振管腳
GND 地
RST 復位腳
I/O 數據輸入/輸出引腳
SCLK 串列時鍾
Vcc1,Vcc2 電源供電管腳
計算器工作大概流程