打印

高手帮忙看看程序!

[复制链接]
2587|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gsypuma|  楼主 | 2007-8-1 15:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想通过串口给单片机发产生方波的寄存器高八位和低八位的数值。前几天是用定时器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++;
}

相关帖子

沙发
gjg191| | 2007-8-1 15:45 | 只看该作者

dd

你在串口中断的开始干什么把T2关了,在串口中断开始把RI=0;
    TR2=0;把这两句去了

使用特权

评论回复
板凳
gsypuma|  楼主 | 2007-8-1 15:49 | 只看该作者

是吗?

要产生新的频率方波时,在设置寄存器,不应该把定时器关了吗?

使用特权

评论回复
地板
gsypuma|  楼主 | 2007-8-1 15:56 | 只看该作者

不是那里的问题

现在的问题是,第一次波形发出后,第二次就进不了串口中断了。
再发什么数,频率都不变了。

使用特权

评论回复
5
gjg191| | 2007-8-1 16:17 | 只看该作者

dd

void serial_receive(void) interrupt 4 using 1
{    
    std_cnt3=0;
   if(RI==1)
   { 
    if(temp==0)
    {                  
    numberhigh=SBUF;
    RI=0;
    temp=1;
    }
    if(temp==1)
    {
    numberlow=SBUF;                   
        RI=0;
        temp=0;
        i=1;
    }
   }
}
while(1)
   {
    if(i==1)
    {
     ES=0;
    T2CON=0x30;
    T2MOD=0x02;
    RCAP2H=numberhigh;
    RCAP2L=numberlow;
    TR2=1;
    i=0;
    ES=1;
    }
   }
        
改成这样试试 

使用特权

评论回复
6
gsypuma|  楼主 | 2007-8-2 13:24 | 只看该作者

问题还是存在!

使用特权

评论回复
7
gsypuma|  楼主 | 2007-8-2 13:37 | 只看该作者

问题还是存在!

还是第一次设置完以后,第二次串口中断就进不去了。

使用特权

评论回复
8
gjg191| | 2007-8-2 13:53 | 只看该作者

dd

你往上位机发数据了吗?

使用特权

评论回复
9
gsypuma|  楼主 | 2007-8-2 14:20 | 只看该作者

没有!

有关系吗?

使用特权

评论回复
10
gjg191| | 2007-8-2 14:28 | 只看该作者

dd

不知道你设置的t2模式对吗还有少了给th2 和tl2赋初值 TH2=RCAP2H;
 TL2=RCAP2L; 把这两句加上.

使用特权

评论回复
11
gsypuma|  楼主 | 2007-8-2 14:46 | 只看该作者

有这个可能呀!

我看看!

使用特权

评论回复
12
gsypuma|  楼主 | 2007-8-2 14:54 | 只看该作者

那两句加上了也不行。

而且,我有个奇怪的问题,我在定时器2启动前加几句给上位机发数据的语句,第一次返回的就是我发送的数据,当然,第二次就不返回了,好象根本没再进这,所以我判断第二次进不了串口中断。可是我把给上位机发数据的语句加到启动后时,返回的数据居然不是我发的数据,真是奇怪,他怎么可能变呢?
    //send_letter=numberhigh;
    //serial_send();
    //send_letter=numberlow;
    //serial_send();
    T2CON=0x30;
    T2MOD=0x02;
    RCAP2H=numberhigh;
    RCAP2L=numberlow;
    TH2=RCAP2H;
    TL2=RCAP2L;
    TR2=1;
    i=0;
    send_letter=numberhigh;
    serial_send();
    send_letter=numberlow;
    serial_send(); 

使用特权

评论回复
13
gsypuma|  楼主 | 2007-8-2 15:02 | 只看该作者

更奇怪的是

我把定时器2启动前后都加上给上位机发数据的语句,现在是第一次我给频率数FFE4后,在定时器2启动前返回的是FFE4,定时器2启动后返回的是FFF2.我第二次给频率数FEE8,在定时器2启动前返回的是FEE8,定时器2启动后返回的是000000.第三次以后就什么也没有了。
真是他奇怪了。

使用特权

评论回复
14
gsypuma|  楼主 | 2007-8-2 15:06 | 只看该作者

这单片机也太诡异了!

使用特权

评论回复
15
gjg191| | 2007-8-2 15:11 | 只看该作者

dd

你把T2赋初值和初始化不要放到循环里只改变RCAP2H RCAP2L 就可以

使用特权

评论回复
16
gsypuma|  楼主 | 2007-8-2 15:36 | 只看该作者

这我也改过

把这些拿出去,就什么都不好使了,连第一次的频率的设置不了了,这破单片机气的我都快骂人了。

使用特权

评论回复
17
gjg191| | 2007-8-2 16:07 | 只看该作者

dd

你用什么型号的单片机!

使用特权

评论回复
18
gsypuma|  楼主 | 2007-8-3 14:06 | 只看该作者

我用的是stc89c54

使用特权

评论回复
19
gsypuma|  楼主 | 2007-8-3 14:24 | 只看该作者

我奇怪的是

定时器初值怎么会在定时器启动后自己就变化了。
在一个就是中断怎么就只能进去一次?

使用特权

评论回复
20
gjg191| | 2007-8-3 14:55 | 只看该作者

dd

我记得t2 只更新RCAP2L RCAP2h就可以啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

140

帖子

0

粉丝