OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 362|回复: 3

各位大侠帮我看看什么原因

[复制链接]

  离线 

12

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2016-6-4
在线时间
61 小时
发表于 2018-4-16 18:58:20 | 显示全部楼层 |阅读模式
1金钱
我做了一个频闪灯, 现在转动编码器时单片机老是死机!就是LED没有方波输出!以下是源码!

#include <STC12C5A60S2.H>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit wela = P1^1;
sbit dula = P1^2;
sbit LED=P1^0;
sbit AA=P3^7; //编码加
sbit BB=P3^6; //编码减
uint flage,status,current_bmb,counter = 0,
p,dataa;
float PA;
static uint m,tm;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                            0x07,0x7f,0x6f};
void huansuan(void);
void datakae(void);
void display(void);
void initial(void);
void delay(unsigned char i)
{
unsigned char j,k;
for(j=i;j>0;j--)
   for(k=110;k>0;k--);
}                                                                                       
void datakae(void)
{   
status=BB;        //一直赋值!
while(0==AA)//当AA条件允许进入主循环!并且BB上次的值保持为临近状态!
  {   
   current_bmb=BB;
   flage=1;
             }
if(1==flage)
  {
        flage=0;
if((0==current_bmb)&&(1==status))   
            {
          tm++;
          if(tm>=1000)
         {
           tm=1000;         
               }
                }
if((0==status)&&(1==current_bmb))
    {  
         tm--;
         if(tm<=10)
         {
           tm=10;         
               }                            
                    }
             }                                                                                                                                                                                  
                  }
void display(void)
{
   P0=table[dataa%10];//个
   dula=1;
   dula=0;

   P2=0xfe;
   wela=1;
   wela=0;
   delay(2);

   P0=table[dataa%100/10];        //十       
   dula=1;
   dula=0;

   P2=0xfd;
   wela=1;
   wela=0;
   delay(2);

P0=table[dataa%1000/100];
   dula=1;
   dula=0;

   P2=0xfb;         //        百
   wela=1;
   wela=0;
   delay(2);
                             
P0=table[dataa%10000/1000];
   dula=1;
   dula=0;

   P2=0xf7;//千
   wela=1;
   wela=0;
   delay(2);
                  }
void huansuan(void)
{
m=10000/tm;
dataa=tm;
            }
//定时器T1初始化
void initial(void)
{
  LED=0;
  P1M1 = 0x00;
  P1M0 = 0xFF;
  counter=0;
  EA = 1;
  TR0 = 1;
  TMOD = 0x01;
  TH0 = (65535-1000)/256;         //1ms
  TL0 = (65535-1000)%256;
  ET0 = 1;
}                               
//主程序
void main()
{
   tm=250;
  initial();
while(1)
{
huansuan();
datakae();
  display();
  LED=0;
        }
         }
void timer0_int()interrupt 1 using 0
{
TH0 = (65535-1000)/256;//1ms产生一次中断
TL0 = (65535-1000)%256;
counter++;
if(counter==m)
{
  LED=1;
  for(p=0;p<150;p++);
  counter=0;
          }        else LED=0;
                                                                            
                   }       

回复

使用道具 举报

  离线 

509

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
132820
金钱
132820
注册时间
2010-12-1
在线时间
1246 小时
发表于 2018-4-17 01:26:11 | 显示全部楼层
既然死机 了,肯定没灯闪才对,先解决死机问题。
回复

使用道具 举报

  离线 

12

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2016-6-4
在线时间
61 小时
 楼主| 发表于 2018-4-17 09:24:25 | 显示全部楼层
就是灯不闪,但是数码管是正常的!调节编码器数码管也是正常的!我分析不是死机,是进不了定时中断!不知什么原因!
回复

使用道具 举报

  离线 

0

主题

440

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1113
金钱
1113
注册时间
2018-2-7
在线时间
123 小时
发表于 2018-4-17 14:32:04 | 显示全部楼层
你判断编码器的时候while里面是死循环,如果编码器转动停止的时候,AA值刚好为0,那你的程序就永远在while循环中出不来了。
回复

使用道具 举报

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

本版积分规则




关闭

必看,必学:"原子哥”力荐上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-9-23 01:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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