A. 單片機用c語言編寫計算器如何實現大於65535的數字加減乘除
用長整型變數(四位元組),或者手動實現進位。
編譯系統一般已經在內部實現了雙位元組或四位元組的數值類型轉換。
有問題HI上找我。
B. 單片機c的加法為什麼會比減法運算速度慢
加法減法是一樣的,造成兩個循環時間不同的原因,不是出在增減上,而是判斷上。
兩個for 的結束循環判斷,第一個是跟50000比較,第二個是跟0比較,在匯編中,跟0比較是省時間的。
你要是看的懂匯編代碼的話,你可以在編譯出來LST文件中看看它們的不同。
C. 單片機C語言加減法指令怎麼算時間
用C沒法具體算,如果是51的話,stc下載器又在帶算延時函數生成;也可以用示波器慢慢自己測,也可以網路一下看看有誰上傳過此類晶元的延時函數
D. 51單片機C語言編程兩個按鍵加減顯示0-99的加減,求程序,自己編的有警告,不知道哪裡錯了
你硬體我都不知到怎麼給你寫,是用數碼管顯示還是液晶顯示。
你還是把程序貼上來我給你找找錯誤吧
E. 51單片機C語言程序4個獨立按鍵實現對數碼管數字顯示的加減清零等
#include<reg52.h>
//P0是數碼管。P1是LED.P2是按鍵
sbitKEY_OUT_1=P2^3;
sbitKEY_OUT_2=P2^2;
sbitKEY_OUT_3=P2^1;
sbitKEY_OUT_4=P2^0;
#defineucharunsignedchar
#defineulintunsignedlong
#defineFrequency10//定時器中斷時間=f*T
#defineTime1//一個周期1ms
#defineTubeNumber6//數碼管個數
#defineKeyLine4//矩陣按鍵行數
#defineKeyColumn4//矩陣按鍵列數
//數碼管真值表
ucharcodeLED_Number[]={0x0C,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//ucharcodeLED_Alphabet[]={0x88,0x83,0xC6,0xA1,0x86,0x8E,0x89,0xC7,0x8C,0xC1,0x91,0x9C};
/*0~9
A~F(b、d為小寫)HLPUyo*/
ucharLED_Buff[TubeNumber]={0xff,0xff,0xff,0xff,0xff,0xff};
/*數碼管顯示緩沖區,0xff確保初始時都不亮.
不可寫成ucharcodeLED_Buff[]。code定義變數寫入room,不可修改*/
//矩陣按鍵編號到標准盤碼的映射表
ucharcodeKeyCodeMap[4][4]={
(0x31,0x32,0x33,0x26),//數字鍵1、數字鍵2、數字鍵3、向上鍵
(0x34,0x35,0x36,0x25),//數字鍵4、數字鍵5、數字鍵6、向左鍵
(0x37,0x38,0x39,0x28),//數字鍵7、數字鍵8、數字鍵9、向下鍵
(0x30,0x1B,0x0D,0x27)};//數字鍵0、ESC鍵、回車鍵、向右鍵
ucharStaFlag[KeyLine][KeyColumn]={(1,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,1,1)};//按鍵是否穩定標志
voidStartTime0();
voidTubeDisplay(ulintsec);
ulintpow(x,y);
voidTubeScan();
voidKeyAction(ucharkeycode);
voidKeyDriver();
voidKeyScan();
voidmain()
{
P1=0x08;//使能U3,選擇數碼管。
StartTime0();
while(1)KeyDriver();
}
//定時器0啟動函數
voidStartTime0()
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-Time*100)/256;
TL0=(65536-Time*100)%256;
PT0=1;
/*定時器0優先中斷控制位。
IP這個寄存器的每一位,表示對應中斷的搶占優先順序,每一位的復值都是0,當我們把某一位設置為1的時候,這一位優先順序就比其它位的優先順序高了。
比如我們設置了PT0位為1後,當單片機在主循環或其他中斷程序執行時,一旦TO發生中斷,作為更高優先順序,程序馬上執行T0.若在T0程序執行時,
其他中斷程序發生中斷,仍執行TO直到T0中斷結束後再執行其他程序。
*/
}
//中斷服務函數
voidTo_time0()interrupt1using0
{
staticucharcnt;//記錄TO中斷次數
// staticulintsec;//記錄經過秒速
//判斷是否溢出
if(TF0==1)
{
TF0=0;
TH0=(65536-Time*100)/256;
TL0=(65536-Time*100)%256;
}
if(cnt>=Frequency)
{
cnt=0;
//sec++;
// Tube_Display(sec);
TubeScan();
KeyScan();
}
}
//數碼管顯示函數
voidTubeDisplay(ulintnom)
{
ucharm=2;//小數部分位數
uchari;//傳輸索引
//秒速達到上限清零
if(nom>pow(10,TubeNumber-m))nom=0;
//分別傳輸小數部分和整數部分
for(i=0;i<m;i++)
LED_Buff[i]=LED_Number[nom/pow(10,i)%10];
for(i=0;i<(TubeNumber-m);i++)
LED_Buff[i+m]=LED_Number[nom/pow(10,i)%10];
//點亮小數點
LED_Buff[m]&=0x7f;
}
//平方運算函數
ulintpow(x,y)//x為底,為冪
{
ulintp,i=1;
//平方運算
for(i=1;i<=y;i++)
p*=x;
//輸出結果
returnp;
}
//數碼管動態函數
voidTubeScan()
{
staticuchari=0;//動態掃描索引
//關閉所有段選位,數碼管消隱
P0=0xff;
//for(i=0;i<Tube_number;i++)
P1=(P1&0xf8)|i;//位選索引賦值到P1口低3位
P0=LED_Buff[i];//緩沖區中的索引位置數據傳輸到P0口
if(++i>=TubeNumber)i=0;//索引遞增循環,遍歷整個緩沖區
}
//矩陣按鍵動作函數
voidKeyAction(ucharkeycode)
{
staticulintresult;
ulintnom=0;
//輸入數字0~9
if((keycode>=0x30)&&(keycode<=39))
{
nom=(nom*10)+(keycode-0x30);//十進制整體左移,新數進入各位
TubeDisplay(nom);
}
//輸入方向鍵
if((keycode>=0x25)&&(keycode<=28))
switch(keycode)
{
case0x26:result+=nom;nom=0;TubeDisplay(result);
case0x28:result-=nom;nom=0;TubeDisplay(result);
case0x25:result=1;result*=nom;nom=0;TubeDisplay(result);
case0x27:result=1;result/=nom;nom=0;TubeDisplay(result);
}
elseif(keycode==0x0d)TubeDisplay(result);//輸入回車鍵,輸出最終結果
elseif(keycode==0x1b)//輸入ESC鍵,清零
{
nom=result=0;
TubeDisplay(nom);
}
}
//矩陣按鍵驅動函數
voidKeyDriver()
{
ucharl,c;
staticucharbackup[KeyLine][KeyColumn]={(1,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,1,1)};//按鍵值備份,保存前一次值
for(l=0;l<KeyLine;l++)
{
for(c=0;c<KeyColumn;c++)
{
if(backup[l][c]!=StaFlag[l][c])
{//檢測按鍵動作
if(backup[l][c]==1)//按鍵按下時執行
KeyAction(KeyCodeMap[l][c]);//調用動作函數
backup[l][c]=StaFlag[l][c];//刷新前一次備份值
}
}
}
}
//矩陣按鍵掃描函數
voidKeyScan()
{
ucharl=0;//矩陣按鍵掃描輸出索引
ucharc=0;//矩陣按鍵掃描列索引
ucharkeybuff[KeyLine][KeyColumn]={(0xff,0xff,0xff,0xff),(0xff,0xff,0xff,0xff),
(0xff,0xff,0xff,0xff),(0xff,0xff,0xff,0xff)};//矩陣按鍵掃描緩沖區
//將一行的四個按鍵移入緩沖區
for(l=0;l<KeyColumn;l++)
keybuff[l][c]=((0xfe|(P2>>(4+l))&0x01));
//按鍵消抖
for(l=0;l<KeyLine;l++)
{
if((keybuff[l][c]&0x0f)==0x00)//連續4次掃描都為0,判斷4*4ms內都是按下狀態,可認為按鍵已穩定按下
StaFlag[l][c]=0;
elseif((keybuff[l][c]&0x0f)==0x0f)//連續4次掃描都為1,判斷4*4ms內都是彈起狀態,可認為按鍵已穩定彈起
StaFlag[l][c]=1;
}
for(c=0;c<KeyColumn;c++)
{
switch(c)//根據索引,釋放當前輸出腳拉低下次的根據索引
{
case0:KEY_OUT_4=1;KEY_OUT_1=0;break;
case1:KEY_OUT_1=1;KEY_OUT_2=0;break;
case2:KEY_OUT_2=1;KEY_OUT_3=0;break;
case3:KEY_OUT_3=1;KEY_OUT_4=0;break;
default:break;
}
}
}
F. 51單片機中如何用C語言實現兩個測量量的相加減
51單片機
中用C語言實現兩個測量量的相加減,是最簡單的計算了,設兩個測量的數據分別為x1,x2,總量為x0,則相加計算,x0=x1+x2,相減計算,x0=x1-x2。
G. 有無52單片機學的很明白的人,幫我講一個程序,是C語言十以內的加減乘除計算器
計算器上的按鍵都對應一個矩陣鍵盤按鍵這樣就像你做一般的處理一樣了,按下一個數a,當加號鍵按下時就執行a+num(設置變數),再按b,當按下=時 執行num=b,進而得到a+b的值,只是這種想法在執行=運算時就要就要有好幾種情況了,不過也算是一種方法吧,希望對你有幫組。
H. 單片機C語言 怎麼處理減法
用if語句判斷就可以了.
if(a>b)
{
}
else
{
}
I. 單片機(c語言):3個按鍵控制2個溫度的加減,其中有一個鍵是選擇哪個溫度,兩個鍵是分別加減。
其中有一個鍵是選擇哪個溫度,讓它控制一個標志位,每按一次這個鍵,標志位改變一次,標志位為0,選第一個溫度,為1選擇第二個溫度。
其餘兩個鍵加/減時,先根據標志位的選擇,再去加/減哪個溫度了。加/減溫度控制會吧。
J. 51單片機C語言編程時能不能比較兩個數的大小,能不能進行加減法運算
完全沒問題