『壹』 如何用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;
}
『貳』 51單片機用什麼軟體編程
開源軟體mcu8051ide 功能不是一般的強,用c語言編程,界面不輸給商業軟體,而且提供多種模擬器件如:led 數碼管,矩陣數碼管(8×8)按鍵,矩陣按鍵,甚至溫度感測器。開源的沒有任何限制,完全免費,自動生成多種燒錄文件(我們一般就用.HEX的)感覺keil c弱爆了。
安裝方法,下載sdcc(mcu8051ide是基於sdcc的)和mcu 8051 ide都安裝好就可以啦,頭文件在sdcc的安裝文件夾內(include)有些關鍵字要加兩個連在一起的下劃線比如 __interrup, __code.
頭文件與keil的不通用,比如定義P0口
在keil下是: sfr P0=0x80; 在sdcc下是: __sfr __at P0 0x80; 這個P0^1的不行,但sdcc裡面有很多頭文件8051.h 80c51.h 80c52.h等等 基本滿足要求,給stc單片機編程不用改,加一點特殊的就可以。這樣優秀的開源軟體不用真的是白不用啊。
『叄』 51單片機的編程問題
1:C51編譯器如何區分位地址和位元組地址
是靠預定義實現的,比如:sfr P0 = 0x80; sbit P0_0 = 0x80;前者聲明了P0埠地址位於0x80,後者說明了P0埠的bit0,即P0.0位於位地址空間0x80處。這2個0x80具有完全不同的含義,靠關鍵字sfr和sbit來區別。這樣當程序被編譯時,編譯器會依此編譯成相應的匯編語言。例如:
C51語句: P0 = 1;
P0聲明為sfr,因此編譯成:mov 80h,01h,將把0x01數據送入0x80單元,由於0x80單元物理上對應P0埠,因此,P0.0腳將輸出高電平(其實是呈現高阻態,P0口獨有的),其他.1-.7腳輸出低電平。
C51語句: P0_0 = 1;
P0_0聲明為sbit,因此編譯成:setb 80h,這將把位地址空間的0x80地址的bit的值置1。這個位正是P0口的bit0,執行後,P0.0將輸出高阻態。而P0.1-.7不會變化。
2:C51為什麼要嵌套匯編
51單片機一個顯著優點就是指令執行時間固定,因此可以適應時序要求嚴格的場合。例如符合ISO7816協議的cpu卡的讀寫,對時序要求比較嚴格。其實就是用io腳做出來的同步半雙工串口。支持cpu卡的程序一般比較龐大,需要用c51來組織,但是由於c編譯的不確定性,必須把底層程序封裝成匯編語言模塊嵌入到工程中。這就帶來幾個問題:如何聲明函數、參數如何傳遞等。限於篇幅,不能說得很細。下面舉例:
匯編程序單獨保存一個文件,加入到工程中,函數如下:
_proc_a:
mov a, r7
inc a
mov r7, a
ret
用c語言在.h文件中聲明: extern unsigned char proc_a(unsigned char val);
調用時形如: retvalue = proc_a(0x11);
說明:
a:匯編程序如果帶參數,則需要在匯編程序前多加一個下劃線。而聲明它的地方不用加(偉福編譯器這么要求的)。
b:函數的形參中第一參數用R7傳遞,函數返回值用R7返回,這是C51的通用規范。其他參數都有相應規定。函數可以返回一個位,用psw的c位返回。c:上面的語句,執行順序是把0x11給R7,然後跳轉子程序,子程序將它加1後送回。
d:函數跳轉到匯編程序時,本區的R0-R7,A,B,PSW,DPTR等寄存器可以供子程序使用,不必考慮調用後是否要恢復這些常規資源。上例中,A的值被函數使用了,編程者不必恢復調用前的值。