求大神指教总是出现 excessive CPU load

2019-07-18 12:04发布


QQ截图20150526160858.png

总是出现 excessive CPU load
源程序如下;望大神指点,不胜感激
  1. #include<reg52.h>               
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. code  uchar seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  5. code uchar seven_bit[] = {0xfe,0xfd,0xfb,0xf7};         //从左到右
  6. //生日快乐歌的音符频率表,不同频率由不同的延时来决定
  7. uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
  8.       212,212,106,126,159,169,190,119,119,126,159,142,159,0};
  9. //生日快乐歌节拍表,节拍决定每个音符的演奏长短
  10. uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
  11. 9,3,12,12,12,12,12,9,3,12,12,12,24,0};
  12. uchar c,temp,i;
  13. uint temp1,temp2;
  14. sbit beep = P1^1;
  15. sbit key = P1^2;
  16. sbit key1 = P1^3;
  17. sbit key2 = P1^4;
  18. sbit key3 = P1^5;
  19. sbit key4 = P1^6;
  20. sbit key5 = P2^4;
  21. sbit key6 = P2^5;
  22. sbit key7 = P2^6;
  23. sbit key8 = P2^7;
  24. sbit DQ = P1^0;
  25. sbit D1 = P1^7;
  26. void  delay(uint x)    //延时
  27. {
  28. while(x--);
  29. }
  30. void Init_DS18B20(void)         //初始化函数
  31. {
  32.         unsigned char x=0;
  33.         DQ = 1;         //DQ复位
  34.         delay(8);       //稍做延时
  35.         DQ = 0;                //单片机将DQ拉低
  36.         delay(75);           //精确延时 大于 480us  ,800微秒
  37.         DQ = 1;              //拉高总线即单片机对总线电平管理权释放
  38.         delay(14);
  39.         x=DQ;                  //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 单片机读取DS18B20存在并相应
  40.         delay(20);                                                
  41. }
  42. /******************************从18B20中读一个字节****************************/
  43. uchar Read_OneChar(void)
  44. {
  45.         uchar i = 0;
  46.         uchar dat = 0;
  47.         for (i=8;i>0;i--)
  48.         {
  49.                   DQ = 0;          // 给低脉冲信号即数据发送的起始信号
  50.                   dat >>= 1;                //从低位到高位顺序发送数据 左移
  51.                   DQ = 1;          // 给高脉冲信号
  52.                   if(DQ)                           //总线被拉高
  53.                   dat |= 0x80;                    //按位或然后赋值给dat,循环8次将每位送到dat中,完成一字节读取。
  54.                   delay(8);
  55.         }
  56.         return(dat);
  57. }
  58. /******************************向18B20中写一个字节****************************/
  59. void Write_OneChar(uchar dat)
  60. {
  61.         uchar i=0;
  62.         for (i=8; i>0; i--)
  63.         {
  64.                 DQ = 0;                            // 给低脉冲信号即单片机数据发送的起始信号 也即写周期的开始
  65.                 DQ = dat&0x01;                        //数据的最低位先写入
  66.                 delay(10);
  67.                 DQ = 1;                                                //表示总线被拉高,
  68.                 dat >>= 1;                            //循环8次将每位送到dat中,完成一字节读取。
  69.         }
  70.         delay(8);
  71. }
  72. /***********************************读取温度**********************************/
  73. uchar Read_Temperature(void)
  74. {         uchar a,b;
  75.         uchar i = 0,t = 0;
  76.         Init_DS18B20();
  77.         Write_OneChar(0xcc);         // 跳过读序号列号即ROM的操作
  78.         Write_OneChar(0x44);         // 启动温度转换
  79.         Init_DS18B20();
  80.         Write_OneChar(0xcc);         //跳过读序号列号的操作
  81.         Write_OneChar(0xbe);         //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  82.         a = Read_OneChar();           //读取温度值低位
  83.         b = Read_OneChar();           //读取温度值高位
  84.         c = 0x0f & a;                        //得到小数部分
  85.         a = a >> 4;                                //低位右移4位
  86.         b = b << 4;             //高位左移4位
  87.     t = a | b;                                //得到8位温度的整数部分,最高为符号位
  88.         return(t);
  89. }



  90. /*********************************************************************/
  91. //读取DS18B20温度,通过数码管显示,在温度超过35度时蜂鸣器会发声-祝你生日快乐                                                                                                                                                                                
  92. /*********************************************************************/

  93. void timer0_init(void)         //初始化
  94. {
  95.         TMOD = 0x01;                        //设置T0为工作模式1
  96.         TH0 = 0xec;
  97.         TL0 = 0x78;                                //为T0赋初值
  98.         TR0 = 1;                                 //启动T0
  99.         EA  = 1;                                  //开总中断
  100.         ET0 = 1;                                  //开定时器中断
  101. }
  102. /*****************************************************************************/
  103. void timer0_isr(void) interrupt 1                  //中断
  104. {
  105.         uchar j,cp;
  106.         TR0 = 0;                                 //关闭T0
  107.         EA = 0;                                         //关总中断
  108.         TH0 = 0xec;
  109.         TL0 = 0x78;                           //为T0赋值
  110.         TR0 = 1;
  111.         EA = 1;
  112.         cp++;
  113.         if(cp >= 200)   //刚好1秒
  114.    {
  115.                 cp = 0;
  116.                 temp1 = Read_Temperature();//得到温度
  117.                 if((temp1 & 0x80) == 0x80) //如果温度为负值
  118.                 {
  119.                         temp2 =0x7f & ~temp1  +  (0x0f & ~c) /15;  //整数处理,需要加上小数来的借位
  120.                         c = 0x0f & ~c + 0x01;   //小数处理
  121.                 }
  122.                 else temp2 = temp1;//如果温度为正值,不用处理
  123.         }
  124.         P0 = 0xff;
  125.         switch(j)
  126.         {
  127.                 case 0:P0 = seven_seg[c * 10/16];break;//显示小数         //正值乘以0.625就是实际温度
  128.                 case 1:P0 = 0x7f & seven_seg[temp2 % 10];break;//显示个位并加上小数点
  129.                 case 2:{        
  130.                                         if((temp2 < 10) && (temp1 < 0x80)){P0 = 0xff;break;}//如果温度小于10度,且为正值,十位0不显示
  131.                                         if((temp1 > 0x80) && (temp2 < 10)){P0 = 0xbf;break;}//如果温度小于10度,且为负值,十位0不显示,只显示“-”
  132.                                            P0 = seven_seg[temp2 / 10];        break;//如果温度大于10度,10位正常显示
  133.                                 }
  134.                 case 3:{
  135.                                         if((temp1 > 0x80) && ((temp2 / 10) > 0))//如果温度为负值,且十位不为0,百位显示“-”
  136.                                         P0 = 0xbf;
  137.                                         break;
  138.                                 }
  139.         }
  140.         P2 = seven_bit[j];
  141.         j++;
  142.         if(j >= 4)
  143.         j=0;
  144. }

  145. void PlayMusic()   //播放函数
  146. {   uint i1=0,j1,k1;   
  147.   while(SONG_LONG[i1]!=0||SONG_TONE[i1]!=0)
  148.   { for(j1=0;j1<SONG_LONG[i1]*20;j1++)  //播放各个音符,SONG_LONG为拍子长度   
  149.      {beep=~beep;   //SONG_TONE延时表决定了每个音符的频率               
  150.                 for(k1=0;k1<SONG_TONE[i1]/3;k1++);  }
  151.                          delay(1200);  i1++;   }  
  152. }  
  153. void main(void)
  154. {         D1=0;
  155.         timer0_init();
  156.         while(1)
  157.         {         
  158.                 if(temp2 >=37||key==0)
  159.                 {         D1=1;
  160.                 PlayMusic();
  161.                          delay(50000); //播放完后暂停一段时间
  162.                 }
  163.                 else
  164.                 {D1=0;         
  165.                 }           
  166.                   if(key1==0)
  167.                    {        
  168.                    temp=0x01; //8盏灯单个灭向右移
  169.                    for(i=0;i<8;i++)
  170.                      {
  171.                       P3=~temp;
  172.                       delay(10000);
  173.                       temp<<=1;        
  174.                           }
  175.                            delay(200000);
  176.                        P3=0xff;//全亮
  177.                         }
  178.                         
  179.                         if(key2==0)
  180.                    {
  181.                    temp=0x80;
  182.                    for(i=0;i<8;i++)//8盏灯单个灭反向左移
  183.                      {
  184.                       P3=~temp;
  185.                       delay(10000);
  186.                       temp>>=1;        
  187.                       }        
  188.                            delay(200000);
  189.                        P3=0xff;//全亮
  190.                    }           
  191.                    if(key3==0)
  192.                    {        
  193.                    temp=0xfe;     
  194.                    for(i=0;i<8;i++)//8盏灯逐个向右灭
  195.                      {
  196.                       P3=temp;
  197.                       delay(10000);
  198.                       temp<<=1;
  199.                      }        
  200.                           delay(200000);
  201.                        P3=0xff;//全亮
  202.                         }
  203.                    if(key4==0)
  204.                    {
  205.                    temp=0xfe;  
  206.                    for(i=0;i<8;i++)//8盏灯逐个亮向右
  207.                      {
  208.                       P3=~temp;
  209.                       delay(10000);
  210.                       temp<<=1;
  211.                      }        
  212.                           delay(200000);
  213.                        P3=0xff;//全亮
  214.                         }
  215.                         if(key5==0)
  216.                         {
  217.                    temp=0x7f;  
  218.                    for(i=0;i<8;i++)//8盏灯逐个灭向左
  219.                      {
  220.                       P3=temp;
  221.                       delay(10000);
  222.                       temp>>=1;
  223.                      }         
  224.                           delay(200000);
  225.                        P3=0xff;//全亮
  226.                         }  
  227.                         if(key6==0)
  228.                         {
  229.                    temp=0x7f;  
  230.                    for(i=0;i<8;i++)//8盏灯逐个亮向左
  231.                      {
  232.                       P3=~temp;
  233.                       delay(10000);
  234.                       temp>>=1;
  235.                      }         
  236.                           delay(200000);
  237.                        P3=0xff;//全亮
  238.                         }
  239.                         if(key7==0)
  240.                         {
  241.                     delay(200000);
  242.                     P3=0x55;//隔一个亮
  243.                     delay(200000);
  244.                     P3=0xaa;//隔一个亮
  245.                          delay(200000);
  246.                     P3=0xff;//全亮
  247.                         }
  248.                         if(key8==0)
  249.                         {
  250.                     delay(200000);
  251.                     P3=0x00;//全灭
  252.                     delay(200000);
  253.                     P3=0xff;//全亮
  254.                  }         
  255.      }           
  256. }
复制代码



QQ截图20150526160827.png





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
武力戡乱
1楼-- · 2019-07-18 14:31
不排除程序设计问题!仿真结果对吗?
狼族守护者
2楼-- · 2019-07-18 17:59
 精彩回答 2  元偷偷看……
狼族守护者
3楼-- · 2019-07-18 22:07
xianyoudian 发表于 2015-5-26 21:28
CPU负担过大,信号频率减小

怎么减小啊。仿真刚开始是正常的,一会就出现那个。是不是数码管的中断造成的影响。单独运行数码管和蜂鸣器都正常啊,但是连在一起就有问题了
狼族守护者
4楼-- · 2019-07-18 23:36
武力戡乱 发表于 2015-5-26 22:18
不排除程序设计问题!仿真结果对吗?

仿真刚开始是正常的,一会就出现那个。是不是数码管的中断造成的影响。单独运行数码管和蜂鸣器都正常啊,但是连在一起就有问题了
武力戡乱
5楼-- · 2019-07-19 03:16
狼族守护者 发表于 2015-5-27 16:42
仿真刚开始是正常的,一会就出现那个。是不是数码管的中断造成的影响。单独运行数码管和蜂鸣器都正常啊,但是连在一起就有问题了

你上传一个全套的仿真和编译文件,我试试!
狼族守护者
6楼-- · 2019-07-19 03:25
武力戡乱 发表于 2015-5-27 18:15
你上传一个全套的仿真和编译文件,我试试!

快毕业答辩了,还一直出问题,希望大神尽快指点下,我把电路图和程序都打包在下面了

一周热门 更多>