想編寫一個軟體,能把微控制器讀到的資料傳到軟體上,軟體也能改引數
網上搜微控制器上位機,上位機能透過串列埠給單片機發資料,微控制器收到資料就進行處理,這一流程可以達到控制作用。編上位機可以用MFC就行,開發平臺可是選vs2010或vc6。0
sclk bit p1。0 ;ds1302時鐘口p1。0
io bit p1。1 ;ds1302資料口p1。1
rst bit p1。2 ;ds1302片選口p1。2
now data 40h
org 0
jmp reset
org 100h
reset:
call ds1302_initial ;初始化ds1302
mov dptr,#init
call ds1302_settime ;設定初始時間
mov r0,#now
call ds1302_gettime ;讀取當前時間
jmp $
init: //秒 分 時 日 月 星期 年
db 00h,00h,20h,01h,01h,05h,10h
;**************************************
;延時x微秒(stc90c52rc@12m)
;不同的工作環境,需要調整此函式
;入口引數:r7
;出口引數:無
;**************************************
delay: ;6 此延時函式是使用1t的指令週期進行計算,與傳統的12t的mcu不同
nop ;1
nop ;1
ret ;4
;**************************************
;從ds1302讀1位元組資料
;入口引數:無
;出口引數:acc
;**************************************
ds1302_readbyte:
clr a
push 0
mov 0,#8 ;8位計數器
readnext:
clr sclk ;時鐘線拉低
nop ;延時等待
nop
mov c,io ;讀取資料
rrc a ;儲存資料
setb sclk ;時鐘線拉高
nop ;延時等待
nop
djnz 0,readnext
pop 0
ret
;**************************************
;向ds1302寫1位元組資料
;入口引數:acc
;出口引數:無
;**************************************
ds1302_writebyte:
push 0
mov 0,#8 ;8位計數器
writenext:
clr sclk ;時鐘線拉低
nop ;延時等待
nop
rrc a ;移出資料
mov io,c ;送出到埠
setb sclk ;時鐘線拉高
nop ;延時等待
nop
djnz 0,writenext
pop 0
ret
;**************************************
;讀ds1302某地址的的資料
;入口引數:acc (地址)
;出口引數:acc (讀出的資料)
;**************************************
ds1302_readdata:
clr rst ;拉低片選
nop ;延時等待
nop
clr sclk ;時鐘線拉低
nop ;延時等待
nop
setb rst ;使能片選
nop ;延時等待
nop
call ds1302_writebyte ;寫地址
call ds1302_readbyte ;讀資料
ret
;**************************************
;往ds1302的某個地址寫入資料
;入口引數:acc (地址) b(需寫入的資料)
;出口引數:無
;**************************************
ds1302_writedata:
clr rst ;拉低片選
nop ;延時等待
nop
clr sclk ;時鐘線拉低
nop ;延時等待
nop
setb rst ;使能片選
nop ;延時等待
nop
call ds1302_writebyte ;寫地址
mov a,b ;地址資料送入acc
call ds1302_writebyte ;寫資料
ret
;**************************************
;寫入初始時間
;入口引數:dptr (初始值地址)
;出口引數:無
;**************************************
ds1302_settime:
mov a,#8eh
mov b,#0
call ds1302_writedata ;允許寫操作
mov r7,#80h ;從暫存器80開始
mov r6,#7 ;連續寫7次
setnext:
clr a
movc a,@a+dptr
mov b,a ;資料
mov a,r7 ;地址
call ds1302_writedata ;寫資料
inc r7
inc r7 ;暫存器地址+2
inc dptr ;資料地址+1
djnz r6,setnext
mov a,#8eh
mov b,#80h
call ds1302_writedata ;防寫
ret
;**************************************
;讀取當前時間
;入口引數:r0 (資料緩衝區首地址)
;出口引數:無
;**************************************
ds1302_gettime:
mov r7,#81h ;從暫存器81開始
mov r6,#7 ;連續讀7次
getnext:
mov a,r7 ;地址
call ds1302_readdata ;讀資料
mov @r0,a ;儲存資料
inc r7
inc r7 ;暫存器地址+2
inc r0 ;資料地址+1
djnz r6,getnext
ret
;**************************************
;初始化ds1302
;**************************************
ds1302_initial:
clr rst
clr sclk
mov a,#8eh
mov b,#0
call ds1302_writedata ;允許寫操作
mov a,#80h
mov b,#0
call ds1302_writedata ;時鐘啟動
mov a,#90h
mov b,#0a6h
call ds1302_writedata ;一個二極體+4k電阻充電
mov a,#8eh
mov b,#80h
call ds1302_writedata ;防寫
ret
end