?? 新建 文本文檔 (2).txt
字號(hào):
附錄1
//頭文件
#include <reg51.h>
#include <intrins.h>
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;
#define unchar unsigned char
// 系統(tǒng)工作狀態(tài)
unsigned char WorkState;
#define D_normal 0 // 顯示電纜號(hào)
#define D_abnormal1 1 // 顯示1號(hào)斷纜情況
#define D_abnormal2 2 // 顯示2號(hào)斷纜情況
//基本距離位
BYTE ten,one,point;
//單片機(jī)T0,T1計(jì)數(shù)值
BYTE tmp1,tmp2,T0,T1;
//C3電纜電容,C2,C1盲區(qū)電容,
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; //這三個(gè)改成控制端口
// P0口連接set、inc、dec按鍵
sbit Dec = P0 ^ 3;
sbit Set = P0 ^ 4;
sbit Inc = P0 ^ 5;
Sbit BEEP= P2 ^ 7; //蜂鳴器與單片機(jī)接口
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) //測距函數(shù)
{ Ten=temp/10;
one=temp%10;
}
void delay1 (unsigned int i)
{
while(i--);
}
//單片機(jī)掃描P1端口看是否需要報(bào)警
void ARALM(void)
{
while(P_1^0&P_1^2==1)
}
delay(unchar ms)
{ // 延時(shí)子程序
unchar i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
BOOL lcd_bz()
{ // 測試LCD忙碌狀態(tài)
BOOL result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P2 & 0x80);
ep = 0;
return result;
}
lcd_wcmd(unchar cmd)
{ // 寫入指令數(shù)據(jù)到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)
{ //設(shè)定顯示位置
lcd_wcmd(pos | 0x80);
}
lcd_wdat(unchar dat)
{ //寫入字符顯示數(shù)據(jù)到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初始化設(shè)定
lcd_wcmd(0x38); //
delay(1);
lcd_wcmd(0x38); //
delay(1);
lcd_wcmd(0x0c); //
delay(1);
lcd_wcmd(0x06); //
delay(1);
lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容
delay(1);
}
disp_normal()
{
BYTE i;
lcd_init(); // 初始化LCD
delay(10);
lcd_pos(4); // 設(shè)置顯示位置為第一行的第5個(gè)字符
i = 0;
while(dis1[i] != '\0')
{ // 顯示字符"1OK 2OK"
lcd_wdat(dis1[i]);
i++;
}
lcd_pos(0x41); // 設(shè)置顯示位置為第二行第二個(gè)字符
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); // 設(shè)置顯示位置為第一行的第5個(gè)字符
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); // 設(shè)置顯示位置為第一行的第5個(gè)字符
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); // 設(shè)置顯示位置為第一行的第5個(gè)字符
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); // 設(shè)置顯示位置為第一行的第5個(gè)字符
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: // 關(guān)閉聲音
default:
Beep = 0;
BeepCount = 0;
break;
case BT_ALARM: // 報(bào)警30秒
if (0 == tCount)
{
if (BeepCount > 0)
{
Beep = BeepCount % 2;
-- BeepCount;
}
else
{
Beep = 0;
BeepType = BT_OFF;
}
}
break;
}
}
// 蜂鳴器鳴叫設(shè)置
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; // 報(bào)警音響30秒
break;
}
}
// 更新顯示內(nèi)容
void ChDisp(void)
{
switch (WorkState)
{
// 顯示電纜號(hào)和OK
default:
case D_NORMAL:
disp_normal();
break;
// 顯示斷纜號(hào)和斷纜距離
case D_abnormal1:
disp_normal1();
break;
case D_abnormal2:
disp_normal1();
case D_abnormal3:
disp_normal1();
break;
case D_abnormal4:
disp_normal4();
break;
}
}
/ /按鍵掃描,返回當(dāng)前按鍵值,有效位是末三位,由高到低對(duì)應(yīng)DEC、INC、SET
unsigned char KeyScan(void)
{
unsigned char key = 0;
// 掃描按鍵鍵值,低電平有效
key = (Dec ? 0x00 : 0x04) | (Inc ? 0x00 : 0x02) | (Set ? 0x00 : 0x01);
return key;
}
// 按鍵功能執(zhí)行
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) // 防止按鍵重復(fù)
{
switch (WorkState)
{
default:
case D_abnormal1:
// 切換到顯示2號(hào)電纜狀態(tài)
WorkState =D_abnormal2;
break;
case D_abnormal2:
// 切換到顯示3號(hào)電纜狀態(tài)
WorkState = D_abnormal3;
break;
case D_abnormal3:
// 切換到顯示4號(hào)電纜狀態(tài)
WorkState = D_abnormal4;
break;
case D_abnormal4:
//切換到顯示1號(hào)電纜狀態(tài)
WorkState = D_abnormal1;
break;
}
}
break;
// 定時(shí)器0中斷服務(wù)函數(shù)
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定時(shí)到
Flag100ms=1;
if((tCount%50)==0)//500ms
tCount=0;
if ((iCount % 100) == 0) // 1秒定時(shí)到
{
Flag1s = 1;
iCount = 0;
}
TF0 = 0; // 定時(shí)器0溢出標(biāo)志清零
}
// 系統(tǒng)初始化
void InitSys(void)
{
// 定時(shí)器0初始化
TH0 = 0x63;
TL0 = 0x18;
ET0 = 1;
// 系統(tǒng)狀態(tài)默認(rèn)設(shè)置
WorkState = D_NORMAL;
// 按鍵狀態(tài)初始化
CurKey = OldKey = BTN_NONE;
// 20毫秒,500毫秒,1秒定時(shí)標(biāo)志
Flag100ms = Flag500ms = Flag1s=Flag10ms=0;
// 蜂鳴器關(guān)閉
Beep = 0;
// 蜂鳴器鳴叫時(shí)間(5毫秒為單
BeepCount = 0;
// 蜂鳴器鳴叫類?
BeepType = BT_OFF;
}
// 主程序
void main(void)
{
WorkState=D_NORMAL;
InitSys()
TMOD=0x15; //定時(shí)器0 工作于計(jì)數(shù)方式1
TR0=1; //計(jì)數(shù)器0 開始運(yùn)行
TR1=1;
EA=1;
ET1=1;
for(;;)
{ tmp1=TL0|(TH0<<8); //取T0 中的數(shù)值
tmp2=TL1|(TH1<<8);//取T1 中的數(shù)值
T1=tmp1*T0/TP2;
C3=1/1.1*P-C1-C2;
t emp=k*c3;
}
// 程序主循環(huán)
while (1) // 判斷是否報(bào)警
{
if(P1_0&P1_2==1)
BeepSet(BT_ALARM);
_Juli(); //獲得數(shù)據(jù)
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();
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -