1樓:
雖然沒有樓上動作快,但既然也做了就發上來參考吧,應該比樓上的更具體寫,比如p1.5幹嘛啊。 :)
整體描述:同時在p1.0 和 p1.1輸出反相的佔空可調的方波
佔空比調整通過修改變數m 來設定,變數as用來做內部迴圈量,範圍0-m
p1.5使用閃爍的方式來顯示對於m設定的佔空比值的非法告警
調整佔空比設定m通過int0 和p1.2來 進行加一和減一的設定 ,通過int1 和p1.2來 進行加五和減五的設定
設定的m值通過連線在p0,p2口的兩個led來顯示,方式10進位制單位顯示
count equ 30h //沒用的變數
as equ 30h //timer1內佔空比計數
m equ 35h //佔空比計數上限設定
org 0000h
ljmp start
org 0003h //int0中斷服務入口 佔空比1步進
ljmp int00
org 0013h //int1中斷服務入口 佔空比5步進
ljmp int11
start: setb ex0 //初始化開始
setb px0
setb it0
setb ex1
clr px1
setb it1
setb ea
clr p1.5 //p1.5顯示設定佔空比數字非法時閃爍告警
mov tmod,#21h //使用timer0 模式1和timer1 模式2
mov th1,#38h //timer1做佔空部分控制,即高低電平時間控制
mov th0,#0b1h //timer0做方波週期
mov tl0,#0e0h
setb tr0
setb tr1
mov dptr,#table //led段碼地址
mov m,#50 //佔空比上限初值
mov p0,#3fh //佔空比10進低位 led段碼
mov p2,#6dh //佔空比10進高位 led段碼
mov as,#0 //佔空比計數變數
top:setb tr1 //**新的一個方波週期從這裡開始**
setb p1.0 //p1.0和p1.1分別輸出反相的等週期方波
clr p1.1 //
mov th0,#0b1h //timer0計數值、即方波週期值設定
mov tl0,#0e0h
mov as,#0 //高電平時間計數變數初值每個timer1溢位加一(最大等於m)
mov b,#10 //沒用
mov a,m
mov b,#100
div ab
jz time1 //如果設定的m值在01-99(可以理解為可接受的值,佔空比最少1:99最多99:1)
mov b,#10
clerk:setb p1.5 //設定的佔空比值非法,則閃爍p1.5告警
lcall delay
clr p1.5
lcall delay
setb p1.5
lcall delay
clr p1.5
mov m,#50 //自動重新設定預設佔空比
lcall show //led顯示m,即當前設定佔空比的值
ljmp top //重新 開始新懂得方波週期
time1:jbc tf1,next //等待timer1 溢位標誌
sjmp time1
next:inc as //每次溢位變數as加一,
mov a,m
cjne a,as,time1 //直到as=m ,即佔空計數達到,
clr p1.0 //波形反相
setb p1.1
clr tr1 //關閉timer1,波形在timer0控制的一個週期內不再變化
time0:jbc tf0,top
sjmp time0 //timer0溢位,開始下一個週期波形
int00:jnb p1.2,loop1 //外部中斷0中斷處理
inc m //當int0 為低電平且p1.2為高則m增加1,每次機器響應int0都加一,直到int0消失
lcall show //led顯示m,即當前設定佔空比的值
reti
loop1:dec m //當int0 為低電平且p1.2為低則m減1,每次機器響應int0都減一,直到int0消失
lcall show //led顯示m
reti
int11:jnb p1.2,loop //外部中斷1中斷處理
mov a,m
add a,#5 //當int1 為低電平且p1.2為高則m增加5,每次機器響應int0都加五,直到int0消失
mov m,a
lcall show //led顯示m
reti
loop:mov a,m
subb a,#5 //當int1 為低電平且p1.2為高則m減少5,每次機器響應int0都減五,直到int0消失
mov m,a
lcall show //led顯示m
reti
show:mov a,m //m /10 ab 內分別是商和餘數
mov b,#10
div ab
movc a,@a+dptr //查表顯示餘數
mov p2,a
mov a,b
movc a,@a+dptr //查表顯示商
mov p0,a
mov b,#10 //沒用
retdelay:mov r6,#0ffh //延時函式
dey1:mov r7,#0ffh
dey2:mov r5,#3
djnz r5,$
djnz r7,dey2
djnz r6,dey1
ret //延時結束
table:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh //led段碼錶end
2樓:匿名使用者
count equ 30h
as equ 30h
m equ 35h 地址35h定義為變數m
org 0000h org 後跟地址,表示下面的指令所在地址
ljmp start 即此跳轉指令在 0000h地址出,為系統開機第一條
org 0003h 同理,另外0003h為中斷入口地址,對應的是什麼中斷暫時不記得了
ljmp int00
org 0013h
ljmp int11
start: setb ex0 中斷與定時器的初始化
setb px0
setb it0
setb ex1
clr px1
setb it1
setb ea 開啟中斷總開關
clr p1.5
mov tmod,#21h 設定定時器/計數器的工作模式(參閱51微控制器書)
mov th1,#38h 設定定時器0的初始值
mov th0,#0b1h
mov tl0,#0e0h 設定定時器1的初始值
setb tr0
setb tr1
mov dptr,#table 把顯示字元表的首地址給dptr
mov m,#50
mov p0,#3fh p0所接數碼管顯示0
mov p2,#6dh p2所接數碼管顯示5 應該是顯示50
mov as,#0
top:setb tr1 開啟定時器1
setb p1.0
clr p1.1
mov th0,#0b1h 設定定時器0的初始值
mov tl0,#0e0h
mov as,#0
mov b,#10 b=10
mov a,m a=m=50
mov b,#100
div ab a除上b
jz time1 跳轉到time1函式
mov b,#10
clerk:setb p1.5 p1.5 ---- ----
lcall delay ---- ----
clr p1.5 這段設定p1.5引腳產生方波
lcall delay
setb p1.5
lcall delay
clr p1.5
mov m,#50 m=50
lcall show 顯示50
ljmp top
time1:jbc tf1,next 判斷定時器1 定時時間是否到,沒到迴圈等待,到了跳轉到next
sjmp time1
next:inc as as加一
mov a,m
cjne a,as,time1 判斷a-as是否為零 這個是方波佔空比可調的關鍵,根據不同的m值這裡迴圈延時的時間不一樣
clr p1.0
setb p1.1
clr tr1
time0:jbc tf0,top 判斷定時器0 定時時間是否到,沒到迴圈等待,到了跳轉到top從新開始
sjmp time0
int00:jnb p1.2,loop1 中斷int0產生,判斷p1.2,為0呼叫loop1 m-1後顯示
inc m 否則m+1顯示
lcall show
reti
loop1:dec m
lcall show
reti
int11:jnb p1.2,loop 中斷int1產生,判斷p1.2,為0呼叫loop m-5後顯示
mov a,m 否則m+5顯示
add a,#5
mov m,a
lcall show
reti
loop:mov a,m
subb a,#5
mov m,a 把要顯示的數存於m
lcall show 呼叫顯示子函式
reti
show:mov a,m 這一段是顯示子函式 m為一個兩位數,除10後得到 十位和各位
mov b,#10
div ab
movc a,@a+dptr dptr指向的是下面的table,如果a=0,就把3fh給a,如果a=9,就把6fh給a
mov p2,a 把a給p2,p2接的是數碼管的位選。
mov a,b
movc a,@a+dptr
mov p0,a 看這個 你的硬體應該是p2接一個數碼管,p0接一個數碼管
mov b,#10
retdelay:mov r6,#0ffh 這一段為延時程式,就是通過迴圈執行指令達到延時的效果
dey1:mov r7,#0ffh
dey2:mov r5,#3
djnz r5,$
djnz r7,dey2
djnz r6,dey1
rettable:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh 用的應該是數碼管,這對應的是0-9
end由於缺少51微控制器書,有些記得不太清楚,如果你手裡有,就算不太會用51微控制器。有上面的註釋應該可以看的懂這段程式了。
祝你好運。 ljmp int11
急急急這個日語誰能幫我翻譯一下謝謝
幫你翻譯咯。你好!qianxiang女士 應該是個女生吧。我有個朋友下週過生日,我們打算為他慶生。2011年12月19日 yan liu 28歲 寫在近況裡 也可在facebook上策劃生日聚會 希望你能參加。facebook團隊。大致上是這個意思哦。希望能幫到你。 你好,qianxiang氏 下週...
誰能幫我回答一下這個問題呢?急急急謝謝
佼傲絲 要有自信心,沒有什麼的,你要做節目主持也是公司的公務啊,自己請教別人也是工作非常積極的表現嘛。不管是老闆還是老闆娘問,沒有什麼心虛的,實話實說,就是想主持好這場晚會。不要想得太多,祝你好運! 偉華 你可以說一下你的難處啊,說你沒有這方面的經驗,但想讓晚會完美一些之類的,所以就向他請教了一下,...
誰能幫我翻譯一下文章。急急急急急急急急急急
畫個圈圈祝福 醫生叫你安靜的坐著當他用他的聽診器聽診的時候。你是安靜的 或者你認為自己安靜。其實你的內心一點都不安靜。會有 撲通 撲通 的聲音。撲通 的聲音是你的心跳。把你的手放在胸部就能感覺到心跳。聽診器的發明之前,醫生就是靠乙隻耳朵貼近病人胸部聽心跳。它能夠聽到你的胸部不同部位的聲音 醫生可以聽...