📄 t2timer.lst
字号:
C51 COMPILER V7.20 T2TIMER 11/02/2004 17:32:34 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE T2TIMER
OBJECT MODULE PLACED IN t2Timer.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE t2Timer.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //////////////////////////////////////////////////////////////////
2 // T2用作计数/定时器或波特率发生器时的编程方法 //
3 // -- xiaoqi //
4 // t2conSet的定义如下,不包括通信波特率发生器方式 //
5 // 0x04...... TR2 = 1,开始计时,CP/RL2=0,自动重装 //
6 // EXEN2 = 0,忽略外部T2EX(P1.1) //
7 // 0x05...... TR2 = 1,开始计时;CP/RL2=1,不自动重装 //
8 // EXEN2 = 0,忽略外部T2EX(P1.1) //
9 // 0x07...... TR2 = 1,开始计数;CP/RL2=1,不自动重装 //
10 // EXEN2 = 0,忽略外部T2EX(P1.1) //
11 // C/T2 = 1,使用外部时钟线T2 //
12 // 0x0F...... TR2 = 1,开始计数;CP/RL2=1,不自动重装 //
13 // C/T2 = 1,使用外部时钟线T2 //
14 // EXEN2 = 1,EXF2受控于捕获允许EXEN2的状态,EXEN2 //
15 // 置1时一个外部T2EX的负脉冲将引发T2中断,同时用当 //
16 // 前计数寄存器中的数值去刷新备用寄存器,备用寄存器//
17 // 原设定值被更新,捕获模式 //
18 //--------------------------------------------------------------//
19 // 用作波特率发生器 //
20 // 0x35...... TR2 = 1,开始计数;CP/RL2=1,不自动重装,但被CRLK和//
21 // CTLK/CRLK的设立而忽略 //
22 // C/T2 = 0,使用内部时钟 //
23 // EXEN2 = 0,忽略外部T2EX(P1.1) //
24 // EXF2受控于EXEN2的状态,置1时一个外部T2EX的负脉冲//
25 // 将引发T2中断。不刷新备用寄存器 //
26 // CTLK = 1,引用为发送时钟源(波特率发生器) //
27 // CRLK = 1,引用为接收时钟源,强制自动重装初值。 //
28 // 当计数器溢出时并不设立标志TF2,所以不引发中断 //
29 // 如果设定了允许CT2中断视作无效 //
30 //--------------------------------------------------------------//
31 // 附加说明: //
32 // 定时器的使用时可以随时切换的,在不通信的时候可以换回来又用作 //
33 // 定时器或计数器,定时或计数器之间也可以来回切换,发挥最大效益 //
34 //////////////////////////////////////////////////////////////////
35 #include <reg52.h>
36
37 // 定义定时计数器的工作模式
38 #define t2conSet 0x04
39 #define Bodrate 0xFFDC // FFDC相对于11.0592M晶振下9600波特率,
40 // 通信实际9600
41
42 unsigned char timerForDelay;
43
44 void init();
45 void uart_init(void);
46
47 void main()
48 {
49 1 init();
50 1 timerForDelay = 10;
51 1 while(timerForDelay); // 延时等待观察效果
52 1
53 1 uart_init(); // 该做波特率发生器定时中断暂停
54 1 SBUF = 0xaa; // 发送一字节
55 1 while(!TI);
C51 COMPILER V7.20 T2TIMER 11/02/2004 17:32:34 PAGE 2
56 1 TI = 0;
57 1
58 1 while(1);
59 1 }
60
61 //////////////////////////////////////////////////////////////////
62 // 初始化开启定时器2 //
63 //////////////////////////////////////////////////////////////////
64 void init()
65 {
66 1 RCAP2H = 0xff;
67 1 RCAP2L = 0xE0;
68 1 TH2 = 0xff; // 定时器初值
69 1 TL2 = 0xE0;
70 1 ES = 0; // 关闭通信中断
71 1 ET2 = 1; // 允许T2中断
72 1 T2CON = t2conSet;
73 1 EA = 1;
74 1 // DCEN = 1; // at89s52才有的计数方向选择
75 1 }
76
77 //////////////////////////////////////////////////////////////////
78 // 定时器CT2中断服务程序 //
79 //////////////////////////////////////////////////////////////////
80 void timer2Int(void) interrupt 5
81 {
82 1 TF2 = 0; // 溢出标志必须由软件清零
83 1 EXF2 = 0; // 捕获标志必须由软件清零
84 1 if(timerForDelay)timerForDelay--;
85 1 }
86
87 //////////////////////////////////////////////////////////////////
88 // 定时器CT2用于串行通信波特率发生器 //
89 // 定义为波特率发生器以后,ET2自动失效 //
90 //////////////////////////////////////////////////////////////////
91
92 void uart_init(void)
93 {
94 1 T2CON = 0x35; // 0b0011 0101 16位串行波特率
95 1 // 发生器,自动重装
96 1 TH2 = (unsigned char )(Bodrate>>8) ;
97 1 TL2 = (unsigned char )(Bodrate & 0xff);
98 1 RCAP2H = (unsigned char )(Bodrate>>8) ;
99 1 RCAP2L = (unsigned char )(Bodrate & 0xff);
100 1 TR2 = 1; // 启动时钟
101 1 SCON = 0x7A; // 0b0111 1010 第一种工作方式
102 1 // 8位单机通信
103 1 ES = 1; // 允许通信中断
104 1 EA = 1; // 中断打开
105 1 }
106
107 //////////////////////////////////////////////////////////////////
108 // 串口中断服务程序 //
109 //////////////////////////////////////////////////////////////////
110 void receive() interrupt 4
111 {
112 1 if(RI) //判断接收中断状态
113 1 {
114 2 timerForDelay = SBUF;
115 2 RI = 0;
116 2 }
117 1 }
C51 COMPILER V7.20 T2TIMER 11/02/2004 17:32:34 PAGE 3
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 94 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -