大功率轮廓灯跳机同步2回路源程序

2022-12-21  

;*****************************************

; 78p153寄存器定义

;*****************************************

R0 == 0X0 ;间接寻址IAR

;****CONT REGISTE*************

; 7 6 5 4 3 2 1 0

; - INT TS TE PAB PSR2 PSR1 PSR2

; PSR TCC RATE WDT RATE

; 000 1:2 1:1

; 001 1:4 1:2

; 010 1:8 1:4

; 011 1:16 1:8

; 100 1:32 1:16

; 101 1:64 1:32

; 110 1:128 1:64

; 111 1:256 1:128

;---------------------------------

; PAB 0:TCC 1:WDT

; TE TCC信号边沿选择位。0:由高到低加1。 1:由低到高加1

; TS TCC信号源 0:内部时钟。 1:外部输入(P62/TCC)

; INT 中断使能标志 0:由DISI或硬件中断屏蔽,1:由ENI/RETL使能中断。

TCC == 0X1

PC == 0X2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

STATUS == 0X3

C == 0

DC == 1

Z == 2

P == 3 ;执行SLEP时置为0

T == 4 ;时间溢出时置为0

GP0 == 5 ;

GP1 == 6 ;

RST == 7 ;复位类型,由引脚唤醒时置1,其它复位置0

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

R4 == 0X4

PORT5 == 0X5

IOC5 == 0X5

PORT6 == 0X6

IOC6 == 0X6

IOCB == 0X0B ;为0将P50,P51,P52, P60,P61,P62下拉

IOCC == 0X0C ;为0将P60,P61,P62, P64,P65,P66,P67漏极开路

IOCD == 0X0D ;为0将P60,P61,P62, P64,P65,P66,P67上拉

;0: 为允许使能。 1:为禁止

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

IOCE == 0X0E ;WDT控制器

WDTE == 7 ;0:禁止,1:允许

EIS == 6 ;0:P60,双向I/O口,1:外部中断管脚。此时IOC6的BIT0置为1(输入)

;为“0”时,/通道被屏蔽。INT为“1”时,可通由P6口读取其状态

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ISR == 0XF ;中断状态寄存器

TCIF == 0 ;TCC溢出时置1,软件清0

ICIF == 1 ;P6口输入变化置1,软件清0

EXIF == 2 ;外部中断,由P60/INT下降沿置1,软件清0

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

IOCF == 0XF ;中断屏蔽寄存器

TCIE == 1 ;0:为中断禁止。1为中断允许

ICIE == 2 ;

EXIE == 3 ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;本程序的要点是计算电源频率进行计数实现同步。

;保证通电后基本同步开工

a_temp == 0x10 ;中断子程序中保存A

tcount1 == 0x11 ;节拍计数1

tcount2 == 0x12 ;节拍计数2

tick == 0x13 ;节拍常量值1


chtb == 0x14 ;查表序号值


count2 == 0x15 ;定时计数值

temp == 0x16 ;临时计数器

temp2 == 0x17

code == 0x18 ;输出代码

lamp == 0x19 ;用于闪烁计数

spcode == 0x1a ;代表速度的代码

stflag == 0x1b ;是否进入一拍标志

ifdrim == 0x1c ;是否梦幻

code2 == 0x1d ;

tcount3 == 0x1e

temp3 == 0x1f


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;开始

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

org 0x0

jmp main

;;;;;;;;;;;;;;;;;;;;;;;;

;中断计数子程序

;;;;;;;;;;;;;;;;;;;;;;;;

org 0x8

intext:

mov a_temp,a

bc stflag,7 ;这是是否要进入下一态的标志位

clr port5

clr port5 ;中断后先清0。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;仅用于指示灯

;;;;;;;;;;;;;;;;;;;;;;;;;;;;

inc lamp ;lamp是指示灯计数寄存器,也可以用别的方法代替

inca spcode ;速度代码0,1,2,3。加1后代入a中

mov temp2,a ;temp2是局部变量,通过加1成为1,2,3,4。后再减1判0的方

djz temp2 ;式来进行指示

jmp speed2

speed1:

jbc lamp,3

jmp lampset1

bc port6,1

jmp lampok

lampset1:

bs port6,1

jmp lampok

speed2:

djz temp2

jmp speed3

jbc lamp,4

jmp lampset2

bc port6,1

jmp lampok

lampset2:

bs port6,1

jmp lampok

speed3:

djz temp2

jmp speed4

jbc lamp,5

jmp lampset3

bc port6,1

jmp lampok

lampset3:

bs port6,1

jmp lampok

speed4:

jbc lamp,6

jmp lampset4

bc port6,1

jmp lampok

lampset4:

bs port6,1 ;port6,1用于指示灯

jmp lampok


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

lampok:

call delay100u ;调用廷时子程序越过0点


jbc ifdrim,0 ;是否梦幻,ifdrim判断是否梦幻

jmp intext2 ;有梦幻,

;;;;;;;;;;;;;;;;;;;;;;;;;;

;非梦幻子程序

;;;;;;;;;;;;;;;;;;;;;;;;;;

intext1:

mov a,code ;输出代码

mov port5,a

djz tcount1 ;tcount1是主计数器

jmp intend

mov a,tick ;tick中有一个常量值

mov tcount1,a ;在中断子程序内加载数据

bs stflag,7 ;tcount1为0要查表

jmp intend

;;;;;;;;;;;;;;;;;;;;;;;;;;

;梦幻子程序

;;;;;;;;;;;;;;;;;;;;;;;;;;

intext2:

djz tcount2 ;同一级亮度存在拍数由 spcode查表得到

jmp intext21

mov a,tick ;这是一个查表得来的值

mov tcount2,a

;;;;;;;;;;;;;;;;;;;;;;;;;;

djz tcount1 ;tcount1表示节拍

jmp intext21

bs stflag,7

inc tcount1 ;重置查表标志


/*;;;;;;;;;;;;;;;;;;;;;;;;;

;tcount1!=tcount3

;;;;;;;;;;;;;;;;;;;;;;;;;

intext25:

mov a,tcount1

sub a,tcount3

jbc status,c ;若为1则无借位,tcount1>tcount3

jmp intext27

mov temp3,a ;差放入temp3中

inc temp3

inc temp3

mov a,tcount3

mov temp,a

intext28:

call delay100u ;第一波廷时

djz temp

jmp intext28

mov a,code2 ;先输出code2,即处于消暗的代码

mov port5,a

intext29:

call delay100u

djz temp3

jmp intext29

mov a,code ;再输出code,即处于上涨的代码

mov port5,a

jmp intext21

intext27:

mov a,tcount3

sub a,tcount1

mov temp3,a

inc temp3

inc temp3

mov a,tcount1

mov temp,a

intext30:

call delay100u

djz temp

jmp intext30

mov a,code ;输出code,即处于上涨的代码

mov port5,a

intext31:

call delay100u

djz temp3

jmp intext31

mov a,code2 ;输出code2,即处于消暗的代码

mov port5,a

;;;;;;;;;;;;;;;;;;;;;;;;;;;*/

intext21:

jbs code,7 ;判断是渐亮还时渐灭

jmp intext22 ;这里是亮度变化趋势区分点

mov a,tcount1 ;code,7为1,则亮度渐亮

mov temp,a

intext23:

call delay100u ;这是个定长廷时子程序,如能用定时器会更好,那有可能利于加上按健功能

djz temp

jmp intext23

mov a,code ;输出已准备好的代码

mov port5,a ;

jmp intend

intext22:

mov a,tcount1 ;亮度为渐暗

add a,@91 ;与160对应产生不过0的廷时

mov temp,a

com temp ;得到渐暗方式的代码

intext24:

call delay100u

djz temp

jmp intext24

mov a,code

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。