我想通过串口给单片机发产生方波的寄存器高八位和低八位的数值。前几天是用定时器0做的,用pc可以与单片机通信的,可因为频率上不去,现在用定时器2做的,可通信的部分怎么就又不好用了呢?我发现这单片机太难用了,还不如dsp呢。我那时调dsp也没怎么麻烦呀。大家帮我看看吧。 #include <howevero.h>
//逻辑 #define FALSE 0 #define TRUE 1 #define H 1 #define L 0
//管脚定义 sbit std_cnt2 = p1^2; sbit std_cnt1 = p0^1; sbit std_cnt0 = p0^0; sbit std_cnt3 = p1^0;
//函数声明 void serial_init(void);//串口初始化 void serial_send(void);
//全局变量声明 unsigned int idata send_letter; //unsigned long data tempnumber=0; unsigned char numberhigh,numberlow; int i=0; unsigned int data temp;
/************ 主函数**************************/ void main(void) { SP=0x60; // interupt_init(); serial_init(); std_cnt0=0; std_cnt1=0; std_cnt2=0; std_cnt3=0;
//while(i==0);//等待中断
/*发射波形*/
while(1) { while(i==0); T2CON=0x30; T2MOD=0x02; RCAP2H=numberhigh; RCAP2L=numberlow; TR2=1; RI=0; i=0; }
}
/************ 串口初始化?*************************/ void serial_init() { SCON=0x50; //工作方式1,单机通讯,接收允许 TMOD=0x21; //方式1下波特率由SMOD和定时器1共同决定,定时器一工作在方式2下 TR0=0; // PCON=0x00; //PCON=0x00速度不加倍 TH1=0xFD; TL1=0xFD; //计数初值,晶振11.0592M,波特率9600, TR1=1; //启动定时器 ET0=0; EX0=1; ES=1; EA=1; // ET1=1; EX1=0; // PX1=1; // PX0=1; PS=1; }
/************ 串口中断函数**************************/ void serial_receive(void) interrupt 4 using 1 { //ES=0;
RI=0; TR2=0; std_cnt3=0; //输出低电平(未发射方波时) for(temp=0;temp<2;temp++) //连续接收2个字节 { switch(temp) { case 0:numberhigh=SBUF;while(RI==0);RI=0;break;//给出定时器初值高八位,并等待下个串行中断 case 1:numberlow=SBUF;break; //给出定时器初值低八位,准备跳出中断 default:break; } } RI=0; i++; } |