傻傻的恰恰 傻傻的恰恰
胸不在大,有型则灵;斯是实妹,唯吾是侵;可以给糖果,玩亲亲;学校游泳池,公园小凉亭;吾自云:能推就行
关注数: 32 粉丝数: 46 发帖数: 545 关注贴吧数: 26
求帮忙找到WT588D语音 获取数据的语言 #include <reg52.h> //调用单片机头文件 #define uchar unsigned char //无符号字符型 宏定义变量范围0~255 #define uint unsigned int //无符号整型 宏定义变量范围0~65535 #include <intrins.h> #include "eeprom52.h" sbit beep = P2^3; //蜂鸣器IO口定义 uint temperature ; // bit flag_300ms ; bit flag_lj_en; //按键连加使能 bit flag_lj_3_en; //按键连3次连加后使能 加的数就越大了 uchar key_time,key_value; //用做连加的中间变量 bit key_500ms ; uchar code table_num[]="0123456789abcdefg"; sbit rs=P1^0; //寄存器选择信号 H:数据寄存器 L:指令寄存器 sbit rw=P1^1; //寄存器选择信号 H:数据寄存器 L:指令寄存器 sbit e =P1^2; //片选信号 下降沿触发 uchar menu_1; //菜单设计的变量 uint t_high = 300,t_low = 100; /************* 红外测温引脚定义 *************/ sbit A_TN9=P2^2; //TN9触发 sbit CLK_TN9=P2^1;//TN9时钟线 sbit DATA_TN9=P2^0;//TN9数据线 /***********全局变量定义**************/ bit flag; unsigned char TN_Data_Buff[5];//红外模块数据缓存数组 unsigned char DATA_INDEX; unsigned char DATA_NUM;//八位数据计数 unsigned char data_tmp;//红外模块数据缓存 unsigned char table_mbtemp[]="00.00^C"; uint addr; // 放音地址 unsigned char con=0,bre=0,co=0; //测温模式 连续 间续 float iTemp,MBTemp=11.01;//温度数据 void delay() { unsigned int i; for(i=0;i<10;i++); } /***********************语音模块控制IO口的定义************************/ sbit VRST = P1^3; sbit VBUSY= P1^4; sbit VSDA = P1^5; sbit VCS = P1^6; sbit VSCL = P1^7; uchar yujing[3]; /*************************** 语音地址的安排 0 - 9 : 对应数字0到9 0b : 点 0c : 米 0d : 已超出量程 /******************************************************************** * 名称 : delay_uint() * 功能 : 小延时。 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void delay_uint(uint q) { while(q--); } /***********************1ms延时函数*****************************/ void delay_1ms(uint q) { uint i,j; for(i=0;i<q;i++) for(j=0;j<110;j++); } /******************把数据保存到单片机内部eepom中******************/ void write_eeprom()//保存数据 { SectorErase(0x2000); byte_write(0x2000, t_high % 256); byte_write(0x2001, t_high / 256); byte_write(0x2002, t_low % 256); byte_write(0x2003, t_low / 256); byte_write(0x2055, a_a); } /******************把数据从单片机内部eepom中读出来*****************/ void read_eeprom() //读出保存数据 { t_high = byte_read(0x2001); t_high <<= 8; t_high |= byte_read(0x2000); t_low = byte_read(0x2003); t_low <<= 8; t_low |= byte_read(0x2002); a_a = byte_read(0x2055); } ///**************开机自检eeprom初始化*****************/ void init_eeprom() ////开始初始化保存的数据 { read_eeprom(); //读出保存数据 if(a_a != 38)//新的单片机初始单片机内问EEPROM { t_high = 400; t_low = 100; a_a = 38; write_eeprom();//保存数据 } } //========================================================================== ////C格式:void TN_IRACK_EN(void); //实现功能:红外模块启动函数 //入口参数:无 //出口参数:无 //========================================================================== void TN_IRACK_EN(void) { unsigned char j; flag=0; A_TN9=0; delay(); DATA_NUM=0; DATA_INDEX=0; for(j=0;j<=4;j++) TN_Data_Buff[j]=0; } //========================================================================== //C格式:void TN_IRACK_UN(void); //实现功能:红外模块关闭函数 //入口参数:无 //出口参数:无 //========================================================================== void TN_IRACK_UN(void) { A_TN9=1; } //========================================================================== //C格式:int TN_ReadData(void); //实现功能:读测得数据 //========================================================================== void TN_ReadData(void) { data_tmp=0; DATA_NUM=0; DATA_INDEX=0; while(DATA_INDEX<5) { if(!CLK_TN9) { if(flag==0) { flag=1; DATA_NUM++; data_tmp<<=1; if(DATA_TN9) { data_tmp=data_tmp|0x01; } else { data_tmp=data_tmp&0xfe; } if(DATA_NUM==8) { TN_Data_Buff[DATA_INDEX]=data_tmp; DATA_NUM=0; DATA_INDEX++; data_tmp=0; } } } else { if(flag==1) { flag=0; } } } } //======================================================================// //Program:TN红外传感器目标数据测量子程序 //InPut:NULL //OutPut:unsigned int returnData测量结果的出错标识 //Note: //Edit by xinqiang 20050324 //======================================================================// unsigned char TN_IR_GetData() { unsigned char iItem,MSB,LSB; unsigned char Back_Data; //定义返回变量,返回0表示读出正确数据 Back_Data = 0xaa; // TN_IRACK_UN(); //delay_1ms(10); TN_IRACK_EN();//enable the TN delay(); delay(); delay(); TN_ReadData(); delay(); iItem = TN_Data_Buff[0]; //取读到第一个字节数据 delay(); if(iItem==0x4c) //判断第一个字节数据是否正确 { MSB = (TN_Data_Buff[1]); //取读到第二个字节数据 LSB = (TN_Data_Buff[2]); //取读到第三个字节数据 if(TN_Data_Buff[4] == 0x0d) //判断是否读到结束标志 { iTemp = MSB*256 +LSB; //计算温度值,计算方法请参考红外测温模块 iTemp = iTemp/16 - 273.15; Back_Data = 0; //返回变量赋0 } } TN_IRACK_UN(); //Unable the TN return Back_Data; //返回Back_Data } /******************************************************************** * 名称 : write_com(uchar com) * 功能 : 1602命令函数 * 输入 : 输入的命令值 * 输出 : 无 ***********************************************************************/ void write_com(uchar com) { e=0; rs=0; rw=0; P0=com; delay_uint(25); e=1; delay_uint(100); e=0; } /******************************************************************** * 名称 : write_data(uchar dat) * 功能 : 1602写数据函数 * 输入 : 需要写入1602的数据 * 输出 : 无 ***********************************************************************/ void write_data(uchar dat) { e=0; rs=1; rw=0; P0=dat; delay_uint(25); e=1; delay_uint(100); e=0; } /******************************************************************** * 名称 : write_string(uchar hang,uchar add,uchar *p) * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下 write_string(1,5,"ab cd ef;") * 输入 : 行,列,需要输入1602的数据 * 输出 : 无 ***********************************************************************/ void write_string(uchar hang,uchar add,uchar *p) { if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); while(1) { if(*p == '\0') break; write_data(*p); p++; } } /***********************lcd1602上显示特定的字符************************/ void write_zifu(uchar hang,uchar add,uchar date) { if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); write_data(date); } /***********************lcd1602上显示两位十进制数************************/ void write_sfm3_18B20(uchar hang,uchar add,uint date) { if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); write_data(0x30+date/100%10); write_data(0x30+date/10%10); write_data('.'); write_data(0x30+date%10); } /***********************lcd1602初始化设置************************/ void init_1602() { write_com(0x38);// write_com(0x0c); write_com(0x06); delay_uint(1000); write_string(1,0," temp: . "); write_string(2,0,"H: . L: . "); write_zifu(1,12,0xdf); //显示度 write_zifu(2,6, 0xdf); //显示度 write_zifu(2,14,0xdf); //显示度 } /*************定时器0初始化程序***************/ void time_init() { EA = 1; //开总中断 TMOD = 0X01; //定时器0、定时器1工作方式1 ET0 = 1; //开定时器0中断 TR0 = 1; //允许定时器0定时 } /********************独立按键程序*****************/ uchar key_can; //按键值 void key() //独立按键程序 { static uchar key_new; key_can = 20; //按键值还原 P3 |= 0xf0; if(key_500ms == 1)//连加 { key_500ms = 0; key_new = 1; } if((P3 & 0xf0) != 0xf0)//按键按下 { delay_1ms(1); //按键消抖动 if(((P3 & 0xf0) != 0xf0) && (key_new == 1)) {//确认是按键按下 key_new = 0; switch(P3 & 0xf0) { case 0xd0: key_can = 3; break; //得到k1键值 case 0xb0: key_can = 2; break; //得到K2键值 case 0x70: key_can = 1; break; //得到k3键值 } flag_lj_en = 1; //连加使能 } } else { if(key_new == 0) { key_new = 1; write_eeprom();//保存数据 flag_lj_en = 0;//关闭连加使能 flag_lj_3_en = 0;//关闭3秒后使能 key_value = 0;//清零 key_time = 0; } } } /****************按键显示函数***************/ void key_with() { if(key_can == 1) //设置键 { menu_1 ++; if(menu_1 >= 3) { menu_1 = 0; } if(menu_1 == 0) { write_com(0x0c); //关闭光标 } } if(menu_1 == 1)//设置高温报警 { if(key_can == 2) { if(flag_lj_3_en == 0) t_high ++ ;//按键按下未松开自动加三次 else t_high += 10;//按键按下未松开自动加三次之后每次自动加10 if(t_high > 990) t_high = 990; } if(key_can == 3) { if(flag_lj_3_en == 0) t_high -- ;//按键按下未松开自动减三次 else t_high -= 10;//按键按下未松开自动减三次之后每次自动减10 if(t_high <= t_low) t_high = t_low + 1; }write_sfm3_18B20(2,2,t_high); write_com(0x80+0x40+2); //将光标移动到秒个位 write_com(0x0f); //显示光标并且闪烁 write_eeprom();//保存数据 } if(menu_1 == 2)//设置低温报警 { if(key_can == 2) { if(flag_lj_3_en == 0) t_low ++ ;//按键按下未松开自动加三次 else t_low += 10;//按键按下未松开自动加三次之后每次自动加10 if(t_low >= t_high) t_low = t_high - 1; } if(key_can == 3) { if(flag_lj_3_en == 0) t_low -- ;//按键按下未松开自动减三次 else t_low -= 10;//按键按下未松开自动加三次之后每次自动加10 if(t_low <= 10) t_low = 10; } write_sfm3_18B20(2,10,t_low); write_com(0x80+0x40+10); //将光标移动到秒个位 write_com(0x0f); //显示光标并且闪烁 write_eeprom();//保存数据 } } /********************菜单对应的处理函数***********************/ void menu_dispaly() { if((menu_1 == 1)) //对光标不处理,要不然光标不会显示在正确的位置 { write_com(0x80+0x42); //将光标移动到 write_com(0x0f); //显示光标并且闪烁 }else if((menu_1 == 2)) { write_com(0x80+0x4a); //将光标移动到 write_com(0x0f); //显示光标并且闪烁 } } /****************报警函数***************/ void clock_h_l() { static uchar value1; if((temperature <= t_low) || (temperature >= t_high)) { value1 ++; //消除实际距离在设定距离左右变化时的干扰 if(value1 >= 2) { beep = ~beep; //蜂鸣器报警 } } else { beep = 1; value1 =0; } } void delay_us (unsigned int us) { while(us--) { _nop_(); } } /***********************三线发码子程序************************/ void Send_threelines(unsigned char addr) { unsigned char i; VRST=0; delay_1ms(5); VRST=1; delay_1ms(20); /* 复位拉高20ms*/ VCS=0; delay_1ms(5); /* 片选拉低5ms */ for(i=0;i<8;i++) { VSCL=1; if(addr&0x01) { VSDA=1; } else VSDA=0; addr>>=1; delay_us(150); /* 150us */ VSCL=0; delay_us(150); /* 150us */ } VCS=1; delay_1ms(300); while(VBUSY == 0); //忙等待 } /****************主函数***************/ void main() { static uchar value = 2; beep = 0; //开机叫一声 delay_1ms(150); P0 = P1 = P2 = P3 = 0xff; init_1602(); //1602初始化 init_eeprom();//开机自检eeprom初始化 if(!TN_IR_GetData()) { temperature = iTemp * 10; } write_sfm3_18B20(2,2,t_high); write_sfm3_18B20(2,10,t_low); delay_1ms(650); temperature = 251; write_sfm3_18B20(1,8,temperature); time_init(); //初始化定时器 while(1) { key();//按键程序 if(key_can < 10) { key_with(); //设置报警温度 } if(flag_300ms == 1) //300ms 处理一次温度程序 { flag_300ms = 0; value ++; if(menu_1 == 0) { if(value > 10)//3秒钟自动播放一次 { value = 0; if(temperature >= 100) { Send_threelines(temperature / 100 % 10) ; //语音 Send_threelines(0x0a) ; //10 } if(temperature >= 10) { Send_threelines(temperature / 10 % 10) ; //语音 Send_threelines(0x0b) ; //10 } Send_threelines(temperature % 10) ; //语音 Send_threelines(0x21) ; //度 } if(!TN_IR_GetData()) { temperature = iTemp * 10; } } write_sfm3_18B20(1,8,temperature); menu_dispaly(); //不同级的菜单对应显示1602对应显示不同 } } } /*************定时器0中断服务程序***************/ void time0_int() interrupt 1 { static uchar value; TH0 = 0x3c; TL0 = 0xb0; // 50ms value ++; if(value % 10 == 0) { flag_300ms = 1; //300ms value = 0; clock_h_l(); //报警函数 } if(flag_lj_en == 1) //按下按键使能 { key_time ++; if(key_time >= 10) //500ms { key_time = 0; key_500ms = 1; //500ms key_value ++; if(key_value > 3) { key_value = 10; flag_lj_3_en = 1; //3次后1.5秒连加大些 } } } }
1 下一页