中级会员
 
- 积分
- 291
- 金钱
- 291
- 注册时间
- 2016-6-4
- 在线时间
- 86 小时
|
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;
}
|
|