原创 51单片机控制1602液晶显示日历温度以及按键状态触发

2011-8-20 09:11 5333 10 11 分类: MCU/ 嵌入式

20110820090724001.png

上面这幅图即是硬件连接图了,然后就是上程序了:
先看看主程序吧:

 


/************头文件引用******************************/
#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; 
}
////////////////////////////////////////////////////////////////////////////

其他的我上传附件继续看看吧:
zip.gif2011-8-18整理.zip

原理图和程序都在里面,板子是别人做的我主要是负责51程序的编写。^_^..........

文章评论1条评论)

登录后参与讨论

用户377235 2014-5-2 09:01

测试能用
相关推荐阅读
578645627_583309889 2013-05-24 23:06
64位WIN7系统可以使用的PL2303驱动程序
64位WIN7系统可以使用的PL2303驱动程序,折腾了好久,终于在网上找到了这个,嘿嘿,发出来一起共享一下,哈哈...
578645627_583309889 2013-05-22 13:44
http://www.cnblogs.com/tao560532/ 我博客园的地址
http://www.cnblogs.com/tao560532/     我博客园的地址 嘿嘿,博客园发帖子要快些。哈哈...
578645627_583309889 2013-03-10 22:43
嵌入式系统软件笔试题
1、130 150 186 移动段号写段代码。 2、inline机制。 3、函数参数机制。 4、中序遍历,前序遍历。 5、改错题 6、...
578645627_583309889 2012-12-18 23:03
常见协议
简单的SPI,IIC,UART,复杂些的pci,pcie,sgmii,smi...
578645627_583309889 2012-01-12 18:42
变量的命名规则
变量的命名规则 (1)    一般规则 1.1:命名应当直观且可以拼读,可望文知意,便于记忆和阅读。   1.2:命名的长度应当符合“min-length&a...
578645627_583309889 2011-10-16 13:49
C语言--位域
位域     位域是指信息存储时,并不需要占用一个完整的字节,而只需要占几个或是一个二进制位。     所谓“位域”或是“位段”是指把一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数...
我要评论
1
10
关闭 站长推荐上一条 /2 下一条