有沒人給我看看,是不是AD芯片時鐘信號給的不對?下面是程序
#include <reg52.h> //52系列單片機頭文件
#include <intrins.h>
#include "math.h"
#define uchar unsigned char
#define uint unsigned int
sbit st=P2^2; //定義AD的WR端口
sbit oe=P2^3; //定義AD的RD端口
sbit eoc=P2^0;
sbit ale=P2^1;
sbit lcden=P2^6; //液晶使能端
sbit lcdrs=P2^4; //液晶數據命令選擇端
sbit ADDA=P2^5; //定義A、B、C三條地址線
sbit ADDB=P3^6;
sbit ADDC=P3^7;
sbit CLK=P2^7; //定義時鐘端口
uint a,num;
float OPA,OPB,AD;
uchar code table41[]="WELCOME!";
/*********
延遲函數
**********/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/************
2002寫命令
**************/
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
/************
2002寫數據
*************/
void write_data(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
/****************
液晶初始化
*********************/
void init()
{
lcden=0;
write_com(0x38);//設置2002顯示,5X7點陣,8位數據接口
write_com(0x0c);//設置開顯示,不顯示光標
write_com(0x06);//寫一個字符后地址指針加1
write_com(0x01);//顯示清零,數據指針清零
}
/********************
顯示程序
****************************/
void display(uint x,uint qian,uint bai,uint shi,uint ge)
{
write_com(0x80+x);
write_data(0x30+qian);
write_data('.');
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
}
/********************
定時中斷初始化,為了產生AD芯片需要的時鐘信號
*********************/
void init_time0()
{
TMOD = 0x02;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
IE = 0x82;
TR0 = 1;
}
/********************
A通道OPA光電壓采集
***********************/
void OPA_1()
{
ADDA=1; //選擇通道1
ADDB=0;
ADDC=0;
oe=0; //關閉輸出允許位
st=0;
st=1;
st=0; //以上三句,開ADC0809
delay(1); //延遲1ms
while(!eoc);//等待轉化結束
P1=0xff;
oe=1; //開啟輸出允許位
a=P1; //將轉化出的數字存放至a
a=a*19.53125; // a=a*5/256*1000
OPA=a*0.001;
}
/********************
主函數:
*******************/
void main()
{
uint a1,a2,a3,a4;
init_time0();
init();
write_com(0x80+0x07);
for(num=0;num<8;num++)
{
write_data(table41[num]);
delay(150);
}
delay(1000);
while(1)
{
OPA_1();//A路光電壓采集
a1=a/1000;
a2=a/100%10;
a3=a/10%10;
a4=a%10;
display(0x48,a1,a2,a3,a4);
}
}
void Timer0_INT() interrupt 1 //用定時中斷產生ADC芯片時鐘信號
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
CLK = ~CLK;
}
|