打印
[示例代码]

T0定时器中断模式实验

[复制链接]
920|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
程序声明 KF8F系列单片机开发板演示程序
标 题: T0定时器中断模式实验
项 目 名: 04-T0_Timer_Interrupt_TEST
开发环境:ChipON IDE
作 者:上海芯旺微电子有限公司
功能简述: T0定时中断模式的使用,使得数码管从0~9999计数,1秒增加1,当加到 9999时,又从0开始计数。

使用特权

评论回复
沙发
家有两宝呀|  楼主 | 2020-11-29 14:54 | 只看该作者
4.2 硬件说明
本实验运用到两个模块,一个是单片机内部功能模块,定时器0(T0),另
一个是数码管显示模块。数码管具体特性在此之前已经讲解过,在此不作敷述,
T0属于内部模块,不需进行接线操作。

使用特权

评论回复
板凳
家有两宝呀|  楼主 | 2020-11-29 14:55 | 只看该作者
4.3 程序设计说明
T0是一个8位的定时/计数器,当T0寄存器值加到255时,再加1,则会产生溢
出,T0寄存器的值返回到0开始重新计数。

使用特权

评论回复
地板
家有两宝呀|  楼主 | 2020-11-29 14:56 | 只看该作者
使用T0定时器,只需配置OPTR一个寄存器,其各个位如图4.1所示。在此重
点讲解定时器0的分频器使用,例如我们采用8M频率,T0工作在定时模式下为每
个机器周期加1,则定时器每次加1的时间是(1/8M)*4=0.5us。如果此时将预分
频器分频比设置成64分频,那么定时器每次加1的时间就是0.5us*64=32us。如果
我们需要一个5MS的定时,那么我们需要156个这样的计数。此时我们即可将T0
寄存器初始值设为100,当T0数值加到256时正好是156个计数,这样便会产生一
个5MS的定时。200个5MS这样的定时就是1S的时间。当T0用于定时中断功能时,
关于OPTR寄存器的说明如下:

使用特权

评论回复
5
家有两宝呀|  楼主 | 2020-11-29 14:57 | 只看该作者
1、 配置T0CS = 0,使其工作于定时模式。
2、 PS<2:0>位用来设置T0预分频器分频比,如需要进行64分频,则PS0 = 1,
PS1 = 0,PS2 = 1。
其它位按照上电默认配置即可。

使用特权

评论回复
6
家有两宝呀|  楼主 | 2020-11-29 14:57 | 只看该作者
C程序代码
#include<KF8F312.h>
/*********************宏定义****************************/
#define uchar unsigned char
#define uint unsigned int
/*********************宏定义结束****************************/
/**********************全局变量*****************************/
uchar const Arr_num[] = {0X3F,
0X06,
0X5B,
0X4F,
0X66,
0X6D,
0X7D,
0X07,
0X7F,
0X6F
}; //共阴接法,数码管显示笔形码
uchar Unit, Decade, Hundred, Thousand; //定义个十百千位
uchar time_1s; //定时计数器
/**********************全局变量结束*************************/
/************************
* 函数名 :Delay_200us
* 函数功能:短时间延时
* 入口参数:无
* 返回 :无
************************/
void Delay_200us()
{
uchar i = 60;
while(--i);
}
/************************
* 函数名 :Init_fun
* 函数功能:初始化函数
* 入口参数:无
* 返回 :无
************************/
void Init_fun(void)
{
OSCCTL = 0x60; // 设置为8M
/*****端口初始化********/
TR0 = 0x08; //设置P03端口为输入
TR1 = 0x00; //设置P1端口为输出
TR2 = 0x00; //设置P2端口为输出
P0 = 0;
P1 = 0;
P2 = 0;
/****初始化定时器0*****/
OPTR = 0x05; //定时器0,分频为1:64,现在晶振为8M,一条指令为
0.5us(1/(8M/4)=0.5us ),则经过32us,计数1
T0 = 0x64; //设定定时5MS, 0X64=100D 即计数156后为256溢
出产生中断,而156*32=4992 约为5000us=5ms
INTCTL = 0XA0; //使能总中断AIE、使能T0中断T0IE、清T0中断标志
位T0IF
}
void main()
{
uchar i;
Unit = 0;
Decade = 0;
Hundred = 0;
Thousand = 0;
time_1s = 0;
Init_fun(); //初始化
while(1)
{
for(i = 0; i < 100; i++)
{
P2 = 0XE0; //打开数码管的 个位
P1 = Arr_num[Unit];
Delay_200us();
P1 = 0;
P2 = 0XF0; //消影
P2 = 0XD0; //打开数码管的 十位
P1 = Arr_num[Decade];
Delay_200us();
P1 = 0;
P2 = 0XF0; //消影
P2 = 0XB0; //打开数码管的 百位
P1 = Arr_num[Hundred];
Delay_200us();
P1 = 0;
P2 = 0XF0; //消影
P2 = 0X70; //打开数码管的 千位
P1 = Arr_num[Thousand];
Delay_200us();
P1 = 0;
P2 = 0XF0; //消影
}
}
}
//中断函数
void int_fun() __interrupt
{
if(T0IF)
{
T0IF = 0; //清零中断标志
T0 = 0x64; //T0重新赋值
if(time_1s++ >= 200) //判断是否达到1s记时 5ms*200
= 1s
{
time_1s = 0; //清零计数器
Unit++; //个位相加
if(Unit == 10)
{
Unit = 0;
Decade++; //十位相加
if(Decade == 10)
{
Decade = 0;
Hundred++; //百位相加
if(Hundred == 10)
{
Hundred = 0;
Thousand++; //千位相加
if(Thousand == 10)
{
Thousand = 0;
}
}
}
}
}
}
}

使用特权

评论回复
7
家有两宝呀|  楼主 | 2020-11-29 14:58 | 只看该作者
汇编程序代码

使用特权

评论回复
8
家有两宝呀|  楼主 | 2020-11-29 14:58 | 只看该作者
.INCLUDE "KF8F312.INC"
;;;;;;;;;;;;;;;;通用寄存器;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY_NUM1    .EQU 0X81    ;延时用的临时变量
DELAY_NUM2    .EQU 0X82    ;延时用的临时变量
PSW_TEMP    .EQU 0X83    ;PSW的临时保存变量
PCH_TEMP    .EQU 0X84    ;PCH的临时保存变量
UNIT     .EQU 0X85    ;数码管个位
DECADE     .EQU 0X86    ;数码管十位
HUNDRED     .EQU 0X87    ;数码管百位
THOUSAND    .EQU 0X88    ;数码管千位
TIME_1S     .EQU 0X89    ;累计计数1s
FLAG_1S     .EQU 0X8A    ;计数1s的标志位
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.ORG 0X0000
   NOP
   JMP MAIN                   ;入口
.ORG 0X0004
JMP INTERRUPT
;*************************************************************
*****************
;* 函 数 名: DIG_DATA
;* 函数功能: 数码管显示数据编码
;* 入口参数: 无
;* 返    回: R0,数码管显示的编码值
;* 注  意 : 查表函数需在程序开头定义,避免编译后表中元素存在Flash的不
同页造成查表出错
;*************************************************************
*****************

使用特权

评论回复
9
家有两宝呀|  楼主 | 2020-11-29 14:59 | 只看该作者
DIG_DATA
ADD PCL, R2
RRET R0 ,#0X3F    ;0
RRET R0 ,#0X06    ;1
RRET R0 ,#0X5B    ;2
RRET R0 ,#0X4F    ;3
RRET R0 ,#0X66    ;4
RRET R0 ,#0X6D    ;5
RRET R0 ,#0X7D    ;6
RRET R0 ,#0X07    ;7
RRET R0 ,#0X7F    ;8
RRET R0 ,#0X6F    ;9
RRET R0 ,#0X77    ;A
RRET R0 ,#0X7C    ;B
RRET R0 ,#0X39    ;C
RRET R0 ,#0X5E    ;D
RRET R0 ,#0X79    ;E
RRET R0 ,#0X71    ;F
RRET R0 ,#0X00    ;空
;;;;;;;;;;;;;;;中断部
分;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

使用特权

评论回复
10
家有两宝呀|  楼主 | 2020-11-29 14:59 | 只看该作者
INTERRUPT
;;保护现场作用,根据实际情况进行保存,中断内部和外部都使用的资源需要保
护,常规需要保护的内容有PSW PCH R0 R1
SWAPR R1 ,PSW
MOVPSW_TEMP, R1
MOVR1 , PCH
MOVPCH_TEMP, R1
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;中断处理
JB INTCTL,T0IF
JMP INT_END
CLR INTCTL,T0IF
MOV R1 ,#0X64
MOV T0, R1           ;设定定时5MS
INC TIME_1S
MOV R1 ,#0XC8         ;累计 计数200个5ms 即1S
XOR R1 ,TIME_1S
JB PSW,Z
JMP INT_END
CLR  TIME_1S
MOV R1 ,#0X55
MOV FLAG_1S, R1
;...
;...
;...
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;恢复现场作用

使用特权

评论回复
11
家有两宝呀|  楼主 | 2020-11-29 15:00 | 只看该作者
INT_END
MOVR1 , PCH_TEMP
MOVPCH, R1
SWAPR R1 , PSW_TEMP
MOV PSW, R1
IRET
;;;;;;;;;;;;;;中断部分结
束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;入口函数,主程
序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MAIN
CALL INIT_ALL       ;初始化寄存器
CALL INIT_RAM               ;初始化RAM
TIME_1S_LOOP
CALL LED_DISPLAY    ;数码管显示当前数值
MOV R0 ,#0X55
XOR R0 ,FLAG_1S
JB  PSW,Z
JMP TIME_1S_LOOP
;; 时间增加操作
CLR FLAG_1S
INC UNIT         ;个位数字的递增
MOV R0 ,UNIT
XOR R0 ,#0X0A
JB PSW ,Z
JMP C_DIS
CLR UNIT
INC DECADE         ;十位数字的递增
MOV R0 ,DECADE
XOR R0 ,#0X0A
JB PSW ,Z
JMP C_DIS
CLR DECADE
INC HUNDRED         ;百位数字的递增
MOV R0 ,HUNDRED
XOR R0 ,#0X0A
JB PSW ,Z
JMP C_DIS
CLR HUNDRED
INC THOUSAND       ;千位数字的递增
MOV R0 ,THOUSAND
XOR R0 ,#0X0A
JB PSW ,Z
JMP C_DIS
CLR THOUSAND
C_DIS
JMP TIME_1S_LOOP
CRET
;;;;;;;;;;;;;主程序结
束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;*************************************************************
*****************
;* 函 数 名: INIT_ALL
;* 函数功能: 初始化函数,对各种寄存器的初始化
;* 入口参数: 无
;* 返    回: 无
;*************************************************************
*****************

使用特权

评论回复
12
家有两宝呀|  楼主 | 2020-11-29 15:01 | 只看该作者
INIT_ALL
;调入校准信息到控制寄存器
CALL #0xFFF
MOV OSCCAL0, R0    ;晶振校准0
NOP
NOP
CALL #0xFFE
MOV OSCCAL1, R0    ;晶振校准1
NOP
NOP
;选择工作频率
MOV R0 ,#0x60   
MOV OSCCTL, R0    ;设置为8M
;端口初始化
MOV R0 ,#0xFF
MOV TR0, R0     ;设置P0端口为输入
MOV R0 ,#0x00
MOV TR1, R0     ;设置P1端口为输出
MOV R0 ,#0X0F
MOV TR2, R0     ;设置P2端口的4,5,6,7为输出,0,1,2,3,为输入
CLR P0
CLR P1
CLR P2
;初始化定时器0
MOV R0 ,#0X84
MOV OPTR, R0   ;定时器0,分频为1:32,现在晶振为4M,一条指令为1us
(1/(4M/4)=1us ),则经过32us,计数1
MOV R0 ,#0X64
MOV T0, R0     ;设定定时5MS,  0X64=100D  即计数156后为256
溢出产生中断,而156*32=4992 约为5000us=5ms
MOV R0,#0Xa0
MOV INTCTL,R0       ;使能总中断AIE、使能T0中断T0IE、清T0中断标志
位T0IF
CRET
;*************************************************************
*****************
;* 函 数 名: LED_DISPLAY
;* 函数功能: 数码管显示函数,由4个8位LED灯显示
;* 入口参数: THOUSAND 千位 ,HUNDRED 百位 ,SMQ_S 十位, UNIT 个位  ,
每个数的范围 0~f
;* 返    回: 无
;*************************************************************
*****************

使用特权

评论回复
13
家有两宝呀|  楼主 | 2020-11-29 15:01 | 只看该作者
LED_DISPLAY
MOV R0 , #0XE0
MOV P2 , R0        ;打开数码管的 个位
MOV R2 , UNIT
CALL DIG_DATA
MOV P1 , R0
CALL DELAY
CLR P1     ;消抖
MOV R0 ,#0XF0
MOV P2 , R0
MOV R0 ,#0XD0
MOV P2 , R0        ;打开数码管的 十位
MOV R2 , DECADE
CALL DIG_DATA
MOV P1 , R0
CALL DELAY
CLR P1     ;消抖
MOV R0 ,#0XF0
MOV P2 , R0
MOV R0 , #0XB0
MOV P2 , R0        ;打开数码管的 百位
MOV R2 , HUNDRED
CALL DIG_DATA
MOV P1 , R0
CALL DELAY
CLR P1     ;消抖
MOV R0 ,#0XF0
MOV P2 , R0
MOV R0 , #0X70
MOV P2 , R0        ;打开数码管的 千位
MOV R2 , THOUSAND
CALL DIG_DATA
MOV P1 , R0
CALL DELAY
CLR P1     ;消抖
MOV R0 ,#0XF0
MOV P2 , R0
CRET
;*************************************************************
*****************
;* 函 数 名: DELAY
;* 函数功能: 延时函数,时间为1ms
;* 入口参数: 无
;* 返    回: 无
;*************************************************************
*****************

使用特权

评论回复
14
家有两宝呀|  楼主 | 2020-11-29 15:02 | 只看该作者
DELAY
MOV R0,#0x12
MOV DELAY_NUM1, R0
LP0
MOV R0,#0X12
MOV DELAY_NUM2, R0
LP1
DECJZ DELAY_NUM2    ;DELAY_NUM2自减1,若为0,则跳过
JMP LP1
DECJZ DELAY_NUM1    ;DELAY_NUM1自减1,若为0,则跳过
JMP LP0
CRET         ;子程序返回
;/************************************************************
******************
;* 函 数 名: init_RAM
;* 函数功能: 初始化RAM
;* 入口参数: 无
;* 返    回: 无
;*************************************************************
*****************/

使用特权

评论回复
15
家有两宝呀|  楼主 | 2020-11-29 15:02 | 只看该作者
INIT_RAM     
CLR   R2       ;传递默认RAM值
; CLR RAM SET 0  BANK0
CLR   PSW ,RP0   
MOV   R0 ,#0X80   ;起始地址0x80
MOV   R1 ,#0X20   ;操作个数
CALL    INIT_RAM_0
; CLR RAM SET 0  BANK1
SET   PSW ,RP0   
MOV   R0 ,#0X80   ;起始地址0x80
MOV   R1 ,#0X01   ;操作个数
CALL    INIT_RAM_0
; 默认工作区域设定   BANK0
CLR   PSW ,RP0
; 其他变量的数值操作
   
   
   
CRET
;;;;;;;;;;;;;;;;;;执行默认数值装载到RAM区
INIT_RAM_0   
ST [R0],R2
INC R0
DECJZ R1
JMP  INIT_RAM_0
CRET  
   
.end

使用特权

评论回复
16
家有两宝呀|  楼主 | 2020-11-29 15:03 | 只看该作者
通用寄存器

使用特权

评论回复
17
里面有晴雨| | 2020-12-11 18:01 | 只看该作者
感谢分享,这个**有有用处,我想是不是能够有打包文件发一下。

使用特权

评论回复
18
daichaodai| | 2020-12-12 14:28 | 只看该作者
学习了,感谢楼主分享。

使用特权

评论回复
19
名字是啥样| | 2020-12-12 17:04 | 只看该作者
感谢楼主分享,感谢。

使用特权

评论回复
20
嵌入小菜菜| | 2020-12-22 14:10 | 只看该作者
感谢楼主耐心细致的分享,不错,不错的资料。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

583

帖子

0

粉丝