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){}
}