久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: [求助]ADC0804與天祥TX-1C,數碼管總是現實255 [打印本頁]

作者: lbc363015930    時間: 2012-8-20 22:16
標題: [求助]ADC0804與天祥TX-1C,數碼管總是現實255

我用的是天祥TX-1C的開發板,用單片機控制ADC0804進行數模轉換,當擰動實驗板上A/D旁邊的電位時,在數碼管的前三位以十進制方式顯示出A/D轉換后的數字量,但為什么一直顯示255,而不變換,為什么????程序如下,附件是原理圖

#include <reg52.h>      //52系列單片機頭文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;  //申明U1鎖存器的鎖存端
sbit wela=P2^7;  //申明U2鎖存器的鎖存端
sbit adwr=P3^6;  //定義AD的WR端口
sbit adrd=P3^7;  //定義AD的RD端口
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint xms)    
{
 uint i,j;
 for(i=xms;i>0;i--)        //i=xms即延時約xms毫秒
  for(j=110;j>0;j--);
}

void display(uchar bai,uchar shi,uchar ge)  //顯示子函數
{
    dula=1;
 P0=table[bai];    //送段選數據
 dula=0;
 P0=0xff;  //送位選數據前關閉所有顯示,防止打開位選鎖存時
 wela=1;   //原來段選數據通過位選鎖存器造成混亂
 P0=0x7e;  //送位選數據
 wela=0;
 delayms(5);     //延時

 dula=1;
 P0=table[shi];
 dula=0;
 P0=0xff;
 wela=1;
 P0=0x7d;
 wela=0;
 delayms(5);

 dula=1;
 P0=table[ge];
 dula=0;
 P0=0xff;
 wela=1;
 P0=0x7b;
 wela=0;
 delayms(5);
}


void main()  // 主程序
{

  uchar a,A1,A2,A3,adval;
 wela=1;
 P0=0x7f;           //置CSAD為0,選通ADCS 以后不必再管ADCS
 wela=0;
    while(1)
 {
  adwr=1;
  _nop_();
  adwr=0;   //啟動AD轉換
  _nop_();
  adwr=1;
  for(a=10;a>0;a--)        //TX-1C實驗板AD工作頻率較低,所以啟動轉換后要多留點時間用來轉換
  {                        //這里把顯示部分放這里的原因也是為了延長轉換時間                                                                                                                                                                                                                          
   display(A1,A2,A3);
  }
  P1=0xff;                    //讀取P1口之前先給其寫全1
  adrd=1;                    //選通ADCS
  _nop_(); 
  adrd=0;                     //AD讀使能
  _nop_();
  adval=P1;   //AD數據讀取賦給P1口
  adrd=1;
  A1=adval/100;  //分出百,十,和個位
  A2=adval%100/10;
  A3=adval%10;
  }
}

tx-1c型單片機開發板原理圖.pdf (1015.98 KB, 下載次數: 12)

作者: 雪海    時間: 2013-6-28 21:12
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit dula=P2^6;
sbit wela=P2^7;
sbit wr=P3^6;
sbit rd=P3^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar aa,bai,ge,shi,d,a;
void display(uchar bai,uchar shi,uchar ge);
void init()
{
        TMOD=0x01;
        TH0=0x80;
        TL0=0xFE;
        EA=1;
        ET0=1;
        TR0=1;
        aa=0;
   


}
void start()
{
   
        wr=1;
        _nop_();
        wr=0;
        _nop_();
        wr=1;       

}
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=10;y>0;y--);
}
void main()
{
  init();
  
  while(1)
        {
                start();
                 rd=1;
                         _nop_();
                 rd=0;
                         _nop_();
                      d=P1;
      
                  rd=1;
                  bai=d/100;
             shi=d%100/10;
             ge=d%10;
                for(a=10;a>0;a--)
            {       
              display(bai,ge,shi);
               
                 }
                }

}

void display(uchar bai,uchar shi,uchar ge)
{
         dula=1;
                P0=table[bai];
                dula=0;
                P0=0xff;
                wela=1;
                P0=0x7e;
                wela=0;
                delay(1);

                dula=1;
                P0=table[shi];
                dula=0;
                P0=0xff;
                wela=1;
                P0=0x7d;
                wela=0;
                delay(1);

                dula=1;
                P0=table[ge];
                dula=0;
                P0=0xff;
                wela=1;
                P0=0x7b;
                wela=0;
                delay(1);
}
void timer0() interrupt 1
{
        TH0=0x80;
        TL0=0xFE;
        aa++;       
}我的這個程序沒問題
作者: w322405    時間: 2017-9-24 08:51
讀前讀數據rd前要把cs置0也就是wela=1;P0=0x7f
作者: 冰凌主銀    時間: 2019-12-11 20:50
我也遇到了,然后改改改,就正確了,加了注釋,代碼如下:

/*
原理:
ADC0804: ADC0804是8位全MOS中速A/D 轉換器,它是逐次逼近式A/D 轉換器,片內有三態數據輸出鎖存器,
可以和單片機直接接口。單通道輸入,轉換時間大約為100us。
ADC0804 轉換時序是:當CS=0 許可進行A/D 轉換。
WR由低到高時,A/D開始轉換,一次轉換一共需要66-73 個時鐘周期。
CS與WR同時有效時啟動A/D轉換,轉換結束產生INTR 信號(低電平有效),可供查詢或者中斷信號。
在CS和RD 的控制下可以讀取數據結果。本實驗沒有使用INTR信號。
*/

//擰動AD旁邊的電位器,會在數碼管的前三位顯示0-255之間的數值。
//這就是把模擬信號轉換成數字信號,即模數轉換。

#include <reg52.h>        //52系列單片機頭文件
#include <intrins.h>        //包含_nop_()函數所在的頭文件
#define uint unsigned int
#define uchar unsigned char

sbit dula=P2^6;        //聲明U1鎖存器的鎖存端
sbit wela=P2^7;        //聲明U2鎖存器的鎖存端

//IO口定義
sbit adwr=P3^6; //定義A/D的WR端口
sbit adrd=P3^7; //定義A/D的RD端口
//數碼管編碼
uchar code table[]={0x3f,0x06,0x5b,0x4f,
                                        0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,
                                        0x39,0x5e,0x79,0x71};

void delayms(uint xms) //延時函數
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}

void display(uchar bai,uchar shi,uchar ge) //顯示子函數
{
        //顯示百位
        dula=1;
        P0=table[bai]; //送段選數據
        dula=0;
        P0=0xff;        //送位選數據前關閉所有顯示,防止打開位選鎖存時原來段選數據通過鎖存器造成混亂
        wela=1;
        /*將U2鎖存器的輸出口的最高位置低電平,目的是將與之相連的ADC0804的CS片選端置低選中。
    一次選中,以后再不用管它。以后凡是操作U2鎖存器的地方都不要再改變A/D的CS端*/
        P0=0x7e;  //在數碼管顯示程序中,送出位選信號時,始終保持U2鎖存器的最高位為低電平。位選第一個數碼管0111 1110
        wela=0;
        delayms(5);
       
        //顯示十位/
        dula=1;
        P0=table[shi]; //送段選數據
        dula=0;
        P0=0xff;
        wela=1;
        P0=0x7d;        //位選第二個數碼管 0111 1101       
        wela=0;
        delayms(5);

        //顯示個位
        dula=1;
        P0=table[ge]; //送段選數據
        dula=0;
        P0=0xfe;
        wela=1;
        P0=0x7b;        //位選第三個數碼管 0111 1011       
        wela=0;
        delayms(5);
}

void main() // 主程序
{
        uchar a,A1,A2,A3,adval; //百十個,A/D value
        wela=1;
        P0=0x7f;        //置CSAD為0,選通ADCS,以后不必再管ADCS
        wela=0;

        while(1)
{
        adwr=1;  //寫信號輸入
        _nop_();  //_nop_()函數,延時一個機器周期
        adwr=0;        //低電平,啟動AD轉換
        _nop_();
        adwr=1;
        //立即先送結果給數碼管顯示,給A/D轉換留有一定時間
        for(a=20;a>0;a--)  //TX-1C實驗板A/D工作頻率較低,所以啟動轉換后要多留點時間用來轉換
        {  //把顯示部分放這里的原因也是為了延長轉換時間(增加寫讀之間的時間間隔)
                display(A1,A2,A3);
        }

        P1=0xff;  //讀取P1口之前先給其寫全1
        adrd=1;  //選通ADCS
        _nop_();  //延時一個機器周期
        adrd=0;  // A/D讀使能
        _nop_();

        adval=P1; // A/D數據讀取賦給P1口
        adrd=1;
        A1=adval/100; //分出百,十,和個位
        A2=adval%100/10;
        A3=adval%10;
        }
}
/*
1、首次上電會看到顯示全是0,但馬上又出現數字:首次顯示完后,接下來便讀取到了A/D轉換后的結果,
當程序再次循環回來時,便顯示了上次的數值。
2、擰動電位器,數碼管上數字始終不動,只有復位一次,或者重新上電一次,數字才會刷新:因為轉換時間不夠。
兩種解決辦法:一是將實驗板上C11電容換成150pF;
                            二是再適當延長A/D轉換時間,即增加數碼管顯示的次數,可將上例for(a=10;a>0;a--)中的a值增大。
*/




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲欧洲综合av | 天天玩夜夜操 | 久久精品 | 精品久久一区二区三区 | 无毛av | 国产精品一区二区三区久久久 | 亚洲丝袜天堂 | 国产精品成人一区二区三区夜夜夜 | 免费观看视频www | 国产欧美一区二区三区久久 | 91免费版在线| 一区二区精品视频 | 精品粉嫩aⅴ一区二区三区四区 | 久综合| 成人福利| 国产高清一区二区三区 | 色橹橹欧美在线观看视频高清 | 久久久亚洲成人 | 久久久精品一区 | 欧美久久电影 | 日韩一区二区三区av | 1级毛片| 国产精品亚洲欧美日韩一区在线 | 欧美九九 | 久久激情五月丁香伊人 | japanhd成人| 国产高清视频在线观看 | 亚洲国产成人精品女人久久久 | 99爱视频| 亚洲国产成人久久久 | 色噜噜狠狠色综合中国 | av网站免费观看 | 美女黄网站| 国产亚洲欧美日韩精品一区二区三区 | 一级片子 | 91久久久久久久久久久久久 | 91精品国产日韩91久久久久久 | 中文字幕不卡在线88 | 精品成人 | 日本欧美黄色片 | 国产一区二区三区四区三区四 |