当前位置:首页 > 单片机 > 单片机
[导读] /******************************************************************基于isd1420语音芯片的温度报警功能:利用ds18b20检测当前温度,通过和设定参数的比较,给ISD1420发出报警脉冲,通过功率放大器L

/******************************************************************
基于isd1420语音芯片的温度报警

功能:利用ds18b20检测当前温度,通过和设定参数的比较,给ISD1420发出


报警脉冲,通过功率放大器LM386驱动喇叭报警。

注:isd1420的报警采用延时方式(isd1420的延时报警取决于录音时间的长短)

问题:1.isd1420会偶然的触发非正常的报警?
2.系统在上电时偶尔会进入非正常的状态?

********************************************************************/

#include
#include
#include

#defineucharunsignedchar
#defineuintunsignedint
#definePLAYE_ADDRXBYTE[0XBFFF]//语音报警地址

#defineBUSY0x80//LCD忙检测标志
#defineDATAPORTP0

sbitP1_0=P1^4;//时钟调整
sbitP1_1=P1^5;//时钟加
sbitP1_2=P1^6;//时钟减

sbitRED_ALARM=P1^0;//红色指示灯
sbitWRITE_ALARM=P1^1;//白色指示灯
sbitGREEN_ALARM=P1^2;//绿色指示灯

sbitDQ=P3^7;//定义ds18b20通信端口
sbitLCM_RS=P2^0;//数据/命令端
sbitLCM_RW=P2^1;//读/写选择端
sbitLCM_EN=P2^2;//LCD使能信号
sbitRECLED_EOC=P3^5;//ISD1420放音结束查询标志


unsignedcharseconde=0;//定义并初始化时钟变量
unsignedcharminite=0;
unsignedcharhour=12;
unsignedcharmstcnt=0;
unsignedchartemp1,temp2,teMP3;
unsignedcharruntime;//系统运行总时间
unsignedchart;
unsignedinttemp;

ucharcodestr0[]={"---::---of"};
ucharcodestr1[]={"temp:.C------"};

voiddelay_LCM(uint);//LCD延时子程序
voidinitLCM(void);//LCD初始化子程序
voidlcd_wait(void);//LCD检测忙子程序
voidWriteCommandLCM(ucharWCLCM,ucharBusyC);//写指令到ICM子函数
voidWritEDAtaLCM(ucharWDLCM);//写数据到LCM子函数
voidDisplayOneChar(ucharX,ucharY,ucharDData);//显示指定坐标的一个字符子函数
voidDisplayListChar(ucharX,ucharY,ucharcode*DData);//显示指定坐标的一串字符子函数

voidinit_timer0(void);//定时器初始化
voiddisplayfun1(void);

voiddelay_18B20(unsignedinti);
voidInit_DS18B20(void);
ucharReadOneChar(void);
voidWriteOneChar(unsignedchardat);
voidReadTemperature(void);
voidplayalarm(void);

/*********延时K*1ms,12.000mHz**********/

voiddelay_LCM(uintk)
{
uinti,j;
for(i=0;i{
for(j=0;j<60;j++)
{;}
}
}
/**********写指令到ICM子函数************/

voidWriteCommandLCM(ucharWCLCM,ucharBusyC)
{
if(BusyC)lcd_wait();
DATAPORT=WCLCM;
LCM_RS=0;//选中指令寄存器
LCM_RW=0;//写模式
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}

/**********写数据到LCM子函数************/

voidWriteDataLCM(ucharWDLCM)
{
lcd_wait();//检测忙信号
DATAPORT=WDLCM;
LCM_RS=1;//选中数据寄存器
LCM_RW=0;//写模式
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}

/***********lcm内部等待函数*************/

voidlcd_wait(void)
{
DATAPORT=0xff;
LCM_EN=1;
LCM_RS=0;
LCM_RW=1;
_nop_();
_nop_();
_nop_();
while(DATAPORT&BUSY)
{
LCM_EN=0;
_nop_();
_nop_();
LCM_EN=1;
_nop_();
_nop_();
}
LCM_EN=0;

}

/**********LCM初始化子函数***********/

voidinitLCM()
{
DATAPORT=0;
delay_LCM(15);
WriteCommandLCM(0x38,0);//三次显示模式设置,不检测忙信号
delay_LCM(5);
WriteCommandLCM(0x38,0);
delay_LCM(5);
WriteCommandLCM(0x38,0);
delay_LCM(5);

WriteCommandLCM(0x38,1);//8bit数据传送,2行显示,5*7字型,检测忙信号
WriteCommandLCM(0x08,1);//关闭显示,检测忙信号
WriteCommandLCM(0x01,1);//清屏,检测忙信号
WriteCommandLCM(0x06,1);//显示光标右移设置,检测忙信号
WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示,不闪烁,检测忙信号
}

/****************显示指定坐标的一个字符子函数*************/

voidDisplayOneChar(ucharX,ucharY,ucharDData)
{
Y&=1;
X&=15;
if(Y)X|=0x40;//若y为1(显示第二行),地址码+0X40
X|=0x80;//指令码为地址码+0X80
WriteCommandLCM(X,0);
WriteDataLCM(DData);
}

/***********显示指定坐标的一串字符子函数***********/

voidDisplayListChar(ucharX,ucharY,ucharcode*DData)
{
ucharListLength=0;
Y&=0x01;
X&=0x0f;
while(X<16)
{
DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++;
}
}

/***********ds18b20延迟子函数(晶振12MHz)*******/

voiddelay_18B20(unsignedinti)
{
while(i--);
}

/**********ds18b20初始化函数**********************/

voidInit_DS18B20(void)
{
unsignedcharx=0;
DQ=1;//DQ复位
delay_18B20(8);//稍做延时
DQ=0;//单片机将DQ拉低
delay_18B20(80);//精确延时大于480us
DQ=1;//拉高总线
delay_18B20(14);
x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay_18B20(20);
}

/***********ds18b20读一个字节**************/

unsignedcharReadOneChar(void)
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/*************ds18b20写一个字节****************/

voidWriteOneChar(uchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay_18B20(5);
DQ=1;
dat>>=1;
}
}

/**************读取ds18b20当前温度************/

voidReadTemperature(void)
{
unsignedchara=0;
unsignedcharb=0;
unsignedintt=0;

Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换

delay_18B20(100);//thismessageisweryimportant

Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度

delay_18B20(100);

a=ReadOneChar();//读取温度值低8位
b=ReadOneChar();//读取温度值高8位
temp1=b<<4;
temp1+=(a&0xf0)>>4;//小数点前的数据
temp2=a&0x0f;//小数点后的数据
temp=temp1;

//temp=((b*256+a)>>4);//当前采集温度值除16得实际温度值



//temp1=t/100%10;//温度值十位
//temp2=t/10%10;//温度值个位
//temp3=t%10;//温度值十分位
}

/***************液晶显示子函数1正常显示*****************/

voiddisplayfun1(void)
{
WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示,不闪烁,检测忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);

DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);

DisplayOneChar(6,0,minite/10+0x30);
DisplayOneChar(7,0,minite%10+0x30);

DisplayOneChar(9,0,seconde/10+0x30);
DisplayOneChar(10,0,seconde%10+0x30);

DisplayOneChar(5,1,temp1/10+0x30);
DisplayOneChar(6,1,temp1%10+0x30);
DisplayOneChar(8,1,temp2/10+0x30);
}

/***************定时器t0初始化*******************/


voidinit_timer0(void)
{
TMOD=0x01;//time0为定时器,方式1
TH0=0x3c;//预置计数初值
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
}

/***********定时器t0中断子函数**************/

voidtimer0(void)interrupt1using0//定时器0方式1,50ms中断一次
{
TH0=0x3c;
TL0=0xb0;
mstcnt++;
if(mstcnt>=20){seconde++;mstcnt=0;}
if(seconde>=60){minite++;seconde=0;}
if(minite>=60){hour++;minite=0;}
if(hour>=24){hour=0;}
}


/*****************系统报警子函数***************************/

voidplayalarm(void)//语音提示温度上升过快
{

if(temp>20&&temp<25)
{
RED_ALARM=0;
PLAYE_ADDR=0x11;
_nop_();
PLAYE_ADDR=0x10;
delay_LCM(2000);//等待放音结束
RED_ALARM=1;
}

if(temp>25&&temp<30)//语音提示温度上升过慢
{
GREEN_ALARM=0;
PLAYE_ADDR=0x21;
_nop_();
PLAYE_ADDR=0x20;
delay_LCM(2000);
GREEN_ALARM=1;
}

if(temp>30)//语音提示恒温控制
{
WRITE_ALARM=0;
PLAYE_ADDR=0x31;
_nop_();
PLAYE_ADDR=0x30;
delay_LCM(1000);
WRITE_ALARM=1;
}
}

/***************themainfuntion****************/

voidmain(void)
{
P1=0xff;//初始化p1口,全设为1
P3=0xff;
delay_LCM(500);
initLCM();//LCD初始化
init_timer0();//时钟定时器0初始化
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
Init_DS18B20();//DS18B20初始化

while(1)
{
delay_LCM(10);
ReadTemperature();
playalarm();
displayfun1();
delay_LCM(10);
}
}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭