sbit SB = P1^7; //vcc
sbit SRED = P1^6; //红
sbit SYELLOW = P1^5; //黄
sbit SAMPLIDYNE = P1^4; //电机
sbit SEND = P3^7; //发送
//sbit SEND2 = P1^3;
sbit TIMES = P1^2; //次数
sbit RECIVE = P1^1; //接收
sbit LOOP = P1^0; //循环一圈
typedef unsigned char INT8U; /* 8 bit 无符号整型 */
INT8U data cishu = 0;
INT8U data s_count = 0;
INT8U data temp = 0;
INT8U data rec_flag = 0;
INT8U data Sec_flag = 0;
INT8U data Sec_flag2 = 0;
INT8U data Sec_flag3 = 0;
void init_serialcomm(void);
void delay10ms(unsigned char); // .110MS
//临时缓冲区
main()
{
SAMPLIDYNE = 0;//0 ---stop
// P1 = 1;
SAMPLIDYNE = 0;//0 ---stop
RECIVE=1;
SB = 1;
cishu = 0;
s_count = 3;
temp = 0;
rec_flag = 0;
Sec_flag = 0;
Sec_flag2 = 0;
Sec_flag3 = 0;
init_serialcomm();
while(1){
SAMPLIDYNE = 0;
SRED = 1;
SYELLOW = 1;
delay10ms(180);
SYELLOW = 0;
delay10ms(20);
if(TIMES) {cishu = 2; }
else{ cishu = 1; }
while(RECIVE != 0 && s_count > cishu){
SAMPLIDYNE = 1;
if(TIMES == 1){ cishu = 2; s_count = 1; }
else { cishu = 1; s_count = 1; }
}
//while(RECIVE==0 && count <= cishu){
while(RECIVE==0 && s_count <= cishu){
SAMPLIDYNE = 1;
if(TIMES) {
SYELLOW = 1;
SRED = 0;
delay10ms(66); //105//70
}
else{
SYELLOW = 0;
SRED = 1;
delay10ms(15); //75
}
if(LOOP == 0) { s_count = s_count + 1; SRED = 1;} //SAMPLIDYNE = 0; }
}
if(s_count > cishu){ SYELLOW = 1; SRED = 0; delay10ms(100);}
}
}
void init_serialcomm(void)
{
TH0 = 0xF3;
TL0 = 0xF3;
TH1=0xCE; //100ms一次中断
TL1=0xCE;
//SCON = 0x70; // TMOD = 0x21;
TMOD = 0x22;
EA = 1;
ES = 1;
ET0 = 1;
ET1 = 1;
IT0 = 1;
TF0 = 0;
TF1 = 0;
// TCON = 0x50;
TR0 = 1;
TR1 = 1;
}
//定时器中断38khz方波
void timer0(void)interrupt 1 using 0 { //T0中断服务程序入口
TH0 = 0xF3;
TL0 = 0xF3;
SEND = !SEND;
//if(SEND) SEND = 0;
// else SEND = 1;
}
/*
//定时器中断100m
void timer1(void)interrupt 2 using 1 { //T1中断服务程序入口
TH1 = 0xCE;
TL1 = 0xCE;
Sec_flag = 1 + Sec_flag;
if(Sec_flag > 100) {Sec_flag2 = Sec_flag2 + 1;Sec_flag = 0;}
if(Sec_flag2 > 100){ Sec_flag3 = Sec_flag3 + 1;Sec_flag2 = 0;}//0.5s
if(Sec_flag3 > 8 ){
Sec_flag3 = 0;
SRED = 1;
SYELLOW = 0;
delay10ms(100);
}
else{
SRED = 1;
SYELLOW = 1;
}
}
*/
// ********************* .. n*10ms **********************
void delay10ms(unsigned char time)
{
unsigned char i;
unsigned int j;
for (i=0;i<time;i++)
{
for(j=0;j<0x390;j++){
}
}
}
请教各位老师,我在上面的程序中,如果把两个定时器中断打开,它怎么仅运行第一个,我一个一个的用它都能用运行且正常,现我想两个都要用上,而且一起用,请问我上面的程序怎么改??
望指教!!!
8 个解决方案
#1
void timer1(void)interrupt 2 using 1
改为 :
void timer1(void)interrupt 3 using 1
定时中断1的中断入口号是3
改为 :
void timer1(void)interrupt 3 using 1
定时中断1的中断入口号是3
#2
大问题被楼上的说了,偶看到个小问题:
#include "AT89x051.H"
怎么说文件名也该是:AT89x51.H
#include "AT89x051.H"
怎么说文件名也该是:AT89x51.H
#3
:)
路过
路过
#4
TO : iori40995(小刘)
ATMEL 也有 AT89C2051型号的,所以也会有 #include "AT89x051.H"
ATMEL 也有 AT89C2051型号的,所以也会有 #include "AT89x051.H"
#5
恩,多谢指教:)
#6
瞧瞧
#7
最好认真的看看书
#8
问题已被指出!
我只好说说debug的方法!在调试时你可以在中断向量处设置中断呀,看程式有没运行至此呀!如果这样的话像这种问题应该很快就查出来了!
我只好说说debug的方法!在调试时你可以在中断向量处设置中断呀,看程式有没运行至此呀!如果这样的话像这种问题应该很快就查出来了!
#1
void timer1(void)interrupt 2 using 1
改为 :
void timer1(void)interrupt 3 using 1
定时中断1的中断入口号是3
改为 :
void timer1(void)interrupt 3 using 1
定时中断1的中断入口号是3
#2
大问题被楼上的说了,偶看到个小问题:
#include "AT89x051.H"
怎么说文件名也该是:AT89x51.H
#include "AT89x051.H"
怎么说文件名也该是:AT89x51.H
#3
:)
路过
路过
#4
TO : iori40995(小刘)
ATMEL 也有 AT89C2051型号的,所以也会有 #include "AT89x051.H"
ATMEL 也有 AT89C2051型号的,所以也会有 #include "AT89x051.H"
#5
恩,多谢指教:)
#6
瞧瞧
#7
最好认真的看看书
#8
问题已被指出!
我只好说说debug的方法!在调试时你可以在中断向量处设置中断呀,看程式有没运行至此呀!如果这样的话像这种问题应该很快就查出来了!
我只好说说debug的方法!在调试时你可以在中断向量处设置中断呀,看程式有没运行至此呀!如果这样的话像这种问题应该很快就查出来了!