【求助】基于51单片机的采集环境声音点亮8*8点阵,仿真错误
程序目标:使用ADC0808把麦克风采集的声音信号转换为数字信号,并根据数值大小,每次点亮8*8点阵64个中的一个LED灯。程序:
#include<at89x51.h>
#include<absacc.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define AD XBYTE //ѡͨµÀ0
sbit LE1=P2^0; //¶¨ÒåÇý¶¯¿Ú
sbit LE2=P2^1;
sbit ad_INT=P3^2; //Ñ¡ÖжÏ0
uchar ad_data,d,row,col;
uchar code C={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
uchar code R={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};//ÏÔʾÂë
void data_Pr();
void delay(k);
void display_Re() //LEDÏÔʾ×Ó³ÌÐò
{
P1=C;
LE2=1;
LE2=0;
P1=R;
LE1=1;
LE1=0;
delay(10);
}
void main()
{
EA=1; //¿ªÖжÏ
EX0=1;
ad_data=0; //²ÉÑùÖµ´æ´¢µ¥ÔªÖÃ0
ad_INT=0;
while(1)
{
AD=0;
data_Pr();
display_Re();
}
}
void Delay(int count)
{
int i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++);
}
void data_Pr(void) //Êý¾Ý´¦Àí
{
d=ad_data>>2;
col=d/8;
row=d%8;
}
void adc0809(void) interrupt 0 using 1
{
ad_data=AD; //½«ADµÄÊý¾ÝËÍad_data
}
程序编译通过了,但是proteus仿真中现实就不正确了。
仿真图如下:
看不懂……还是别仿了,直接来真的 编译,仿真均已通过。但是还有一个问题,在换列点亮下一个灯时,会产生竞争冒险。请大神指教!
程序附录如下:
#include<at89x51.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
sbit le1=P3^0; //驱动74HC573
sbit le2=P3^1;
sbit st=P3^5;
sbit eoc=P3^6;
sbit oe=P3^7;
uchar ad_data,d,row,col;
uchar code R[]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80}; //行和列的数组,共对应64个坐标
uchar code C[]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};
void data_Pr(); //确定要点亮的灯的行row、列col
void delay(k); //延时1ms
void display_Re(); //点亮坐标为(row,col)的灯
void main()
{
ad_data=0; //采样值存储单元置零
P2=0xff;
while(1)
{
oe=1;
ad_data=P0;
oe=0;
data_Pr();
oe=1;
st=0; //启动ADC
st=1;
st=0;
while(!eoc) //等待转换完成
display_Re();
}
}
void Delay(int count)
{
int i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++);
}
void data_Pr(void)
{
d=ad_data>>2;
col=d/8;
row=d%8;
}
void display_Re() //LEDÏÔʾ×Ó³ÌÐò
{
le1=0; //这个程序会产生冒险竞争
le2=0;
P2=C;
le2=1;
le1=0;
delay(1);
P1=R;
le1=1;
le2=0;
delay(1);
}
页:
[1]