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

📄 bs18b20information collection and voice broadcast.txt

📁 基于凌阳单片机的DS18B20驱动、温度信号采集和语音播报程序
💻 TXT
字号:
包含文件有:main.c、18B20user.c、key.asm、18B20driver.asm

//****主程序***********
/*功能描述:通过按键1(IOA0)来拨报当时的室温*/
#include "SPCE061A.h"
#include "DS18B20User.h"
typedef unsigned char uchar;
uchar flag;
int main(void)
{   float DS18B20_qidong(void);
    float n,m,fTemp=0.0;
	unsigned int temp=0,k,l,jj;
	int yi=1,er=2,san=3,shi=10,dian=11,danwei=12;
	__asm("nop");
	temp = DS18B20_Initial();       //初始化DS18B20
				
	while(1)
{
    scankey();
	fTemp = DS18B20_qidong();				//进行一次测温并读取测量温度值
	*P_Watchdog_Clear = 0x0001;
	if(flag==1)
	{
	 flag=0;
	 jj=value1();
	 switch(jj)
	 {
	  case 0x0001:
	  				if(fTemp<10)
	  				{
	  				 n=fTemp*100;
	  				 k=(int)n;
	  			//	 play(wa);
	  				 play(k/100);
	  				 play(dian);
	  				 play((k%100)/10);
	  				 play((k%100)%10);
	  				 play(danwei);
	  				 *P_Watchdog_Clear = 0x0001;
	  				 }
	  				 if(fTemp==10)
	  				 {
	  				//  play(wa);
	  				  play(yi);
	  				  play(shi);
	  				  play(danwei);
	  				  *P_Watchdog_Clear = 0x0001;
	  				  }
	  				  if(fTemp==20)
	  				 {
	  			//	  play(wa);
	  				  play(er);
	  				  play(shi);
	  				  play(danwei);
	  				  *P_Watchdog_Clear = 0x0001;
	  				  }
	  				  if(fTemp==30)
	  				 {
	  			//	  play(wa);
	  				  play(san);
	  				  play(shi);
	  				  play(danwei);
	  				  *P_Watchdog_Clear = 0x0001;
	  				  }
	  		//		  if((10<fTemp&&fTemp<20)|(20<fTemp&&fTemp<30)|(30<fTemp&&fTemp<40)|(40<fTemp&&fTemp<50)|(50<fTemp&&fTemp<100))
	  		          if(20<fTemp&&fTemp<100)
	  				  {
	  				   m=fTemp*100;
	  				   l=(int)m;
	  		//		   play(wa);
	  				   play(l/1000);
	  				   play(shi);
	  			if((l%1000)/100!=0) play((l%1000)/100);
	  				   play(dian);
	  				   play(((l%1000)%100)/10);
	  				   play(((l%1000)%100)%10);
	  				   play(danwei);
	  				   *P_Watchdog_Clear = 0x0001;
	  				   }
	  				   break;
	  case 0x0002:break;
	  case 0x0004:break;
	  default:break;
	  }
	}
  }
}


void play(unsigned int result)         //音频播放子程序
  {SACM_S480_Initial(1);
   SACM_S480_Play(result,3,3);
   while(SACM_S480_Status()&0x01)
       SACM_S480_ServiceLoop();
       *P_Watchdog_Clear = 0x0001;
 }
 
 float DS18B20_qidong(void)                 //启动18B20转换温度
{
	int uiTemp=0;
	float fTemp=0.0;
	unsigned int Data[9];
	F_18B20_SetSystemCLK();
	if(F_18B20_Reset())                //判断复位是否成功
	{
		DS18B20_WriteByte(0xcc);	//Skip ROM
		DS18B20_WriteByte(0x44);	//启动18B20进行转换
		while(F_18B20_Read_DQ()==0)	//wait for converting OK
		{
			uiTemp++;
		}
		F_18B20_Reset();
		DS18B20_WriteByte(0xcc);	//Skip ROM
		DS18B20_WriteByte(0xbe);	//Skip ROM
		for(uiTemp=0;uiTemp<9;uiTemp++)
		{
			Data[uiTemp] = DS18B20_ReadByte();
		}
		F_18B20_Reset();
		uiTemp = (Data[1]<<8)|Data[0];
		fTemp = (float)uiTemp;
		fTemp = fTemp/16;
	}
 	F_18B20_RsuSystemCLK();
	return fTemp;
}
//**************地层驱动程序***************************
	.DEFINE		P_IOA_Data				0x7000
	.DEFINE		P_IOA_Buffer			0x7001
	.DEFINE		P_IOA_Dir				0x7002
	.DEFINE		P_IOA_Attrib			0x7003
	.DEFINE		P_IOA_Latch				0x7004

	.DEFINE		P_IOB_Data				0x7005
	.DEFINE		P_IOB_Buffer			0x7006
	.DEFINE		P_IOB_Dir				0x7007
	.DEFINE		P_IOB_Attrib			0x7008
	.DEFINE		P_SystemClock			0x7013
.DEFINE Port_Data	P_IOB_Data
.DEFINE Port_Buffer	P_IOB_Buffer
.DEFINE Port_Dir	P_IOB_Dir
.DEFINE Port_Attrib	P_IOB_Attrib
//M_DQ用于定义具体连接DS18B20的DQ线的端口
.DEFINE	M_DQ	0x8000			//
.DATA
R_SystemClock:
	.DW	0x0018					//buffer of save the system clock
	
.CODE
.PUBLIC _F_18B20_Initial_IO   //端口初始化
_F_18B20_Initial_IO:
	r1 = [Port_Dir]				//set the prot connected DQ to float input mode 
	r1 = r1&(~M_DQ)
	[Port_Dir] = r1
	r1 = [Port_Attrib]
	r1 = r1|M_DQ
	[Port_Attrib] = r1
	r1 = [Port_Buffer]
	r1 = r1|M_DQ
	[Port_Buffer] = r1
	retf
//======================================================
// 汇编格式:	_F_18B20_Reset
// C格式:		unsigned int F_18B20_Reset(void);
// 实现功能:	一线总线复位及从设备应答控制程序
// 入口参数:	无
// 出口参数:	0表示复位失败   1表示复位成功
// 破坏寄存器:	r2  r3
//======================================================	
.PUBLIC _F_18B20_Reset
_F_18B20_Reset:
	r3 = [Port_Dir]
	r3 = r3|M_DQ
	[Port_Dir] = r3					//Set Port connect DQ as Ouput
	r2 = [Port_Buffer]
	r2 = r2&(~M_DQ)
	[Port_Buffer] = r2				//Set DQ to Low
	r1 = 600
	call _F_18B20_Delay				//Delay 600us for DS18B20 Reset
	r2 = r2|M_DQ		
	[Port_Buffer] = r2
	r3 = r3&(~M_DQ)
	[Port_Dir] = r3					//resume the port as floatting input 
	r1 = 30
	call _F_18B20_Delay				//Delay 30us
	r2 = 1000
?F_18B20_Reset_L:
	r2 -=1
	jz ?F_18B20_Reset_E				//Timer overflow Erro
	r1 = [Port_Data]
	r1 = r1&M_DQ
	jnz ?F_18B20_Reset_L
	r2 = 1000
?F_18B20_Reset_L2:
	r2-=1
	jz ?F_18B20_Reset_E				//Timer overflow Erro
	r1 = [Port_Data]
	r1 = r1&M_DQ
	jz ?F_18B20_Reset_L2
	r1 = 1
	jmp ?F_18B20_Reset_Exit
?F_18B20_Reset_E:
	r1 = 0
?F_18B20_Reset_Exit:
	retf
//======================================================
// 汇编格式:	_F_18B20_Write_1
// C格式:		void F_18B20_Write_1(void);
// 实现功能:	向一线总线写1
// 入口参数:	无
// 出口参数:	无
// 破坏寄存器:	r1  r2  r3
//======================================================
.PUBLIC _F_18B20_Write_1
_F_18B20_Write_1:
	r3 = [Port_Dir]
	r3 = r3|M_DQ
	[Port_Dir] = r3					//Set Port connect DQ as Ouput
	r2 = [Port_Buffer]
	r2 = r2&(~M_DQ)
	[Port_Buffer] = r2				//Set DQ to Low
	r1 = 10
	call _F_18B20_Delay				//Delay 10us
	r2 = r2|M_DQ		
	[Port_Buffer] = r2
	r1 = 25
	call _F_18B20_Delay				//Delay 40us
	r3 = r3&(~M_DQ)
	[Port_Dir] = r3					//resume the port as floatting input 
	retf
//======================================================
// 汇编格式:	_F_18B20_Write_0
// C格式:		void F_18B20_Write_0(void);
// 实现功能:	向一线总线写0
// 入口参数:	无
// 出口参数:	无
// 破坏寄存器:	r1  r2  r3
//======================================================
.PUBLIC _F_18B20_Write_0
_F_18B20_Write_0:
	r3 = [Port_Dir]
	r3 = r3|M_DQ
	[Port_Dir] = r3					//Set Port connect DQ as Ouput
	r2 = [Port_Buffer]
	r2 = r2&(~M_DQ)
	[Port_Buffer] = r2				//Set DQ to Low
	r1 = 40
	call _F_18B20_Delay				//Delay 40us
	r2 = r2|M_DQ		
	[Port_Buffer] = r2
	r1 = 1
	call _F_18B20_Delay				//Delay 1us
	r3 = r3&(~M_DQ)
	[Port_Dir] = r3					//resume the port as floatting input 
	retf
//======================================================
// 汇编格式:	_F_18B20_Read_DQ
// C格式:		unsigned int F_18B20_Read_DQ(void);
// 实现功能:	读一位一线总线的数据
// 入口参数:	无
// 出口参数:	当前读回的位的值0或1
// 破坏寄存器:	r1  r2  r3
//======================================================	
.PUBLIC _F_18B20_Read_DQ
_F_18B20_Read_DQ:
	r3 = [Port_Dir]
	r3 = r3|M_DQ
	[Port_Dir] = r3					//Set Port connect DQ as Ouput
	r2 = [Port_Buffer]
	r2 = r2&(~M_DQ)
	[Port_Buffer] = r2				//Set DQ to Low
	r1 = 10
	call _F_18B20_Delay				//Delay 40us
	r3 = r3&(~M_DQ)
	[Port_Dir] = r3					//resume the port as floatting input 
	r1 = 3
	call _F_18B20_Delay				//Delay 40us
	r3 = [Port_Data]
	r3 = r3&M_DQ
	jz ?L18B20_Read_0
	r3 = 0x80
?L18B20_Read_0:
	r1 = 30
	call _F_18B20_Delay
	r2 = r2|M_DQ		
	[Port_Buffer] = r2
	r1 = 1
	call _F_18B20_Delay				//Delay 1us
	r1 = r3
	retf
//======================================================
// 汇编格式:	_F_18B20_Delay
// C格式:		void F_18B20_Delay(unsigned int Timers);
// 实现功能:	在49MHz的主频下的uS延时程序
// 入口参数:	需要延时的时长(以uS为单位)
// 出口参数:	无
// 破坏寄存器:	r1  
//======================================================	
.PUBLIC _F_18B20_Delay
_F_18B20_Delay:
	cmp r1,1
	jna ?Delay_Exit
?Delay_Loop:
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	r1-=1
	jnz ?Delay_Loop
?Delay_Exit:
	retf
//======================================================
// 汇编格式:	_F_18B20_SetSystemCLK
// C格式:		F_18B20_SetSystemCLK(void);
// 实现功能:	将CPU主频设置为49MHz,为的是在时序控制时
//				可以获取到较精确的延时
// 入口参数:	无
// 出口参数:	无
// 破坏寄存器:	r1  
//======================================================
.PUBLIC _F_18B20_SetSystemCLK
_F_18B20_SetSystemCLK:
	r1 = 0x88
	[P_SystemClock] = r1			//set system clock upto 49MHz
	retf
//======================================================
// 汇编格式:	_F_18B20_RsuSystemCLK
// C格式:		void F_18B20_RsuSystemCLK(void);
// 实现功能:	恢复系统及CPU主频,而至于恢复为多少,则
//				由前面定义的变量R_SystemClock的值确定,用
//				户可根据各自的程序设计需求进行改动
// 入口参数:	无
// 出口参数:	无
// 破坏寄存器:	r1  
//======================================================
.PUBLIC _F_18B20_RsuSystemCLK
_F_18B20_RsuSystemCLK:
	r1 = [R_SystemClock]
	[P_SystemClock] = r1
	retf

//****************按键服务程序******************
.include hardware.inc
.include s480.inc
.EXTERNAL _flag
.ram
.var _keyva
.code
.public _scankey
_scankey:.proc
	
	r1=[P_IOA_Data]
	r1&=0x000f
	cmp r1,0
	jne loop
	retf
loop:
    r1=1
    [_flag]=r1
	call delay
	r1=[P_IOA_Data]
	r1&=0x000f
	cmp r1,0x0001                   //有三个键值0x0001,0x0002,0x0004
	je _value
	r1=[P_IOA_Data]
	r1&=0x000f
	cmp r1,0x0002
	je _value
	r1=[P_IOA_Data]
	r1&=0x000f
	cmp r1,0x0004
	je _value
	retf
	.endp
.public _value
_value:
	[_keyva]=r1
	retf
	.endp
.public _value1
_value1:.proc
	r1=[_keyva]
	retf
	.endp
	

delay:                                         //延时子程序
	r1=0
loop7:r1+=1
	cmp r1,0xd000
	jne loop7
	retf
//***********************音频中断服务子程序*******************************
.text
.public _FIQ
_FIQ:
	push r1,r4 to [sp]
	r1=0x2000
	test r1,[P_INT_Ctrl]
	jnz L_FIQ_TimerA
	r1=0x8000
	test r1,[P_INT_Ctrl]
	jnz L_FIQ_TimerB
L_FIQ_pwm:
	[P_INT_Clear]=r1
	pop r1,r4 from [sp]
	reti
L_FIQ_TimerA:
	[P_INT_Clear]=r1
	call F_FIQ_Service_SACM_S480;
	pop r1,r4 from [sp]
	reti
L_FIQ_TimerB:
	[P_INT_Clear]=r1
	pop r1,r4 from [sp]
	reti

///*****************用户使用程序*************
#include  "DS18B20Driver_IO.h"
void DS18B20_WriteByte(unsigned int Data)
{
	unsigned int i;
	for(i=0;i<8;i++)
	{
		if(Data&0x0001)                //用与操作判断data的最底位是1还是0,是1则写1,是0则写0
			F_18B20_Write_1();         //写1子程序
		else
			F_18B20_Write_0();           //写0子程序
		Data = Data>>1;	              //把data的高位一个个的移到最第位
	}
}

unsigned int DS18B20_ReadByte(void)
{
	unsigned int i,Data=0;
	for(i=0;i<8;i++)
	{
		Data = Data>>1;
		Data = Data|F_18B20_Read_DQ();
	}
	return Data;           //返回是8位的数据	
}

unsigned int DS18B20_Initial(void)
{
	unsigned int uiTemp=0;
	F_18B20_SetSystemCLK();     //将CPU主频设置为49MHz,为的是在时序控制时可以获取到较精确的延时
	F_18B20_Initial_IO();
	uiTemp = F_18B20_Reset();
	F_18B20_RsuSystemCLK();         //恢复系统及CPU主频
	return uiTemp;                  //uiTemp=0---失败,uitemp=1---成功
}

⌨️ 快捷键说明

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