计算起来大约每只LED(是超高亮度发光二极管?不是数码管。)点亮时间1ms。这对新型发光二极管来说没问题,靠谱。
那么下面以1000HZ的扫描频率扫描16只发光管,每只点亮时间压缩到60us,按照xwj原理,亮度不变。
...
而如果1KHZ扫描频率,60us 时标中断一次,一秒钟中断16,000次?前台程序每秒钟被中断一万6千次?还干别的么?还有4 级中断ISR怎么办?
刘前辈 发表于 2010-11-2 10:55
其实还不是每秒中断16000,是每秒中断21600次。
更高的频率是86400Hz.
;;; 定时中断选择与PWM周期同步,21.6K,则重装载值为256.
PWM1reload EQU 256 ;定时中断的频率 ;为PWM频率的1倍
;;; 那么定时中断的频率则为86400Hz
另外附送一小段程序,此程序在22.1184MHz的89C51上运行
;模拟串口子程序
;不能采用延时的办法
;要(比较)准确的确认起始位,还有每个数据位的中点位置,才能正确取样数据.
;模拟串口:9600BPS,每位取样3次,则中断速度为28800次/S,采用22.1184M晶振,
;如若采取INT0外部中断检测开始位,则每位采样两次即可,中断速度为19200次/S,
; 或者每位采样一次,仅第一次中断速度为19200次/S,剩下的都为9600次/S,
;用INT0外部中断检测开始位,需要一个独立的定时器,可独立开始,可独立停止。
;若每位取样4次,则中断速度为38400次/S,
;此程序中采取第一种方法
;发送时时钟不需要3倍,相等即可。
;发送和接收可以看成是两个相互独立的模块,不论硬件还是软件上。
RXD2 BIT P3.2
TXD2 BIT P3.3
com2con data 02Fh
RI2 bit com2con.0
TI2 bit com2con.1
tx2send bit com2con.2
tx2sending bit com2con.3
ct2busy bit com2con.4
com2stat data 30h
com2recvtemp data 31h
com2recvbuf data 32h
com2sendstat data 33h
com2sendtemp data 34h
com2sendbuf data 35h
; com2stat 数据格式
; 7 6 5 4 3 2 1 0
; | | | | | | | +---
; | | | | | | +----- 最低的这两位,表示接收数据的时钟相位,0,1,2, 在1相位的时候采样数据.
; | | | | | +-------
; | | | | +---------
; | | | +----------- 高4位,表示接收数据的位;第几位,0是起始位,1开始是数据位,8是最后一位数据,9是停止位.
; | | +-------------
; | +---------------
; +-----------------
;相位的变化方式 : 在服务程序退出前,增加相位,使他等于下一次的相位,下一次直接用,用完后再增加或判断
mov a,com2stat
jz detectstartbit ;如果com2stat等于0,说明现在还没有启动数据接收过程
jb acc.0,getbit ;第一相位,去采样数据
jb acc.1,incbitpos ;第二相位,看是否采集完成,增加采样的地址数.
;第0相位,增加相位,然后退出
inc a
mov com2stat,a
sjmp com2skipall
detectstartbit:
jb RXD2,com2skipall ;RXD2为高电平,说明没有起始位到来,退出
inc com2stat ;有起始位到来,COM2stat加1,准备开始接收起始位;
sjmp com2skipall
getbit:
inc a
mov com2stat,a
anl a,#0f0h ;取com2stat的高4位
jz checkstartbit ;判断起始位是否正确.
xrl a,#090H ;
jz stopbit ;在接收停止位吗?
mov c,RXD2 ;采集数据
mov a,com2recvtemp
rrc a
mov com2recvtemp,a
sjmp com2skipall
checkstartbit:
jb RXD2,notstartbit ;起始位不正确
sjmp com2skipall ;起始位正确
notstartbit: ;放弃采样数据重新开始
MOV com2stat,#0h
sjmp com2skipall
incbitpos:
anl a,#0f0h
xrl a,#90h
jz recvdone
xrl a,#90h
add a,#10h
mov com2stat,a
sjmp com2skipall
recvdone:
jb RI2,com2skipall ;如果RI2被置位,说明recvbuf中有数据未被取走,则进行等待.
;在位9,相位2处空转,而不丢弃这次采集的数据,
;如果recvbuf中数据不能被及其取走,则不能进行后续的接收过程.
mov com2recvbuf,com2recvtemp ;如果RI2未被置位,则转存数据,接收完成,置RI2.
mov com2stat,#0h
setb RI2
sjmp com2skipall
stopbit: ;检查停止位是否正确
jnb rxd2,notstopbit ;如果RXD2电平不为高电平,则停止位不正确.
;jb RI2,com2skipall ;如果RI2被置位,说明recvbuf中有数据未被取走,则进行等待.
;在位9,相位2处空转,而不丢弃这次采集的数据,
;如果recvbuf中数据不能被及其取走,则不能进行后续的接收过程.
mov com2recvbuf,com2recvtemp ;如果RI2未被置位,则转存数据,接收完成,置RI2.
mov com2stat,#0h
setb RI2
sjmp com2skipall
notstopbit: ;停止位不正确,放弃所采集的数据
mov com2stat,#0h
sjmp com2skipall
com2skipall:
com2send:
jb tx2sending,com2sending
jnb TX2SEND,com2sendskipall
com2sendstart:
;inc com2sendstat
mov com2sendstat,#01h
clr txd2
mov com2sendtemp,com2sendbuf
setb tx2sending
clr tx2send
sjmp com2sendskipall
com2sending:
mov a,com2sendstat
jb acc.1,sendincbitpos
jnb acc.0,sendbitchange
inc a
mov com2sendstat,a
anl a,#0f0h
xrl a,#090h
jz com2senddone
sjmp com2sendskipall
sendincbitpos:
anl a,#0f0h
add a,#010h
mov com2sendstat,a
xrl a,#0a0h
jz com2senddone
sjmp com2sendskipall
com2senddone:
mov com2sendstat,a
clr tx2sending
setb TXD2
setb TI2
sjmp com2sendskipall
sendbitchange:
inc a
mov com2sendstat,a
anl a,#0f0h
xrl a,#090h
jz com2sendstopbit
mov a,com2sendtemp
rrc a
mov com2sendtemp,a
mov txd2,c
sjmp com2sendskipall
com2sendstopbit:
setb txd2
sjmp com2sendskipall
com2sendskipall: |