导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→320hz信号发生程序[zhangliang946]

 *第18022篇: 320hz信号发生程序

  
楼 主:zhangliang946 2007年9月2日11:39
 320hz信号发生程序
这是我做的程序,发生320赫兹,不用DA直接PWM输出,如果大家要就拿去吧!里边的tab。c是我用keil编的字表自动生成程序,如果用标准c编译,会生成文本文件形式的字表。这个字表生成字节的数量在程序开头的宏定义中设定,使用很方便。这个程序是给一个公司写的,里边有些与频率输出无关,大家忍着看吧!
  第一次注册登陆论坛,给大家一个见面礼。以谢往日只看不发的罪过。
  
2楼:zhangliang946 2007年9月2日11:50
 我的附件怎莫没上来,那就贴上来吧
;河北工程大学创新实验室
SIN_OUT         EQU    P1.3    ;     信号输出引脚
LOW_OUT_3       EQU    P1.4    ;     某小时后输出3秒高脉冲引脚
HIGH_OUT_6      EQU    P1.2    ;     出波后六秒高脉冲引脚
BEEP            EQU    P3.7    ;     蜂鸣器引脚
WAT_DOG         EQU    P3.5    ;     看门狗引脚
SOUND           EQU    P3.4    ;     音响

NUM1            EQU    30       ;2 HOUR   30        重启继电器的低电平发生时间设定
NUM2            EQU    60       ;4 HOUR   60
NUM3            EQU    120       ;8 HOUR   120
NUM_LOW         EQU    240       ; 240      240*15=3600

NUM4            EQU    10       ;蜂鸣器和音响的定时长度
NUM5            EQU    20       ;
;==============================================================================
        ORG 0000H
RESE:   AJMP CLKR
 ORG 000BH           ;T0
 AJMP CLK1
        ORG 0013H           ;INT1中断入口
        AJMP INT_1
        ORG 001BH           ;T1
        AJMP CLK2

 ORG 0025h
CLKR:   MOV  TMOD,#12H
 MOV  TH0,#216    ;216
 MOV  TL0,#216    ;us//24m 晶振
        MOV  TH1,#3ch
        MOV  TL1,#0afh   ;25ms

        SETB PT0
        SETB ET0
        SETB ET1
        SETB EX1            ;开INT1中断允许位
        SETB IT1            ;设置触发方式为边沿触发
        SETB TR1
 SETB EA

        CLR  HIGH_OUT_6
        SETB LOW_OUT_3      ;四小时后输出3秒高脉冲,引脚设定为低
        SETB BEEP
        SETB SOUND

        MOV 21H,#40         ;24m/40 ci
        MOV 25H,#3          ;1 MIAO
        MOV 2AH,#00H        ;外中断触发后计数单元

        CLR  20H.0          ;是否到达某小时标志  FLAG
        CLR  20H.3          ;外中断到达标志      ;20h作标志位数据区  2DH      20h.5
        CLR  20H.4          ;BIAOZHI .. KEY
        ;=========================
 MOV  A,P1             ;初始各定时值设定
 ORL  A,#00011111B
 MOV  22H,A
        MOV  29H,A
        MOV  A,#00H
        JB   22H.7,LOOP0      ;key1
        SETB 20H.4
        ADD  A,#NUM1
LOOP0:  JB   22H.6,LOOP1      ;key2
        SETB 20H.4
        ADD  A,#NUM2
LOOP1:  JB   22H.5,LOOP2      ;key3
        SETB 20H.4
        ADD  A,#NUM3
LOOP2:
        JB   20H.4,LOOP3     ;异常情况处理  非正常按键方式时,状态为2小时
        MOV  24H,#NUM1
        MOV  2CH,#NUM1
        AJMP LOOP4
LOOP3:  MOV  24H,A
        MOV  2CH,A
LOOP4:  MOV  23H,#NUM_LOW    ;240

        ;========================
        CLR  20H.4           ;10 SEC|20 SEC 设定
        MOV  A,P1
        ORL  A,#11111100B
        MOV  22H,A
        ANL  29H,A           ;标志同样存放在29H中
        MOV  A,#00H
        JB   22H.1,LOOP5
        ADD  A,#NUM4
        SETB 20H.4
LOOP5:  JB   22H.0,LOOP6
        ADD  A,#NUM5
        SETB 20H.4
LOOP6:
        JB   20H.4,LOOP7
        MOV  2BH,#NUM4        ;计数值存放在2BH中
        AJMP LOOP8
LOOP7:  MOV  2BH,A            ;默认值为10秒
LOOP8:  ;========================

;======================================================
MAIN:   setb WAT_DOG
        CLR  WAT_DOG
        JNB 20H.3,MAIN   ;判断外中断是否到来
 MOV DPTR,#TAB1  ;2
PP0:    MOV 26H,#80     ;2
PP:     MOV A,#0        ;1
 MOVC A,@A+DPTR  ;2

TT1:    setb WAT_DOG
        CLR  WAT_DOG
        JNB 20H.2,TT1     ;2
 CLR 20H.2         ;1

 MOV 27H,#8      ;2
 MOV 28H,A       ;1

TT:     MOV A,28H       ;1
 RRC A           ;1
 MOV 28H,A       ;1
 MOV  SIN_OUT,C  ;2        输出口

        DJNZ 27H,TT     ;2

 INC DPTR        ;1
 DJNZ 26H,PP     ;2
 JMP  MAIN       ;2
;=================================
;定时器T0  实现波形输出标志位的设定
;=================================
 ORG  0E0H
CLK1:   SETB 20H.2
 RETI
;=================================
;定时器T1 实现四小时定时和3秒低脉冲
;=================================
        ORG 0F0H
CLK2:   PUSH ACC
        PUSH PSW
        MOV  TH1,#3ch
        MOV  TL1,#0afh       ;25ms /24M晶振

        JNB  20H.3,LOOP101
        MOV  A,21H
LOOP100:CJNE A,#20,LOOP101
        CPL  BEEP
LOOP101:
        DJNZ 21H,KK8
        MOV  21H,#40        ;1秒钟到
        AJMP KK9
KK8:    LJMP RET1
KK9:
        ;=======================================
        JNB 20H.3,KK3       ;外中断到达后计时

        INC  2AH
        MOV  A,2AH
        CJNE A,#6,KK4        ;输出波形6s后停止输出
        CLR  TR0             ;关中断t0
        CLR  20H.2           ;重设置标志位,停止输出脉冲
KK4:
        CJNE A,#6,KK5        ;判断四秒高脉冲是否到时间
        CLR  HIGH_OUT_6      ;设为低
KK5:
        CJNE A,2BH,KK6      ;蜂鸣器判断
        SETB BEEP           ;关蜂鸣器
        SETB SOUND          ;音响关
        ;==============================
        CLR  20H.3          ;清各标志位    放在这里是因为蜂鸣器时间最长
        AJMP KK3            ;输出结束
        ;==============================
KK6:

        ;========================================
KK3:    MOV   A,P1           ;=====================
        ORL   A,#00011100B
        CJNE  A,29H,SET4    ;有改变
        AJMP  KK2
SET4:
        CLR  20H.4
        MOV  22H,A
        MOV  29H,A
        MOV  A,#00H
        JB   22H.7,SET5      ;key1
        SETB 20H.4
        ADD  A,#NUM1
SET5 :  JB   22H.6,SET6      ;key2
        SETB 20H.4
        ADD  A,#NUM2
SET6:   JB   22H.5,SET7      ;key3
        SETB 20H.4
        ADD  A,#NUM3
SET7:
        JB   20H.4,SET8     ;异常情况处理  非正常按键方式时,状态为2小时
        MOV  24H,#NUM1
        MOV  2CH,#NUM1
        AJMP SET9
SET8:   MOV  24H,A
        MOV  2CH,A
SET9:   MOV  23H,#NUM_LOW    ;240

        ;========================
        CLR  20H.4           ;10 SEC|20 SEC 设定
        MOV  A,P1
        ORL  A,#11111100B
        MOV  22H,A
        ANL  29H,A           ;标志同样存放在29H中
        MOV  A,#00H
        JB   22H.1,SET10
        ADD  A,#NUM4
        SETB 20H.4
SET10:  JB   22H.0,SET11
        ADD  A,#NUM5
        SETB 20H.4
SET11:
        JB   20H.4,SET12
        MOV  2BH,#NUM4        ;计数值存放在2BH中
        AJMP SET13
SET12:  MOV  2BH,A            ;默认值为10秒
SET13:  ;========================
        CLR  20H.0           ;是否到达四小时标志  FLAG
        SETB LOW_OUT_3

KK2:    ;========================================
        JB   20H.0,RET2       ;* HOUR
        DJNZ 24H,RET1
        MOV  24H,2CH
        DJNZ 23H,RET1
        MOV  23H,#NUM_LOW             ;240
        CLR  LOW_OUT_3
        SETB 20H.0
        AJMP RET1
RET2:   DJNZ 25H,RET1
        MOV  25H,#3
        SETB LOW_OUT_3
        CLR  20H.0
RET1:   POP  PSW
        POP  ACC
        RETI
;====================================
;INT1中断
;====================================
       ORG 1C0H
INT_1:
       SETB TR0
       SETB 20H.3     ; INT1 FLAG
       SETB HIGH_OUT_6    ;六秒高脉冲引脚设定
       CLR BEEP           ;蜂鸣器开启
       CLR SOUND          ;音响开
       MOV 21H,#40       ;1秒钟计数值  为了输出信号时间的准确而设定
       MOV 2AH,#00H
       RETI
tab1:   db 0fh,0fh,0fh,0fh,1fh,1fh,1fh,3fh,3fh,3fh
        db 3fh,7fh,7fh,7fh,7fh,7fh,7fh,7fh,7fh
        db 7fh,0ffh,7fh,7fh,7fh,7fh,7fh,7fh,7fh
        db 7fh,7fh,3fh,3fh,3fh,3fh,1fh,1fh,1fh
        db 0fh,0fh,0fh,0fh,7h,7h,7h,3h,3h,3h,1h,1h
        db 1h,1h,0h,0h,0h,0h,0h,0h,0h,0h,0h,0h
        db 0h,0h,0h,0h,0h,0h,0h,0h,0h,1h,1h,1h
        db 1h,3h,3h,3h,7h,7h,7h

 END
//////////////////////////////////////////
//tab。c
#include   <reg52.h>  
#include   <stdio.h>  
#include   <math.h>  

#define num   80
main ()
{


unsigned int c[num+1];
float f[num+1];
float pi=3.1415926;
unsigned char i,k;

///////////////////////////////////
SCON  = 0x50;
TMOD |= 0x20;
TH1   = 0xFA;
TR1   = 1;
TI    = 1;
PCON |= 0x80;
TMOD = (TMOD & 0xF0) | 0x05;
TR0 = 1;
///////////////////////////////////
k=0;
for(i=0;i  <=num;i++)
{
   f[i]=i*pi*2.0/num;
   f[i]=8*(sin(f[i])+1)/2;
   c[i]=(unsigned int)f[i];
   switch(c[i])
   {
  case 0:c[i]=0; break;
  case 1:c[i]=1; break;
  case 2:c[i]=3; break;
  case 3:c[i]=7; break;
  case 4:c[i]=15;break;
  case 5:c[i]=31;break;
  case 6:c[i]=63;break;
  case 7:c[i]=127;break;
  case 8:c[i]=255;break;
  default:c[i]=0; 
   }

   k++;
   if(k==10)
   {
   k=0;
   printf ("\"%xH\"\n",c[i]);
   }
   else
   printf("\"%xH\"\t\t\t\t\t",c[i]);

}


while(1){}
  
}



点击浏览该文件


>>>>>>对该主题发表你的看法

本主题贴数2,分页: [第1页]


[上一篇主题]:急求LMH6702内部电路原理图!!!

[下一篇主题]:小弟用2051时候出现个问题