发新帖我要提问
12
返回列表
打印

单片机发方波的问题,高手帮忙!

[复制链接]
楼主: gsypuma
手机看帖
扫描二维码
随时随地手机跟帖
21
xuhuadong| | 2007-7-31 10:09 | 只看该作者 回帖奖励 |倒序浏览

89c52的t2时钟有一个专用的功能就是输出p1.0输出方波

数据手册上肯定有介绍,只要把串口的数据转换一下放到mode里就行了

使用特权

评论回复
22
gsypuma|  楼主 | 2007-7-31 14:28 | 只看该作者

我看资料没有说呀

再一个,用不用中断是关键问题吗?如果不用中断的话,就可以了?

使用特权

评论回复
23
农民讲习所| | 2007-7-31 14:32 | 只看该作者

找个定时器能在硬件上直接从IO口输出CLK的MCU

使用特权

评论回复
24
maychang| | 2007-7-31 14:45 | 只看该作者

不用中断的意思是根本不由MCU控制

由硬件自动完成。这样不占用MCU时间,没有因执行指令产生的延迟,所以速度快,可以产生较高频率的信号。

使用特权

评论回复
25
gsypuma|  楼主 | 2007-7-31 14:59 | 只看该作者

你们说的是stc 的89c54这款单片机吗?

使用特权

评论回复
26
gsypuma|  楼主 | 2007-7-31 15:29 | 只看该作者

高手帮忙!

能详细的说一下定时器2的应用吗?我看他说有三种方式,其他的看的不是太明白!

使用特权

评论回复
27
gsypuma|  楼主 | 2007-8-1 10:07 | 只看该作者

我已经用t2发出波形了,但有问题

一个是按照资料给出的公式,方波频率=振荡器频率/4*[65536-( RCAP2H,RCAP2L)],得到的不是我想要的频率呀 ,再一个,发出的波形不稳,总是跳,是怎么回事呀?

使用特权

评论回复
28
xiaopet| | 2007-8-1 10:35 | 只看该作者

LZ没有把问题考虑清楚

从定时中断,到中断响应,再到响应后执行你的发射方波程序,就这里已经去了多少时间?
100K,而且是11M的晶振,根本就不到10个指令周期,你有这么快吗?

使用特权

评论回复
29
xiaopet| | 2007-8-1 10:39 | 只看该作者

而且还用了手动加载的方式,这样就更慢了

用自动加载定时器方式,会快一些!
或者把晶振频率提高,这样才比较好做。

使用特权

评论回复
30
gsypuma|  楼主 | 2007-8-1 10:45 | 只看该作者

楼上的我已经换方案了

现在问题是新的了。

使用特权

评论回复
31
gsypuma|  楼主 | 2007-8-1 15:40 | 只看该作者

急呀!半个月了!

使用特权

评论回复
32
xiaopet| | 2007-8-1 15:46 | 只看该作者

T2的功能我没用过,呵呵,帮不上忙了

仔细研究一下DATASHEET呀,每一种方式都试一下。E文看不懂就搞个词霸,一点点翻译过来看。多试几次,准行。想当年,我自己搞I2C,用IO口模拟那种,天天试,足足搞了一个星期才搞出来。
然后用示波器观察。在这里等不是办法呀。

使用特权

评论回复
33
甄蔡组合| | 2007-8-1 15:55 | 只看该作者

中断冲突了

我估计是你的中断有问题。

使用特权

评论回复
34
gsypuma|  楼主 | 2007-8-1 15:57 | 只看该作者

我现在的程序

#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++;
}

使用特权

评论回复
35
gsypuma|  楼主 | 2007-8-1 15:59 | 只看该作者

最闹心的

语法上什么问题也没有,自己考虑逻辑也没问题,就是不出来,让人找不到问题的原因,很痛苦。

使用特权

评论回复
36
5880527| | 2007-8-1 18:00 | 只看该作者

简单又很难的问题

  

使用特权

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

楼上说的太有理了

使用特权

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

定时器2的用法说可以指点一下

英文资料没有介绍定时器2作为时钟信号输出的用法,中文资料说的很简单,就说把几个控制位做相应的改变。
    T2CON=0x30;
    T2MOD=0x02;
    RCAP2H=numberhigh;
    RCAP2L=numberlow;
    TH2=RCAP2H;
    TL2=RCAP2L;
    TR2=1;
我怎么用不知道可以不?现在的问题是第一次波形发出后,第二次没办法更改。找不到原因,有经验的可以说说吗?

使用特权

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

本版积分规则