精华内容
下载资源
问答
  • 电子政务-内部上下电阻的无极性RS-485接口芯片.zip
  • STM32F4 USB接口上下电阻

    千次阅读 2019-01-14 09:10:38
    根据《STM32F4XX中文参考手册》931页 USB部分的介绍: STM32F4 的OTG_FS模块集成了DP/DM的上下电阻,所以外部不再需要额外的上下电阻。    

    根据《STM32F4XX中文参考手册》931页 USB部分的介绍:

    STM32F4 的OTG_FS模块集成了DP/DM的上下拉电阻,所以外部不再需要额外的上下拉电阻。

     

     

    展开全文
  • //完成上拉刷新,就是底部加载完毕,这个方法要调用 //移除footer,这个动作不能少 listview.removeFooterView(footer); super.onPostExecute(result); } }.execute(); } }); } } ...

    这个博客好想不能提供下载代码啊, 我只能把代码贴出来了...

    其实你只需看用法, 不用关心具体实现,demo非常容易看懂

    public class CustomListViewActivity extends Activity {
        private CustomListView listview;
    	private ArrayList<String> data;
    	private BaseAdapter adapter;
    
    	/** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            init();
            setListener();
        }
        
        
        private void init(){
            data = new ArrayList<String>();
    		//虚拟一些数据
            data.add("a");
            data.add("b");
            data.add("c");
            data.add("e");
            data.add("f");
            data.add("g");
            data.add("h");
            data.add("i");
            data.add("j");
            data.add("k");
            data.add("L");
            data.add("M");
            data.add("L");
            data.add("N");
            data.add("O");
            data.add("P");
            data.add("Q");
            
            listview = (CustomListView) findViewById(R.id.listview);
            
            adapter = new BaseAdapter(){
    			@Override
    			public int getCount() {
    				return data.size();
    			}
    
    			@Override
    			public Object getItem(int position) {
    				return null;
    			}
    
    			@Override
    			public long getItemId(int position) {
    				return position;
    			}
    
    			@Override
    			public View getView(int position, View convertView, ViewGroup parent) {
    				TextView textView = new TextView(getApplicationContext());
    				textView.setHeight(100);
    				textView.setTextSize(20);
    				textView.setGravity(Gravity.CENTER);
    				textView.setBackgroundColor(0x66666666);
    				textView.setTextColor(0xaaffffff);
    				textView.setText(data.get(position));
    				return textView;
    			}
            };
            listview.setAdapter(adapter);
        }
        
        private void setListener(){
        	listview.setOnRefreshListner(new OnRefreshListner() {
    			@Override
    			public void onRefresh() {
    				new AsyncTask<Void, Void, ArrayList<String>>(){
    					@Override
    					protected ArrayList<String> doInBackground(Void... params) {
    						try {
    							//模拟从服务器获取数据的过程
    							Thread.sleep(1500);
    						} catch (InterruptedException e) {
    							e.printStackTrace();
    						}
    						
    						ArrayList<String> virtualData = new ArrayList<String>();
    						virtualData.add("Head刷新后的新数据1");
    						virtualData.add("Head刷新后的新数据2");
    						virtualData.add("Head刷新后的新数据3");
    						virtualData.add("Head刷新后的新数据4");
    						virtualData.add("Head刷新后的新数据5");
    						virtualData.add("Head刷新后的新数据6");
    						
    						return virtualData;
    					}
    					//更新UI的方法,系统自动实现
    					@Override
    					protected void onPostExecute(ArrayList<String> result) {
    						data.addAll(0,result);//注意是往前添加数据
    						adapter.notifyDataSetChanged();
    						listview.onRefreshComplete();//完成下拉刷新,这个方法要调用
    						super.onPostExecute(result);
    					}
    				}.execute();
    			}
    		});
            //创建FootView
            final View footer = View.inflate(CustomListViewActivity.this, R.layout.footer, null);
            listview.setOnAddFootListener(new OnAddFootListener() {
    			@Override
    			public void addFoot() {
    				listview.addFooterView(footer);
    			}
    		});
            
            listview.setOnFootLoadingListener(new OnFootLoadingListener() {
    			@Override
    			public void onFootLoading() {
    				new AsyncTask<Void, Void, ArrayList<String>>(){
    					@Override
    					protected ArrayList<String> doInBackground(Void... params) {
    						try {
    							//模拟从服务器获取数据的过程
    							Thread.sleep(2000);
    						} catch (InterruptedException e) {
    							e.printStackTrace();
    						}
    						
    						ArrayList<String> virtualData = new ArrayList<String>();
    						virtualData.add("Foot刷新后的新数据1");
    						virtualData.add("Foot刷新后的新数据2");
    						virtualData.add("Foot刷新后的新数据3");
    						virtualData.add("Foot刷新后的新数据4");
    						virtualData.add("Foot刷新后的新数据5");
    						virtualData.add("Foot刷新后的新数据6");
    						return virtualData;
    					}
    
    					//在doInBackground后面执行
    					@Override
    					protected void onPostExecute(ArrayList<String> result) {	
    						data.addAll(result);//这个是往后添加数据
    						adapter.notifyDataSetChanged();
    						listview.onFootLoadingComplete();//完成上拉刷新,就是底部加载完毕,这个方法要调用
    						//移除footer,这个动作不能少
    						listview.removeFooterView(footer);
    						super.onPostExecute(result);
    					}
    				}.execute();
    			}
    		});
        }
    }

     下面上listview的代码,有点长...

    /**
     * 支持下拉刷新和上拉刷新
     * 可自定义上啦和下拉过程的操作,推荐使用AsyncTask
     * 需自定义Foot的View,然后只需在addFoot方法中添加即可
     * @author lxj
     *
     */
    public class CustomListView extends ListView implements OnScrollListener {
    
    	private static final int DONE = 0;
    	private static final int PULL_TO_REFRESH = 1;
    	private static final int RELEASE_TO_REFRESH = 2;
    	private static final int REFRESHING = 3;
    	private static final float RATIO = 3;// 用来设置实际间距和上边距之间的比例
    
    	private int state;// 当前下拉刷新的状态
    
    	private int firstVisibleIndex;// 在listview中第一个可以看见的item
    	private View headView;
    	private ImageView headArrow;
    	private ProgressBar progressBar;
    	private TextView headTitle;
    	private TextView headLastUpdate;
    	private int headContentWidth;
    	private int headContentHeight;
    	private Animation animation;
    	private Animation reverseAnimation;
    	private OnRefreshListner refreshListner;// 刷新监听器
    
    	private boolean isRefreshable;
    	private boolean isRecored = false;// 用来记录第一次按下坐标点,在整个滑动的过程中 只记录一次
    	private float startY;
    	private boolean isBack = false;// 是从 松开刷新状态 来到的 下拉刷新状态
    	
    	public CustomListView(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		init(context);
    	}
    
    	private void init(Context context) {
    		// listview 设置滑动时缓冲背景色
    		setCacheColorHint(0x00000000);
    
    		headView = View.inflate(context, R.layout.head, null);
    
    		headArrow = (ImageView) headView.findViewById(R.id.head_arrow);
    		progressBar = (ProgressBar) headView.findViewById(R.id.progressbar);
    		headTitle = (TextView) headView.findViewById(R.id.head_title);
    		headLastUpdate = (TextView) headView
    				.findViewById(R.id.head_last_update);
    
    		headArrow.setMinimumWidth(50);
    		headArrow.setMinimumHeight(70);
    
    		MeasureView(headView);
    		
    		headContentWidth = headView.getMeasuredWidth();
    		headContentHeight = headView.getMeasuredHeight();
    
    		headView.setPadding(0, -1*headContentHeight, 0, 0);
    		// 为listView加入顶部View
    		addHeaderView(headView);
    
    		setOnScrollListener(this);
    
    		animation = new RotateAnimation(-180, 0, Animation.RELATIVE_TO_SELF,
    				0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    		animation.setDuration(250);
    		animation.setFillAfter(true);// 设定动画结束时,停留在动画结束位置 (保留动画效果)
    		animation.setInterpolator(new LinearInterpolator());// 匀速变化
    
    		reverseAnimation = new RotateAnimation(0, -180,
    				Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
    				0.5f);
    		reverseAnimation.setDuration(200);
    		reverseAnimation.setFillAfter(true);// 设定动画结束时,停留在动画结束位置 (保留动画效果)
    		reverseAnimation.setInterpolator(new LinearInterpolator());// 匀速变化
    
    		// 设置当前headView的状态
    		state = DONE;
    
    		// 设置当前下拉刷新是否可用
    		isRefreshable = false;
    	}
    	
    
    	/**
    	 * 测量headView的 宽高
    	 * 
    	 * @param child
    	 */
    	private void MeasureView(View child) {
    		ViewGroup.LayoutParams lp = child.getLayoutParams();
    
    		if (null == lp) {
    			lp = new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT,
    					LayoutParams.WRAP_CONTENT);
    		}
    
    		int measureChildWidth = ViewGroup.getChildMeasureSpec(0, 0, lp.width);
    		int measureChildHeight;
    
    		if (lp.height > 0) {
    			measureChildHeight = MeasureSpec.makeMeasureSpec(lp.height,
    					MeasureSpec.EXACTLY);
    		} else {
    			measureChildHeight = MeasureSpec.makeMeasureSpec(0,
    					MeasureSpec.UNSPECIFIED);
    		}
    
    		child.measure(measureChildWidth, measureChildHeight);
    
    	}
    
    	@Override
    	public boolean onTouchEvent(MotionEvent event) {
    
    		switch (event.getAction()) {
    		case MotionEvent.ACTION_DOWN:
    			if (firstVisibleIndex == 0 && !isRecored) {
    				startY = event.getY();
    				isRecored = true;
    			}
    
    			break;
    
    		case MotionEvent.ACTION_MOVE:
    			float tempY = event.getY();
    			if (firstVisibleIndex == 0 && !isRecored) {
    				startY = tempY;
    				isRecored = true;
    			}
    
    			if (state != REFRESHING) {
    				if (state == PULL_TO_REFRESH) {
    					// 向下拉了 从下拉刷新的状态 来到 松开刷新的状态
    					if ((tempY - startY) / RATIO >= headContentHeight
    							&& (tempY - startY) > 0) {
    						state = RELEASE_TO_REFRESH;
    
    						changeHeadViewOfState();
    					}
    					// 向上推了 从下拉刷新的状态 来到 刷新完成的状态
    					else if ((tempY - startY) <= 0) {
    						state = DONE;
    
    						changeHeadViewOfState();
    					}
    
    				} else if (state == RELEASE_TO_REFRESH) {
    					// 向上推了 还没有完全将HEADVIEW 隐藏掉(可以看到一部分)
    					// 从松开刷新的状态 来到 下拉刷新的状态
    					if ((tempY - startY) / RATIO < headContentHeight
    							&& (tempY - startY) > 0) {
    						state = PULL_TO_REFRESH;
    
    						changeHeadViewOfState();
    						isBack = true;
    					}
    					// 向上推了 一下子推到了最上面 从松开刷新的状态 来到 刷新完成的状态 (数据不刷新的)
    					else if ((tempY - startY) <= 0) {
    						state = DONE;
    
    						changeHeadViewOfState();
    					}
    
    				} else if (state == DONE) {
    					// 刷新完成的状态 来到 下拉刷新的状态
    					if ((tempY - startY) > 0) {
    						state = PULL_TO_REFRESH;
    
    						changeHeadViewOfState();
    					}
    				}
    
    				if (state == PULL_TO_REFRESH) {
    					headView.setPadding(
    							0,
    							(int) ((tempY - startY) / RATIO - headContentHeight),
    							0, 0);
    				}
    
    				if (state == RELEASE_TO_REFRESH) {
    					headView.setPadding(
    							0,
    							(int) ((tempY - startY) / RATIO - headContentHeight),
    							0, 0);
    				}
    
    			}
    
    			break;
    
    		case MotionEvent.ACTION_UP:
    			if (state != REFRESHING) {
    				if (state == PULL_TO_REFRESH) {
    					// 松手
    					state = DONE;
    
    					changeHeadViewOfState();
    				}
    
    				else if (state == RELEASE_TO_REFRESH) {
    					// 松手
    					state = REFRESHING;
    					changeHeadViewOfState();
    
    					// 执行数据刷新方法
    					onRefresh();
    				}
    			}
    
    			isRecored = false;
    			isBack = false;
    
    			break;
    		}
    
    		return super.onTouchEvent(event);
    	}
    
    	/**
    	 * 执行下拉刷新
    	 */
    	private void onRefresh() {
    		if (refreshListner != null) {
    			refreshListner.onRefresh();
    		}
    	}
    
    	/**
    	 * HeadView的状态变化效果
    	 */
    	private void changeHeadViewOfState() {
    		// 
    		switch (state) {
    
    		case PULL_TO_REFRESH:
    			
    			headArrow.setVisibility(View.VISIBLE);
    			progressBar.setVisibility(View.GONE);
    			headTitle.setVisibility(View.VISIBLE);
    			headLastUpdate.setVisibility(View.VISIBLE);
    			
    			headArrow.clearAnimation();
    			headTitle.setText("下拉可以刷新");
    			//由 松开刷新  到  下拉刷新
    			if(isBack){
    				
    				headArrow.startAnimation(animation);
    				isBack = false;
    			}
    
    			break;
    
    		case RELEASE_TO_REFRESH:
    			
    			headArrow.setVisibility(View.VISIBLE);
    			progressBar.setVisibility(View.GONE);
    			headTitle.setVisibility(View.VISIBLE);
    			headLastUpdate.setVisibility(View.VISIBLE);
    			
    			headArrow.clearAnimation();
    			headArrow.startAnimation(reverseAnimation);
    			
    			headTitle.setText("松开可以刷新");
    
    			break;
    
    		case REFRESHING:
    
    			headArrow.setVisibility(View.GONE);
    			progressBar.setVisibility(View.VISIBLE);
    			headTitle.setVisibility(View.VISIBLE);
    			headLastUpdate.setVisibility(View.VISIBLE);
    			
    			headArrow.clearAnimation();
    			headTitle.setText("正在刷新...");
    			
    			headView.setPadding(0, 0, 0, 0);
    			
    			break;
    
    		case DONE:
    			
    			headArrow.setVisibility(View.VISIBLE);
    			progressBar.setVisibility(View.GONE);
    			headTitle.setVisibility(View.VISIBLE);
    			headLastUpdate.setVisibility(View.VISIBLE);
    			
    			headArrow.clearAnimation();
    			headTitle.setText("下拉可以刷新");
    			
    			headView.setPadding(0, -1 * headContentHeight, 0, 0);
    
    			break;
    		}
    
    	}
    
    	private int lastPos;//最后一个可见的item的位置
    	private int count;//item总数,注意不是当前可见的item总数
    	private boolean hasFoot = false;//是否有了Foot
    	@Override
    	public void onScroll(AbsListView view, int firstVisibleItem,
    			int visibleItemCount, int totalItemCount) {
    		firstVisibleIndex = firstVisibleItem;
    		lastPos = getLastVisiblePosition();
    		count = totalItemCount;
    		
    		//因为刚进入的时候,lastPos=-1,count=0,这个时候不能让它执行onAddFoot方法
    		if(lastPos==count-1 && !hasFoot && lastPos != -1){
    			hasFoot = true;
    			onAddFoot();
    			Log.d("addFoot================","执行添加Foot....");
    		}
    		
    		Log.d("count================", count+"");
    		Log.d("lastPos================", lastPos+"");
    	}
    
    	@Override
    	public void onScrollStateChanged(AbsListView view, int scrollState) {
    		if(isFootLoading)
    			return;
    		
    		if(hasFoot && scrollState==SCROLL_STATE_IDLE){
    			isFootLoading = true;
    			onFootLoading();
    		}
    	}
    
    	/**
    	 * 设置下拉刷新监听
    	 * 
    	 * @param listener
    	 */
    	public void setOnRefreshListner(OnRefreshListner listener) {
    		// 设置下拉刷新可用
    		isRefreshable = true;
    		refreshListner = listener;
    
    	}
    	
    	
    	//执行底部加载
    	public void onFootLoading(){
    		if(footLoadingListener!=null && isFootLoading)
    			footLoadingListener.onFootLoading();
    	}
    	
    	public void setOnAddFootListener(OnAddFootListener addFootListener){
    		onAddFootListener = addFootListener;
    	}
    	
    	//执行添加foot
    	public void onAddFoot(){
    		if(onAddFootListener!=null && hasFoot)
    			onAddFootListener.addFoot();
    	}
    	//是否添加Foot的监听器,如果写在OnFootLoadingListener中会有延迟,效果不好
    	//应该是先进入添加Foot的状态,再进入FootLoading的状态
    	public OnAddFootListener onAddFootListener;
    	//是否进入从底部加载数据的状态的监听器
    	public OnFootLoadingListener footLoadingListener;
    	//正在加载底部数据
    	private boolean isFootLoading = false;
    	public void setOnFootLoadingListener(OnFootLoadingListener footLoading){
    		footLoadingListener = footLoading;
    	}
    
    	/**
    	 * 下拉刷新监听器
    	 * @author lxj
    	 *
    	 */
    	public interface OnRefreshListner {
    		/**
    		 * 下拉刷新的时候,在这里执行获取数据的过程
    		 */
    		void onRefresh();
    	}
    	
    	/**
    	 * 上拉刷新监听器
    	 * @author lxj
    	 *
    	 */
    	public interface OnFootLoadingListener{
    		/**
    		 * 这里是执行后台获取数据的过程
    		 */
    		void onFootLoading();
    	}
    	
    	/**
    	 * 添加Foot的监听器
    	 * @author lxj
    	 *
    	 */
    	public interface OnAddFootListener{
    		/**
    		 * 这里是用户addFootView的操作
    		 */
    		void addFoot();
    	}
    	
    	/**
    	 * 底部数据加载完成,用户需要加入一个removeFootView的操作
    	 */
    	public void onFootLoadingComplete(){
    		hasFoot = false;
    		isFootLoading = false;
    	}
    
    	/**
    	 * 上拉刷新完成时 所执行的操作,更改状态,隐藏head
    	 */
    	public void onRefreshComplete() {
    		state = DONE;
    		changeHeadViewOfState();
    
    		headLastUpdate.setText("最后刷新时间: " + new Date().toLocaleString());
    	}
    
    	@Override
    	public void setAdapter(ListAdapter adapter) {
    
    		headLastUpdate.setText("最后刷新时间: " + new Date().toLocaleString());
    		
    		super.setAdapter(adapter);
    	}
    }
    

    下面是布局文件:

    main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <com.test.custom.CustomListView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:id="@+id/listview" />
    
    </LinearLayout>
    head.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
    
        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="30dp" >
    
            <FrameLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true" >
    
                <ImageView
                    android:id="@+id/head_arrow"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:background="@drawable/arrow" />
    
                <ProgressBar
                    android:id="@+id/progressbar"
                    style="?android:attr/progressBarStyleSmall"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:visibility="gone" />
            </FrameLayout>
    
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:gravity="center_horizontal"
                android:orientation="vertical" >
    
                <TextView
                    android:id="@+id/head_title"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="下拉可以刷新"
                    android:textColor="#666666"
                    android:textSize="20sp" />
    
                <TextView
                    android:id="@+id/head_last_update"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="3dp"
                    android:text="最后更新时间:"
                    android:textColor="#666666"
                    android:textSize="10sp" />
            </LinearLayout>
        </RelativeLayout>
    
    </LinearLayout>

    footer.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:gravity="center" >
        
        <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
             />
        <TextView android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="10dip"
            android:text="正在加载中..."
            android:textSize="20sp"/>
    
    </LinearLayout>


    本着一条龙服务的原则, 下面连箭头图片都给你搞上...点我下载箭头箭头就在前面那个空格区域(3个点的后面),晕啊,抓狂箭头是白色的看不到,,,你在那里用鼠标拖一下就出来了,或者到我空间相册下载....

    展开全文
  • 上拉加载下拉刷新的ListView 运行效果图 ##如何使用## ListViewPlus是基于ListView开发的自定义控件,大家可以将ListViewPlus当成ListView来使用。 使用ListViewPlus需要实现ListViewPlusListener接口,该接口...
  • 1.1.1 接口相关电路及概念 1. 集电极开路输出 在电路中常会遇到漏极开路(Open Drain)和集电极开路(Open Collector)两种情形。漏极开路电路概念中提到的“漏”是指 MOSFET的漏极。同理,集电极开路电路中的“集...
    1.1.1 接口相关电路及概念
    1. 集电极开路输出

    在电路中常会遇到漏极开路(Open Drain)和集电极开路(Open Collector)两种情形。漏极开路电路概念中提到的“漏”是指 MOSFET的漏极。同理,集电极开路电路中的“集”就是指三极管的集电极。在数字电路中,分别简称OD门和OC门。

    典型的集电极开路电路如图所示。电路中右侧的三极管集电极什么都不接,所以叫做集电极开路,左侧的三极管用于反相作用,即左侧输入“0”时左侧三极管截止,VCC通过电阻加到右侧三极管基极,右侧三极管导通,右侧输出端连接到地,输出“0”。

    clip_image002

    从图中电路可以看出集电极开路是无法输出高电平的,如果要想输出高电平可以在输出端加上上拉电阻。因此集电极开路输出可以用做电平转换,通过上拉电阻上拉至不同的电压,来实现不同的电平转换。

    用做驱动器。由于OC门电路的输出管的集电极悬空,使用时需外接一个上拉电阻Rp到电源VCC。OC门使用上拉电阻以输出高电平,此外为了加大输出引脚的驱动能力,上拉电阻阻值的选择原则,从降低功耗及芯片的灌电流能力考虑应当足够大;从确保足够的驱动电流考虑应当足够小。

    将OC门输出连在一起时,再通过一个电阻接外电源,可以实现“线与”逻辑关系。只要电阻的阻值和外电源电压的数值选择得当,就能做到既保证输出的高、低电平符合要求,而且输出三极管的负载电流又不至于过大。

    集电极开路输出除了可以实现多门的线与逻辑关系外,通过使用大功率的三极管还可用于直接驱动较大电流的负载,如继电器、脉冲变压器、指示灯等。

    2. 漏极开路输出

    和集电极开路一样,顾名思义,开漏电路就是指从MOSFET的漏极输出的电路。典型的用法是在漏极外部的电路添加上拉电阻到电源如图所示。完整的开漏电路应由开漏器件和开漏上拉电阻组成。这里的上拉电阻R的阻值决定了逻辑电平转换的上升/下降沿的速度。阻值越大,速度越低,功耗越小。因此在选择上拉电阻时要兼顾功耗和速度。标准的开漏脚一般只有输出的能力。添加其它的判断电路,才能具备双向输入、输出的能力。

    clip_image004

    很多单片机等器件的I/O就是漏极开路形式,或者可以配置成漏极开路输出形式,如51单片机的P0口就为漏极开路输出。在实际应用中可以将多个开漏输出的引脚连接到一条线上,这样就形成“线与逻辑”关系。注意这个公共点必须接一个上拉电阻。当这些引脚的任一路变为逻辑0后,开漏线上的逻辑就为0了。在I2C等接口总线中就用此法判断总线占用状态。

    同集电极开路一样,利用外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经上拉电阻,再经MOSFET到GND。IC内部仅需很下的栅极驱动电流,因此漏极开路也常用于驱动电路中。

    3. 推挽输出

    在功率放大器电路中经常采用推挽放大器电路,这种电路中用两只三极管构成一级放大器电路,如图所示。两只三极管分别放大输入信号的正半周和负半周,即用一只三极管放大信号的正半周,用另一只三极管放大信号的负半周,两只三极管输出的半周信号在放大器负载上合并后得到一个完整周期的输出信号。

    clip_image006

    推挽放大器电路中,一只三极管工作在导通、放大状态时,另一只三极管处于截止状态,当输入信号变化到另一个半周后,原先导通、放大的三极管进入截止,而原先截止的三极管进入导通、放大状态,两只三极管在不断地交替导通放大和截止变化,所以称为推挽放大器。输出既可以向负载灌电流,也可以从负载抽取电流

    4. 上拉电阻与下拉电阻

    在嵌入式接口的相关应用中经常提到上拉电阻与下拉电阻,顾名思义,上拉电阻就是把端口连接到电源的电阻,下拉电阻就是把端口连接到地的电阻。虽然电路形式非常简单,然而上拉电阻与下拉电阻在很多场合却扮演着非常重要的作用。

    简单的说,上拉电阻的主要作用在于提高输出信号的驱动能力、确定输入信号的电平(防止干扰)等,具体的表现为:

    l 当TTL电路驱动COMS电路时,如果TTL电路输出的高电平低于COMS电路的最低高电平(一般为3.5V), 这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。

    l OC门电路必须加上拉电阻,以提高输出的搞电平值。

    l 为加大输出引脚的驱动能力,有的单片机管脚上也常使用上拉电阻。

    l 在COMS芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻产生降低输入阻抗,提供泄荷通路。

    l 芯片的管脚加上拉电阻来提高输出电平,从而提高芯片输入信号的噪声容限增强抗干扰能力。

    l 提高总线的抗电磁干扰能力。管脚悬空就比较容易接受外界的电磁干扰。

    l 长线传输中电阻不匹配容易引起反射波干扰,加上下拉电阻是电阻匹配,有效的抑制反射波干扰。

    上拉电阻阻值的选择原则包括:

    l 从节约功耗及芯片的灌电流能力考虑应当足够大;电阻大,电流小。

    l 从确保足够的驱动电流考虑应当足够小;电阻小,电流大。

    l 对于高速电路,过大的上拉电阻可能边沿变平缓。

    综合考虑以上三点,通常在1K到10K之间选取。对下拉电阻也有类似道理。

    5. 嵌入式微控制器的I/O配置

    上面介绍了嵌入式系统接口设计中相关的接口电路和概念,嵌入式微控制器的I/O是在嵌入式系统设计中最常用到的接口,很多微控制器的I/O口可以进行灵活配置,以本书中介绍的STM32F10X为例,STM32F10X的I/O可以配置成如表中所示的8中模式。因此在I/O的应用中更为灵活。

    GPIO_Mode

    描述

    GPIO_Mode_AIN

    模拟输入

    GPIO_Mode_IN_FLOATING

    浮空输入

    GPIO_Mode_IPD

    下拉输入

    GPIO_Mode_IPU

    上拉输入

    GPIO_Mode_Out_OD

    开漏输出

    GPIO_Mode_Out_PP

    推挽输出

    GPIO_Mode_AF_OD

    复用开漏输出

    GPIO_Mode_AF_PP

    复用推挽输出

    STM32F10X端口位的基本结构如图所示,从图中可以看到典型的推挽输出电路与上下拉电阻,当N-MOS被激活时就变成了典型的开漏输出模式,当N-MOS和P-MOS同时被激活时就变成了典型的推挽输出模式,通过上拉电阻和下拉电阻的开关控制可以使端口处于上拉或者下拉输入模式。

    根据开漏输出和推挽输出的特点,可以很容易判断在以下应用中应当工作在推挽输出模式(或者复用推挽输出):

    l 驱动应用中,驱动LED、蜂鸣器等

    l USART_TX、USART_CK、USART_RTS、MOSI、SPI主模式SCK、CAN_TX等需要较强驱动能力的场合

    而在I2C等接口总线应用中,由于需要“线与”判断总线占用状态,以及需要使用电平转换的场合需要将I/O配置成开漏输出的模式。



    我们所熟悉的一般有这几种 集电极开路,漏极开路,推挽,上拉电阻,弱上拉,三态门,准双向口。不过说道这个 漏极开路型还真没用过。
        于是就查找了半天的资料,终于弄的大体明白,这里就来和大家一起说一下什么是漏极开路以及漏极开路的具体作用吧!

    我们先来说说集电极开路输出的结构。集电极开路输出的结构如图1所示,右边的那个三极管集电极什么都不接,所以叫做集电极开路(左边的三极管为反相之用,使输入为“0”时,输出也为“0”)。对于图 1,当左端的输入为“0”时,前面的三极管截止(即集电极c跟发射极e之间相当于断开),所以5v电源通过1k电阻加到右边的三极管上,右边的三极管导通(即相当于一个开关闭合);当左端的输入为“1”时,前面的三极管导通,而后面的三极管截止(相当于开关断开)。

    集电极开路,漏极开路 - 66znyy - 成长

    我们将图1简化成图2的样子。图2中的开关受软件控制,“1”时断开,“0”时闭合。很明显可以看出,当开关闭合时,输 出直接接地,所以输出电平为0。而当开关断开时,则输出端悬空了,即高阻态。这时电平状态未知,如果后面一个电阻负载(即使很轻的负载)到地,那么输出端 的电平就被这个负载拉到低电平了,所以这个电路是不能输出高电平的。

    再看图3,图3中那个1k的电阻即是上拉电阻。如果开关闭合,则有电流从1k电阻及开关上流过,但由于开关闭和时电阻为0(方便我们的讨论,实际情况中开 关电阻不为0,另外对于三极管还存在饱和压降),所以在开关上的电压为0,即输出电平为0。如果开关断开,则由于开关电阻为无穷大(同上,不考虑实际中的 漏电流),所以流过的电流为0,因此在1k 电阻上的压降也为0,所以输出端的电压就是5v了,这样就能输出高电平了。但是这个输出的内阻是比较大的(即1kω),如果接一个电阻为r的负载,通过分 压计算,就可以算得最后的输出电压为5*r/(r+1000)伏,即5/(1+1000/r)伏。所以,如果要达到一定的电压的话,r就不能太小。如果r 真的太小,而导致输出电压不够的话,那我们只有通过减小那个1k的上拉电阻来增加驱动能力。但是,上拉电阻又不能取得太小,因为当开关闭合时,将产生电 流,由于开关能流过的电流是有限的,因此限制了上拉电阻的取值,另外还需要考虑到,当输出低电平时,负载可能还会给提供一部分电流从开关流过,因此要综合 这些电流考虑来选择合适的上拉电阻。

    如果我们将一个读数据用的输入端接在输出端,这样就是一个io口了(51的io口就是这样的结构,其中p0口内部不带上拉,而其它三个口带内部上拉),当我们要使用输入功能时,只要将输出口设置为1即可,这样就相当于那个开关断开,而对于p0口来说,就是高阻态了。

    对于漏极开路(od)输出,跟集电极开路输出是十分类似的。将上面的三极管换成场效应管即可。这样集电极就变成了漏极,oc就变成了od,原理分析是一样的。

    另一种输出结构是推挽输出。推挽输出的结构就是把上面的上拉电阻也换成一个开关,当要输出高电平时,上面的开关通,下面的开关断;而要输出低电平时,则刚好相反。比起oc或者od来说,这样的推挽结构高、低电平驱动能力都很强。 如果两个输出不同电平的输出口接在一起的话,就会产生很大的电流,有可能将输出口烧坏。而上面说的oc或od输出则不会有这样的情况,因为上拉电阻提供的 电流比较小。如果是推挽输出的要设置为高阻态时,则两个开关必须同时断开(或者在输出口上使用一个传输门),这样可作为输入状态,avr单片机的一些io 口就是这种结构。

    ---------------------------------------------------------------------------

    单片机内部的逻辑经过内部的逻辑运算后需要输出到外面,外面的器件可能需要较大的电流才能推动,因此在单片机的输出端口必须有一个驱动电路。这种驱动电路有两种形式:

    其中的一种是采用一只N型三极管(npn或n沟道),以npn三极管为例,就是e接地,b接内部的逻辑运算,c引出,b受内部驱动可以控制三极管是否导通 但如果三极管的c极一直悬空,尽管b极上发生高低变化,c极上也不会有高低变化,因此在这种条件下必须在外部提供一个电阻,电阻的一端接c(引出脚)另一 端接电源,这样当三极管的b有高电压是三极管导通,c电压为低,当b为低电压时三极管不通,c极在电阻的拉动下为高电压,这种驱动电路有个特点:低电压是 三极管驱动的,高电压是电阻驱动的(上下不对称),三极管导通时的ec内阻很小,因此可以提供很大的电流,可以直接驱动led甚至继电器,但电阻的驱动是 有限的,最大高电平输出电流=(vcc-Vh)/r;

    另一种是互补推挽输出,采用2只晶体管,一只在上一只在下,上面的一只是n型,下面为p型(以三极管为例),两只管子的连接为:npn(上)的c连 vcc,pnp(下)的c接地,两只管子的ee,bb相连,其中ee作为输出(引出脚),bb接内部逻辑,这个电路通常用于功率放大点路的末级(音响), 当bb接高电压时npn管导通输出高电压,由于三极管的ec电阻很小,因此输出的高电压有很强的驱动能力,当bb接低电压时npn截至,pnp导通,由于 三极管的ec电阻很小因此输出的低电压有很强的驱动能力,简单的例子,9013导通时ec电阻不到10欧,以Vh=2.5v,vcc=5v计算,高电平输 出电流最大=250MA,短路电流500ma,这个计算同时告诉我们采用推挽输出时一定要小心千万不要出现外部电路短路的可能,否则肯定烧毁芯片,特别是 外部驱动三极管时别忘了在三极管的基极加限流电阻。推挽输出电路的形式很多,有些单片机上下都采用n型管,但内部逻辑提供互补输出,以上的说明仅仅为了说 明推挽的原理,为了更深的理解可以参考功率放大电路。

    ---------------------------------------------------------------------------

    集电极开路门(集电极开路OC或源极开路OD)

    漏极开路输出相当于集电极开路输出。漏极开路是对mos管而言,集电极开路是对三极型管而言。一般用于线或、线与、电流驱动,匹配电平。

    开漏形式的电路有以下几个特点:

    1.利用外部电路的驱动能力,减少IC内部的驱动, 或驱动比芯片电源电压高的负载。

    2.可以将多个开漏输出的Pin,连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。这也是I2C,SMBus等总线判断总线占用状态的原理。

    3.由于漏级开路,所以后级电路必须接一上拉电阻,上拉电阻的电源电压就可以决定输出电平。这样就可以进行任意电平的转换了。

    4.源极开路提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。

    ---------------------------------------------------------------------------

    上拉电阻很大,提供的驱动电流很小,叫弱上拉;反之叫强上拉。

    展开全文
  • 1,首先在/src/api中创建一个接口 2,接口编写模仿其他页面即可,url地址是把host去掉的部分, 3,在vue.config.js中找到devServer,找到代理所在,把url出来,单独...4,在使用接口的组件页面引用该接口,要带上{...

    1,首先在/src/api中创建一个接口
    在这里插入图片描述
    2,接口编写模仿其他页面即可,url地址是把host去掉的部分,在这里插入图片描述
    3,在vue.config.js中找到devServer,找到代理所在,把url拉出来,单独拦截,如果遇到了该url会拼接target的host,然后changeorigin是解决跨域问题,pathrewrite是重写路径
    在这里插入图片描述
    就是重写这个路径
    在这里插入图片描述
    4,在使用接口的组件页面引用该接口,要带上{}大括号,然后就可以在不删除mock接口下,引入部分外部接口了,方便逐步替换掉项目的接口
    在这里插入图片描述
    ,

    展开全文
  • jquery mobile 通过asp.net web api2 提供数据接口滑动分页示例
  • 实现 RecyclerView 上拉加载及自动加载

    千次阅读 2017-12-09 12:58:13
    之前在《一步步打造自己的通用上拉加载布局》(如果没有看过,建议先看下这一篇)写到如何实现一个通用的上拉加载布局,本文将基于此进行扩展,实现 RecyclerView 的上拉加载及自动加载。在之前的《一步步打造自己的...
  • 你了解1-Wire接口

    2020-04-11 17:09:29
    你了解1-Wire接口 一、概述 1-Wire总线是一个简单的信号传输电路,可通过一根共用的数据线实现主控制器与一个或一个以上从器件之间的半双工双向通信。 二、硬件结构 设备(主机或从机)通过一个漏极开路或三态端口...
  • 分组列表,下拉刷新和上拉加载更多【项目地址在文章最后!!】 效果图: 实现过程,借鉴PinnedHeadListView,但是该demo没有下拉刷新功能,故将该控件整合到PullToRefresh 库中,【PullToRefresh 库为第三方...
  • 支持下拉刷新和上拉加载的 RefreshLayout,自带越界回弹效果,支持 RecyclerView,AbsListView,ScrollView,WebView
  • 一丶效果图 二丶概述 RecyclerVIew的上拉加载,下拉刷新网上也有很多,包括github的开源也有非常好用的,这里整理demo作为一个开始
  • 前言:  看过许多下拉刷新的例子,好多大牛们的代码写的很完美,让人羡慕嫉妒恨~~~,可是,对于下拉刷新时的手势操作却没有给出详细的解释,当一堆堆逻辑代码出来的时候,对于我们这些菜鸟来说,... 上拉加载数据:
  • 众所周知,小程序搭配小白接口简直就是BUG一样的存在。不花一分钱就能发布自己的专属小程序。免费套餐强大到足以支撑一个私人小应用啦。 可免费调用15万次/月真的是很良心了。 前端靠微信,后端靠小白! 话不多说 ...
  • ListView实现上拉加载&下拉刷新

    千次阅读 2018-10-11 21:38:12
    自定义的有下拉刷新和上拉加载的ListView开始时,跟系统的ListView一样。不过多了个header和footer只不过这两个布局以不同的方式隐藏起来了而已。(header是在手机屏幕外的上面,footer是直接隐藏起来了。因为下拉...
  • 实现下拉刷新在google的android.support.v4包中,提供一个SwipeRefreshLayout方法, 用于实现下拉刷新,实现的过程也非常简单, 那我们先来看一下SwipeRefreshLayout是什么东西,其实从名字来看,它就是一个刷新...
  • 上拉电阻与下拉电阻的作用总结

    千次阅读 2016-09-04 10:21:52
    一、定义: 上拉就是将不确定的信号通过一个电阻钳位在...出型电路(如普通门电路)提升电流和电压的能力是有限的,上拉电阻的功能主要是为集电极开路输出型电路输出电流通道。 二、上下电阻作用:
  • 思路今天大家实现一个上拉加载更多的ListView.GitHub传送门:PulmListView, 欢迎大家fork&&star.先大家看一下示例效果: 然后大家理一下实现思路, 如果我们要实现一个上拉加载更多的ListView, 我们需要实现的...
  • android 高仿UC浏览器首页上拉面板效果,最近在项目中,产品经理看见uc浏览器首页的上拉面板的效果做的非常不错,于是希望我们的项目的首页也做成这样的效果。于是经过思考后,实现了一个仿uc浏览器的上拉面板效果。
  • 导读:HUB75接口是一种常用的LED单元板驱动接口,本文就常见的HUB75接口知识点进行整理。 A/B/C/D 4根地址线,所以是16扫(24=162^4=1624=16) A/B/C/D/E 5根地址线,所以是32扫(25=322^5=3225=32)
  • pulltoRefreshSwipeMenuListview 是一个侧滑功能的可刷新控件,其缺点是该控件继承自listview,不能扩展到其他控件,优点是:使用方便,简单 其原理是:复写了listview,并复写其setAdapter方法,在为listview...
  • 一直在用到RecyclerView时都会微微一颤,因为一直都没去了解怎么实现上拉加载,受够了每次去Github找开源引入,因为感觉就为了一个上拉加载功能而去引入一大堆你不知道有多少BUG的代码,不仅增加了项目的冗余程度,...
  • Android下拉刷新和上拉加载更多

    万次阅读 多人点赞 2018-01-31 11:06:29
    Android下拉刷新和上拉加载更多 下拉刷新 通过android系统提供的组件:SwipeRefreshLayout 一、基本使用 1 xml中 添加 SwipeRefreshLayout 组件 该组件包含着要操作下拉刷新的控件 如ListView RecyclerView...
  • [导读] cpu与外部设备、存储器的连接和数据交换都需要通过接口设备来实现,前者被称为I/O接口,而后者则被称为存储器接口,cpu接口信号各自代表不同的意思,比如BPRI# (I) Bus Priority Request(总线优先权请求)...
  • 吸电流、电流输出、灌电流输出 即泄,主动输出电流,从输出口输出电流; 灌即充,被动输入电流,从输出端口流入; 吸则是主动吸入电流,从输入端口流入。  吸电流和灌电流就是从芯片外电路通过引脚流入芯片...
  • 通信接口

    千次阅读 2019-01-08 19:41:58
    电气特性、传输速率、连接特性和接口的机械特性等内容——物理层 原理、线数、传输速率、应用场合。 如图为一个通信接口转换器。图中显示电子通信常用接口,以及接口复用情况及接口型式。 一、SPI SPI...
  • DBI接口与DPI接口与DSI接口

    万次阅读 热门讨论 2010-09-26 22:09:00
    (1)DBI接口  A,也就是通常所讲的MCU借口,俗称80 system接口。The lcd interface between host processor and LCM device list as below,The LCM driver will repeated update panel display。MCU借口通过并行...
  • 前言: &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;...纵观多数App,下拉刷新和上拉加载更多是很常见的功能,但是谷歌官方只有一个SwipeRefreshLayo
  • 1 前言关于RecyclerView 添加上拉加载更多和下拉刷新的封装很多,例如有自定义ViewGroup来实现的,也有使用SwipeRefreshLayout来实现的,我觉得都不是太好,因为对于在项目中,需要各种下拉刷新和上拉加载更多的效果...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,364
精华内容 21,345
关键字:

上拉带接口