头像-47348

lennon

  • 辽宁省盘锦市
  • 单片机 模拟技术
  • 测试仪器及设备

个人成就

获得 2 次赞

帮助过1人

求助:基于DAC0832的信号发生器频率是怎么计算的?

  相信大家玩过用0832做信号发生器的朋友一定见过下面这个程序,我看到频率的计算时,依据我的理解,信号的频率是根据定时器的时间决定每个点的函数持续时间,比如10hz sin函数 选取的定时是TH0=0XFD,TL0=0X06 (也就是在波频率调整中间值选 waveTH[0]和waveTL[0])20hz sin函数 选取的定时是TH0=0XFE,TL0=0X8A (也就是在波频率调整中间值选 waveTH[1]和waveTL[1])。因为sin函数有256个点,所以,定时器定的应该是1/256的周期时间,。。但是通过计算我发现用所给的频率调整中间值得出的周期值和预期的不一样,请问我是计算错了还是理解错了?请看以下程序1602显示的相关程序我已经忽略#include<reg52.h>#define  uchar unsigned char#define  uint  unsigned int#define DAdata  P0 //DA数据端口sbit DA_S1= P2^0;   // 控制DAC0832的8位输入寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存sbit DA_S2= P2^1;   // 控制DAC0832的8位DAC寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存sbit key=   P3^2;uchar wavecount;    //'抽点'计数uchar THtemp,TLtemp;//传递频率的中间变量//uint T_temp;uchar judge=1;      //在方波输出函数中用于简单判别作用uchar waveform;     //当其为0、1、2时,分别代表三种波uchar code freq_unit[3]={10,50,200}; //三种波的频率单位uchar  wavefreq[3]={1,1,1};    //给每种波定义一个数组单元,用于存放单位频率的个数uchar code waveTH[]={    0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,  //正弦波频率调整中间值0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,  //三角波频率调整中间值0xec,0xf6,0xf9,0xfb,0xfc,0xfc,0xfd,0xfd,0xfd,0xfe};uchar code waveTL[]={     0x06,0x8a,0x10,0x4e,0x78,0x93,0xa8,0xb3,0xbe,0xc6, //正弦波频率调整中间值0xac,0xde,0x48,0x7a,0x99,0xaf,0xbb,0xc8,0xd0,0xde, //三角波频率调整中间值0x88,0x50,0x90,0x32,0x34,0xbe,0x4a,0xa3,0xe5,0x2c}; /*************************************************************************************************/uchar code triangle_tab[]={  //每隔数字8,采取一次0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78,0x80,0x88,0x90,0x98,0xa0,0xa8,0xb0,0xb8,0xc0,0xc8,0xd0,0xd8,0xe0,0xe8,0xf0,0xf8,0xff,0xf8,0xf0,0xe8,0xe0,0xd8,0xd0,0xc8,0xc0,0xb8,0xb0,0xa8,0xa0,0x98,0x90,0x88,0x80,0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x18,0x10,0x08,0x00};uchar code sine_tab[256]={//输出电压从0到最大值(正弦波1/4部分)0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,//输出电压从最大值到0(正弦波1/4部分)0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,//输出电压从0到最小值(正弦波1/4部分)0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,//输出电压从最小值到0(正弦波1/4部分)0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80}; void delay(uchar z)   {    uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void triangle_out() //三角波输出{    DA_S1=0;    DAdata=triangle_tab[wavecount++];if(wavecount>64) wavecount=0;                                 //打开8位输入寄存器DA_S1=1;  //关闭8位输入寄存器}void sine_out()  //正弦波输出{DA_S1=0;  //打开8位输入寄存器    DAdata=sine_tab[wavecount++];DA_S1=1;  //关闭8位输入寄存器}void square_out()  //方波输出{    judge=~judge;    if(judge==1) DAdata=0xff;else  DAdata=0x00;DA_S1=0;  //打开8位输入寄存器DA_S1=1;  //关闭8位输入寄存器}void main(){    uchar i=0;DA_S2=0;    //使DAC寄存器处于直通状态DAdata=0;DA_S1=1;    //关闭8位输入寄存器init_lcd();    waveform=0;TMOD=0x01;  //设置定时器0为16位工作方式IT0=1;      //设置外部中断0为下降沿触发ET0=1;      //开定时器中断EX0=1; EA=1;while(1){//DAout(0xff);    //可输出TTL波形//DAout(0x80);//T_temp=32;}}   void timer0() interrupt 1{TH0=THtemp;TL0=TLtemp;if(waveform==0)      sine_out();else if(waveform==1) triangle_out();else if(waveform==2) square_out();}void key_int0() interrupt 0{    uchar keytemp;uint total_freq; //总频率EA=0; TR0=0;     //关总中断与定时器delay(5);       //延时够吗???if(key==0)       //确实有按键按下而引发中断{keytemp=P3&0xf0; //获取P3口高四位的值switch(keytemp){    case 0xe0: //选择波形     waveform++; if(waveform>2) waveform=0; break;    case 0xd0:  //频率按规定单位依次增加     wavefreq[waveform]++; if(wavefreq[waveform]>10) wavefreq[waveform]=1; // /*这边要用“>10”,因为它比“=11”可靠 break;  //   性更高,使加数有个上限,不会一直加下去*/    case 0xb0:  //频率按规定单位依次衰减     wavefreq[waveform]--; if(wavefreq[waveform]<1) wavefreq[waveform]=10; //这边要用“<1”,因为它比“=0”可靠性更高 break;    case 0x70:    //TTL输出     DA_S2=1; //使DAC寄存器关闭 break;}    THtemp=waveTH[waveform*10+(wavefreq[waveform]-1)]; //方括号中选取第几个数后,并把该值赋给T_tempTLtemp=waveTL[waveform*10+(wavefreq[waveform]-1)];    total_freq= wavefreq[waveform] * freq_unit[waveform]; //求输出频率(个数*单位)

pic16F872汇编转换为c语言,思路是什么?这段代码怎么转换

[table=98%] Generated by WinDis84, (c) Nigel Goodwin 1998. LIST P=16F84, F=INHX8M include "p16FXX.inc" ORG 0x0000 INCF 0x16 , W Label_000A INCF 0x15 , W ; ???? ADDLW 0x3F RETLW 0x00 DECF EEDATA , W DECF TMR0 , W MOVLW 0x00 Label_0002 INCF EEDATA , W MOVLW 0x00 INCF TMR0 , W IORLW 0x08 RETLW 0x00 DECF 0x12 , W DECF 0x13 , W RRF 0x1C , W BCF 0x28 , 04 BCF 0x28 , 06 GOTO Label_0001 RRF 0x10 , W DECF 0x16 , W CALL Label_0002 DECF 0x19 , W BTFSC 0x28 , 02 BTFSC 0x28 , 04 GOTO Label_0001 ADDLW 0x30 CALL Label_0003 DECF 0x1C , W CALL Label_0004 CALL Label_0005 ; ???? Label_0011 IORLW 0x00 ; ???? IORLW 0x02 CLRW DECF 0x19 , W CALL Label_0006 DECF 0x18 , W GOTO Label_0007 Label_001E GOTO Label_0008 GOTO Label_0001 CLRW CALL Label_0009 CALL Label_000A DECF 0x13 , W DECF 0x12 , W RETLW 0x08 Label_000B IORLW 0x00 MOVLW 0x08 INCF INDF , W MOVLW 0x08 DECF INDF , W RETLW 0x0E RETLW 0x0E COMF INDF , W CALL Label_000B IORWF INDF , W MOVLW 0x30 ADDWF 0x20 , W CALL Label_000B IORWF INDF , W CALL Label_000C ADDWF 0x20 , W DECF TMR0 , W INCF 0x12 , W INCF 0x11 , W BCF 0x28 , 00 IORWF PORTB , W ; ???? IORWF PCLATH , W IORWF PORTB , W DECF 0x19 , W ; ???? IORWF 0x28 , W DECFSZ INDF , W ADDLW 0x3F ADDLW 0x3F ADDLW 0x3F ADDLW 0x3F CLRW SUBLW 0x28 DECF 0x12 , W DECF 0x13 , W CALL Label_000D CALL Label_000E CALL Label_000F CALL Label_0010 SWAPF 0x30 , W INCF 0x16 , W INCF 0x11 , W CALL Label_0011 INCF 0x12 , W INCF 0x11 , W IORLW 0x00 ANDLW 0x01 IORLW 0x08 XORWF 0x3A , W ANDLW 0x04 DECF 0x1D , W CALL Label_0012 CALL Label_0013 SUBLW 0x28 CALL Label_0007 DECF 0x12 , W DECF 0x13 , W SWAPF EEDATA , W BCF INDF , 00 INCFSZ EEDATA , W BCF INDF , 02 INCF 0x16 , W INCF 0x11 , W CALL Label_0014 INCF 0x12 , W INCF 0x11 , W SUBLW 0x28 DECF 0x12 , W DECF 0x13 , W SWAPF EEDATA , W BCF INDF , 00 INCFSZ EEDATA , W BCF INDF , 02 INCF 0x16 , W INCF 0x11 , W CALL Label_0014 INCF 0x12 , W INCF 0x11 , W SUBLW 0x28 CALL Label_0001 INCF 0x16 , W INCF 0x11 , W SUBLW 0x22 INCF 0x12 , W INCF 0x11 , W ADDLW 0x28 INCF 0x16 , W INCF 0x11 , W SUBLW 0x21 INCF 0x12 , W INCF 0x11 , W ADDLW 0x28 INCF 0x16 , W INCF 0x11 , W RRF 0x24 , W INCF 0x12 , W INCF 0x11 , W INCF 0x16 , W INCF 0x11 , W ANDLW 0x23 INCF 0x12 , W INCF 0x11 , W ADDLW 0x28 INCF 0x16 , W INCF 0x11 , W BCF 0x24 , 06 INCF 0x12 , W INCF 0x11 , W INCF 0x16 , W INCF 0x11 , W ANDLW 0x23 INCF 0x12 , W INCF 0x11 , W ADDLW 0x28 ADDLW 0x28 ADDLW 0x28 DECF 0x16 , W DECF 0x13 , W CALL Label_0015 ; ???? CALL Label_0016 XORLW 0x00 XORLW 0x28 XORLW 0x08 CALL Label_0017 DECF 0x19 , W ADDWF 0x28 , W SUBWF 0x3A , W DECF 0x19 , W CLRW ADDWF 0x3A , W DECF 0x19 , W RLF 0x28 , W CLRW DECF 0x19 , W BTFSC 0x28 , 00 CALL Label_0018 ; ???? ; ???? DECF 0x19 , W GOTO Label_0019 CALL Label_0018 DECF 0x16 , W DECF 0x13 , W CALL Label_001A CALL Label_000D SUBLW 0x28 DECF 0x12 , W DECF 0x13 , W SWAPF EEDATA , W DECF 0x16 , W CALL Label_001B DECF 0x12 , W INCFSZ EEDATA , W DECF 0x16 , W CALL Label_001C INCF 0x16 , W INCF 0x11 , W BCF 0x21 , 06 INCF 0x12 , W INCF 0x11 , W CALL Label_000D CALL Label_000E CALL Label_001D INCF 0x16 , W INCF 0x11 , W NOP INCF 0x12 , W INCF 0x11 , W INCF 0x16 , W INCF 0x11 , W ADDLW 0x21 INCF 0x12 , W INCF 0x11 , W SUBLW 0x28 SUBLW 0x28 DECF 0x12 , W DECF 0x13 , W INCFSZ EEDATA , W ; ???? SWAPF EEDATA , W XORLW 0x00 RETLW 0x28 XORLW 0x08 BCF 0x3A , 04 DECF 0x19 , W GOTO Label_001E IORWF 0x3A , W DECF 0x19 , W ; ???? IORWF 0x28 , W XORLW 0x08 BCF 0x3A , 04 DECF 0x19 , W RETLW 0x28 IORWF 0x28 , W ; ???? ; ???? DECF 0x19 , W GOTO Label_001E CLRW DECF 0x19 , W MOVLW 0x28 IORWF 0x28 , W BCF 0x28 , 04 INCF 0x12 , W INCF 0x11 , W Label_0009 IORLW 0x28 DECF 0x12 , W DECF 0x13 , W XORWF 0x16 , W NOP NOP NOP XORWF 0x12 , W INCF 0x16 , W INCF 0x11 , W MOVLW 0x21 INCF 0x12 , W INCF 0x11 , W DECF 0x16 , W CALL Label_001A CALL Label_000D INCF 0x16 , W INCF 0x11 , W BCF 0x24 , 06 INCF 0x12 , W INCF 0x11 , W INCF 0x16 , W INCF 0x11 , W ANDLW 0x23 INCF 0x12 , W INCF 0x11 , W INCF 0x16 , W INCF 0x11 , W CALL Label_001F INCF 0x12 , W INCF 0x11 , W INCF 0x16 , W INCF 0x11 , W ADDLW 0x21 INCF 0x12 , W INCF 0x11 , W DECFSZ 0x17 , W DECFSZ 0x13 , W DECF 0x13 , W DECF 0x12 , W Label_0007 MOVF INDF , W CALL Label_0020 IORLW 0x00 ; ???? ANDLW 0x00 GOTO Label_0021 DECF 0x13 , W DECF 0x12 , W MOVF INDF , W BSF INDF , 00 NOP NOP NOP NOP NOP NOP ADDLW 0x3F ADDLW 0x3F 想自己试着翻译,但是没有一点头绪 [/table]

大家帮我看看这个我哪里理解错了

再ds1302时钟芯片里面有这么一个函数 void write_ds1302_byte(uchar dat) { uchar i; for(i=0;i>1; sck=1; } } 就是将命令dat由低位到高位写入io中,也就是是命令写入函数 。 正确的理解是例如 dat=0x45即dat=0100 0101和0x01进行‘’“&”运算, i=0时,屏蔽掉前七位 即0100 0101&0000 0001=0000 0001,此时io 的最低位是1.dat右移一位 dat=0010 0010 i=1时,屏蔽掉前七位即0010 0010&0000 0001=0000 0000,此时io 的次低位时0.dat右移一位dat=0001 0001 . . .直到i=8,就将dat=0100 0101写入到io中。 但是我的理解是依据上面的函数 i=0; dat=0x45即dat=0100 0101时,io=dat&0x01 此时io=0000 0001;dat右移一位 dat=0010 0010; i=1; dat=0010 0010 此时 io=dat&0x01; 即io=0010 0010&0000 0001=0000 0000; dat右移一位dat=0001 0001 i=3; dat=0001 0001此时io=dat&0x01 即io=0001 0001&0000 0001 =0000 0001 直到i=7,最后的io值是0000 0000 并不等于dat 0x45啊 求大神我错在哪里了?