上面这幅图即是硬件连接图了,然后就是上程序了:
先看看主程序吧:
/************头文件引用******************************/
#include"include.h"
#include"channel.h" //控制发送接受频道文件
#include"voice.h" //控制语音模块按键显示文件
#include"1602.h"
#include"ds1302.h"
#include"ds18b20.h"
#include"sound.h"
#include"jiance.h"
#include"fangbo.h"
#include"delay.h"
#define time_fanhui 200
sbit tx_hujiao=P1^7; //发送按键
sbit keyjian=P1^5;
sbit relay=P3^4;
sbit answer=P3^3;//应答键
uint8 zhu_xun_huan_flag=0;//作为进入主循环的标志位,首先是初始化为0这样在初始化的
//时候一直进不了主循环,只有当应答按键按下触发外部中断1时则将它置1此时才进入循环
void int1_init();
void int1();
uint8 keyscan()
{
uint8 keyval=1;
if(keyjian==0)
{
delay(20);
if(keyjian==0)
{
key********************************
函数名:menu_1602()
函数功能:主界面主要1602液晶显示时间和年月日
***********************************************************/
void menu_1602()//没有按键按下则显示主界面
{
wendu();//调温度显示
ds1302(); //调时钟显示
}
void key()
{
voice_init();//按键扫描初始化,为下面扫描作准备
channel();//按键控制频道1602显示
voice();//按键检测语音模块
}
void init()
{
keyjian=1;
// Play_Song_init(0);//蜂鸣器初始化函数
voice_init();//按键扫描初始化,为下面扫描作准备
/**********初始化DS1302*******************************************************/
// BurstW1302T(set_clk); //初始化 年月日 时分秒 设置时间
lcd_init();//1602 液晶初始化
Time1_Init();//初始化定时器
TR1=0;//关闭定时器1使其不输出方波
}
void main()
{
uint16 i;
uint8 j;
uint8 flag_close=0;
uint8 counter_fanhui;
//uint8 m=0;
//下面主要实现1602上写字
/* lcd_wcom(0x40); //设定CGRAM地址 低三位有用
for(m=0;m<64;m++) //将心型代码写入CGRAM中
{
lcd_wdat(table[m]);
}
lcd_wcom(0x80); //设定上排的显示位置 显示在第一行
for(m=0;m<4;m++)
{
lcd_wdat(m);
}
lcd_wcom(0xc0); //将显示坐标转移到下排和上排相对应的地方 第二行
for(m=4;m<8;m++) //显示心型图案的下半部分
{
lcd_wdat(m);
}
while(1);*/
// adcs=1;
// wr=0;
// led_cs=0;
// du=0;
// we=0;
/* while(1)
{
if(key_flag==1)
{
for(i=0;i<500;i++)
{
if(flag_close==0)//判断关闭1602的清屏函数
{
clear_1602();
}
flag_close=1;
for(i=0;i<10000;i++) //进入FOR循环使得显示一段时间的状态
{
for(i=0;i<500;i++)
{
voice_init();//按键扫描初始化,为下面扫描作准备
key();//扫键函数
}
nrf2401();//实现无线半双工通信,实现呼叫功能 *
}
}
}
else //没键按下则显示菜单
{
menu_1602();
for(i=0;i<500;i++)
{
key();
}
}
} */
init();//初始化所有操作
int1_init();//外部中断1初始化
flag_anjian=1;
while(1)
{
uint8 keyzhi,jiancezhi=0;
keyzhi=keyscan();
jiancezhi=jiancefangbo();
if((!keyzhi)||jiancezhi)
{
if(keyzhi==0)
{
TR1=1;
}
if(jiancezhi==1)
{
//sound_test();
di_di();
}
}
///////////////////////////////////////////////////////////////////////////////
while(1)
{
if(key_flag==1)
{
for(j=0;j<1;j++)
{
counter_fanhui++;
if(counter_fanhui==time_fanhui)//计数执行多少遍后返回主菜单即退出
//按键相关函数
{
key_flag=0;//如果计到一定时间则立马将key_flag清零
counter_fanhui=0;//计数值也清零
}
else
{
key_flag=1;
}
for(i=0;i<500;i++) //进入FOR循环使得显示一段时间的状态
{
voice_init();//按键扫描初始化,为下面扫描作准备
key();//扫键函数
}
}
}
else //没键按下则显示菜单
{
menu_1602();//显示菜单
for(i=0;i<500;i++)
{
key();
}
}
}
}
//////////////////////////////////////////////////////////////////////////////////////
}
////////////////////////////////////////////////////////////////////////////
//外部中断1初始化函数
void int1_init()
{
IT1=0;//设置为低电平触发
EX1=1;//打开外部中断1允许位
PX1=1;//设置为最高优先级
EA=1;
}
////////////////////////////////////////////////////////////////////////////
void int1() interrupt 2
{
//////////////////////////////////////////
relay=0;//打开继电器
/////////////////////////////////////////
zhu_xun_huan_flag=1;//将标志位置1此时在主函数里判断此位从而进入主循环
_Speak=1;
}
////////////////////////////////////////////////////////////////////////////
其他的我上传附件继续看看吧:
2011-8-18整理.zip
原理图和程序都在里面,板子是别人做的我主要是负责51程序的编写。^_^..........
用户377235 2014-5-2 09:01