1樓:匿名使用者
org 0000h
l0000: ljmp min00 ; 主程式
; / *** *** *** *** / 初始化 pwm
pca00: mov cmod, #82h ; (fsys/2)
mov ccon, #00h
mov cl, #00h
mov ch, #00h
mov ccapm0, #00h ; pwm0 輸出
mov pca_pwm0, #00h
setb cr ; 開 pwm
ret; / *** *** *** *** / 主程式
p1m0 equ 91h
p1m1 equ 92h
p3m0 equ 0b1h
p3m1 equ 0b2h
adc_contr equ 0c5h ; a/d 轉換暫存器
adc_data equ 0c6h ; a/d 結果暫存器
min00: mov p1m0, #08h ; 設定 p1.3 為高阻狀態
mov p1m1, #08h
mov adc_contr, #0e3h ; 開a/d 轉換電源 p1.3
lcall pca00 ; 初始化 pwm
min10: nop ; 主程式 入口
lcall adc00 ; 測光敏電阻電壓
mov ccap0h, a ; 寫入pwm 控制 發光亮度
ljmp min10
ret; / *** *** *** *** / a/d 轉換通道 測電壓
adc00: mov adc_data, #00h
orl adc_contr, #08h ; 啟動 ad 轉換
mov a, #10h ; 判斷 ad 轉換是否完成
anl a, adc_contr
jz adc32 ; ad 轉換尚未完成, 繼續等待
anl adc_contr, #0e7h ; 清0 adc_flag, adc_start 位, 停止a/d 轉換
mov a, adc_data ; a = ad 轉換結果
retend
2樓:
電源的5v那你不要接在地線上面了啦。呵呵 電都通不上,程式也很簡單的嘛。微控制器採集光敏電阻節點上的電壓,根據這個電壓輸出一定的占空比的pwm。
a/d:
org 0000h
ljmp main
;-----------------------------------------
org 0100h
main:
lcall init_uart ;init uart, use to show adc result
lcall init_adc ;init adc sfr
;-------------------------------
next:
mov a,#0
lcall show_result ;show channel0 result
mov a,#1
lcall show_result ;show channel1 result
mov a,#2
lcall show_result ;show channel2 result
mov a,#3
lcall show_result ;show channel3 result
mov a,#4
lcall show_result ;show channel4 result
mov a,#5
lcall show_result ;show channel5 result
mov a,#6
lcall show_result ;show channel6 result
mov a,#7
lcall show_result ;show channel7 result
sjmp next
;/*----------------------------
;send adc result to uart
;input: acc (adc channel no.)
;output:-
;----------------------------*/
show_result:
lcall send_data ;show channel no.
lcall get_adc_result ;get high 8-bit adc result
lcall send_data ;show result
;//if you want show 10-bit result, uncomment next 2 lines
; mov a,adc_low2 ;get low 2-bit adc result
; lcall send_data ;show result
ret;/*----------------------------
;read adc conversion result
;input: acc (adc channel no.)
;output:acc (adc result)
;----------------------------*/
get_adc_result:
orl a,#adc_power | adc_speedll | adc_start
mov adc_contr,a ;start a/d conversion
nop ;must wait before inquiry
nopnop
nopwait:
mov a,adc_contr ;wait complete flag
jnb acc.4,wait ;adc_flag(adc_contr.4)
anl adc_contr,#not adc_flag ;clear adc_flag
mov a,adc_res ;return adc result
ret;/*----------------------------
;initial adc sfr
;----------------------------*/
init_adc:
mov a,#0ffh
mov p1,a
mov p1m0,a
mov p1m1,a ;set all p1 as open-drain mode
mov adc_res,#0 ;clear previous result
mov adc_contr,#adc_power | adc_speedll
mov a,#2 ;adc power-on and delay
lcall delay
ret;/*----------------------------
;initial uart
;----------------------------*/
init_uart:
mov scon,#5ah ;8 bit data ,no parity bit
mov tmod,#20h ;t1 as 8-bit auto reload
mov a,#-5 ;set uart baudrate -(18432000/12/32/9600)
mov th1,a ;set t1 reload value
mov tl1,a
setb tr1 ;t1 start running
ret;/*----------------------------
;send one byte data to pc
;input: acc (uart data)
;output:-
;----------------------------*/
send_data:
jnb ti,$ ;wait for the previous data is sent
clr ti ;clear ti flag
mov sbuf,a ;send current data
ret;/*----------------------------
;software delay function
;----------------------------*/
delay:
mov r2,a
clr a
mov r0,a
mov r1,a
delay1:
djnz r0,delay1
djnz r1,delay1
djnz r2,delay1
retend
////////////////////////////////
a/d轉換的模板如上,pwm比較簡單,你自己看資料配置一下暫存器就可以了,
微控制器程式錯誤,51微控制器c語言程式錯誤
後面兩個錯誤是沒有宣告函式,最簡單的方法就是把main函式調到程式的最後,你看看還有沒有錯誤,我們 hhh.c 113 error c211 call not to a function這個呼叫函式名不存在 hhh.c 114 error c211 call not to a function這個呼...
求紅外置收頭的微控制器程式
void initial void 名 稱 rcv 功 能 紅外掃瞄解碼 入口引數 出口引數 說 明 備 注 慧淨電子網 www.hlmcu.com 慧淨空間 http hi.baidu.com hlmcu void rcv while cnt1 低電平大於4 256 10us 10.24ms則是錯...
求微控制器程式 LED檯燈自動調光等
你好 我贊同二樓的,一樓給你的只是乙個簡化問題的方向。你沒有描述出問題的特徵,是軟體編譯通不過 我覺得不是這個 還是不能調光,或調光範圍非常窄,或根本不調光。我感覺你應該是後面幾個問題如二樓所言。你的程式幾乎沒有注釋,很難看的明白,就我的經驗,說幾點建議。1.首先建立正確的數學模型,如你的程式 頻率...