| 
 
| 附上代码: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标志清零
 }
 
 }
 }
 }
 | 
 |