📄 电源老化测试定时器.c
字号:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RSPIN = P2^7;
sbit RWPIN = P2^6;
sbit EPIN = P2^5;
sbit out= P1^0;
/* 增特殊功能寄存器定义 */
sfr ISP_DATA = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;
sfr ISP_CONTR = 0xe7;
/* 定义常量 */
#define ERROR 0
#define OK 1
bit km; //按键已去抖动标志
bit kp; //按键已处理标志
bit ON_OFF;
bit start;
bit rest;
bit sheding;
uchar show_status; //LED 显示状态标志
uchar XPOS,YPOS;
uint ON,OFF,TIMER;
uint ON_R ,OFF_R,TIMER_R;
uchar ON_0,ON_1,ON_2,OFF_0,OFF_1,OFF_2,TIMER_0,TIMER_1,TIMER_2 ;
uint count_down; //1秒钟计时用
uchar miao;
void delay(unsigned int t)
{ unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++)
;
}
/* 打开 ISP,IAP 功能 */
void ISP_IAP_enable(void)
{
EA = 0; /* 关中断 */
ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */
ISP_CONTR = ISP_CONTR | 0x02;
ISP_CONTR = ISP_CONTR | 0x80; /* 1000,0000 */
}
/* 关闭 ISP,IAP 功能 */
void ISP_IAP_disable(void)
{
ISP_CONTR = ISP_CONTR & 0x7f; /* 0111,1111 */
ISP_TRIG = 0x00;
EA = 1; /* 开中断 */
}
/* 字节读 */
uchar byte_read(uint byte_addr)
{
ISP_ADDRH = (uchar)(byte_addr >> 8);
ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
ISP_CMD = ISP_CMD | 0x01; /* 0000,0001 */
ISP_IAP_enable();
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
_nop_();
ISP_IAP_disable();
return (ISP_DATA);
}
/* 扇区擦除 */
uchar sector_erase(uint sector_addr)
{
uint get_sector_addr = 0;
get_sector_addr = (sector_addr & 0xfe00); /* 1111,1110,0000,0000; 取扇区地址 */
ISP_ADDRH = (uchar)(get_sector_addr >> 8);
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
ISP_CMD = ISP_CMD | 0x03; /* 0000,0011 */
ISP_IAP_enable();
ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
_nop_();
ISP_IAP_disable();
return OK;
}
/* 字节编程 */
uchar byte_program(uint byte_addr, uchar original_data)
{
ISP_ADDRH = (uchar)(byte_addr >> 8);
ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
ISP_CMD = ISP_CMD | 0x02; /* 0000,0010 */
ISP_DATA = original_data;
ISP_IAP_enable();
ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
_nop_();
ISP_IAP_disable();
return OK;
}
void lcdwaitidle(void)
{ P0=0xff;
RSPIN=0;
RWPIN=1;
EPIN=1;
while((P0&0x80)==0x80);
EPIN=0;
}
void lcdwcn(unsigned char c)
{ RSPIN=0;
RWPIN=0;
P0=c;
EPIN=1;
_nop_();
EPIN=0;
}
void lcdwc(unsigned char c)
{ lcdwaitidle();
lcdwcn(c);
}
void lcdwd(unsigned char d)
{ lcdwaitidle();
RSPIN=1;
RWPIN=0;
P0=d;
EPIN=1;
_nop_();
EPIN=0;
}
void lcdpos(void)
{ XPOS&=0x0f;
YPOS&=0x03;
if(YPOS==0x00)
lcdwc(XPOS|0x80);
else if(YPOS==0x01)
lcdwc((XPOS+0x40)|0x80);
}
void lcdreset()
{ delay(150); lcdwcn(0x38);
delay(50); lcdwcn(0x38);
delay(50); lcdwcn(0x38);
lcdwc(0x38);
lcdwc(0x08);
lcdwc(0x01);
lcdwc(0x06);
lcdwc(0x0c);
}
void lcdwone(unsigned char x,unsigned char y,unsigned char s)
{ YPOS=y;
XPOS=x;
{ lcdpos();
lcdwd(s);
}
}
void lcdwda(unsigned char x,unsigned char y,unsigned char *s)
{ YPOS=y;
for(XPOS=x;XPOS<16;XPOS++)
{ lcdpos();
lcdwd(*s);
s++;
}
}
void show_1602()
{
ON_R=ON;
OFF_R=OFF;
TIMER_R=TIMER;
ON_2=ON_R/100;
ON_1= (ON_R-=ON_2*100)/10;
ON_0= ON_R-=ON_1*10;
OFF_2=OFF_R/100;
OFF_1= (OFF_R-=OFF_2*100)/10;
OFF_0= OFF_R-=OFF_1*10;
TIMER_2=TIMER_R/100;
TIMER_1= (TIMER_R-=TIMER_2*100)/10;
TIMER_0= TIMER_R-=TIMER_1*10;
lcdwone(4,0,0X30+ON_2);
lcdwone(5,0,0X30+ON_1);
lcdwone(6,0,0X30+ON_0);
lcdwone(4,1,0X30+OFF_2);
lcdwone(5,1,0X30+OFF_1);
lcdwone(6,1,0X30+OFF_0);
lcdwone(11,1,0X30+TIMER_2);
lcdwone(12,1,0X30+TIMER_1);
lcdwone(13,1,0X30+TIMER_0);
delay(5000);
switch(show_status )
{ case 1:
lcdwone(4,0,0X20);
lcdwone(5,0,0X20);
lcdwone(6,0,0X20);
break;
case 2:
lcdwone(4,1,0X20);
lcdwone(5,1,0X20);
lcdwone(6,1,0X20);
break;
case 3:
lcdwone(11,1,0X20);
lcdwone(12,1,0X20);
lcdwone(13,1,0X20);
break;
case 4:
sector_erase(0x2000);
byte_program( 0x2000, ON_2);
byte_program( 0x2001, ON_1);
byte_program( 0x2002, ON_0);
byte_program( 0x2003, OFF_2);
byte_program( 0x2004, OFF_1);
byte_program( 0x2005, OFF_0);
byte_program( 0x2006, TIMER_2);
byte_program( 0x2007, TIMER_1);
byte_program( 0x2008, TIMER_0);
show_status=0;
break;
default:
break;
}
delay(5000);
}
void read_ISP_IAP()
{
byte_read( 0x2000);
ON_2=ISP_DATA;
byte_read( 0x2001);
ON_1=ISP_DATA;
byte_read( 0x2002);
ON_0=ISP_DATA;
byte_read( 0x2003);
OFF_2=ISP_DATA;
byte_read( 0x2004);
OFF_1=ISP_DATA;
byte_read( 0x2005);
OFF_0=ISP_DATA;
byte_read( 0x2006);
TIMER_2=ISP_DATA;
byte_read( 0x2007);
TIMER_1=ISP_DATA;
byte_read( 0x2008);
TIMER_0=ISP_DATA;
ON=ON_2*100+ON_1*10+ON_0;
OFF=OFF_2*100+OFF_1*10+OFF_0;
TIMER=TIMER_2*100+TIMER_1*10+TIMER_0;
}
void Timer0ISR(void) interrupt 1 using 3 //定时器0中断程序,用于走时,1/8000秒一次
{
if(TIMER==0)
{
TR0=0;
out= 1;
start=0;
}
count_down--;
if(count_down==0) //过了一秒钟
{count_down=8000;
miao++;
if(miao==60)
{miao=0;
TIMER--;
}
if(ON_OFF==0)
{
out= 1;
if(OFF==0) ON_OFF=1;
else OFF--;
}
else
{
out= 0;
if(ON==0) ON_OFF=0;
else ON--;
}
}
}
void Timer1ISR(void) interrupt 3 using 2 //定时器2中断,用于按键扫描
{uchar keytmp;
TH1=0x3c; TL1=0xb0; // 每30ms中断一次
//*** 按键扫描及处理 ***/
keytmp=P3;
if(keytmp==0xff) { km=0; kp=0; }
else
{ if(km==0) km=1;
else
{ if(kp==0)
{ kp=1;
if(keytmp==0xfe &&TR0==0) //第一个按钮
{show_status++;
if(show_status==1)sheding=1;
if(show_status>4)
show_status=0;
}
if(keytmp==0xfd &&TR0==0 ) //第二个按钮
{ switch(show_status )
{ case 1:
if(ON>998) ON=999;
else ON++;
break;
case 2:
if(OFF>998) OFF=999;
else OFF++;
break;
case 3:
if(TIMER>998) TIMER=999;
else TIMER++;
break;
default:
break;
}
}
if(keytmp==0xfb &&TR0==0) //第二个按钮
{ switch(show_status )
{
case 1:
if(ON==0){ON=0; }
else {ON--; }
break;
case 2:
if(OFF==0){OFF=0; }
else {OFF--; }
break;
case 3:
if(TIMER==0){TIMER=0; }
else {TIMER--; }
break;
default:
break;
}
}
if(keytmp==0xf7 && start==0 ) //第二个按钮
{
rest=1;
show_status=0;
}
if(keytmp==0xef &&show_status==0) //第二个按钮
{
start=!start;
if(start==1)
{
TR0=1;
}
else
{
TR0=0;
out= 1;
}
}
}
}
}
}
main()
{ out= 1;
EPIN=0;
lcdreset();
lcdwda(0,0," ON= s Timer");
lcdwda(0,1,"OFF= s m");
delay(50);
read_ISP_IAP();
start=0;
ON_OFF=0;
miao=0;
sheding=0;
IE=0; IP=0; //disable all interrupt and lower priority
TMOD=0x12; //timer 0 is set to mode 2,auto_reloading,timer1,mode 1
TH0=0x2F; TL0=0x2F; //timer0 parameters for 0.125ms
TH1=0x3c; TL1=0xb0; //timer1 parameters for 30ms
TR0=0; TR1=1; //timer0 interrupt most important
ET0=1; ET1=1; EA=1; //enable interrupt function
count_down=8000;
show_status=0;
while(1)
{
show_1602();
if(sheding==1)
{sheding=0;
read_ISP_IAP();
}
if(rest==1)
{
rest=0;
read_ISP_IAP();
}
if( TR0==1)
{
if(ON==0 && ON_OFF==0)
{
byte_read( 0x2000);
ON_2=ISP_DATA;
byte_read( 0x2001);
ON_1=ISP_DATA;
byte_read( 0x2002);
ON_0=ISP_DATA;
ON=ON_2*100+ON_1*10+ON_0;
}
if(OFF==0&& ON_OFF==1)
{
byte_read( 0x2003);
OFF_2=ISP_DATA;
byte_read( 0x2004);
OFF_1=ISP_DATA;
byte_read( 0x2005);
OFF_0=ISP_DATA;
OFF=OFF_2*100+OFF_1*10+OFF_0;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -