?? powertestinganddetecting.c
字號:
/*******************************************************************************************/
//使用stc89le516ad,12MHZ晶振,P0口輸出段碼,P2口做列掃描,共陽極LED數(shù)碼管,P1口數(shù)據(jù)采集通道//
//開機顯示"-dy-",掃描開機按鈕是否按下,等待開機
//數(shù)據(jù)采集完畢后,默認顯示"pass"或"fail",按功能鍵,可切換到數(shù)據(jù)顯示方式
//按關(guān)機按鈕,切斷電源
/*******************************************************************************************/
#include "reg52.h"
#include "intrins.h" //包含內(nèi)部函數(shù)
#include "math.h"
#define uchar unsigned char
#define uint unsigned int
sbit on_off=P3^4; //開測試板電源
sbit fun=P3^5; //功能健,調(diào)整顯示方式
sbit ad_start=P3^6; //關(guān)測試板電源
sbit on_offpower=P3^7;
//定義與A/D轉(zhuǎn)換有關(guān)的特殊寄存器
sfr P1_en=0X97; // 轉(zhuǎn)換功能允許寄存器
sfr ad_con=0xc5; // 轉(zhuǎn)換控制寄存器
sfr ad_data=0xc6; // 轉(zhuǎn)換結(jié)果寄存器
uchar code dis_7[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
0x90,0x88,0xa1,0x8e,0xc7,0x8c,0x91,0xbf,0xff};
/* 共陽極段碼顯示表 0,1,2,3,4,5,6,7,8,9,a,d,f,l,p,y,- ,不亮 */
int code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; // 段碼位控制字
uint data dis[5]={0x10,0x0b,0x0f,0x10,0x00}; // 顯示數(shù)據(jù)初始化,顯示"-dy-"
int data ad[5]={0x00,0x00,0x00,0x00,0x00}; // AD轉(zhuǎn)換原始數(shù)據(jù)存放
uchar data success[4]={0x0e,0x0a,0x05,0x05}; // 若合格,顯示的字符,"pass"
uchar data fail[4]={0x0c,0x0a,0x01,0x0d}; // 若不合格,顯示的字符,"fail"
bit dis_flag=0; // 顯示標志位
bit flag_t1=0; // T1中斷標志
bit dis_mode=0;//顯示模式
uint h=0x00; // T1中斷計數(shù),20次關(guān)閉,定時1s
void delay1ms(uint count);
void ledscan();
void ledscan0();
void ledscan1();
void keyscan();
void power_on_off();
/********************/
// 開關(guān)測試板電源 //
/********************/
void power_on_off()
{
static bit bpressflag;
if(!on_off) // 等待開待檢測板電源
{
if(bpressflag)
return;
delay1ms(5); // 判斷是否為干擾
if(!on_off)
{
bpressflag=1;
if(!on_offpower)
on_offpower=1;
else
on_offpower=0;
}
}
else
bpressflag=0;
}
/********************/
// 掃描方式判斷 //
/********************/
void ledscan()
{
static bit bpressflag;
if(!fun) // 如果功能鍵按下,進入顯示方式1
{
if(bpressflag)
return;
delay1ms(5);
if(!fun)
{
bpressflag=1;
if(!dis_mode)
{
dis_mode=1;
ledscan0();
}
else
{
dis_mode=0;
ledscan1();
}
}
}
else
bpressflag=0;
}
/*****************/
// 掃描方式1程序 //
/*****************/
void ledscan1()
{
uchar i,k;
long ad_sub;
TMOD=0x10; // T1使用定時模式方式1,50ms
TH1=0x3c;
TL1=0xb0;
dis[0]=0x00;
delay1ms(100);
delay1ms(100);
delay1ms(100);
for(i=0;i<5;i++) // 5條通道,顯示5個數(shù)據(jù)
{
dis[0]++;
ad_sub=ad[i];
ad_sub=(ad_sub*330)/256;
dis[1]=ad_sub/100;
dis[4]=ad_sub%100;
dis[2]=dis[4]/10;
dis[3]=dis[4]%10;
flag_t1=0;
TR1=1; //開始計時,開中斷
ET1=1;
EA=1;
while(1)
{
if (flag_t1)
{
P2=0xff;
break;
}
for(k=0;k<4;k++) // 4位LED掃描控制
{
if (k==1)
P0=(dis_7[dis[k]] & 0x7f);
else
P0=dis_7[dis[k]];
P2=scan_con[k];
delay1ms(1);
}
}
}
}
/*****************/
// 掃描方式0程序 //
/*****************/
void ledscan0()
{
uchar k;
TMOD=0x10; // T1使用定時模式方式1,50ms
TH1=0x3c;
TL1=0xb0;
if(!dis_flag)
{
for(k=0;k<4;k++)
dis[k]=success[k];
}
else
{
for(k=0;k<4;k++)
dis[k]=fail[k];
}
TR1=1; //開始計時,開中斷
ET1=1;
EA=1;
while(1)
{
if(flag_t1)
{
P2=0xff;
break;
}
for(k=0;k<4;k++)
{
P0=dis_7[dis[k]];
P2=scan_con[k];
delay1ms(1);
}
}
}
/**************/
// 鍵掃描程序 //
/**************/
void keyscan()
{
static bit bpressflag;
static bit ad_finish;
uchar i;
int compare[5]={0x80,0x80,0x9e,0xcc,0x80};
if (!ad_start)
{
if(bpressflag)
return;
delay1ms(5);
if (!ad_start)
{
bpressflag=1;
P1=P1 | 0xf8;
P1_en=0xf8;
for(i=0;i<5;)
{
ad_data=0;
ad_con=i+3;
delay1ms(10);
ad_con|=0x08;
ad_finish=0;
while(!ad_finish)
{
ad_finish=(ad_con & 0x10);
}
ad_con &= 0xf7;
ad[i]=ad_data;
i++;
}
for(i=0;i<5;i++)
{
if ( fabs(ad[i] - compare[i])>23 )
{
dis_flag=1;
break;
}
}
}
}
else
bpressflag=0;
}
/**************/
// 延時程序 //
/**************/
void delay1ms(uint count)
{
uint i,k,temp;
uchar j;
temp=(uint)((100*12)/12);
for(i=0;i<count;i++)
for(j=0;j<1;j++)
for(k=0;k<temp;k++)
;
}
/**************/
// 主程序 //
/**************/
void main()
{
char k;
on_off=1;
while(1)
{
for(k=0;k<4;k++)
{
P0=dis_7[dis[k]];
P2=scan_con[k];
delay1ms(1);
}
power_on_off();
keyscan();
ledscan();
}
}
/**************/
// 定時中斷 //
/**************/
void t1_int() interrupt 3 using 2
{ ET1=0;TR1=0;TH1=0X3C;TL1=0XB0;
h++;
if(h==48)
{
flag_t1=1;
h=0;
}
else
{
flag_t1=0;
ET1=1;
TR1=1;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -