導航:首頁 > 操作系統 > zx單片機

zx單片機

發布時間:2022-10-05 08:32:35

1. 編程:使用單片機P1口控制8個LED。顯示方式:自上而下逐個點亮,再自下而上逐個點亮,如此循環

給你個簡單點的
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN: MOV P1,#01111111B ;P1口低電平 對應燈亮 點亮P1.7對應的LED
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#10111111B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11011111B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11101111B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11110111B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11111011B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11111101B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11111110B;點亮P1.0對應LED
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11111110B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11111101B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11111011B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11110111B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11101111B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#11011111B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#10111111B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
MOV P1,#01111111B
LCALL DLY_500MS ;延時500ms 可以清晰看到每個LED的亮滅情況
SJMP MAIN
;延時250ms子程序
DLY_250MS:MOV R5,#5
DLY1: MOV R6,#100
DLY0: MOV R7,#250
DLY: DJNZ R7,DLY
DJNZ R6,DLY0
DJNZ R5,DLY1
RET
;延時500ms子程序
DLY_500MS:MOV R4,#2
DLY2: LCALL DLY_250MS
DJNZ R4,DLY2
RET
END

2. 單片機用C語言寫兩個數碼管顯示0到59循環的程序在歸0

#include<reg52.h>
sbit wei=P3^0;
sbit led1=P3^2;
sbit led2=P3^3;
char tt =0;
char i=0;
unsigned char code led_zx[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
void mdelay(unsigned int delaytime)
{
int c;
for(;delaytime!=0;delaytime--)
for(c=0;c!=124;c++);
}
void main()
{
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;//開定時器0中斷
TR0=1;//啟動定時器0
while(1)
{
if ( tt==20 )
{
tt=0;
if ( wei==1 ) { i++; }
}
if ( i==59 ) { i=0; }
led2=0;
P1=(led_zx[i%10]);
led1=1;
mdelay(50);
led1=0;
P1=(led_zx[i/10]);
led2=1;
mdelay(50);
}
}
void timer0() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
tt++;
}

3. 51單片機電子鍾 通過按鍵調整時間 這塊程序怎麼寫(方法)

ORG 0000H ;主程序入口
LJMP MAIN ;跳轉到標號MAIN執行
ORG 000BH ;定時器T0中斷入口
AJMP PTF0 ;跳轉到標號PTF0執行
HOUR EQU 4AH ;賦值偽指令
MIN EQU 4BH
SEC EQU 4CH
BUFF EQU 4DH
;*************************************************************************************
;主程序
MAIN: MOV HOUR,#00H ;時,分,秒,標記清零
MOV MIN,#00H
MOV SEC,#00H
MOV BUFF,#00H
MOV SP,#60H ;設堆棧指針
MOV TH0,#3CH ;定時器賦初值
MOV TL0,#0B0H
MOV 40H,#14H ;設循環次數20次
MOV TMOD,#1 ;寫TMOD
MOV IP,#2 ;寫IP
MOV IE,#82H ;開中斷
SETB TR0 ;啟動定時器
LOOP: ACALL DISPLAY ;調用顯示程序
JNB P3.0,FEN ;校時鍵按否?否,跳轉到FEN
ZX: ACALL DISPLAY
JB P3.0,ZX
MOV A,HOUR ;時加1
ADD A,#1
DA A
CJNE A,#24H,BI ;時加到24時否?是,清零
CLR A
BI: MOV HOUR,A
MOV SEC,#00H ;秒清零
FEN: JNB P3.1,YY ;校分鍵按下否?否,跳轉到YY
ZC: ACALL DISPLAY
JB P3.1,ZC
MOV A,MIN ;分加1
ADD A,#1
DA A
CJNE A,#60H,CI ;分加到60否?是,清零
CLR A
CI: MOV MIN,A
MOV SEC,#00H ;秒清零
YY: AJMP LOOP
;***************************************************************************************
;中斷服務程序
PTF0: MOV TH0,#3CH ;初值重裝
MOV TL0,#0B0H
CLR TR0 ;關定時器
CLR A ;清A
DJNZ 40H,XX ;1秒到否?否,跳轉到XX
MOV 40H,#14H ;重寫循環次數
MOV A,SEC ;秒單元加1
ADD A,#1
DA A
MOV SEC,A
CJNE A,#60H,PTF0R ;60秒到否?否,跳轉到PTF0R
JMIN: MOV SEC,#00H ;秒清零
MOV A,MIN ;分單元加1
ADD A,#1
DA A
MOV MIN,A
CJNE A,#60H, PTF0R ;60分到否?否,跳轉到PTF0R
MOV MIN,#00H ;分清零
JHOUR: MOV SEC,#00H ;秒清零
MOV A,HOUR ;時單元加1
ADD A,#1
DA A
MOV HOUR,A
CJNE A,#24H, PTF0R ;24時到否?否,跳轉到PTF0R
MOV HOUR,#00H ;時清零
AJMP PTF0R ;跳轉到PTF0R
XX: MOV R7,40H ;給小數點做標記,1和0
CJNE R7,#0AH,NEQ
EQ: NOP
AJMP PTF0R
NEQ: JC YEQ
MOV BUFF,#00H
AJMP PTF0R
YEQ: MOV BUFF,#0FFH
AJMP PTF0R
PTF0R: SETB TR0
RETI
;***************************************************************************************
;顯示子程序
DISPLAY: MOV R5,BUFF ;根據標記輸出帶點和不帶點的數字
CJNE R5,#00H,CVB ;根據標記查不同的表
MOV DPTR,#TAB1
LJMP TYU
CVB: MOV DPTR,#TAB
TYU: MOV A,MIN ;顯示分鍾的個位
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#0F0h
CLR P2.4
ACALL DELAY
MOV A,MIN ;顯示分鍾的十位
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#0F0H
CLR P2.5
ACALL DELAY
MOV A,HOUR ;顯示時鍾的個位
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#0F0H
CLR P2.6
ACALL DELAY
MOV A,HOUR ;顯示時鍾的十位
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#0F0H
CLR P2.7
ACALL DELAY
RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;不帶小數點的字型碼
TAB1: DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH ;帶小數點的字型碼
;****************************************************************************************
;延時子程序
DELAY: MOV R4,#20
YAN: MOV R5,#10
SHI: DJNZ R5,SHI
DJNZ R4,YAN
RET
END

以前我的單片機課程設計,提供給你參考參考,不過只有調分和調時的。。。

4. 匯編語言單片機求大神講解一段程序

MOV A,31H ; 讓 累加器A 等於 寄存器31H內的數值
ANL A,#0FH ; 累加器A 高4位清零
ACALL ZX-SCAN ; 調用地址ZX-SCAN的子程序
MOV SBUF,A ; 將累加器A 的數值 從串口 發送出去
JNB TF,$ ; 檢測 如果 TF 位為 0 ,則繼續執行本指令,否則執行下一條指令
MOV A,31H ; 讓 累加器A 等於 寄存器31H內的數值
ANL A,#0F0H ; 累加器A 高4位清零
ACALL ZX-SCAN ; 調用地址ZX-SCAN的子程序
MOV SBUF,A ; 將累加器A 的數值 從串口 發送出去
JNB T1,$ ; 檢測 如果 T1 位為 0 ,則繼續執行本指令,否則執行下一條指令
CLR T1 ; T1 位清零
MOV DPTR,#ZX-TBJ ; 讓 DPTR 指向地址 ZX-TBJ 的數據表
MOVC A ,@A+DPTR ; 從數據表讀一個位元組到累加器A
RET ; 子程序返回

5. 單片機根據環境亮暗智能控制LED的開啟和關斷

不行的,沒有輸入檢測量,怎麼能讓單片機控制開啟和關斷呢。找一個光敏感測器做輸入,就可以了!感測器電路要放大的啊,在網上多找找看,很多的!

6. 怎麼用C語言做單片機的精確延時

在單片機應用中,經常會遇到需要短時間延時的情況,一般都是幾十到幾百μs,並且需要很高的精度(比如用單片機驅動DS18B20時,誤差容許的范圍在十幾μs以內,不然很容易出錯);而某些情況下延時時間較長,用計時器往往有點小題大做。另外在特殊情況下,計時器甚至已經全部用於其他方面的定時處理,此時就只能使用軟體定時了[1]。
1 C語言程序延時
Keil C51的編程語言常用的有2種: 一種是匯編語言;另一種是C 語言。用匯編語言寫單片機程序時,精確時間延時是相對容易解決的。比如,用的是晶振頻率為12 MHz的AT89C51,打算延時20 μs,51單片機的指令周期是晶振頻率的1/12,即一個機器周期為1 μs;「MOV R0,#X」需要2個機器周期,DJNZ也需要2個機器周期,單循環延時時間t=2X+3(X為裝入寄存器R0的時間常數)[2]。這樣,存入R0里的數初始化為8即可,其精度可以達到1 μs。用這種方法,可以非常方便地實現512 μs以下時間的延時。如果需要更長時間,可以使用兩層或更多層的嵌套,當然其精度誤差會隨著嵌套層的增加而成倍增加。
雖然匯編語言的機器代碼生成效率很高,但可讀性卻並不強,復雜一點的程序就更難讀懂;而C語言在大多數情況下,其機器代碼生成效率和匯編語言相當,但可讀性和可移植性卻遠遠超過匯編語言,且C 語言還可以嵌入匯編程序來解決高時效性的代碼編寫問題。就開發周期而言,中大型軟體的編寫使用C 語言的開發周期通常要比匯編語言短很多,因此研究C語言程序的精確延時性能具有重要的意義。
C程序中可使用不同類型的變數來進行延時設計。經實驗測試,使用unsigned char類型具有比unsigned int更優化的代碼,在使用時應該使用unsigned char作為延時變數。
2 單層循環延時精度分析
下面是進行μs級延時的while程序代碼。
延時函數:
void delay1(unsigned char i) {
while(i );}
主函數:
void main() {
while(1) {
delay1(i);
}
}
使用Keil C51的反匯編功能,延時函數的匯編代碼如下:
C:0x00E6AE07MOVR6,0x07
C:0x00E81FDECR7
C:0x00E9EEMOVA,R6
C:0x00EA70FAJNZC:00E6
C:0x00EC22RET

圖1 斷點設置位置圖
通過對i賦值為10,在主程序中圖1所示的位置設置斷點。經過測試,第1次執行到斷點處的時間為457 μs,再次執行到該處的時間為531 μs,第3次執行到斷點處的時間為605 μs,10次while循環的時間為74 μs,整個測試結果如圖2所示。

圖2 使用i--方式測試模擬結果圖
通過對匯編代碼分析,時間延遲t=7X+4(其中X為i的取值)。測試表明,for循環方式雖然生成的代碼與用while語句不大一樣,但是這兩種方法的效率幾乎相同。C語言中的自減方式有兩種,前面都使用的是i--的方式,能不能使用--i方式來獲得不同的效果呢?將前面的主函數保持不變,delay1函數修改為下面的方式:
void delay1(unsigned char i) {
while(--i);}
同樣進行反匯編,得到如下結果:
C:0x00E3DFFEDJNZR7,
C:00E3C:0x00E522RET
比較發現,--i的匯編代碼效率明顯高於i--方式。由於只有1條語句DJNZ,執行只需要2個時鍾周期, 1個時鍾周期按1 μs計算,其延時精度為2 μs;另外,RET需要2個時鍾周期,能夠達到匯編語言代碼的效率。按前面的測試條件進行測試,第1次執行到斷點處的時間為437 μs,再次執行到該處的時間為465 μs,第3次執行到斷點處的時間為493 μs,10次while循環的時間為28 μs,整個測試結果如圖3所示。

圖3 使用--i方式測試模擬結果圖
調整i的取值,i取8時延時時間為24 μs,i取9時延時時間為26 μs。通過分析得出,10次循環為28 μs是由於外層循環造成的,其精度可以達到2 μs。在設計時應該考慮參數傳遞和RET語句執行所需要的時間周期。實驗分析發現,for語句使用--i方式,同樣能夠達到與匯編代碼相同的精度。i取不同值時延時模擬結果如圖4所示。

圖4 i取不同值時延時模擬結果圖
3 多重嵌套下的C程序延時
在某些情況下,延時較長,僅使用單層循環方式是不能完成的。此時,只能使用多層循環方式,那麼多重循環條件下,C程序的精度如何呢?下面是一個使用for語句實現1 s延時的函數。
延時函數
void delay1s(void) {
for(k=100;k>0;k--) //定時1 s
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
主函數調用延時函數代碼段:
while(1) {
delay1s();
scond+=1;
}
為了直接衡量這段代碼的效果,利用Keil C找出這段代碼產生的匯編代碼:
C:0x00B37002JNZ
C:00B7C:0x00B5150CDEC0x0C
C:0x00B7E50DMOVA,0x0D
C:0x00B9450CORLA,0x0C
C:0x00BB70DEJNZC:009B
C:0x00BDE50BMOVA,0x0B
C:0x00BF150BDEC0x0B
C:0x00C17002JNZC:00C5
C:0x00C3150ADEC0x0A
C:0x00C5E50BMOVA,0x0B
C:0x00C7450AORLA,0x0A
C:0x00C970CAJNZC:0095
C:0x00CB22RET
分析匯編代碼,其他匯編代碼使用的不是DJNZ跳轉方式,而是DEC和JNZ語句來實現循環判斷。1條JNZ指令要花費2個時鍾周期,3條指令就需要6個機器周期,MOV指令和DEC指令各需要1小時鍾周期,1個時鍾周期按1 μs算,其精度最多達到8 μs,最後加上一條LCALL和一條RET語句,所以整個延時精度較差[4]。
利用Keil C的測試工具,在一處設置一個斷點。第1次執行到中斷處的時間為0.000 513 s,第2次執行到中斷處的時間為1.000 922 s,時間延遲為1.000 409 s,測試結果如圖5所示。對於上面的3種循環嵌套,循環次數為100×20×248=496 000,每次循環的時間約為2 μs。

圖5 三重嵌套循環1 s實現時間測試結果
為獲取與匯編語言延時的差距,同樣進行1 s的延時,程序代碼段如下:
LCALL DELY1S
INC Second
DELY1S:MOV R5,#100
D2:MOV R6,#20
D1:MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,D2
RET
通過Keil C51測試,其實際延遲時間為0.997 943 s。雖然C語言實現延時方式的匯編代碼復雜度增加,但是與匯編語言實現的方式性能差距並不大。
4 總結
匯編語言在實時性方面具有較大的優越性,雖然使用Keil C51可以在C語言程序中嵌入匯編代碼,但是復雜度明顯提高。實驗證明,只要合理地運用C語言,在延時編程方面就可以達到與匯編語言相近的精度。為了獲得精確的時間延遲,可通過Keil C工具的模擬功能,調整延遲量,從而得到較理想的結果。

閱讀全文

與zx單片機相關的資料

熱點內容
方言pdf 瀏覽:997
程序員格子襯衣搞笑圖 瀏覽:390
vxworks編譯版本 瀏覽:111
怎麼查看讀取相冊的app 瀏覽:206
那個空調用日立壓縮機 瀏覽:816
androidsdkr25下載 瀏覽:12
哪位程序員的名字是誰 瀏覽:568
蘋果手機底部怎麼放5個app 瀏覽:915
壓縮機出涼風 瀏覽:823
不能從文件夾看到迅雷 瀏覽:139
編程處理表格有意義嗎 瀏覽:438
java字元串回車換行 瀏覽:155
普通分體空調是什麼壓縮機 瀏覽:824
數控車床牙刀滾花編程實例 瀏覽:944
辦公室pdf 瀏覽:279
自動化測量和編程 瀏覽:588
827編程教學 瀏覽:726
跳轉到文件夾 瀏覽:518
文件夾怎麼解壓並安裝 瀏覽:406
壓縮機維修論壇 瀏覽:8