⑴ 單片機 匯編語言如果要實現按鍵按下後連加或連減的效果,程序該怎麼編寫
匯編很久沒用過了,提供一下思路,供參考!
可採用計時的方式,檢測按鍵按下狀態超過2秒後,數據開始增大遞加遞減的步距(之前是每次加減1,增大後,每次加減10),松開按鍵後,計時器清零!
採用計次的方式也可以實現,按鍵後,數據遞加或遞減一次,延時300毫秒,再次檢測按鍵,未松開,繼續遞加,加滿5次後,開始增發遞加或遞減步距,松開按鍵後,計次清零!
⑵ 單片機中計算器程序c語言加減乘除怎麼寫
void mian(void)--寫錯了。
{
……
http://hi..com/do_sermon/item/a16790e1db9dded6ea34c986
⑶ 51單片機怎麼實現兩位數的加減
51單片機
51單片機是對所有兼容Intel 8051指令系統的單片機的統稱。該系列單片機的始祖是Intel的8004單片機,後來隨著Flash rom技術的發展,8004單片機取得了長足的進展,成為應用最廣泛的8位單片機之一,其代表型號是ATMEL公司的AT89系列,它廣泛應用於工業測控系統之中。很多公司都有51系列的兼容機型推出,今後很長的一段時間內將佔有大量市場。51單片機是基礎入門的一個單片機,還是應用最廣泛的一種。需要注意的是51系列的單片機一般不具備自編程能力。
中文名
51單片機
外文名
mcu
定義
兼容Intel 8031系統的單片機統稱
始祖
Intel公司始創的8004單片機
缺點
不具備自編程能力
快速
導航
功能
學習
模擬
區別
主要產品
*Intel(英特爾)的:80C31、80C51、87C51,80C32、80C52、87C52等;
*ATMEL(愛特梅爾)的:89C51、89C52、89C2051,89S51(RC),89S52(RC)等;
*Philips(飛利浦)、華邦、Dallas(達拉斯)、Siemens(西門子)等公司的許多產品;
STC(國產宏晶)單片機:89c51、89c52、89c516、90c516等眾多品牌。
功能
·8位CPU·4kbytes程序存儲器(ROM) (52為8K)
·128bytes的數據存儲器(RAM) (52有256bytes的RAM)
·32條I/O口線·111條指令,大部分為單位元組指令
·21個專用寄存器
·2個可編程定時/計數器·5個中斷源,2個優先順序(52有6個)
·一個全雙工串列通信口
·外部數據存儲器定址空間為64kB
·外部程序存儲器定址空間為64kB
·邏輯操作位定址功能·雙列直插40PinDIP封裝
·單一+5V電源供電
CPU:由運算和控制邏輯組成,同時還包括中斷系統和部分外部特殊功能寄存器;
RAM:用以存放可以讀寫的數據,如運算的中間結果、最終結果以及欲顯示的數據;
ROM:用以存放程序、一些原始數據和表格;
I/O口:四個8位並行I/O口,既可用作輸入,也可用作輸出
T/C:兩個定時/記數器,既可以工作在定時模式,也可以工作在記數模式;
五個中斷源的中斷控制系統;
一個全雙工UART(通用非同步接收發送器)的串列I/O口,用於實現單片機之間或單片機與微機之間的串列通信;
片內振盪器和時鍾產生電路,石英晶體和微調電容需要外接。最佳振盪頻率為6M—12M。
學習
作為一個初學者,如何單片機入門?
實際上,其實不需要多少東西,會簡單的C語言,知道51單片機的基本結構就可以了。一般的大學畢業生都可以了,自學過這2門課程的高中生也夠條件。設備上,一般是建議購買一個模擬器,例如,的「雙功能下載線」就具有良好的穩定性和較快的下載速度,上位機可擴展,可以下載更多的單片機及嵌入式晶元。通過實驗,這樣才可以進行實際的,全面的學習。日後在工作上,模擬器也大有用處。還有,一般光有模擬器是不行,還得有一個實際的電路,即學習板,如圖,即為,單片機最小系統。
⑷ 單片機加法程序
1L的程序怎麼看著都像是有問題。
要100以內的奇數相加,奇數就是1,3,5,7,9……99,一共50個數字,如果從1開始,那就是每次加2,重復49次到(2*49)+1=99,所以程序這樣簡單些:
ORG
0000H
CLR
A,
MOV
50H,
A
MOV
51H,
A
MOV
R2,
#01H
;從1開始
MOV
R3,#49
;重復49次
LOOP:
CLR
C
;么次進行加法前先清除C,以免出問題
MOV
A,
R2
ADD
A,
51H
MOV
51H,
A
CLR
A
ADDC
A,
50H
MOV
50H,
A
INC
R2
INC
R2
DJNZ
R3,
LOOP
SJMP
$
END
⑸ 單片機怎樣編寫加一減一
第一次按下設置鍵對第一個數碼管進行加減設置,再按下設置鍵對第二個數碼管進行加減數的設置,如此類推設置完第四個數碼管後再按下設置鍵表示完成設置,並對設置結果進行保存。
⑹ 在學習51單片機:s1,s2,控制加減,在數碼管顯示0-99的程序怎麼寫 謝謝
ORG 0000H
AJMP MAIN
ORG 30H
MAIN: MOV R1,#0
XUNH:
LCALL DISP
LCALL DELAY
INC R1
CJNE R1,#100,XUNH
AJMP MAIN
;顯示P1口十位P2口個位,這樣做就怎麼也不會閃爍了把
DISP: MOV DPTR,#TAB ;共陰
MOV A,R1
MOV B,#10
MUL AB
MOV A
MOVC A,@A+DPTR
MOV P1,A
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
;延時1s,要精確延時可以稍微調一下數值
DELAY:MOV R2,#25
DEL1: MOV R3,#100
DEL2: MOV R4,#200
DEL3: DJNZ R4,$
DJNZ R3,DEL2
DJNZ R2,DEL1
RET
END
;做動態顯示也可以,人眼是看不出閃爍的。那樣會省點口線,嘿嘿反正你只有2個 數碼管沒別的東西,就乾脆做個靜態的咯。怎麼也閃爍不了的
⑺ 一個簡單51單片機加法程序問題
說錯了唄。——要知道 221bH是一個16位(bit)的(16進制)數,41h只是一個8位(bit)的存儲單元,怎麼可能放得下這么大個數呢?
正確說法應該是:把221bh存放到41h、40h兩個連續的存儲單元中。
⑻ 8位單片機怎麼實現32位加減法
你說的實現32位加減法指的是雙位元組的運算吧.
;雙位元組減法子程序
;參數:R6R5,R4R3
;返回:R2R3
DSUB:
MOV
A,R5
CLR
C
SUBB
A,R3
MOV
R3,A
MOV
A,R6
SUBB
A,R4
MOV
R2,A
RET
;雙位元組加法子程序
;參數:R6R5,R4R3
;返回:R2R3
LADD:
MOV
A,R5
ADD
A,R3
MOV
R5,A
MOV
A,R6
ADDC
A,R4
MOV
R6,A
MOV
A,R5
MOV
R3,A
MOV
A,R6
MOV
R2,A
RET
;雙位元組乘法子程序
;參數:R6R5,R4R3
;返回:R2R1R4R3
DMUL:
MOV
A,R5;
MOV
B,R3
MUL
AB;R5*R3
XCH
A,R3;低位→R7,R7→A准備乘數
MOV
R1,B;高位暫存R1
MOV
B,R6
MUL
AB;R6*R3
ADD
A,R1;乘積低位加上一乘積高位暫存R4
MOV
R4,A
CLR
A;清A
ADDC
A,B;高位加低位來的進位存R5
MOV
R1,A
MOV
A,R4
MOV
B,R5
MUL
AB;R5*R4
ADD
A,R1;第三次乘積低位加R5暫存R6
XCH
A,R4
XCH
A,B
ADDC
A,R1;第三次乘積高位加R5存R5
MOV
R1,A
MOV
FO,C;保存進位位
MOV
A,R6
MUL
AB;R6*R4
ADD
A,R1;第四次乘積低位加R5存R5
MOV
R1,A
CLR
A
MOV
ACC.0,C
MOV
C,FO
ADDC
A,B;第四次乘積高位加低位來的進位後存於R4
MOV
R2,A
RET
;雙位元組除法程序
;參數:R2R1R4R3,R6R5
;返回:R4R3(商),R2R1(余數)
DDIV:
MOV
A,R1
CLR
C
SUBB
A,R5
MOV
A,R2
SUBB
A,R6
JNC
DIV1;被除數高位位元組大於除數,轉溢出處理
MOV
B,DIV1;無溢出執行除法,置循環次數
MOV
B,#16;被
⑼ c51單片機怎麼用兩個按鍵控制兩個數碼管的加減,加到99就好,求程序
1、首先先在proteus畫出模擬圖,方便模擬程序。
⑽ 單片機:K1~K4控制數碼管加減演示 流程圖!!!
玩單片機這么久了,從沒見過這樣進行按鍵處理的
別的不多說了,給你一個我自己編寫的加減數程序吧
埠已經按照你的板子連線改好了,至於數碼管的編碼,如果不對,你再自行修改吧
如果看不懂,或任何疑問,可以隨時追問,也可私密我加個好友
#include<reg52.h>
sbit K1=P1^0; sbit K2=P1^1; sbit K3=P1^2;//按鍵埠定義
unsigned int count;//數碼管顯示用變數
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數碼管顯示編碼
/***************************************************************************/
void delay(char x) {char j;for(;x>0;x--){for(j=100;j>0;j--);}}//延時
/***************************************************************************/
void display(int xs)//四位數碼管顯示
{
char d1,d2,d3,d4;
d1=(xs/1)%10; d2=(xs/10)%10;
d3=(xs/100)%10; d4=(xs/1000)%10;
P0=table[d1]; P2=0x01; delay(5); P2=0x00;
P0=table[d2]; P2=0x02; delay(5); P2=0x00;
P0=table[d3]; P2=0x04; delay(5); P2=0x00;
P0=table[d4]; P2=0x08; delay(5); P2=0x00;
}
/***************************************************************************/
void key()//按鍵處理
{
if(K1==0){delay(10);if(K1==0){count++;}while(!K1){display(count);}}//加一
if(K2==0){delay(10);if(K2==0){count--;}while(!K2){display(count);}}//減一
if(K3==0){delay(10);if(K3==0){count=0;}while(!K3){display(count);}}//清零
display(count); if(count>9999){count=0;}//調用顯示函數 及 防止溢出
}
/***************************************************************************/
void main(){count=1234; while(1){key();}}//主函數
/***************************************************************************/