|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2013-5-7 12:02:23
|
显示全部楼层
绿茶山人 发表于 2013-5-7 09:50 ![](static/image/common/back.gif)
全局变量当然能在中断中改变,也能在main中使用,我没懂你的“不返回初始值”是什么意思。 ...
#include <REG52.H>
#define uchar unsigned char
#define uint unsigned int
uchar imt[1]={'a'};
uchar imu[3];
uchar c,t,f,y;
//uchar *rx=imu;
bit flag_send=1;
void delay900ms(void) //误差 -0.000000000205us
{
unsigned char a,b,c;
for(c=127;c>0;c--)
for(b=128;b>0;b--)
for(a=24;a>0;a--);
}
void delay20us(void) //误差 -0.46875us
{
unsigned char a,b;
for(b=3;b>0;b--)
for(a=1;a>0;a--);
}
void init(void)
{
TMOD=0x20; //T1方式2
TH1=0xfd; //波特率 1200 晶振12M
TL1=0xfd;
SCON=0x50; //串口工作于方式1即10位(1+8+1)
TR1=1; //启动定时器1
ES=1; //串口中断允许
EA=1; //总中断打开
}
void send (void)
{
//uchar i=0;
ES =0;
//for(i=0;i<1;i++)
// {
//SBUF=imu[1];
SBUF=imt[0];
while(!TI);
TI=0;
// ES=0;
// }
ES=1 ;
}
void main(void)
{
t=0;
flag_send=0;
init();
while(1)
{
if(t==1)
{
f++;
}
if(flag_send)
{
y++;
flag_send =0;
}
if(f==100)
{
if(y==1)
{
while(!flag_send)
{
send() ;
y=0;
f=0;
t=0;
}
}
if(y==2)
{
send() ;
send() ;
y=0;
f=0;
t=0;
}
if(y==3)
{
send() ;
send() ;
send() ;
y=0;
f=0;
t=0;
}
if(y==4)
{
send() ;
send() ;
send() ;
send() ;
y=0;
f=0;
t=0;
}
if(y==5)
{
send() ;
send() ;
send() ;
send() ;
send() ;
y=0;
f=0;
t=0;
}
if(y==6)
{
send() ;
send() ;
send() ;
send() ;
send() ;
send() ;
y=0;
f=0;
t=0;
}
}
}
}
void uart(void) interrupt 4
{
if(RI)
{
RI=0;
t=1;
flag_send=1;
// imu[1]=SBUF;
// rx ++;
// if(rx>imu) //+5的时候只接收6位
// {
// rx=imu;
//}
}
}
我上面用的办法是判断ri触发次数(发几个字符给他,他就触发几次),从而来使(h==1).....等等
我不知道怎么把收的的数据赋值给变量 ,随便设一个h把,然后(h==1)的时候执行一个程序,(h==2).......指点一下 |
|