全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1489
推到 Plurk!
推到 Facebook!

請問以軟體詢問方式控制adc的問題

答題得分者是:jlian168
jyybasic
一般會員


發表:2
回覆:3
積分:1
註冊:2009-03-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-03-10 17:19:00 IP:140.116.xxx.xxx 訂閱

下面是我的程式碼 我是要把它顯示在lcd上面
但是目前是不能work的(我是要用軟體詢問方式控制adc)
應該是我的程式碼錯誤 請有經驗的大大幫我看一下
給我想法就好了 不一定要直接解答給我 謝謝

[code c#]
#include
#include "Delay.h" //延遲函式庫
sbit RS=P2^0 ; //P1.0之代稱為RS
sbit RW=P2^1 ; //P1.1之代稱為RW
sbit E=P2^2 ; //P1.2之代稱為E
sbit ADCRD=P3 ^0 ;
sbit ADCWR=P3 ^1 ;
sbit INT=P3^2;
char code *keycode[]={"0","1","2","3","4","5","6","7","8","9"};
char code *ptr ;
char code *digi[]={"DIGI:0.0000"};
int i,j,k,b[5],c=1;
long a;

delay(int d)
{
int i,j;
for(i=0;i for(j=0;j<200;j ) ;
}
void waitlcd() //等待LCD
{
unsigned char status;
P1=0xff ; //P1設定為輸入埠
do
{
RS=0 ;RW=1 ;E=1 ; //為指令,讀取,致能LCD
status=P1 ; //讀取狀態值
E=0 ;
//禁能LCD
}
while(status&0x80) ; //等到忙碌旗標(BF)為零才離開
}

void Command(cmd) //命令LCD
{
P1=cmd ; //送出命令值
RS=0 ;RW=0 ;E=1 ; //為指令,寫入,致能LCD
E=0 ;RW=1 ; //為禁能LCD,讀取
waitlcd() ; //等待LCD完成命令
}

void Data(char data1) //傳送資料到LCD
{
P1=data1 ; //送出資料
RS=1 ;RW=0 ;E=1 ; //為資料,寫入,致能LCD
E=0 ;RW=1 ; //為禁能LCD,讀取
waitlcd() ;
//等待LCD完成資料寫入
}

void main()
{


ADCWR=0 ; ADCWR= 1 ;
INT=1 ; INT=0 ;
for(;;) ;
ADCRD=0 ;

a=P0 ;
a=a*196;
Command(0x3f) ; //採用8位元資料存取/雙列字/5*10點矩陣字型
Command(0xe) ; //顯示器ON/游標被顯示在位址計數器
Command(0x80) ;
delay(2000);

b[0]=a/10000;
a=a000;
b[1]=a/1000;
a=a00;
b[2]=a/100;
a=a0;
b[3]=a/10;
a=a;
b[4]=a;


for(i=0;i<=4;i )
{
j=i;
if (i>=1) j ;
Command(0x80 j) ;
ptr=keycode[b[i]] ; //找出所按的鍵碼值之位址
while(*ptr!=0) //若其資料不為零則
Data(*ptr ); //把資料送到LCD去顯示
}

ADCRD=1 ;
INT=1 ;
ADCWR=0 ; ADCWR= 1 ;
}
[/code]


編輯記錄
jyybasic 重新編輯於 2009-03-10 17:19:50, 註解 無‧
aki
版主


發表:30
回覆:696
積分:755
註冊:2004-01-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-03-10 17:41:27 IP:61.229.xxx.xxx 訂閱
你是採用 Build-in ADC 的  8051 CPU 嗎? 還是外接 ADC Chip?


===================引 用 jyybasic 文 章===================

下面是我的程式碼 我是要把它顯示在lcd上面
但是目前是不能work的(我是要用軟體詢問方式控制adc)
應該是我的程式碼錯誤 請有經驗的大大幫我看一下
給我想法就好了 不一定要直接解答給我 謝謝

[code c#]
#include
#include "Delay.h" //延遲函式庫
sbit RS=P2^0 ; //P1.0之代稱為RS
sbit RW=P2^1 ; //P1.1之代稱為RW
sbit E=P2^2 ; //P1.2之代稱為E
sbit ADCRD=P3 ^0 ;
sbit ADCWR=P3 ^1 ;
sbit INT=P3^2;
char code *keycode[]={"0","1","2","3","4","5","6","7","8","9"};
char code *ptr ;
char code *digi[]={"DIGI:0.0000"};
int i,j,k,b[5],c=1;
long a;

delay(int d)
{
int i,j;
for(i=0;i for(j=0;j<200;j ) ;
}
void waitlcd() //等待LCD
{
unsigned char status;
P1=0xff ; //P1設定為輸入埠
do
{
RS=0 ;RW=1 ;E=1 ; //為指令,讀取,致能LCD
status=P1 ; //讀取狀態值
E=0 ;
//禁能LCD
}
while(status&0x80) ; //等到忙碌旗標(BF)為零才離開
}

void Command(cmd) //命令LCD
{
P1=cmd ; //送出命令值
RS=0 ;RW=0 ;E=1 ; //為指令,寫入,致能LCD
E=0 ;RW=1 ; //為禁能LCD,讀取
waitlcd() ; //等待LCD完成命令
}

void Data(char data1) //傳送資料到LCD
{
P1=data1 ; //送出資料
RS=1 ;RW=0 ;E=1 ; //為資料,寫入,致能LCD
E=0 ;RW=1 ; //為禁能LCD,讀取
waitlcd() ;
//等待LCD完成資料寫入
}

void main()
{


ADCWR=0 ; ADCWR= 1 ;
INT=1 ; INT=0 ;
for(;;) ;
ADCRD=0 ;

a=P0 ;
a=a*196;
Command(0x3f) ; //採用8位元資料存取/雙列字/5*10點矩陣字型
Command(0xe) ; //顯示器ON/游標被顯示在位址計數器
Command(0x80) ;
delay(2000);

b[0]=a/10000;
a=a000;
b[1]=a/1000;
a=a00;
b[2]=a/100;
a=a0;
b[3]=a/10;
a=a;
b[4]=a;


for(i=0;i<=4;i )
{
j=i;
if (i>=1) j ;
Command(0x80 j) ;
ptr=keycode[b[i]] ; //找出所按的鍵碼值之位址
while(*ptr!=0) //若其資料不為零則
Data(*ptr ); //把資料送到LCD去顯示
}

ADCRD=1 ;
INT=1 ;
ADCWR=0 ; ADCWR= 1 ;
}
[/code]


jyybasic
一般會員


發表:2
回覆:3
積分:1
註冊:2009-03-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-03-10 19:42:10 IP:140.116.xxx.xxx 訂閱
我是使用外接adc0804來執行的
aki
版主


發表:30
回覆:696
積分:755
註冊:2004-01-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-03-11 07:28:31 IP:61.229.xxx.xxx 訂閱
外接 ADC0804 用 8051 來控制的書一堆,幾乎是標準章節,
我手上的這 一本,


8051 C 語言專題製作 [B068]; 作者: 郭庭吉
ISBN:9861291326
504頁 / 套色 / 16開
初版日期:2004-09-29
最新出版日期:2004-09-29
定價:450元

第 9-1~9-6 節就有範例, 你可以參考,
啟動 ADC0804 #WR, 然後就一直檢查 ADC0804 的 #INT level 為 "H"
就表示轉換 OK, 然後讀取 Port 的值, 就這樣囉!

===================引 用 jyybasic 文 章===================
我是使用外接adc0804來執行的
jyybasic
一般會員


發表:2
回覆:3
積分:1
註冊:2009-03-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-03-11 13:30:20 IP:140.116.xxx.xxx 訂閱
我知道用51控制ADC0804是基本章節
我已經自己實做過用外部中斷控制與使用IC555給TRIGGER控制ADC
現在想要以軟體詢問方式來控制ADC0804
我的程式碼 ADCWR=0 ; ADCWR= 1 ;
INT=1 ; INT=0 ; 應該就是表示出ADC已經轉換結束
接著才開始讀取PORT的值在顯示出來

我自己是覺得是我在WR與INT的時間可能不足 所以ADC可能還沒轉換完成
所以想問問看想法是不是有錯誤
jlian168
一般會員


發表:14
回覆:6
積分:14
註冊:2008-08-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-03-13 09:02:26 IP:125.228.xxx.xxx 未訂閱

你好:
既然是用polling方式,pollingADC0804接至外部int0的接腳即可(不要啟動外部中斷).
這樣是否為你要的方式呢?
Thanks.
jyybasic
一般會員


發表:2
回覆:3
積分:1
註冊:2009-03-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-03-13 13:25:18 IP:140.116.xxx.xxx 訂閱
不算是耶 接起來是一定要的

可是要自己控制int0那隻腳如何運作才可以讓adc正常work

我現在就是卡在這邊 不知道哪個時序出問題 才會不能work
jlian168
一般會員


發表:14
回覆:6
積分:14
註冊:2008-08-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-03-25 15:08:15 IP:125.228.xxx.xxx 未訂閱

[code cpp]
ADC啟動轉換;
main()
{
...//other program
if(INT0) //設high完成(因ADC0804會自己動作)
{
read_ADC;
ADC啟動轉換;
}
...//other program
}
[/code]
你好:
不知是否跟你想的一樣嗎?
系統時間:2024-05-07 14:55:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!