亚博智能论坛  
  
查看: 554|回复: 0

【求指教】声音信号点小灯过程中的竞争冒险,怎么破?

  [复制链接]

该用户从未签到

11

主题

26

帖子

59

积分

新手上路

Rank: 1

积分
59
发表于 2017-6-22 16:04:34 | 显示全部楼层 |阅读模式
编译,仿真均已通过。但是还有一个问题,在换列点亮下一个灯时,会产生竞争冒险。请大神指教!
程序如下:
  1. #include<at89x51.h>
  2. #include<math.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit le1=P3^0;               //驱动74HC573
  6. sbit le2=P3^1;

  7. sbit st=P3^5;
  8. sbit eoc=P3^6;
  9. sbit oe=P3^7;

  10. uchar ad_data,d,row,col;
  11. uchar code R[]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};     //行和列的数组,共对应64个坐标
  12. uchar code C[]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};  

  13. void data_Pr();       //确定要点亮的灯的行row、列col
  14. void delay(k);         //延时1ms
  15. void display_Re();    //点亮坐标为(row,col)的灯

  16. void main()
  17. {
  18.         
  19.         ad_data=0;          //采样值存储单元置零
  20.         P2=0xff;
  21.         while(1)
  22.         {
  23.                 oe=1;
  24.                 ad_data=P0;
  25.                 oe=0;
  26.                 data_Pr();
  27.                 oe=1;
  28.                 st=0;        //启动ADC
  29.                 st=1;
  30.                 st=0;
  31.                 while(!eoc)         //等待转换完成
  32.                 display_Re();
  33.                
  34.         }
  35. }
  36. void Delay(int count)
  37. {
  38.         int i,j;
  39.         for(i=0;i<count;i++)
  40.                 for(j=0;j<120;j++);
  41. }
  42. void data_Pr(void)            
  43. {
  44.         d=ad_data>>2;
  45.         col=d/8;
  46.         row=d%8;
  47.         
  48. }
  49. void display_Re()           //LED??ê?×ó3ìDò
  50. {
  51.         le1=0;           //这个程序会产生冒险竞争
  52.         le2=0;
  53.         P2=C[col];
  54.         le2=1;
  55.         le1=0;
  56.         delay(1);
  57.         P1=R[row];
  58.         le1=1;
  59.         le2=0;
  60.         delay(1);
  61. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表