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

📄 新建 文本文档 (2).txt

📁 一段远程序用于一般的电缆防到报警器,是基于单片机的异端程序
💻 TXT
字号:
附录1

//头文件
#include <reg51.h>
#include <intrins.h>
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ; 
#define unchar unsigned char 
// 系统工作状态
unsigned char WorkState;
#define D_normal	  0	  // 显示电缆号
#define D_abnormal1	  1	  // 显示1号断缆情况
#define	D_abnormal2  2	  // 显示2号断缆情况
//基本距离位
BYTE ten,one,point;
//单片机T0,T1计数值
BYTE tmp1,tmp2,T0,T1;
//C3电缆电容,C2,C1盲区电容,
BYTE C3,C2,C1,K;
//LCD显示10K 2OK 
BYTE code dis1[] = {"1OK 2OK"};
sbit rw= P3^1;		
sbit rs = P3^0;
sbit ep = P3^5;      //这三个改成控制端口
// P0口连接set、inc、dec按键
sbit Dec = P0 ^ 3;
sbit Set = P0 ^ 4;
sbit Inc = P0 ^ 5;
Sbit BEEP= P2 ^ 7;   //蜂鸣器与单片机接口
sbit P1_0=P1^0;
Sbit P1_1=P_1^1;
Sbit P1_2=P_1^2;
Sbit P1_3=P_1^3;
void juli(void)        //测距函数
{ Ten=temp/10;
  one=temp%10;
}
void delay1 (unsigned int i)
{
	while(i--);

}


//单片机扫描P1端口看是否需要报警

void ARALM(void)
{
	while(P_1^0&P_1^2==1)
       
		
}
delay(unchar ms)
{							// 延时子程序
	unchar i;
	while(ms--)
	{
		for(i = 0; i< 250; i++)
		{
			_nop_();
			_nop_();
			_nop_();
			_nop_();
		}
	}
}

BOOL lcd_bz()
{							// 测试LCD忙碌状态
	BOOL result;
	rs = 0;
	rw = 1;
	ep = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	result = (BOOL)(P2 & 0x80);
	ep = 0;
	return result;	
}

lcd_wcmd(unchar cmd)
{							// 写入指令数据到LCD
	while(lcd_bz());
	rs = 0;
	rw = 0;
	ep = 0;
	_nop_();
	_nop_();	
	P2 = cmd;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ep = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ep = 0;		
}

lcd_pos(unchar pos)
{							//设定显示位置
	lcd_wcmd(pos | 0x80);
}

lcd_wdat(unchar dat)	
{							//写入字符显示数据到LCD
	while(lcd_bz());
	rs = 1;
	rw = 0;
	ep = 0;
	P2 = dat;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ep = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ep = 0;	
}

lcd_init()
{	
	lcd_wcmd(0x38);			//
	delay(1);
	lcd_wcmd(0x38);			//
	delay(1);						//LCD初始化设定
	lcd_wcmd(0x38);			//
	delay(1);
	lcd_wcmd(0x38);			//
	delay(1);
	lcd_wcmd(0x0c);			//
	delay(1);
	lcd_wcmd(0x06);			//
	delay(1);
	lcd_wcmd(0x01);			//清除LCD的显示内容
	delay(1);
}

disp_normal()
{
	BYTE i;
	lcd_init();				// 初始化LCD			
	delay(10);
	lcd_pos(4);				// 设置显示位置为第一行的第5个字符
	i = 0;
	while(dis1[i] != '\0')
	{						// 显示字符"1OK 2OK"
		lcd_wdat(dis1[i]);
		i++;
	}
	lcd_pos(0x41);			// 设置显示位置为第二行第二个字符
	i = 0;
	while(dis2[i] != '\0')
	{
		lcd_wdat(dis2[i]);	// 显示字符"3OK 4OK"
		i++;
	}
	while(1);				// 
}

disp_abnormal1()
{
	lcd_init();				// 初始化LCD			
	delay(10);
	lcd_pos(4);				// 设置显示位置为第一行的第5个字符		 
	
	lcd_wdat('1');
	lcd_wdat('=');
	lcd_wdat(dis1[ten]);
	lcd_wdat(dis1[one]);
	lcd_wdat('.');
	lcd_wdat(dis1[point]);
	lcd_wdat('m');
//	while(1);				// 
}
disp_abnormal2()
{
	lcd_init();				// 初始化LCD			
	delay(10);
	lcd_pos(4);				// 设置显示位置为第一行的第5个字符		 
	
	lcd_wdat('2');
	lcd_wdat('=');
	lcd_wdat(dis1[ten]);
	lcd_wdat(dis1[one]);
	lcd_wdat('.');
	lcd_wdat(dis1[point]);
	lcd_wdat('m');
//	while(1);				// 
}
disp_abnormal3()
{
	lcd_init();				// 初始化LCD			
	delay(10);
	lcd_pos(4);				// 设置显示位置为第一行的第5个字符		 
	
	lcd_wdat('1');
	lcd_wdat('=');
	lcd_wdat(dis1[ten]);
	lcd_wdat(dis1[one]);
	lcd_wdat('.');
	lcd_wdat(dis1[point]);
	lcd_wdat('m');
//	while(1);				// 
}
disp_abnormal4()
{
	lcd_init();				// 初始化LCD			
	delay(10);
	lcd_pos(4);				// 设置显示位置为第一行的第5个字符		 
	
	lcd_wdat('4');
	lcd_wdat('=');
	lcd_wdat(dis1[ten]);
	lcd_wdat(dis1[one]);
	lcd_wdat('.');
	lcd_wdat(dis1[point]);
	lcd_wdat('m');
//	while(1);				// 
}
// 蜂鸣器声音控制
void BeepCtrl(unsigned char tCount)
{
	switch (BeepType)
	{
		case BT_OFF:	// 关闭声音
		default:
			Beep = 0;
			BeepCount = 0;
			break;
		case BT_ALARM:	// 报警30秒
			if (0 == tCount)
			{
				if (BeepCount > 0)
				{
					Beep = BeepCount % 2;
					-- BeepCount;
				}
				else
				{
					Beep = 0;
					BeepType = BT_OFF;
				}
			}
			break;
	}
}

// 蜂鸣器鸣叫设置
void BeepSet(unsigned char type)
{
	switch (type)
	{
		case BT_OFF:
		default:
			BeepType = BT_OFF;
			BeepCount = 0;
			break;
		case BT_ALARM:
			BeepType = BT_ALARM;
			BeepCount = 60;		// 报警音响30秒
			break;
	}
}


// 更新显示内容
void ChDisp(void)
{
	switch (WorkState)
	{
		// 显示电缆号和OK
		default: 
		case D_NORMAL:	
		    disp_normal();          		          
			break;	
                // 显示断缆号和断缆距离	            		          
		case D_abnormal1:
 			disp_normal1();
                        break;
		case D_abnormal2:
                        disp_normal1();
                case D_abnormal3:
                     disp_normal1();
			break;
               case D_abnormal4:
                     disp_normal4();
			break;
	}
}
/ /按键扫描,返回当前按键值,有效位是末三位,由高到低对应DEC、INC、SET
unsigned char KeyScan(void)
{
	unsigned char key = 0;

	// 扫描按键键值,低电平有效
	key = (Dec ? 0x00 : 0x04) | (Inc ? 0x00 : 0x02) | (Set ? 0x00 : 0x01);

	return key;
}
// 按键功能执行
void KeyDone(void)
{
	if (CurKey != OldKey)
	{
		OldKey = CurKey;
		KeyCount = 1;
	}
	if (BTN_NONE == CurKey)
		KeyCount = 0;
	switch (CurKey)
	{
		default :
                      
		case BTN_NONE:
                  
			break;
		case BTN_SET:
                      
            if (KeyCount == 1)	// 防止按键重复
			{ 

				switch (WorkState)
				{
					default:
					case D_abnormal1:
						// 切换到显示2号电缆状态 
						WorkState =D_abnormal2;
						break;
					case D_abnormal2:
						// 切换到显示3号电缆状态
						WorkState = D_abnormal3;
						break;
					case D_abnormal3:
						// 切换到显示4号电缆状态
						WorkState = D_abnormal4;
						break;
					case D_abnormal4:
						//切换到显示1号电缆状态
					 	WorkState = D_abnormal1;
						break;
					 
				}
			}
			break;

		


// 定时器0中断服务函数
void T0_int(void) interrupt 5 using 1
{
	static unsigned char iCount = 0;
	static unsigned char tCount = 0;
	BeepCtrl(tCount);

	++ iCount;
	++ tCount;
	if ( (iCount % 1)==0)
		Flag10ms = 1;
if ((iCount % 10)== 0)	//0.1s定时到
		Flag100ms=1;

	if((tCount%50)==0)//500ms
		tCount=0;

	if ((iCount % 100) == 0)	// 1秒定时到	
		{
			Flag1s = 1;
			iCount = 0;
	   	}


	TF0 = 0;				// 定时器0溢出标志清零
}
// 系统初始化
void InitSys(void)
{
	// 定时器0初始化
	TH0 = 0x63;
	TL0 = 0x18;
	
	ET0 = 1;

	// 系统状态默认设置
	WorkState = D_NORMAL;

	// 按键状态初始化
	CurKey = OldKey = BTN_NONE;
       // 20毫秒,500毫秒,1秒定时标志
	Flag100ms = Flag500ms = Flag1s=Flag10ms=0;

	// 蜂鸣器关闭
	Beep = 0;
	// 蜂鸣器鸣叫时间(5毫秒为单
     BeepCount = 0;

	// 蜂鸣器鸣叫类?
	BeepType = BT_OFF;
	
}


// 主程序
void main(void)
{
	WorkState=D_NORMAL;
        InitSys()
     
        TMOD=0x15; //定时器0 工作于计数方式1 
           TR0=1; //计数器0 开始运行
           TR1=1;
            EA=1;
            ET1=1;
            for(;;)
           { tmp1=TL0|(TH0<<8); //取T0 中的数值
             tmp2=TL1|(TH1<<8);//取T1 中的数值
            T1=tmp1*T0/TP2;
            C3=1/1.1*P-C1-C2;
	         t emp=k*c3;
            }
         // 程序主循环
	while (1)   // 判断是否报警
	{
			
	    
           if(P1_0&P1_2==1)			
		  
                 BeepSet(BT_ALARM);
                
		  _Juli();	//获得数据		
                  if(P1_0==1)
                  disp_abnormal1();
                  P1_1=0;
                  if(P1_2==1)
                  disp_abnormal2();
                  P1_3=0;
         else if   
                  disp_normal();//正常显示
	
				
	        }
			
main()
{
	while(1)
{	
      disp_normal();
	
}
}

⌨️ 快捷键说明

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