java电平检测_如何用51单片机检测高低电平,并有输出

时间:2025-03-07 18:12:26

/*****************************

单片机型号STC15W401AS(1T)

使用芯片内部振荡器11.0592MHz

使用芯片内部加电复位功能

使用P3.2 INT0双向中断功能

随意使用其他端口做输出

只通过编译,未经仿真验证

*****************************/

#include ""            //STC15系列通用头文件

sbit INT0 = P3^2;                //外部中断端口

sbit LED1 = P1^0;                //输出端口

sbit LED2 = P1^1;

sbit LED3 = P1^2;

sbit LED4 = P1^3;

sbit LED5 = P1^4;

sbit LED6 = P1^5;

sbit LED7 = P5^4;

sbit LED8 = P5^5;

void Timer0Init();                //初始化定时器0声明

unsigned int Counter=0;            //定时中断计数器

bit FLAG=0;                      //中断标志 1:上升沿中断 0:下降沿中断

/******************************

主程序

******************************/

void main()

{

Timer0Init();                //初始化定时器0

LED1 = 0;                    //初始化输出端口

LED2 = 0;

LED3 = 0;

LED4 = 0;

LED5 = 0;

LED6 = 0;

LED7 = 0;

LED8 = 0;

INT0 = 1;                    //初始化INT0中断端口

IT0 = 0;                    //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)

EX0 = 1;                    //开INT0中断

ET0 = 1;                    //开定时器0中断

EA  = 1;                    //开总中断

while (1)

{

if(FLAG==1)                //如果中断标志为1

{

if(Counter<=200)

LED2 = 1;

if(Counter<=400)

LED3 = 1;

if(Counter<=800)

LED4 = 1;

if(Counter<=1000)

LED5 = 1;

if(Counter<=1200)

LED6 = 1;

if(Counter<=1400)

LED7 = 1;

if(Counter<=1600)

LED8 = 1;

}

}

}

/*****************************************

定时器初始化,时钟12T、16位自动重载模式

*****************************************/

void Timer0Init()                    //200微秒@11.0592MHz

{

AUXR |= 0x80;                    //定时器时钟1T模式

TMOD &= 0xF0;                    //设置定时器模式

TL0 = 0x5C;                        //设置定时初值

TH0 = 0xF7;                        //设置定时初值

//    TF0 = 0;                        //清除TF0标志

//    TR0 = 1;                        //定时器0开始计时

}

/*-------------------------------

定时器0中断服务程序

-------------------------------*/

void timer0() interrupt    1

{

if(Counter<65535)

Counter++;

}

/*-------------------------------

外部中断服务程序

-------------------------------*/

void exint0() interrupt 0             //INT0中断入口

{

INT0 = !INT0;                     //将测试口取反

FLAG = INT0;                       //保存INT0口的状态, INT0=0(下降沿); INT0=1(上升沿)

if(FLAG==1)

{

LED1 = 1;                    //第一输出与测试口同步

TR0 = 1;                    //开定时器0

}

else

{

TR0  = 0;                    //关闭定时器0

Counter = 0;                //定时中断计数器清0

LED1 = 0;                    //输出端口全清0

LED2 = 0;

LED3 = 0;

LED4 = 0;

LED5 = 0;

LED6 = 0;

LED7 = 0;

LED8 = 0;

}

}