打印

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

[复制链接]
5207|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gsypuma|  楼主 | 2007-7-29 09:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
maychang| | 2007-7-29 09:13 | 只看该作者

不知道楼主说的是什么问题

好像是单片机实际工作时测量到的方波频率与计算值不一致。

使用特权

评论回复
板凳
ayb_ice| | 2007-7-29 09:28 | 只看该作者

随便说说

ATMEL公司的AT89C52及以上的型号可以容易由T2产生很宽范围的方波信号,你看看DATASHEET就知道了...

使用特权

评论回复
地板
gyt| | 2007-7-29 09:58 | 只看该作者

楼主注意:一个指令要1个多us

楼主的程序可能有问题。

使用特权

评论回复
5
mengzhaohe| | 2007-7-29 19:24 | 只看该作者

同意楼上

把程序发上来分析一下

使用特权

评论回复
6
zhaoyu2005| | 2007-7-29 20:57 | 只看该作者

用11M晶振产生100K方波,不到10个指令周期计数器就重装一次

如果用到中断的话,你还让单片机干别的不了?

使用特权

评论回复
7
5880527| | 2007-7-29 22:15 | 只看该作者

用中断发不出那么高频率的

  

使用特权

评论回复
8
ayb_ice| | 2007-7-30 07:36 | 只看该作者

89C54产生方波,根本不用中断...

使用特权

评论回复
9
gsypuma|  楼主 | 2007-7-30 09:23 | 只看该作者

我的程序

void main(void)
{
    SP=0x60;
//    interupt_init();
    serial_init();
    
    std_cnt0=0;
    std_cnt1=0;
    std_cnt2=0;
    std_cnt3=0;

    while(i==0);//等待中断

    /*发射波形*/
    TH0=numberhigh; 
    TL0=numberlow;
    TF0=0;
    TR0=1;
    while(1)
    {
     while(TF0==0);
     TH0=numberhigh;
     TL0=numberlow;
     std_cnt3=!std_cnt3; 
     TF0=0;    

使用特权

评论回复
10
yewuyi| | 2007-7-30 09:23 | 只看该作者

PWM^^

使用特权

评论回复
11
gsypuma|  楼主 | 2007-7-30 09:27 | 只看该作者

我的想法

    我要做的是,用pda通过串口给单片机一个频率数,然后单片机发射相应的方波。用到了串口的中断。程序如下
void serial_receive(void) interrupt 4 using 1
{    
    
     
    //ES=0;
    RI=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;                   //给出定时器初值低八位,准备跳出中断
    }
    }  
现在的两个问题是,第一,pda发什么,单片机都是一个频率。不过我用pda给pc发就可以作到发什么收什么。第二,我现在用pc代替pda发频率数,单片机最高就到40k,和计算的不相符,大家看看,帮忙分析分析。

使用特权

评论回复
12
gsypuma|  楼主 | 2007-7-30 16:26 | 只看该作者

高手帮忙!

我现在真不知道该怎么办了?

使用特权

评论回复
13
conwh| | 2007-7-30 16:30 | 只看该作者

用STC的PWM功能

使用特权

评论回复
14
工控秀才| | 2007-7-30 16:42 | 只看该作者

8核心来解决

只需要挂8MHz的晶体,利用一个核心产生100K以上的时基是非常容易的。
其它还有7个可以随时听你调遣的。

使用特权

评论回复
15
gsypuma|  楼主 | 2007-7-30 17:25 | 只看该作者

楼上说的什么意思呀?

没看懂!

使用特权

评论回复
16
AIRWILL| | 2007-7-30 17:51 | 只看该作者

建议用 T2 引脚自动翻转来实现

否则, 只能直接通过计算指令数来完成了, 定时器来不及起作用了

使用特权

评论回复
17
maychang| | 2007-7-30 17:55 | 只看该作者

楼上提的建议才是正解

使用特权

评论回复
18
gsypuma|  楼主 | 2007-7-30 18:39 | 只看该作者

T2 引脚自动翻转是怎么实现呀?

我在c51的书上没有看到呀!

使用特权

评论回复
19
gsypuma|  楼主 | 2007-7-30 19:23 | 只看该作者

我把我的程序写上了,高手能帮看看吗 ?

#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 = p0^3;


//函数声明
void serial_init(void);//串口初始化
void serial_send(void);


//全局变量声明
unsigned int idata send_letter;

unsigned char  data numberhigh,numberlow;
int i=0;
unsigned  int data temp;

/************ 主函数**************************/
void main(void)
{
    SP=0x60;

    serial_init();
    
    std_cnt0=0;
    std_cnt1=0;
    std_cnt2=0;
    std_cnt3=0;

    while(i==0);//等待中断

    /*发射波形*/
    TH0=numberhigh; 
    TL0=numberlow;
    TF0=0;
    TR0=1;
    while(1)
    {
     while(TF0==0);
     TH0=numberhigh;
     TL0=numberlow;
     std_cnt3=!std_cnt3; 
     TF0=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;

    EX1=0;

    PS=1;
}

/************ 串口中断函数**************************/
void serial_receive(void) interrupt 4 using 1
{    
    
     

    RI=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++;
}

使用特权

评论回复
20
ayb_ice| | 2007-7-31 09:46 | 只看该作者

89C54产生方波,根本不用中断...

仔细看DATASHEET,你就明白了。。。
初始化下定时器就可以了。。。

使用特权

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

本版积分规则

32

主题

140

帖子

0

粉丝