⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 控制系统.c

📁 LCD全方位应用超强功能,温度,篮球计算器,密码锁等
💻 C
📖 第 1 页 / 共 5 页
字号:
	 0xE0,0x1F,0x01,0xE0,0x1F,0x03,0xC0,0x1F,0x07,0x80,0x0F,0x9F,0x00,0x03,0xFC,0x00}};




/*========================== 标记及点图片(宽度x高度=16*16)===========================*/


uchar code running[7][32]={
     {// 警报标记16*16
	  0x00,0x00,0x00,0x39,0x00,0x7B,0x00,0xFE,0x01,0xDC,0x0F,0x98,0x0F,0x18,0x0C,0x1F,
      0x0C,0x1F,0x0F,0x18,0x0F,0x98,0x01,0xDC,0x00,0xFE,0x00,0x7B,0x00,0x39,0x00,0x00,},
	 {// 闹铃开启标记16*16
	  0x00,0x00,0x00,0x40,0x00,0xE0,0x01,0xB0,0x01,0xB0,0x03,0x18,0x03,0x18,0x06,0x0C,
      0x0C,0x06,0x0C,0xE6,0x1B,0x1B,0x0C,0x06,0x06,0x0C,0x03,0xF8,0x00,0xE0,0x00,0x00},
	 {// 键盘锁标记16*16
      0x00,0x00,0x01,0xF8,0x03,0xFC,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0xFC,0x06,0x96,
      0x0E,0xA7,0x0E,0xC7,0x0E,0xA7,0x0E,0x97,0x07,0xFE,0x03,0xFC,0x01,0xF8,0x00,0x00,},
	 {// 温度计标记16*16
	  0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,
      0x01,0x90,0x01,0x98,0x01,0x9C,0x01,0x9E,0x01,0x9C,0x00,0x18,0x00,0x10,0x00,0x00},
	 {// 模式3点16*16
	  0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,
      0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	 {// 模式2点16*16
	  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,
      0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},	  
	 {// 篮球器运行标记16*16
	  0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x01,0x80,0x01,0x80,0x01,0x90,
      0x01,0x98,0x01,0x9C,0x01,0x9E,0x01,0x9C,0x01,0x98,0x01,0x90,0x00,0x00,0x00,0x00}};


/*========================== 菜单按钮图片(宽度x高度=16*8)============================*/

uchar code menu_key[]=
	 {//菜单按钮
	  0x7F,0xFE,0x81,0x81,0x83,0xC1,0x87,0xE1,0x8F,0xF1,0x9F,0xF9,0x80,0x01,0x7F,0xFE};





/*=====================================================================================
 函数名称:定时器中断处理与初始化,延时
 功能描述:时钟更新、篮球器计时
 全局变量:time_tick、time_tick1、resu[2]、resu[3]、resu[4]、temp_delay、temp_min
 参数说明:无
 返回说明:t0_isr(中断标记)、b20time(温度更新标记)
 设 计 人:LIJH
 版    本:1.0
 说    明:
 ======================================================================================*/


/*延时(一次10个机器周期不等) 参数格式:延时数*/
void delay(unsigned int det)
{
  while(det--);
}



/*1s延时*/
void delay_pw()
{
  delay(60000);
  delay(60000);
}


/*6个周期  6us */
void  delay_b20(uchar n)
{  
  while(n--);
}



/*主时钟中断处理*/
void time0_isr(void) interrupt  TF0_VECTOR  using 1
{
  TR0=0;
  TL0=(time_count&0x00FF);
  TH0=(time_count>>8);
  TR0=1;
  if(--time_tick)  return;
  time_tick=20;
  t0_isr=1;
  if(nba_tim&!oth_run)	   // 当在篮球器界面时 nba_tim==1、oth_run==0 
  {
    if(resu[3]==0)
	{
	  resu[3]=59;
	  if(resu[2]>0)	resu[2]--;
	}
	else resu[3]--;
	if(resu[2]==0&resu[3]==0)  // 比赛时间到后停止
	{
	  TR0=0;TR1=0;EA=0;
	}
	return;
  }
  if((++temp_min)==60)	  // 实现温度的更新
  {
    temp_min=0;
    temp_delay--;
	if(temp_delay==0)
    {
	  b20time=1;temp_delay=5;
	}
  }	
}


/*24时钟中断处理*/
void time1_isr(void) interrupt  TF1_VECTOR  using 2
{
  TR1=0;
  TL1=(time_count&0x00FF);
  TH1=(time_count>>8);
  TR1=1;
  if(--time_tick1) return;
  time_tick1=20;
  if(resu[4]>0)resu[4]--;	  //  篮球器24秒中断
  t0_isr=1;
  if(resu[4]==0)
  { TR0=0;TR1=0;EA=0;}
}


/*定时器初始化*/
void time_init()			
{
  EA=0;
  TR0=0;
  TR1=0;
  TMOD=0x11;
  TL0=(time_count&0x00FF);
  TH0=(time_count>>8);
  TL1=(time_count&0x00FF);
  TH1=(time_count>>8);
  IE=0;
  ET0=1;
  ET1=1;
}



/*=====================================================================================
 函数名称:LCD驱动
 功能描述:基本驱动(写1个字节、清屏、初始化)
 全局变量:无
 参数说明:dat_comm(0:命令 1:数据),content(数值)
 返回说明:无返回值
 设 计 人:LIJH
 版    本:1.0
 说    明:
 ======================================================================================*/


/*检查忙碌位*/
void chk_busy (void)
{
  lcd_data = 0xff;
  lcd_rs = 0;    // 命令
  lcd_rw = 1;	 // 读
  lcd_e = 1;
  while(busy==1);
  lcd_e = 0;
}


/*写LCD 参数格式:0:命令,1:数值 ,数据*/
void wr_lcd (uchar dat_comm,uchar content)
{
  chk_busy ();
  lcd_rs=dat_comm;
  lcd_rw = 0;         // 写
  lcd_data=content;   // 输出数据或命令
  lcd_e=1;             
  lcd_e=0;
}


/*清绘图*/
void clrgdram(void)
{
  uchar i,j;
  for(j=0;j<32;j++)
  {
    wr_lcd(comm,0x34);
    wr_lcd(comm,0x80+j);
    wr_lcd(comm,0x80);
    wr_lcd(comm,0x30);
    for(i=0;i<32;i++)
      wr_lcd(dat,0x00);  // 写入0x00
   }
  wr_lcd(comm,0x36);
}


/*清除显示*/
void clear_dis(void)
{
  wr_lcd(comm,0x30);
  wr_lcd(comm,0x01);  // 清屏,地址指针指向00H
  clrgdram();		  // 请绘图RAM
}



/*开机LCD初始化*/
void init_lcd (void)
{
  lcd_rst=1;
  wr_lcd(comm,0x30);  // 30---基本指令动作  
  wr_lcd(comm,0x06);  // 光标的移动方向
  wr_lcd(comm,0x0c);  // 开显示,关游标
  clear_dis(); 
}





/*=====================================================================================
 函数名称:DS1302驱动
 功能描述:基本驱动(读写数据、读写日期,时间、初始化)
 全局变量:无
 参数说明:w_adder(写地址),r_adder(读地址),w_data(写入数据)
 返回说明:返回读取的数据
 设 计 人:LIJH
 版    本:1.0
 说    明:上升沿写入数值,下降沿读出数值,没用设立后背电池充电
 ======================================================================================*/


/*向1302写数据 参数格式:地址,数据*/
void w1302(uchar w_adder,uchar w_data)
{
  uchar d;
  ret_ds1302();
  for(d=0;d<16;d++)
  {
    if(d==8) w_adder=w_data;
	d02_data=(bit)(w_adder&0x01);
    d02_sclk=0;		 // 上升沿
    w_adder>>=1;
    d02_sclk=1;
  }
  end_ds1302();    
}



/*接收1302一个字节的数据 参数格式:读地址*/
uchar r1302(uchar r_adder)
{
  uchar d=0;
  ret_ds1302();
  for(d=0;d<8;d++)	 // 写地址
  {
    d02_data=(bit)(r_adder&0x01);
    d02_sclk=0;
    r_adder>>=1;
    d02_sclk=1;
  }
  r_adder=0;
  for(d=0;d<8;d++)	 // 读数据 
  {
	d02_data=1;
	d02_sclk=1;		 // 下降沿
	r_adder>>=1;
	d02_sclk=0;
	if(d02_data) r_adder|=0x80;
  }
  end_ds1302();
  return(r_adder);
}



/*写入时间与日期*/
void wds1302_time_date(void)
{
  w1302(d02_wrc,0x00);   			 // 写允许
  w1302(0x90,0xa5);                  // 单二极管2K电阻充电
  w1302(d02_year,today.year);   	 // 年
  w1302(d02_weeks,today.week);  	 // 星期
  w1302(d02_month,today.month);   	 // 月
  w1302(d02_day,today.day);   		 // 日
  w1302(d02_hour,0x7f&now.hour);   	 // 时
  w1302(d02_minute,now.minute);   	 // 分
  w1302(d02_second,0x7f&now.second); // 秒
  w1302(d02_wrc,0x80); 				 // 写禁止
}




/*初始化写DS1302 RAM*/
void init_wds1302_ram(void)
{
  w1302(d02_wrc,0x00); 
  w1302(0x90,0xa5);         // 单二极管2K电阻充电
  w1302(d02_signs,0x00);   	// 状态寄存
  w1302(d02_passw,0x74);   	// 密码储存首位
  w1302(d02_passw+2,0x14);  // 初始值为:741456
  w1302(d02_passw+4,0x56);  // 密码最后一位
  w1302(d02_alm,0x12);   	// 闹铃时(12小时)
  w1302(d02_alm+2,0x00);   	// 闹铃分(0分)
  w1302(d02_temp,0xff);   	// 温度上限(255为关闭) 	 
  w1302(d02_temp+2,0xff);   // 温度下限(关闭)
  w1302(d02_initsi,0xb4);   // 是否要初始化标记(0xb4为已经初始化)
  w1302(d02_wrc,0x80); 
}

/*写DS1302一字节的RAM*/
void wds1302_data(uchar adder,uchar _data)
{
  w1302(d02_wrc,0x00); 
  w1302(adder,_data);
  w1302(d02_wrc,0x80);
} 


/*读取日期*/
void rds1302_date(void)
{
  
  today.year=r1302(d02_year+1);	  
  today.week=r1302(d02_weeks+1);
  today.month=r1302(d02_month+1);
  today.day=r1302(d02_day+1);  
}


/*读取时间*/
void rds1302_time(void)
{
  now.hour=(r1302(d02_hour+1));
  now.minute=r1302(d02_minute+1);
  now.second=r1302(d02_second+1);
  if(now.hour==alarm_time[0]&&now.minute==alarm_time[1]) alm_run=1;
  else 										// 闹铃时间比较
  {
    alm_run=0;buzstop=0;buzzer=close;
  } 
}					

/*开机读数据*/
void rds1302_data(void)
{
  signs=r1302(d02_signs+1);
  alarm_time[0]=r1302(d02_alm+1);
  alarm_time[1]=r1302(d02_alm+3);
  als_temp[0]=r1302(d02_temp+1);
  als_temp[1]=r1302(d02_temp+3);		   
}
 

/*DS1302初始化*/
void init_ds1302(void)
{
  wds1302_time_date();
  init_wds1302_ram();
}


/*=====================================================================================
 函数名称:DS18b20驱动
 功能描述:基本驱动(读写数据、数据转换、初始化)
 全局变量:无
 参数说明:无
 返回说明:返回读取的数据
 设 计 人:LIJH
 版    本:1.0
 说    明:调试中。。。
 ======================================================================================*/



/*18B20初始化*/
void init_ds18b20()
{
  b20_io=1;
  b20_io=0;
  delay_b20(120);		// 延时≥480us
  b20_io=1;
  delay_b20(12);	    // 拉高为高电平后在15—60us出现低电平,并维持60—240us
  ds18b20=~b20_io;
  delay_b20(40);	
}


/*向18B20发送一个字节*/
void send18b20_byte(uchar data_send)
{
  uchar d=0;
  for (d=0;d<8;d++)
  {
	b20_io=0;					// 拉低电平后向总线写入一个位,15us后18B20接收  
    b20_io=data_send&0x01;	    
    delay_b20(10);				// 延时60us后完成一次
    b20_io=1;
    data_send>>=1;			    // 下位开始
  }
}


/*从18B20读出温度值 12位分辨率*/  
void receive18b20(void)
{
  uchar n=1,d;
  for (d=0;d<16;d++)
  {
	if(d==8) n=0;
	b20_io=0;					  // 拉低总线
	temp.t_data[n]>>=1;            
	b20_io=1;                     // 拉高总线
	if(b20_io)					  // 读入总线数值
      temp.t_data[n]|=0x80;
    delay_b20(10);				  // 等待60us
  }
}


/*数据转化*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -