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

📄 chunling.c

📁 关于单片机开发的一个实例
💻 C
字号:
#pragma src(aa.inc)
#include <reg52.h>			   
#include <main.h>
#include <zlg7289A.h>

extern uchar ReadKey();
extern void write24c16(uint address,uchar ddata);
extern void LedShow(uchar position,uchar dfuction,uchar ddata,uchar dp);
extern uchar Read_TLC0834(uchar channel);
extern void SingleCommand(uchar command);
extern void page_rd(uint firstrd_ad,uint count,uchar *firstwr_ad);	

//单片机与MAX813L之间的引脚定义

sbit WDI_813L=P1^1;


//单片机与蜂鸣器之间的引脚定义

sbit CONTROL_SPEAKER=P2^4;


//三通道上下限参数值存储变量
uchar data limit_data[6];  // tempeture_up;	   温度上限
 //uchar data tempeture_down;	  温度下限
// uchar data preasure_up;		  压力上限
// uchar data preasure_down;	  压力下限
//uchar data flux_up;			   流量上限
//uchar data flux_down;		   流量下限

uchar data tempeture_variable;	 //存储实时的温度值
uchar data preasure_variable;	 //存储实时的压力值
uchar data flux_variable;		 //存储实时的流量值

uchar data qianwei;		  // 千位		 电压值在0-5v之间
uchar data baiwei;		  // 百位
uchar data shiwei;		  // 十位
uchar data gewei;		  // 个位

float data  transform_value=(5/256)*1000;   // (5v/256)×测试的值×1000倍再取整数部分用于显示  一位代表的电压值的一千倍

bit status=0  ;    //0=设置,1=测量
uchar data realtime_channel=0;    //实时通道数	 0-2
bit set_up_down_sign=0;    //设置上下限标志  =0 下限 =1上限
uchar data set_position=3 ;   //设置时的位置 	从千位开始设置
uchar data waring_status;  //报警状态  低六位 分别为D0:温度下限报警 D1:温度上限报警
            //   D2:压力下限报警 D3:压力上限报警D4:流量下限报警D5:	流量上限报警

/////////////////////////////////////////////////////////////////////////////////////
void delay_ms(uint T_ms)		 //毫秒级延时子程序
{
  uint i,j;
  for(j=0;j<T_ms;j++)
  {
    for(i=0;i<100;i++);
  }
}

///////////////////////////////////////////////////////////////////////////////////
void SerialPortInit() 				   //串口初始化
{
 SCON=0xD0;		 //1100 0000		 串口方式3  允许接收
 PCON=0x00;
 TMOD=0x20;		 //定时器T1  0010 0000
 TH1=0xFD;							  //波特率设为9600
 TL1=0xFD;
 TR1=1;			 //允许定时器T1记数

}

//////////////////////////////////////////////////////////////////////////////////////
void Initialize()			   //本机初始化
{
 uchar *read_data;
 uchar j=0;
 uint i;
 SerialPortInit(); 		 //串口初始化
 SingleCommand(ResetClearCommand);         // 复位ZLG7289,清除闪烁和消隐属性
 LedShow(7,DownDataCom_1,0x0A,0);    //在通道处显示“A” 外形和“R”一样
 LedShow(6,DownDataCom_1,0x0E,0);    //在 数据(千位)处显示“E”
 LedShow(5,DownDataCom_1,0x0A,0);    //在数据(百位)处显示“A” 
 LedShow(4,DownDataCom_1,0x0D,0);    //在数据(十位)处显示“D”
 LedShow(3,DownDataCom,0x33,0);            //在数据(个位)处显示“Y” 

 delay_ms(5000);
 page_rd(0,3,read_data);				  //读取温度的上下限数据
 if(*read_data==0xAA)
   {
     limit_data[0]=0;limit_data[1]=0;
    }
 else
  {
   limit_data[0]=*(++read_data);limit_data[1]=*(++read_data);
   }
 page_rd(1,3,read_data);		 //读取压力的上下限数据
 if(*read_data==0xAA)
   {
     limit_data[2]=0;limit_data[3]=0;
    }
 else
  {
   limit_data[2]=*(++read_data);limit_data[3]=*(++read_data);
   }
 page_rd(2,3,read_data);		   //读取流量的上下限数据
 if(*read_data==0xAA)
   {
     limit_data[4]=0;limit_data[5]=0;
    }
 else
  {
   limit_data[4]=*(++read_data);limit_data[5]=*(++read_data);
   }

   i=limit_data[0]*transform_value; 
   qianwei=i/1000;
   baiwei=(i/100)%10;
   shiwei=(i/10)%10;
   gewei=i%10;
  LedShow(5,DownDataCom_0,0,1);		        //显示通道"0."	 温度通道  下限
  LedShow(4,DownDataCom_0,qianwei,0);		 //显示千位
  LedShow(3,DownDataCom_0,baiwei,0);		 //显示百位
  LedShow(2,DownDataCom_0,shiwei,0);		 //显示十位
  LedShow(1,DownDataCom_0,gewei,0);		 //显示个位
  LedShow(0,DownDataCom,4,0);		 //设置灯点亮
 }

///////////////////////////////////////////////////////////////////////////////
void main()
{
 uint i;
 uchar symbol,j;
 uchar bsbuf;
 Initialize();
   do{
       if(KEY_ZLG7289A==0)
	     {
            symbol = ReadKey(); // 读出按键的值
			switch(symbol)
			 {
				case(7): // 检测到按下   输入键 ENTER
				      if(status==0)		 //为测试时 enter才有作用
				       { if(set_up_down_sign==1)
						  {
						    limit_data[realtime_channel*2+1]=(uchar)((qianwei*1000+baiwei*100+shiwei*10+gewei)/ transform_value);
						   	write24c16(realtime_channel*256,0x55);
							write24c16(realtime_channel*256+8,limit_data[realtime_channel*2]);
							write24c16(realtime_channel*256+16,limit_data[realtime_channel*2]);
						    }
						 else
						  {
						   limit_data[realtime_channel*2]=(uchar)((qianwei*1000+baiwei*100+shiwei*10+gewei)/ transform_value);
						   set_up_down_sign=1;
						   }
						if(realtime_channel==2&&set_up_down_sign==1)
						  {
						   realtime_channel=0;set_up_down_sign=0;
						   }
						  
						  else if(realtime_channel<2&&set_up_down_sign==1)
						        {
						        realtime_channel++;set_up_down_sign=0;
							     }
						}

						while(KEY_ZLG7289A==0);
						break;

				case(15): // 检测到按下  测量键 MEASURE
						LedShow(0,DownDataCom,0x20,0);		 //测量灯点亮
						status=1;//处于测量状态

						while(KEY_ZLG7289A==0);
						break;

				case(23): // 检测到按下  右移键 ->
				        if(status==0) //设置状态才有作用
						 {
						  if(set_position>1)
						   {
						     set_position--;
						    }
						   else
						    {
							 set_position=3;  //从千位开始重设
							 }
						  }
						
						while(KEY_ZLG7289A==0);
						break;

				case(31): // 检测到按下   减少键  -
						if(status==0)	  //处于设置状态 改变位置处的值大小
						 {
						   switch(set_position)
			                 {
							  case(3):	
							     if(qianwei>=1)					 //千位
								 {
		                           qianwei--;
					              }
								  LedShow(4,DownDataCom_0,qianwei,0);		 //显示千位
			                     break;
			                 case(2):						 //百位
							     if(baiwei>=1)			
								 {
		                           baiwei--;
					              }
								LedShow(3,DownDataCom_0,baiwei,0);		 //显示百位
			                     break;
			                case(1):						//十位
							       if(shiwei>=1)			
								    {
		                             shiwei--;
					                 }
								    LedShow(2,DownDataCom_0,shiwei,0);		 //显示十位
			                        break;
							case(0):						  //个位
							         if(gewei>=1)					
								     {
		                               gewei--;
					                  }
									 LedShow(1,DownDataCom_0,gewei,0);		 //显示个位
			                        break;
			                default: break;
							  }
						  }
						 else          //处于测试时改变通道号
							{
							 if(realtime_channel>1)
						      {
						        realtime_channel--;
							   
						       }
						     else
						       {
							     realtime_channel=2;  //从二通道开始
							    }
							  LedShow(0,DownDataCom,0x20,0);		 //测量灯点亮
							 }

						while(KEY_ZLG7289A==0);
						break;

				case(39): // 检测到按下   增加键  +
				       if(status==0)	  //处于设置状态 改变位置处的值大小
						 {
						   switch(set_position)
			                 {
							  case(3):	
							     if(qianwei<=5)					 //千位
								 {
		                           qianwei++;
					              }
								 LedShow(4,DownDataCom_0,qianwei,0);		 //显示千位
			                     break;
			                 case(2):						 //百位
							     if(baiwei<=9)			
								 {
		                           baiwei++;
					              }
								 LedShow(3,DownDataCom_0,baiwei,0);		 //显示百位
 				
					 
			                     break;
			                case(1):						//十位
							       if(shiwei<=9)			
								    {
		                             shiwei++;
					                 }
								   	  LedShow(2,DownDataCom_0,shiwei,0);		 //显示十位
			                        break;
							case(0):						  //个位
							         if(gewei<=9)					
								     {
		                               gewei++;
					                  }
									 LedShow(1,DownDataCom_0,gewei,0);		 //显示个位
			                        break;
			                default: break;
							  }
						  }
						 else          //处于测试时改变通道号
							{
							   if(realtime_channel>2)		   //?????
						          {
						            realtime_channel++;
						           }
						       else
						           {
							         realtime_channel=2;  //从二通道开始
							       }

							 }
						   LedShow(0,DownDataCom,0x20,0);		 //测量灯点亮
						
						while(KEY_ZLG7289A==0);
						break;

				case(47): // 检测到按下   设置键 OPTION
						LedShow(0,DownDataCom,0x40,0);		 //设置灯点亮
						status=0;
						while(KEY_ZLG7289A==0);
						break;
				default: break;
			 }
        }
     else
	  { 
	    // 没有按键按下
	   if(status==0)  //处于设置状态
	     {
		  
		  }
	    else if(status==1)  //处于测量状态
	         {
		  	   switch(realtime_channel)
			   {
			   case(0):
		              tempeture_variable=Read_TLC0834(realtime_channel);
					  i=tempeture_variable;
			          break;
			   case(1):
		              preasure_variable=Read_TLC0834(realtime_channel);
					  i= preasure_variable;
			          break;
			   case(2):
		              flux_variable=Read_TLC0834(realtime_channel);
					  i=flux_variable;
			          break;
			   default: break;
			    }
				      i=i*transform_value; 
                      qianwei=i/1000;
                      baiwei=(i/100)%10;
                      shiwei=(i/10)%10;
                      gewei=i%10;
					  LedShow(5,DownDataCom_0,realtime_channel,1);		        //显示通道"*."	 温度通道  下限
  					  LedShow(4,DownDataCom_0,qianwei,0);		 //显示千位
  				      LedShow(3,DownDataCom_0,baiwei,0);		 //显示百位
 					  LedShow(2,DownDataCom_0,shiwei,0);		 //显示十位
					  LedShow(1,DownDataCom_0,gewei,0);		 //显示个位
					  if(limit_data[realtime_channel*2]>i)	 //低于下限报警
					  { 
					   	CONTROL_SPEAKER=0;					//
						  LedShow(0,DownDataCom,0x10|0x20,0);		 //下限报警灯点亮
					  	}
					   else	if(limit_data[realtime_channel*2+1]<i) //高于上限报警
					        {
							 CONTROL_SPEAKER=0;
							   LedShow(0,DownDataCom,0x8|0x20,0);		 //上限报警灯点亮
							 }
					   
		      }

	 
        }
	  if(RI==1)	 //判断接收中断标志
	    {
		  bsbuf=SBUF;
		  RI=0;
		  if(bsbuf==0xAA)	// 向上位机发送实时测量结果和报警状态

		   {
		      
		       
			   if(TI==1){;}
			    TI=0;
		              SBUF=tempeture_variable; //发测量结果
					  if(TI==1){;}
			          TI=0;
		              SBUF=preasure_variable;
					  if(TI==1){;}
			          TI=0;
		              SBUF=flux_variable;
					  if(TI==1){;}
			          TI=0;
			          break;
 		     if(TI==1){;}
			 TI=0;				//清发送标志
			 SBUF= waring_status;	  //发报警状态
			   if(TI==1){;}
			    TI=0;
		     

			 }

		  else if(bsbuf==0x55)//向上位机发送设置的上下限报警值
		       {
			    for(j=0;j>=5;j--)
				 {
			    SBUF=limit_data[j];
				if(TI==1){;}
				TI=0;
				 
				 }
			    }
		 }
	  
    }while(1);

}

⌨️ 快捷键说明

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