电缆快速检测系统软件设计
2015-11-03 11:17
239 查看
/*********************************************************** ***********基于51单片机的电缆通短断快速检测系统程序********* ************************************************************/ #include "reg51.h" //文件包含8051内部资源的定义 #define uchar unsigned char //定义无符号字符 #define uint unsigned int //定义无符号整数 sbit P3_5=P3^5; //变量P3_5表示引脚P3.5 sbit P3_6=P3^6; //变量P3_6表示引脚P3.6 sbit P3_7=P3^7; //变量P3_7表示引脚P3.7 uchar LED_number[8]={0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F}; void Init_C51(); //声明初始化函数 void Delay_ms(uint); //声明延时函数 uchar Key(); //声明按键控制函数 void LED_Display(int); //声明数码显示函数 int Count_1(uchar); //声明信号处理函数 /***************************主函数**************************/ void main() { int i=0; int N=8; //定义待检电缆初芯数 bit Up_N=0; //定义电缆芯数增加键 bit Down_N=0; //定义电缆芯数减少键 bit Start=0; //定义电缆测试开始键 uchar key_value=0xEF; //定义按键返回值变量 Init_C51(); //单片机I/O 口初始化 //**********进入按键控制程序********************** for(;;) //Start=1时 跳出循环 { LED_Display(N); //调用数码显示函数 for(;;) //有键按下时跳出循环 { key_value=Key(); //调用按键控制函数 switch(key_value) { case 0xFB: { Up_N=1; //P3.2=0,电缆芯数增加 break; } case 0xF7: { Down_N=1; //P3.3=0,电缆芯数减少 break; } case 0xEF: { Start=1; //P3.4=0,电缆测试开始 break; } } } if(Up_N) //芯数增加? { N++; if(N>8) N=1; } if(Down_N) //芯数减少? { N--; if(N<1) N=8; } if(Start) //开始测试? { break; } } //*******************开始测试程序****************** P0=0x01; //P0口向电缆输入信号 for(;i<N;i++) { int Num_1=1; //采集信号中高电平的初始个数 uchar Receiver; Delay_ms(10); //延时,避免采集错误信号 Receiver=P2; //P2口从电缆输出端采集信号 Num_1=Count_1(Receiver); //调用信号处理函数计算采集的高电平数 if(Num_1==0) //电缆第i+1芯发生断路 { P3_7=1; //点亮断路指示灯并出循环 break; } else if(Num_1==1); //电缆第i+1芯正常通路 else //电缆第i+1芯发生短路 { P3_6=1; //点亮短路指示灯并出循环 break; } P0<<=1; //P0左移一位,检测下一芯 } if(i==N) P3_5=1; //电缆正常,点亮通路指示灯 } /***********************初始化函数************************************* 函数名称:void Init_C51() 函数功能:实现单片机I/O的初始化 输入参数:无 输出参数:无 ***********************************************************************/ void Init_C51() { P0=0x00; P1=0xFF; P2=0x00; P3_5=0; P3_6=0; P3_7=0; } /***********************按键控制函数*********************************** 函数名称:uchar Key() 函数功能:实现电缆芯数的选择和测试开始 输入参数:无 输出参数:KeyV ***********************************************************************/ uchar Key() { uchar KeyV; uchar temp; P3=P3|0xE3; //三个按键所在位置 KeyV=P3; //KeyV=P3=111***11B if(KeyV|0xE3==0xFF) //无键按下 return(0); Delay_ms(10); //延时去键抖 KeyV=P3; //KeyV=P3=111***11B if(KeyV|0xE3==0xFF) //无键按下 return(0); else { for(;;) { temp=P3; if(temp|0xE3==0xFF) break; } return(KeyV); } } /***********************数码显示函数*********************************** 函数名称:void LED_Display(int n) 函数功能:实现数字n的七段数码显示 输入参数:输入参数范围1~8; 输出参数:无 ***********************************************************************/ void LED_Display(int n) { P1=LED_number[n-1]; //显示相应数码 } /***********************信号处理函数********************** 函数名称:int Count_1(uchar x) 函数功能:计算整数二进制数中“1”的个数 输入参数:输入参数范围0x00~0xFF; 输出参数:无 ***********************************************************************/ int Count_1(uchar x) { int num=0; while(x) { x=x&(x-1); num++; } return(num); } /***********************延时函数*************************************** 函数名称:void Delay_ms(uint delay_time) 函数功能:实现输入多少ms的延时 输入参数:输入参数范围0~6553; 输出参数:无 ***********************************************************************/ void Delay_ms(uint delay_time) { uint d_cnt; for(;delay_time>0;delay_time--) for(d_cnt=0;d_cnt<255;d_cnt++) {;} }