附上代码:pb4作为模拟电压输入口,用于ad转换pb3作为+5v输入检测口pb0作为输出问题是,通电后本应该直接输出高电平的,但是pb0口却是输出了几次高电平和低电平后才稳定再高电平,为什么,是初始化问题吗?#include "iot13v.h"
#include "macros.h"
#define uchar unsigned char
#define uint unsigned int
#define OUT0_0 (PORTB=PORTB&0xfe)
#define OUT0_1 (PORTB=PORTB|0x01)
uchar i,flag,sflag,fflag;
uint value,dis_val;
/****************************************/
void port_init(void)
{
PORTB = 0xE0;//定义pb 11100000
DDRB = 0x01;//pb0为输出,其余输入
}
/****************************************************/
void adc_init(void)
{
ADCMUX = 0x03;
ADCSRA = 0xE9;
}
/****************************************************/
#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
//conversion complete, read value (int) using...
value=ADCL;
value|=(int)ADCH << 8;
flag=1;
}
/***************************************/
void init_devices(void)
{
port_init();
adc_init();
TIMSK = 0x05;
SREG=0x80;
}
/***************************************/
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<140;j++);
}
}
/******************************************/
uint conv(uint i)
{
long x;
uint y;
x=(5000*(long)i)/1023;
y=(uint)x;
return y;
}
/******************************************/
void main(void)
{
init_devices();
fflag=1;
while(1)
{
if((PINB&0x10)==0x10){OUT0_0;fflag=1;} //检测pb4口有无电压,真就pb0口输出低,电压标志1
else {
if(flag==1)//判断ad转换完成标志
{
dis_val=conv(value); //对ad值进行转换
if((dis_val>=2260)&&(fflag==1)){OUT0_1;sflag=1;}//大于2260并且电压标志1为真,pb0输出高,sflag标志为1
else if((dis_val>=2060)&&(sflag==1)&&(dis_val<2260)){OUT0_1;} //电压在2060与2260之间,且sflag标志为真,pb0输出高
else {OUT0_0;sflag=0;fflag=0;} //小于2060,pb0输出低,电压标志1清零
flag=0; //ad标志清零
}
}
}
} |