标题:
大神帮我看一下我的程序,我是初学者 谢谢
[打印本页]
作者:
jkl8687
时间:
2014-11-10 22:21
标题:
大神帮我看一下我的程序,我是初学者 谢谢
/*这是用外部中断下降沿 第1次在3秒内达5次以上 点亮Green_LED 和 LED5 ,如果少以5次Red_LED程序停止 . 第2.3次依次 */
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar counter1;
uchar JDQ1,JDQ2,JDQ3;
sbit Green_LED =P0^0;
sbit Green_LED1 =P0^1;
sbit Green_LED2 =P0^2;
sbit Red_LED =P0^3;
sbit LED5 =P1^0;
sbit LED6 =P1^1;
sbit LED7 =P1^2;
sbit LED8 =P1^3;
void Delay_1ms(unsigned int Time)
{
unsigned int x, y;
for(x = Time; x > 0; x--)
for(y = 120; y > 0; y--);
}
void timer1_init()
{
TMOD |= 0x10;
TMOD &= 0xdf;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
TR0 = 1; //启动定时器0
TF0=0;
}
void interrupter_init()
{
ET0 = 1; //开定时器0中断
EX0=1; //开外部中断0
EA=1; //开总中断
IT0=1; //下降沿触发
//IE0=0;
PX0=1;
// TCON |=0X01;
}
main()
{
timer1_init();
interrupter_init();
Red_LED =1;
Green_LED =1;
Green_LED1 = 1;
Green_LED2 =1;
LED5 = 1;
LED6 = 1;
LED7 = 1;
LED8 = 1;
JDQ1=0;
JDQ2=0;
JDQ3=0;
while(1);
}
void ISR_Key(void) interrupt 0
{
counter1++;
}
void interrupt_timer1() interrupt 1
{
uint sec;
uchar counter;
TF0=0;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
counter++;
if(counter ==20)
{
counter = 0;
if(JDQ2==0)
sec++;
if ((sec<30)&&(counter1>=5))
{
Green_LED=0;
LED5 =0;
}
if ((sec<30)&&(counter1>=5)&&(JDQ1 ==1))
{ JDQ1=2;
Green_LED1 =0;
LED6 = 0;
}
if ((sec<30)&&(counter1>=5)&&(JDQ1 ==3))
{ JDQ1=4;
Green_LED2 =0;
LED7 = 0;
}
if ((sec>=30)&&(counter1<5))
{
Red_LED=0;
}
if (sec>=40)
{ sec=0;counter1=0;
JDQ1=1;
if (JDQ2==2)
{
JDQ1=3;
}
if(JDQ1==4)
{
JDQ1=0;
JDQ2=1;
LED8 =0;
}
}
}
}
作者:
jkl8687
时间:
2014-11-10 23:58
大神快帮帮忙
作者:
mqwu
时间:
2014-11-11 09:03
这个代码2个星期前我帮另一个人写过, 请在帖子里找一下
作者:
jkl8687
时间:
2014-11-11 09:14
找不到
作者:
jkl8687
时间:
2014-11-11 09:52
看一下我的错在哪里
作者:
mqwu
时间:
2014-11-11 11:25
//用一个外部中断做按5次的键,一个定时器来判断3秒溢出, 如果定时器在3秒内按了5次, 外部中断重新赋初值,这样防止定时器在3秒溢出,绿灯亮。反之,定时器溢出将使得红灯亮, 用12M crystal 和数码管+38译码器
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
code uchar number[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar a[6];
sbit ENLED = P1^4;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit Green_LED =P2^0;
sbit Red_LED =P2^1;
void timer1_init()
{
TMOD |= 0x10;
TMOD &= 0xdf;
TH1 = 0x3C;
TL1 = 0xB0;
TR1 = 1;
}
void interrupter_init()
{
ET1 = 1;
EA=1; //諾ÖÖD¶Ï¿a
EX0=1; //ía2¿ÖD¶Ï0¿a
IT0=1; //±ßÑØ′¥·¢
}
void Scanning_Numerical_LED(void)
{
static uchar j = 0;
switch(j)
{
case 0: ADDR0 = 0;ADDR1 = 0;ADDR2 = 0;j++;P0 = number[a[0]];break;
case 1: ADDR0 = 1;ADDR1 = 0;ADDR2 = 0;j++;P0 = number[a[1]];break;
case 2: ADDR0 = 0;ADDR1 = 1;ADDR2 = 0;j++;P0 = number[a[2]];break;
case 3: ADDR0 = 1;ADDR1 = 1;ADDR2 = 0;j++;P0 = number[a[3]];break;
case 4: ADDR0 = 0;ADDR1 = 0;ADDR2 = 1;j++;P0 = number[a[4]];break;
case 5: ADDR0 = 1;ADDR1 = 0;ADDR2 = 1;j = 0;P0 = number[a[5]];break;
default: break;
}
}
main()
{
ENLED = 0; ADDR3 = 1;
timer1_init();
interrupter_init();
while(1)
{
Scanning_Numerical_LED();
}
}
void ISR_Key(void) interrupt 0 using 1
{
uchar counter1;
counter1++;
TR1=1;
if (counter1==5)
{
counter1=0;
TH1 = 0x3C; //50 ms setting;
TL1 = 0xB0;
}
}
void interrupt_timer1() interrupt 3
{
uint sec;
uchar counter;
TH1 = 0x3C; //50 ms setting;
TL1 = 0xB0;
counter++;
if(counter ==20)
{
counter = 0;
sec++;
if (sec>=3)
{
Red_LED=1;
TR1=0; 停定时器1;
}
else Green_LED=1;
if (sec==10)
sec=0;
a[0] = sec%10;
a[1] = sec/10;
//a[2] = sec/100%10;
// a[3] = sec/1000%10;
//a[4] = sec/10000%10;
// a[5] = sec/100000%10;
}
}
作者:
jkl8687
时间:
2014-11-11 20:51
我这个程序要实现在3秒内外部中断沿进入5次以上同时用一个IO口接开关按下绿灯亮,如果不管哪一个不成立就红灯亮
作者:
明白
时间:
2014-11-11 21:03
用一个定时器就可以,不用外中断做按键。
这样按键可以用任意IO,
多少个按键都可以
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1