搜索
bottom↓
回复: 13

200莫元请懂汇编的高手转一段代码

[复制链接]

出0入0汤圆

发表于 2012-7-21 19:24:44 | 显示全部楼层 |阅读模式
产生报警音
;本实例的目的是让大家学会用单片机产生声音的方法,学会计算程序所用时间
;本实例的功能是能PIC16F84产生报警音,频率分两个0.1s第一个
;0.1S频率从1.8K-3.5K匀速增加第二个0.1S频率从3.5K-1.8K匀速减少,
;程序复位后,蜂鸣器开始报警
;盛方单片机学习网-----www.sfmcu.com
;烧写时应注意:配置位已经在程序中写明,加载HEX文件时会自动加载,烧写时不用再手动设置配置位。
;实验时请注意套件跳线选择;
;*****************************************************
  LIST P=16F84A,R=DEC         ;定义器件,默认为十进制
;-----------------------------------------------------
  __CONFIG B'11111111110001';_CP_OFF&_WDT_OFF&_PWRITE_ON&_XT_OSC
                                              ;没有代码保护
                                              ;看门狗关闭
                                              ;上电廷时器开启
                                              ;振荡器模式为XT
;-----------------------------------------------------
RTCC EQU 01H                ;定义各寄存器
PC EQU 02H
STATUS EQU 03H
C EQU 0
RP0 EQU 5
;----------------------
PORTA EQU 05H

TRISA EQU 05H
;-----------------------
SOUNDDELAY1 EQU 10H    ;声音频率变化计数器,从1.8~3.55KHZ
FRE_COUNT EQU 11H      ;同一频率的重复次数保存地址
FRE_REPEAT EQU 12H   
SOUND_TEMP EQU 13H
TEMP EQU 14H           ;暂存寄存器
S_LOOP EQU 46          ;93-47=46
S_MAX EQU 93           ;最低频率1.8K  93*3=280US*2
S_MIN EQU 47           ;最高频率3.55K  47*3=140*2
S_REPEAT EQU 4         ;同一频率重复次数
;--------------------
    ORG 0000H
MAIN
    CLRF PORTA         ;初始化IO口

    BSF STATUS,RP0     ;设置数据寄存器体1
    MOVLW 0000000B
    MOVWF TRISA        ;设置RA端口全部为输出
    BCF STATUS,RP0     ;恢复数据寄存器体0
LOOP
    CALL SOUND200MS    ;调用报警200MS子程序
    GOTO LOOP         ;反复循环报警
;-------------------------------
SOUND200MS
    MOVLW S_LOOP
    MOVWF FRE_COUNT     ;46=93-47 最低频率的计数减去最高频率的计数等于频率变化的次数
SOUND_LH_LP
    MOVLW S_REPEAT      ;同一频率重复次数送FRE_REPEAT
    MOVWF FRE_REPEAT
    MOVFW FRE_COUNT
    ADDLW S_MIN        ;计数值加最小值
    MOVWF TEMP
REPEAT0_LP
    MOVFW TEMP
    BSF PORTA,0      
    CALL SOUNDDELAY0   ;廷时W*3US
    BCF PORTA,0
    MOVFW TEMP
    CALL SOUNDDELAY0
    DECFSZ FRE_REPEAT,1 ;每四次减频率计数一次
    GOTO REPEAT0_LP
    DECFSZ FRE_COUNT,1
    GOTO SOUND_LH_LP
SOUND_HL
    MOVLW S_LOOP
    MOVWF FRE_COUNT   ;46=93-47
SOUND_HL_LP
    MOVLW S_REPEAT    ;同一频率重复次数送FRE_REPEAT
    MOVWF FRE_REPEAT
    MOVFW FRE_COUNT
    SUBLW S_MAX       ;最大值减计数值
    MOVWF TEMP
REPEAT1_LP
    MOVFW TEMP
    BSF PORTA,0
    CALL SOUNDDELAY0    ;廷时W*3US
    BCF PORTA,0
    MOVFW TEMP
    CALL SOUNDDELAY0
    DECFSZ FRE_REPEAT,1;四次减频率计数一次
    GOTO REPEAT1_LP
    DECFSZ FRE_COUNT,1
    GOTO SOUND_HL_LP
SOUND_END
    RETLW 0
;------------------------------
SOUNDDELAY0
    MOVWF SOUNDDELAY1     ;廷时W*3US+1US
SOUNDDELAYUS_1
    DECFSZ SOUNDDELAY1,1
    GOTO SOUNDDELAYUS_1
    RETLW 0
;------------------------
    END




我只会用C,有能力的朋友请帮帮忙

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-7-21 19:38:39 | 显示全部楼层
200莫元??  我好奇的是你怎么支付?

出0入0汤圆

发表于 2012-7-21 19:48:52 | 显示全部楼层
楼主来逗大家的

出0入0汤圆

发表于 2012-7-21 19:55:11 | 显示全部楼层
转成C吗?

出0入0汤圆

 楼主| 发表于 2012-7-21 20:04:45 | 显示全部楼层
wzda_gundam 发表于 2012-7-21 19:55
转成C吗?

对,转成C

出0入0汤圆

 楼主| 发表于 2012-7-21 20:06:24 | 显示全部楼层
高手请帮帮忙,要不支付人民币也行,觉得多少合适了,太多我支付不起,我也只是学习想做个报警声音
有愿意帮忙的请根贴

出0入0汤圆

发表于 2012-7-21 20:16:53 | 显示全部楼层
不会PIC的汇编

出0入0汤圆

 楼主| 发表于 2012-7-21 20:18:00 | 显示全部楼层

出0入0汤圆

发表于 2012-7-21 20:42:54 | 显示全部楼层
这个汇编程序有它的特点,一看便知道是从“PIC单片机学习网”的网站实例中转来的,连错字都一样。
不过好似被删掉了一些行。
可惜,懂点汇编,不会C。200无缘!

出0入0汤圆

发表于 2012-7-21 20:58:22 | 显示全部楼层
尝试一下,不知对否。用C生成的延时或者不对。
typedef   unsigned char  uint8;

#define        S_LOOP                46
#define S_MAX                93
#define S_MIN                47
#define S_REPEAT        4

uint8        SOUNDDELAY1;
uint8        FRE_COUNT;
uint8        FRE_REPEAT;
uint8        SOUND_TEMP;
uint8        TEMP;




void SOUNDDELAY0(uint8 Delay)
{
   while(--Delay);
}


void SOUND200MS(void)
{
   uint8 Temp;

   FRE_COUNT = S_LOOP;
   do
   {  
     FRE_REPEAT = S_REPEAT;
     Temp = FRE_COUNT+S_MIN;  
      do
      {      
        PORTA &= 0xfe;  //注意读修改写
        SOUNDDELAY0(Temp);
        PORTA  |= 0x01;
        SOUNDDELAY0(Temp);
      }while (--FRE_REPEAT);  
   }while (--FRE_COUNT);

   FRE_COUNT = S_LOOP;
   do
   {  
     FRE_REPEAT = S_REPEAT;
     Temp = S_MAX - FRE_COUNT;  
      do
      {      
        PORTA &= 0xfe;
        SOUNDDELAY0(Temp);
        PORTA  |= 0x01;
        SOUNDDELAY0(Temp);
      }while (--FRE_REPEAT);
   }while (--FRE_COUNT);


}


void main(void)
{
  PORTA = 0x00;
  TRISA = 0X00;
  while (1)
  {
     SOUND200MS();
  }

}

出0入0汤圆

发表于 2012-7-21 21:13:48 | 显示全部楼层
LS的比我快了一步

出0入0汤圆

 楼主| 发表于 2012-7-21 21:56:41 | 显示全部楼层
谢谢楼上的,我先看看程序,主要是学习,举一反三

出0入0汤圆

发表于 2013-1-18 14:24:58 | 显示全部楼层
楼主有1937的汇编例程吗?

出0入21汤圆

发表于 2013-1-18 14:50:44 | 显示全部楼层
下载了c,有机会试试,谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-17 12:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表