📄 bs18b20information collection and voice broadcast.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 + -