找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3613|回复: 6
收起左侧

不会汇编,请把以下程序翻译成C语言,用于STC12C5608AD芯片使用,万分感谢。

[复制链接]
ID:108715 发表于 2017-3-24 20:30 来自手机 | 显示全部楼层 |阅读模式
200黑币
看门狗测试程序,在STC的下载板上可以直接测试
/*------------------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 1T 系列单片机 看门狗及其溢出时间计算公-------*/
/* --- Mobile: (86)13922805190 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -----------------------*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
;本演示程序在STC-ISP Ver 4.86.PCB的下载编程工具上测试通过,相关的工作状态在P1口上显示
;看门狗及其溢出时间 = (12 * Pre_scale *32768)/Oscillator frequency
WDT_CONTR EQU 0E1H ;看门狗地址
WDT_TIME_LED EQU P1.5                   ;用 P1.5 控制看门狗溢出时间指示灯,
                  ;看门狗溢出时间可由该指示灯亮的时间长度或熄灭的时间长度表示
WDT_FLAG_LED EQU P1.7
                                    ;用P1.7控制看门狗溢出复位指示灯, 如点亮表示为看门狗溢出复位
Last_WDT_Time_LED_Status EQU 00H ;位变量,存储看门狗溢出时间指示灯的上一次状态位
;WDT复位时间(所用的Oscillator frequency = 18.432MHz):
;Pre_scale_Word EQU 00111100B          ;清0,启动看门狗,预分频数=32, 0.68S
Pre_scale_Word EQU 00111101B          ;清0,启动看门狗,预分频数=64, 1.36S
;Pre_scale_Word EQU 00111110B          ;清0,启动看门狗,预分频数=128, 2.72S
;Pre_scale_Word EQU 00111111B          ;清0,启动看门狗,预分频数=256, 5.44S
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN:
MOV A, WDT_CONTR          ;检测是否为看门狗复位
ANL A, #10000000B
JNZ WDT_Reset          ;WDT_CONTR.7 = 1, 看门狗复位, 跳转到看门狗复位程序
;WDT_CONTR.7 = 0,上电复位, 冷启动,RAM单元内容为随机值
SETB Last_WDT_Time_LED_Status         ;上电复位,
         ;初始化看门狗溢出时间指示灯的状态位 = 1
CLR WDT_TIME_LED          ;上电复位, 点亮看门狗溢出时间指示灯
MOV WDT_CONTR, #Pre_scale_Word ;启动看门狗
WAIT1:
SJMP WAIT1                   ;循环执行本语句(停机),等待看门狗溢出复位
;WDT_CONTR.7 = 1,看门狗复位, 热启动, RAM 单元内容不变, 为复位前的值
WDT_Reset:                   ;看门狗复位, 热启动
CLR WDT_FLAG_LED          ;是看门狗复位,点亮看门狗溢出复位指示灯
JB Last_WDT_Time_LED_Status, Power_Off_WDT_TIME_LED
                                                      ;为1熄灭相应的灯,为0亮相应灯
;根据看门狗溢出时间指示灯的上一次状态位设置 WDT_TIME_LED 灯,
;若上次亮本次就熄灭, 若上次熄灭本次就亮
CLR WDT_TIME_LED                   ;上次熄灭本次点亮看门狗溢出时间指示灯
CPL Last_WDT_Time_LED_Status          ;将看门狗溢出时间指示灯的上一次状态位取反
WAIT2:
SJMP WAIT2                                    ;循环执行本语句(停机),等待看门狗溢出复位
Power_Off_WDT_TIME_LED:
SETB WDT_TIME_LED                   ;上次亮本次就熄灭看门狗溢出时间指示灯
CPL Last_WDT_Time_LED_Status          ;将看门狗溢出时间指示灯的上一次状态位取反
WAIT3:
SJMP WAIT3                                    ;循环执行本语句(停机),等待看门狗溢出复位
END
回复

使用道具 举报

ID:155507 发表于 2017-3-24 20:30 | 显示全部楼层

  1. #include <reg52.h> //此文件中定义了单片机的一些特殊功能寄存器

  2. //WDT复位时间(所用的Oscillator frequency = 18.432MHz):
  3. //#define Pre_scale_Word 0x3C // EQU 00111100B          ;清0,启动看门狗,预分频数=32, 0.68S
  4. #define Pre_scale_Word 0x3D  // EQU 00111101B          ;清0,启动看门狗,预分频数=64, 1.36S
  5. //#define Pre_scale_Word 0x3E // EQU 00111110B          ;清0,启动看门狗,预分频数=128, 2.72S
  6. //#define Pre_scale_Word 0x3F // EQU 00111111B          ;清0,启动看门狗,预分频数=256, 5.44S


  7. sfr WDTRST = 0xE1; // 看门狗地址

  8. sbit  WDT_TIME_LED=P1^5;  // ;用 P1.5 控制看门狗溢出时间指示灯,
  9.                                                 //  ;看门狗溢出时间可由该指示灯亮的时间长度或熄灭的时间长度表示
  10. sbit  WDT_FLAG_LED=P1^7;  // ;用P1.7控制看门狗溢出复位指示灯, 如点亮表示为看门狗溢出复位


  11. unsigned char Last_WDT_Time_LED_Status =0; //;位变量,存储看门狗溢出时间指示灯的上一次状态位

  12. void main(void)
  13. {

  14.    if( (WDTRST & 0x80) ) //;检测是否为看门狗复位
  15.    { // ;看门狗复位, 热启动
  16.          WDT_FLAG_LED= 0; //;是看门狗复位,点亮看门狗溢出复位指示灯
  17.                                                         //;为1熄灭相应的灯,为0亮相应灯
  18.          if( Last_WDT_Time_LED_Status) //         ;根据看门狗溢出时间指示灯的上一次状态位设置 WDT_TIME_LED 灯,
  19.                                                                         //;若上次亮本次就熄灭, 若上次熄灭本次就亮
  20.          {
  21.                 WDT_TIME_LED =1; // ;上次熄灭本次点亮看门狗溢出时间指示灯
  22.            Last_WDT_Time_LED_Status = ~Last_WDT_Time_LED_Status; // ;将看门狗溢出时间指示灯的上一次状态位取反

  23.          }
  24.    }
  25.    else
  26.    { // ;上电复位,
  27.          Last_WDT_Time_LED_Status = ~Last_WDT_Time_LED_Status; //  ;将看门狗溢出时间指示灯的上一次状态位取反
  28.          WDT_TIME_LED =0; // ;上次熄灭本次点亮看门狗溢出时间指示灯
  29.          WDTRST = Pre_scale_Word; // ;启动看门狗
  30.    }

  31.    while(1); //  ;循环执行本语句(停机),等待看门狗溢出复位

  32. }

复制代码
回复

使用道具 举报

ID:142559 发表于 2017-3-25 16:57 | 显示全部楼层
大哥,汇编改C语言,也就你有空去弄。要不从新造个资料,要不学汇编
回复

使用道具 举报

ID:108715 发表于 2017-3-25 23:11 来自手机 | 显示全部楼层
归依龙井 发表于 2017-3-25 16:57
大哥,汇编改C语言,也就你有空去弄。要不从新造个资料,要不学汇编

可是没有C语言的资料啊。官方只有这个汇编,看不懂啊。
回复

使用道具 举报

ID:151348 发表于 2017-3-26 10:07 | 显示全部楼层
找个其他型号同类型单片机的看门狗程序试试
回复

使用道具 举报

ID:162841 发表于 2017-3-26 14:27 来自手机 | 显示全部楼层
干嘛去弄汇编,c语言多简单
回复

使用道具 举报

ID:183789 发表于 2017-3-27 14:03 | 显示全部楼层
把程序看明白,在用C语言写就好了哈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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