【求助】基于51单片机的采集环境声音点亮8*8点阵,仿真错误

2020-01-18 18:48发布

程序目标:使用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[0XF7F8]              //ѡͨµÀ0

sbit LE1=P2^0;               //¶¨ÒåÇý¶¯¿Ú
sbit LE2=P2^1;


sbit ad_INT=P3^2;             //Ñ¡ÖжÏ0

uchar ad_data,d,row,col;
uchar code C[8]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
uchar code R[8]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};  //ÏÔʾÂë
void data_Pr();
void delay(k);
void display_Re()           //LEDÏÔʾ×Ó³ÌÐò
{
        P1=C[col];
        LE2=1;
        LE2=0;
        P1=R[row];
        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仿真中现实就不正确了。
仿真图如下:
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
Jmhh247
1楼-- · 2020-01-18 23:12
看不懂……还是别仿了,直接来真的
武洋洋
2楼-- · 2020-01-18 23:36
编译,仿真均已通过。但是还有一个问题,在换列点亮下一个灯时,会产生竞争冒险。请大神指教!
程序附录如下:
#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[col];
        le2=1;
        le1=0;
        delay(1);
        P1=R[row];
        le1=1;
        le2=0;
        delay(1);
}

一周热门 更多>