帮我用8951单片机给ADC0809编写一个500k的时钟脉冲程序

我这里有一段已经编好的用ADC0809进行模数转换的程序,只不过原有的电路中,ADC0809使用的时钟脉冲是由外部脉冲激励给的,我想用单片机的P3.3口输出一个500k的时钟脉冲,能不能在不改变原有程序功能的前提下加入这个功能,原来的程序如下:
#include <AT89X51.h>

#define uchar unsigned char
#define uint unsigned int

uchar data dispbit[4]={0xfe,0xfd,0xfb,0xf7},dispbuf[4];
sbit eoc=P3^0;
sbit start=P3^1;
sbit oe=P3^2;
unsigned char tc; //软件延时单元
bit flag1=0; //采样标志
code unsigned char ds=5; //软件延时系数__5

void delay (uint count);
void display(void);
uchar ad(void);

void main(void)
{
uchar k,s;
uint ss;
TMOD=0x01; //定时器初始化
TH0=0x4C;
TL0=0x00;
IE=0x82; //开放定时器0中断
tc=ds; //软件延时初值
TR0=1; //启动定时器
for (k=0;k<4;k++) //关显示
{
dispbuf[k]=28;
}
start=0; //AD转换控制信号初始化
oe=0;
do
{
if(flag1==1) //采样时刻到?
{
flag1=0;
s=ad(); //调用AD函数
ss=196*s; //标度变换
ss=ss/100;
ss=ss*4;
dispbuf[0]=ss/1000;
dispbuf[1]=ss%1000/100+10; //送显示
dispbuf[2]=ss%100/10;
dispbuf[3]=ss%10;
}
display();
}while(1);
}

uchar ad(void)
{
uchar ads;
start=1;
start=0;
do
{
}while(eoc==0);
oe=1;
ads=P1;
oe=0;
return(ads);
}

void display(void)
{
const uchar design[20]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,/*0x77,0x7C,0x39,0x5E,0x79,0x71,*/
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,
0xFF,0xEF/*,0x76,0x73,0x00,0x40*/};
uchar i;
// dispbit=0x0;

for(i=0;i<4;i++)
{
P2=dispbit[i];
P0=design[dispbuf[i]];
// dispbit++;
delay (2);
}
}

void delay (unsigned int count)
{
unsigned int i,j;
for (i=0;i<count;i++)
for (j=0;j<120;j++);
}

void timer0(void) interrupt 1 //定时器0中断服务函数
{
TH0=0x4C; //再送定时初值
tc--; //软件延时计数
if (tc==0) //中断5次
{
tc=ds; //再设软件延时初值
flag1=1; //建AD标志
}
}

似乎不太现实,500k的频率,1us要改变一次p3.3的状态,如果用12M的晶振,一个指令周期就是1us了,刚跳出中断又会再次进入中断,主程序根本没法执行。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-06-05
500K。就中断一次去反就得了。
第2个回答  2010-06-05
能做到,用12M晶振1T的单片机并调用中断产生500k的脉冲就行了.
第3个回答  2010-06-05
有点难,试试用ALE直接输出作ADC0809的时钟。
http://zhidao.baidu.com/question/143979152.html
相似回答