⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc22p.s

📁 为苏州一家公司所做的的恒温恒湿车间控制 系统
💻 S
字号:
	.module ADC22P.c
	.area text
	.dbfile ADC22P.c
	.dbfunc e AD_SPIInit _AD_SPIInit fV
_AD_SPIInit::
	.dbline -1
	.dbline 16
; /*-----------------------------------------------------*
; *文件描述:本文件包含了AD采集的2子程序,分别为:          * 
; *(1)ADC22P:2片2543-22路AD采集                         *
; *(2)TLC2543:TLC2543芯片A/D转换子程序                   *
; *-------------《嵌入式应用技术基础教程》--------------*/
; #include "Includes.h"
; /*SPIInit:SPI初始化子程序-------------------------------*
; *功 能:对SPI进行初始化,默认为允许SPI,主机工作方式,时钟  *
; *      空闲低电平,比特率8分频,                         *
; *      波特率为CGMOUT/2*BD(设CGMOUT=2*fBUS=2*2.4576MHz)*
; *参 数:无                                               *
; *返 回:无                                               *
; *------------------------------------------------------*/
; #include "Includes.h"
; void AD_SPIInit(void)
;  {  
	.dbline 17
; 	SPCR=0b00100010;   //不产生中断、主机方式、时钟空闲低电平
	lda #34
	sta 0x10
	.dbline 18
; 	SPSCR=0b00000001;  //8分频
	lda #1
	sta 0x11
	.dbline -2
L1:
	.dbline 0 ; func end
	rts
	.dbend
	.dbfunc e ADC22P _ADC22P fV
;              j -> 0,X
;           temp -> 1,X
;        channel -> 3,X
;             cs -> 4,X
;           buff -> 5,X
;           flag -> 7,X
;              i -> 8,X
;        ADValue -> 11,X
_ADC22P::
	.dbline -1
	ais #-9
	tsx
	.dbline 28
;  }
; //------------------------------------------------------------------*
; /*A/D转换并求平均值(22路)子程序(AD22P.ASM)-----------------------*
; *功能:采集TLC2543(0)-(1)片,共22通道,取16次平均值放入内存ADValue *
; *入口:无                                                          *
; *出口:ADValue--22路通道的16次平均采样值                           *
; *调用:TLC2543Z                                                    *
; *-----------------------------------------------------------------*/
; void ADC22P(INT16U *ADValue)
; {   
	.dbline 33
; 	INT8U i,j,flag,buff[2]; 
; 	INT8U cs,channel;
;     INT16U temp; 
;     //A/D数据区清0   
;     for(flag=0;flag<=21;flag++)      
	clr 7,X
	bra L6
L3:
	.dbline 34
	clr *__r0
	lda 7,X
	sta *__r1
	lsl *__r1
	rol *__r0
	lda *__r1
	add 12,X
	sta *__r1
	lda *__r0
	adc 11,X
	sta *__r0
	clra
	ldhx *__r0
	sta ,x
	clra
	sta 1,x
	tsx
L4:
	.dbline 33
	inc 7,X
L6:
	.dbline 33
	lda 7,X
	cmp #21
	bls L3
	.dbline 37
;       ADValue[flag]=0; 
;     //启动第0片TLC2543的0通道转换,得到"空数据"--不要   
;     //对22个通道采集数据,每一路采集16次,16次的数据总和-->ADValue       
;     for(j=0;j<16;j++)
	clr ,X
	jmp L10
L7:
	.dbline 38
;     {
	.dbline 39
;       flag=0;
	clr 7,X
	.dbline 40
;       for(i=0;i<22;i++)
	clr 8,X
	jmp L14
L11:
	.dbline 41
	.dbline 42
	lda 8,X
	ldx #11
	clrh
	div
	tsx
	sta 4,X
	.dbline 43
	lda 8,X
	ldx #11
	clrh
	div
	pshh
	pula
	tsx
	sta 3,X
	.dbline 44
	aix #5
	pshx
	pshh
	tsx
	aix #2
	clr *__r0
	lda 3,X
	psha
	lda *__r0
	psha
	clr *__r0
	lda 4,X
	psha
	lda *__r0
	psha
	jsr _TLC2543
	ais #6
	tsx
	.dbline 45
	aix #5
	pshx
	pshh
	tsx
	aix #2
	clr *__r0
	lda 3,X
	psha
	lda *__r0
	psha
	clr *__r0
	lda 4,X
	psha
	lda *__r0
	psha
	jsr _TLC2543
	ais #6
	tsx
	.dbline 47
	lda 5,X
	sta 1,X
	lda 6,X
	sta 2,X
	.dbline 48
	clr *__r0
	lda 7,X
	sta *__r1
	lsl *__r1
	rol *__r0
	lda *__r1
	add 12,X
	sta *__r1
	lda *__r0
	adc 11,X
	sta *__r0
	ldhx *__r0
	lda 1,x
	sta *__r3
	lda ,x
	tsx
	sta *__r2
	lda *__r3
	add 2,X
	sta *__r3
	lda *__r2
	adc 1,X
	ldhx *__r0
	sta ,x
	lda *__r3
	sta 1,x
	tsx
	.dbline 49
	inc 7,X
	.dbline 50
L12:
	.dbline 40
	inc 8,X
L14:
	.dbline 40
	lda 8,X
	cmp #22
	bhs X1
	jmp L11
X1:
	.dbline 51
L8:
	.dbline 37
	inc ,X
L10:
	.dbline 37
	lda ,X
	cmp #16
	bhs X2
	jmp L7
X2:
	.dbline 53
;       { 
;         cs=i/11;
;         channel=i%11;      
;         TLC2543(cs,channel,buff);
;         TLC2543(cs,channel,buff);
;         //从内存buff取出数据-->ADValue[flag]中         
;         temp=*((unsigned int *)buff);         
;         ADValue[flag]=ADValue[flag]+temp;
;         flag++;       
;       }
;     }
;     //求22路A/D数据的16次平均值   
;     for(flag=0;flag<=21;flag++)     
	clr 7,X
	bra L18
L15:
	.dbline 54
	clr *__r0
	lda 7,X
	sta *__r1
	lsl *__r1
	rol *__r0
	lda *__r1
	add 12,X
	sta *__r1
	lda *__r0
	adc 11,X
	sta *__r0
	ldhx *__r0
	lda 1,x
	sta *__r3
	lda ,x
	sta *__r2
	lda #4
X0:
	lsr *__r2
	ror *__r3
	dbnza X0
	lda *__r2
	ldhx *__r0
	sta ,x
	lda *__r3
	sta 1,x
	tsx
L16:
	.dbline 53
	inc 7,X
L18:
	.dbline 53
	lda 7,X
	cmp #21
	bls L15
	.dbline -2
L2:
	ais #9
	.dbline 0 ; func end
	rts
	.dbsym l j 0 c
	.dbsym l temp 1 s
	.dbsym l channel 3 c
	.dbsym l cs 4 c
	.dbsym l buff 5 A[2:2]c
	.dbsym l flag 7 c
	.dbsym l i 8 c
	.dbsym l ADValue 11 ps
	.dbend
	.dbfunc e TLC2543 _TLC2543 fV
;           temp -> 0,X
;            buf -> 7,X
;        channel -> 5,X
;             cs -> 3,X
_TLC2543::
	.dbline -1
	ais #-1
	tsx
	.dbline 66
;       ADValue[flag]=ADValue[flag]/16;    
; }
; /*TLC2543芯片A/D转换子程序(TLC2543.c)--------------------------*
; *TLC2543的接线:                                                 *
; *             ① I/O LOCK(18)接MC08HC908GP32的SPSCK(18)         *
; *             ② DATA INPUT(17)接MC08HC908GP32的MOSI(17)        *
; *             ③ DATA OUT (16)接MC08HC908GP32的MISO(16)         *
; *             ④ 0-1片的片选CS(15)接分别接MC08HC908GP32的PTC0~1 *
; *入口:cs-片号,channel-通道号0,1,2 ...10  buf-存放数据的首址   *
; *出口:内存buf开始连续两个地址为取出的数(高4位、低8位)        *
; *--------------------------------------------------------------*/
; void TLC2543(INT16U cs,INT16U channel,INT8U *buf)
; {
	.dbline 68
;   INT8U temp;
;   CS_D=0xff;     //定义PTC为输出
	lda #-1
	sta 0x6
	.dbline 69
;   CS_P = 0xff;	 //C口全为高电平	
	lda #-1
	sta 0x2
	.dbline 71
;   //TLC2543片选CS=1    
;   CS_P &= ~(1<<cs);  //相应片TLC2543的选CS=0,产生高到低的变化    
	mov #0,*__r0
	mov #1,*__r1
	lda 4,X
	and #15
	beq X4
X3:
	lsl *__r1
	rol *__r0
	dbnza X3
X4:
	com *__r1
	com *__r0
	clr *__r2
	lda 0x2
	and *__r1
	sta *__r1
	lda *__r2
	and *__r0
	mov *__r1,0x2
	.dbline 73
;      
;   SPIDR = (channel<<4) | 0x0C;//入口通道、16位格式、MSB先送出、二进制
	lda 6,X
	sta *__r1
	lda 5,X
	sta *__r0
	lda #4
X5:
	lsl *__r1
	rol *__r0
	dbnza X5
	lda *__r1
	ora #12
	sta 0x12
L20:
	.dbline 74
L21:
	.dbline 74
;   while ((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1 
	brclr #3,0x11,L20
L23:
	.dbline 76
L24:
	.dbline 76
;                                           //发送完毕   
;   while ((SPISCR & (1<<ReFullBit)) == 0);    //为0等待,也就是等待SPRF为1
	brclr #7,0x11,L23
	.dbline 78
;   //发送控制字,取出上次转换结果高字节 
;   *buf = SPIDR; //*buf中存放的是D11~D4位   
	lda 8,X
	sta *__r1
	lda 7,X
	sta *__r0
	lda 0x12
	ldhx *__r0
	sta ,x
	tsx
	.dbline 79
;   SPIDR = *buf;	//上次转换结果低字节(后四位为0),握手信号  
	lda 7,X
	ldx 8,X
	psha
	pulh
	lda ,x
	tsx
	sta 0x12
L26:
	.dbline 80
L27:
	.dbline 80
;   while ((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1 
	brclr #3,0x11,L26
L29:
	.dbline 82
L30:
	.dbline 82
;                                           //发送完毕   
;   while ((SPISCR & (1<<ReFullBit)) == 0);    //为0等待,也就是等待SPRF为1 
	brclr #7,0x11,L29
	.dbline 84
;    					  //接收到数据
;   *(buf+1) = SPIDR;// *(buf+1)中存放D3~D0位   
	lda 8,X
	add #1
	sta *__r1
	lda 7,X
	adc #0
	sta *__r0
	lda 0x12
	ldhx *__r0
	sta ,x
	tsx
	.dbline 85
;   CS_P= 0xff;	//TLC2543片选CS=1    
	lda #-1
	sta 0x2
	.dbline 87
;   //整合后*buf存放高四位(D11~D8),*(buf+1)中存放低八位(D7~D0) 
;   *(buf+1) = (*(buf+1)>>4) | (*buf<<4);    
	lda 8,X
	add #1
	sta *__r1
	lda 7,X
	adc #0
	sta *__r0
	lda 7,X
	ldx 8,X
	psha
	pulh
	lda ,x
	nsa
	and #-16
	sta *__r2
	ldhx *__r0
	lda ,x
	sta *__r4
	lda #4
X6:
	lsr *__r4
	dbnza X6
	lda *__r4
	ora *__r2
	ldhx *__r0
	sta ,x
	tsx
	.dbline 88
;   *buf = *buf>>4;      
	lda 7,X
	ldx 8,X
	psha
	pulh
	lda ,x
	tsx
	sta *__r0
	lda #4
X7:
	lsr *__r0
	dbnza X7
	mov *__r0,*__r1
	lda 8,X
	sta *__r3
	lda 7,X
	sta *__r2
	lda *__r1
	ldhx *__r2
	sta ,x
	tsx
	.dbline -2
L19:
	ais #1
	.dbline 0 ; func end
	rts
	.dbsym l temp 0 c
	.dbsym l buf 7 pc
	.dbsym l channel 5 s
	.dbsym l cs 3 s
	.dbend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -