標題: [求助]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)
2012-8-20 22:16 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者: 雪海 時間: 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
|
精品成人
|
日本欧美黄色片
|
国产一区二区三区四区三区四
|