-
使用
C
语言编写单片机中断应
< br>【例
7-1
】
设系统时钟频率为
P20 = !P20;
p>
//
将
P2.0
取
反
用程序时,用中断号
6MHz
,利用
T0
定时
,每隔
1s
i = 20;
//<
/p>
重新
给
计数
变<
/p>
区分每一个中断。例如,
将
P2.0
的状态取反。
量赋值
void
X0_ISR(void)
interrupt
0{}
p>
解:
所要求的定时时间
1s
超过
}
}
//
外
部中断
0
中断函数
了定时器的定时能力(时钟频
下面举
例说明
12T
模式下,
void
T0_ISR
(void)
interrupt
1{}
率为
6MHz
,
12
分频时,
16
位
//
定时器
T0
中断函数
S
TC12C5A60S2
单片机串行通
定
时
器
的
最
长
定
时
时
间
p>
为
void
X1_ISR(void)
interrupt
2{}
p>
131.072ms
)
信程序的编制方法。
,所以无法采用定
//
外部中断
1
中断函数
【例
8-1
】
设有甲、乙两台单
时器直接实现
1s<
/p>
的定时。
void T1_ISR
(void)
interrupt
3{}
将
定
时
器
的
定<
/p>
时
时
间
设
为
片机,编写程序,使两台单片
//
定时器
T1
中断函数
机间实现如下串行通信功能。
50ms
,在中断服务程序中对定
void
UART1_ISR
(void)
(
假
设
系
统
时
钟
为
时器溢出中断请求进行计数,<
/p>
interrupt
4{}
//
串行口
1
中断<
/p>
11.0592MHz
。
)
当计够
20
次时,将
p>
P2.0
的状
函数
甲机(
发送
机)
:将
首址为
态取反,
否则直接返回主
程序,
void
ADC_ISR
(void)
interrupt
ADDRT
的
128
字节外部
RAM
从而达到
1s
的
定时。
5{}
//ADC
中断函数
数据块顺序向乙机发送;
选择
T0
为
16
位定时器
方式,
【例
5-1
】
< br>编程实现通过延时函
乙机
(接收机)
:
将接收的数据,
方式字为
01H
。系统时钟频率
数,
P1.0
输出方波信号,并通
顺序存放在以首址为
ADD
RR
为
6MHz
,
12
分频时,计数单
过示波器观察程序输出波形的
的外部
RAM
中。
<
/p>
位时间间隔为
2
μ
s
。
T0
的计数
周期。
甲机
(发送机)
汇编语言程序:
初值为:
#include
“
stc12.h”
$$INCLUDE
()
;
包
//STC12C5A60S2
单片机寄存
含单片机寄存器定义文件
$$INCLUDE
()
;
器定义头文件
包含
STC12C5A60S2
寄存器定
< br>
ORG 0000H
sbit
P10=P1^0;
//
定义
P1.0
引
LJMP
MAINT
义文件
脚
;
主程序入口
ORG
0000H
void
delay(unsigned
long
cnt);//
ORG
0023H
LJMP
MAIN
p>
;
转
延时函数声明
LJMP
INTSE1
;
串口
1<
/p>
主程序
void main(void) {
中断服务程序入口
ORG
000BH
P10=1;
ORG
0100H
;T0
中断服务程序入口地址
while(1)
//
主程序循环
MAINT:
MOV
SP,#60H
LJMP
T0_ISR
{delay(60000);
;
p>
设
置
堆
栈
指
针
ORG
0100H
P10=~P10;
}
}
MOV
SCON,#01000000B
;
置
MAIN:
MOV
SP,#60H
void
delay(unsigned
;
设置堆栈指针
串行口工作方式
1
long
cnt)
//
延时函数
MOV
TMOD,#01H
;T
初始化
MOV
TMOD,#20H
;
定
{
while(cnt>0)
cnt--;
}
MOV
TL0,#58H
时器
1
为工作方式
2
MOV
TH0,#9EH
MOV
TH1,#0FDH
;
9600b
ps
如图所示的中断线路可实现系
MOV
A,#20
;加器
A
置
20
的时间常数
统的故障显示,当系统的各部
SETB
T0
;
允外
T0
中
断
MOV
TL1,#0FDH <
/p>
分工作正常时,
4
个故障源输
SETB
EA
;CPU
开中断
SETB
TR1
;
启动定时器
1
入端全为低电平,指示灯全熄
SETB
TR0
;
启动
T0
计数
SETB
ES
;
串行口开中断
灭。若当某部分出现故障,则
SJMP
$$
;
等待
SETB
EA
;
开中断
对应的输入线由低电平变为高
T0_ISR:
MOV
TL0,#58H
MOV DPTR,#ADDRT; ADDR
T
电平,从而引起单片机中断,
MOV
TH0,#9EH
;
重
是首址,可以使用
EQ
U
定义
试设计判定故障源的程序,并
新装入时间常数
MOV
R0,#00H
;字节数初值
进行相应的灯光显示。
DEC
A
;
累加器
A
内容减
1
MOVX
A,@DPTR
;
取
解:通过或非门,将上升沿转
JNZ
EXIT
第一个发送字节
换为下降沿,利用下降沿中断
CPL
P2.0
MOV
SBUF,A
;
启动串行口发
方式实现。
MOV
A,#20
;
送
汇编语言程序如下:
累加器
A
重载
20
SJMP $$
;
等待中断
ORG
0000H
EXIT:
RETI
LJMP
MAIN
;
转主程序
END
;
中断服务程序
ORG
0003H
程序中的符号“
$$
”表示“本条
INTSE1:
CLR
TI
LJMP
INT_X0
;
转中断服
指令地址”
,指令“
SJMP
$$
”
;
将中断标志清零
务程序
相
当
于
:“
HERE:
LJMP
CJNE
R0,#7FH
,LOOPT
ORG
0100H
HERE
”
。
;
判断
128B
是否发送完
,
若没完
,
MAIN:
MOV
SP,#60H
#include
“
stc12.h
”
//
包
则转
MOV
P2,#0FFH
;
p>
指示灯全熄
含
STC12C5A60S2<
/p>
的寄存器定
CLR
ES
全部发送完毕,
禁止
灭
义文件
串行口中断
SETB
IT0
;
为边沿触发中
sbit
P20=P2^0;
//
声明
P2.0
LJM
P
ENDT
;
转中断返回
断方式
的引脚位变量
LOOPT:
INC
R0
SETB
EX0
;
允许中断
unsigned
char i;
//
声明计数
;
修改计数值
SETB
EA
;
CPU
开中断
变量。
C
语言程序中尽量不要
INC
DPTR
;
修改地址指针
SJMP
$$
;
等待中断
使用
ACC
MOVX
A,@DPTR
;
取发送
INT_X0:
MOV
A,P1
;
对
void main
(void)
数据
应关系:
LED0--P2.0--
P1.0
,其
{
MOV
SBUF,A
启动串行口
他类推
//SP=0x60;
//
使用
C
语言设
END
T:
RETI
;
中断返回
CPL
A
计程序时,可以不设置堆栈指
END
ANL
A,#0FH
针
MOV
P2,A
TMOD=0x01;
乙机接收汇编语言程序:
RETI
END
TL0=0x58;
$$INCLUDE
()
;
包
对应的
C
语言版程序
:
TH0=0x9E;
含单片机寄存器定义文件
#include
“
stc12.h
”
i=20; //
计数变量赋初值
ORG
0000H
//
包含寄存器定义头文
ET0=1;
//
允许
T0
中断
LJMP
MAINR
;
转主程序
件
EA
= 1;
//
开放总的中断
ORG
0023H
void
X0_ISR
(void)
interrupt
0
TR0=1;
//
启动
T0
计数
LJMP
INTSE2
//
外部中断函数
while(1);
//
等待中断
;
串口
1
中断服务程序入口
{
P2=~P1;
}
}
ORG
0100H
void main (void)
void
T0_ISR
(void)
interrupt
1
MAINR:MOV
SP,#60H
{unsigned char i;
//
定时器
T0
中断
函数
;
设置堆栈指针
P2=0x0f
//
熄灭所有的指示灯
{
MOV
SCON,#01010000B
;
置
IT0=1;
< br>//
外部中断
0
为边沿触
TL0=0x58;
//
重新
装
入时
间
串行口工作方式<
/p>
1
,允许接收
发方式
常数
MOV
TMOD,#20H
;
定时器
1
EX0=1;
//
允许外部中断
0
TH0=0x9E;
为工作方式
2
EA
=1;
//
允许总的中断
i--
//
计数变量减
1
MOV
TH1,#0FDH
;
产
生
while(1);
//
等待中断
if
(i==0) {
//
若减到
0
,
9600bps
的时间常数
}
则将
P2.0
取反
MOV
TL1,#0FDH
SETB
TR1
;
启动定时器
1
SETB
ES
;
串行口开中断
SETB
EA
;
开中断
MOV
DPTR,#ADDRR
;
数
据缓冲区首址送
DPTR
MOV
R0,#00H
;
置传送字
节数初值
SJMP
$$
;
等待中断
;
中断服务程序
INTSE2:CLRRI
;
清接收
中
断标志
MOV
A,SBUF
;
取
接
收
的
数
据
MOVX
@DPTR,A
;
接收的数据送缓冲区
CJNE
R0,#7FH,LOOPR
;
判接
收完没有
;
若没有,
转
LOOPR
继续接收
CLR
ES
;
若接收完,则关串
行口中断
LJMP
ENDR
LOOPR:INC R0
;
修改计数
值
INC
DPTR
修改地址指针
ENDR:
RETI
;
中断返回
END
【例
8-2
】
设有甲、乙两台单
片机,以工作方式
2
进行串行
通信。
每帧为
11
位,
可程控的
第
9
位数据为奇偶校验用的补
偶位。编程实现如下
所述的应
答通信功能:
甲机取一数据,进行奇偶校验
后发送。
乙机对收到的数据进行奇偶校
验,若补偶正确则乙机向甲机
p>
发出应答信息
“
00H
”
,
代表
“数
据发送正确”
,
甲机接收到此信
息
后再发送下一个字节。若奇
偶校验错误,则乙机向甲机发
出应答
信息
“
0FFH
”
,
代表
“数
据不正确”
,
要求甲机再次发送
原数据,直至数据发送正确。
甲机发送
128
字节数据后停止
发送。
乙机接收
1
28
字节数据。
甲机汇编源程序:
$$INCLUDE
()
;
包
含
STC12C5A60S2
单片机寄存
器定义文件
ADDRT EQU
0000H
ORG
0000H
LJMP
MAINT
;
跳至主程序入
口地址
ORG
0023H
;
串口
1
中
断服务程序入口
LJMP
INTSET
ORG
0100H
MAINT:
MOV
SP,#60H
MOV
PCON,#80H
;
波特率加
倍
MOV
SCON,#10010000B;
< br>置
工作方式
2
,并允许接收
p>
MOV
DPTR,#ADDRT
p>
;
设
置数据块首址
ADDRT
的地址
指针
MOV
R0,#00H
设置发送字节
初值
SETB
ES
;
允许串行口中断
SETB
EA
;CPU
开中断
MOVX
A, @DPTR
;
p>
取
第一个发送数据
MOV
C,P
;
数据补偶
MOV
TB8,C
MOV
SBUF,A
;
启动串行
口
,
发送数据
SJMP
$$
;
中断服务程序
INTSET:
JB
RI
,LOOPT1;
接收中断?
若
RI=1
,<
/p>
则转接收乙机发送的
应答信息
CLR
TI
;
因<
/p>
RI=0
,则必有
TI=1
,表明是甲机发送数据的
中断请求
LJMP END
T
甲机发送一数
据
完毕跳至中断返回程序
LOOPT1:
CLR
RI
;
清
接
收中断标志
MOV
A,SBUF
;
取乙机的
应答数据
< br>
SUBB
A,#01H
< br>;
判断乙机
应答信息是否为“
0
0H
”
JC
LOOPT2
;
数据传送
正确,则转
LOOPT2
MOVX
A,@DPTR
;
数据传
送不正确时,要求重新发送
< br>
MOV
C,P
MOV
TB8,C
MOV
SBUF,A
;
启动串行
口,重发一次数据
LJMP
ENDT
;
跳中断返回程序
LOOPT2:INC
DPTR
;
修
改地址指针,发送下一个数据
INC
R0
;
修改发送字节数
计数值
MOVX
A,@DPTR;
下
一
个数据补偶
MOV
C,P
MOV
TB8,C
;
不
能
直
接
< br>使
用
MOV TB8,P
MOV
SBUF,A
;
启动串行
口,发送新的数据
CJNE
R0,#80H,END
T
;
数据
发送完?若没有发送完,则中
断返回
p>
CLR
ES
;
全部发送完毕,
禁止串行口中断
ENDT:
RETI
;
中断返回
END
乙机汇编语言程序:
$$INCLUDE
()
;
包
含
STC12C5A60S2
单片机寄存
器定义文件
ADDRR
EQU
0000H
ORG
0000H
LJMP
MAINR
主程序入口
ORG
0023H
;
串行中断入口
LJMP
INTSER
;
转
至串行口中断服务程序
ORG
0100H
MAINR:MOV
SP,#60H
MOV
PCON,#80H
;
波
特率加倍
MOV
SCON,#10010000B
置
串行口为工作方式
2
,允许
接
收
MOV
DPTR,#ADDRR;
数据指
针首址
MOV
R0,#00H;
接收
数据字节
数初值
SETB
ES;
串行口开中断
SETB
EA
;CPU
开中断
SJMP
$$
等待中断
;
串行口中断服务程序
INTSER:
JB
RI,LOOPR1
;
若
RI
=
1
,则转接收程序入口
CLR TI
;
若
RI=0
,
< br>必有
TI=1
,
是发送中断,故
应清零
LJMP
ENDR
;
跳至中断
返回程序
LOOPR1:CLR
RI
;
清接收中断标志
MOV
A,SBUF
;
读取接收
的数据
MOV
C,P
;
奇偶校验
JC
LOOPR2
;
如
< br>8
位数为奇,则转
LOOPR2
再检
测
RB8
位
ORL
C,RB8
JC
LOOPR3
p>
;
奇
偶校验错误时,转
LOOPR3
LJMP
LOOPR4
;
补
< br>偶
正
确,转
LOOPR4
LOOPR2:ANL
C,RB8
;8
< br>位数为奇
,再检测
RB8
位
p>
JC
-
-
-
-
-
-
-
-
-
上一篇:波士胶 Bostik改性聚氨酯
下一篇:VxWorks的中断服务