📄 新建 文本文档 (2).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 + -