欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5261|回復: 5
打印 上一主題 下一主題
收起左側

[求助]ADC0804與天祥TX-1C,數碼管總是現實255

[復制鏈接]
跳轉到指定樓層
樓主
ID:44052 發表于 2012-8-20 22:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

我用的是天祥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)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:51300 發表于 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++;       
}我的這個程序沒問題
回復

使用道具 舉報

板凳
ID:225054 發表于 2017-9-24 08:51 來自觸屏版 | 只看該作者
讀前讀數據rd前要把cs置0也就是wela=1;P0=0x7f

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

地板
ID:661907 發表于 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值增大。
*/

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表