📄 powertestinganddetecting.c
字号:
/*******************************************************************************************/
//使用stc89le516ad,12MHZ晶振,P0口输出段码,P2口做列扫描,共阳极LED数码管,P1口数据采集通道//
//开机显示"-dy-",扫描开机按钮是否按下,等待开机
//数据采集完毕后,默认显示"pass"或"fail",按功能键,可切换到数据显示方式
//按关机按钮,切断电源
/*******************************************************************************************/
#include "reg52.h"
#include "intrins.h" //包含内部函数
#include "math.h"
#define uchar unsigned char
#define uint unsigned int
sbit on_off=P3^4; //开测试板电源
sbit fun=P3^5; //功能健,调整显示方式
sbit ad_start=P3^6; //关测试板电源
sbit on_offpower=P3^7;
//定义与A/D转换有关的特殊寄存器
sfr P1_en=0X97; // 转换功能允许寄存器
sfr ad_con=0xc5; // 转换控制寄存器
sfr ad_data=0xc6; // 转换结果寄存器
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}; // 显示数据初始化,显示"-dy-"
int data ad[5]={0x00,0x00,0x00,0x00,0x00}; // AD转换原始数据存放
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中断计数,20次关闭,定时1s
void delay1ms(uint count);
void ledscan();
void ledscan0();
void ledscan1();
void keyscan();
void power_on_off();
/********************/
// 开关测试板电源 //
/********************/
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个数据
{
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;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -