电脑连不上校园网登录:单片机定时器2使用(C语言程序) | 水寒博客
来源:百度文库 编辑:中财网 时间:2024/09/21 09:01:09
本文是关于52单片机定时器计数器2做为普通的16位自动重装定时器使用,类似于定时器计数器0和定时器计数器1工作在方式1下。以下程序在Keil 2和Keil 3下调时通过,下载在本校的实验板上达到预期效果。AT89C52及其以上、AT89S52及其以上、STC89C52及其以上测试正常运行。
源代码:
view sourceprint?001
/***********************************************************
002
程序功能:52系列单片机定时器计数器2使用
003
程序设计:燕山大学 鲁信琼
004
晶振选择:24MHz, 如果晶振不匹配,请修改延时函数参数;P2^6口接数码管段选控制位; P2^7口接数码管位选控制位; P1^7口作为测试指示灯
005
本实验注意事项:
006
1. 定时器2的中断使能为IE^6位,也就是ET2; 中断服务程序标号为5。
007
2. 定时器2工作在16为自动重装模式下,不需要在中断服务程序中重新赋初值,在程序初始化的时候我们应该给RCAP2L和RCAP2H赋值,TH2和TL2将会在中断产生时自动使TH2=RCAP2H,TL2=RCAP2L。
008
3. 定时器2的中断标志位TF2不能够由硬件清零,所以要在中断服务程序中将其清零,为了使定时尽量准确,我们常在终端服务程序中第一步就使TF2=0。
009
4. 使定时器2产生中断的有两个中断源,如果EXEN2(定时器2外部使能标志)置1的话,使定时器2进入中断的有可能是定时器2计数溢出,也可能是捕获到T2EX(单片机P1^1口)有负跳变,所以需要在中断服务程序中判断EXF2是否为1。
010
011
承接51单片机、PIC单片机程序、VB/VC++上位机程序、电子产品软硬件设计开发工作
012
013
EMail: xqlu(at)ysu.net.cn QQ: 9790335
014
***********************************************************/
015
016
#include
017
#include
018
#define uchar unsigned char
019
#define uint unsigned int
020
#define LED_DATA P0
021
sbit DULA=P2^6;
022
sbit WELA=P2^7;
023
sbit LED=P1^7;
024
uchar timer2_ctr,num;
025
uchar code table[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x40, 0};
026
027
//24MHz晶振延时x毫秒函数
028
void
delay_ms(uint xms)
029
{
030
uint x,y;
031
for
(x=xms; x>0; x--)
032
for
(y=248; y>0; y--);
033
}
034
035
//初始化主函数
036
void
init_main()
037
{
038
DULA=0;
//关闭数码管显示
039
WELA=0;
040
041
RCAP2H=(0xFFFF-50000)/256;
042
RCAP2L=(0xFFFF-50000)%256;
//24MHz晶振下定时25ms,自动重装
043
TH2=RCAP2H;
044
TL2=RCAP2L;
//定时器2赋初值
045
T2CON=0;
//配置定时器2控制寄存器,这里其实不用配置,T2CON上电默认就是0,这里赋值只是为了演示这个寄存器的配置
046
T2MOD=0;
//配置定时器2工作模式寄存器,这里其实不用配置,T2MOD上电默认就是0,这里赋值只是为了演示这个寄存器的配置
047
IE=0xA0;
//1010 0000开总中断,开外定时器2中断,可按位操作:EA=1; ET2=1;
048
TR2=1;
//启动定时器2
049
}
050
051
//数码管显示3位数:0-255
052
void
display(uchar num)
053
{
054
uchar gw,sw,bw;
055
bw=num/100;
056
sw=num%100/10;
057
gw=num%10;
058
059
LED_DATA=0XFE;
//1111 1110
060
WELA=1;
061
_nop_();_nop_();
062
WELA=0;
063
LED_DATA=table[bw];
064
DULA=1;
065
_nop_();_nop_();
066
DULA=0;
067
delay_ms(3);
068
069
LED_DATA=0XFD;
//1111 1101
070
WELA=1;
071
_nop_();_nop_();
072
WELA=0;
073
LED_DATA=table[sw];
074
DULA=1;
075
_nop_();_nop_();
076
DULA=0;
077
delay_ms(3);
078
079
LED_DATA=0XFB;
//1111 1011
080
WELA=1;
081
_nop_();_nop_();
082
WELA=0;
083
LED_DATA=table[gw];
084
DULA=1;
085
_nop_();_nop_();
086
DULA=0;
087
delay_ms(3);
088
}
089
090
void
main()
091
{
092
init_main();
093
while
(1)
094
{
095
display(num);
096
}
097
}
098
099
void
timer2() interrupt 5
100
{
101
//!!!注意!!! 定时器2必须由软件对溢出标志位清零,硬件不能清零,这里与定时器0和定时器1不同!!!
102
103
TF2=0;
104
timer2_ctr++;
105
106
//定时25ms×40=1000ms即1秒钟,这里模拟一个60秒秒表
107
if
(timer2_ctr>=40)
108
{
109
timer2_ctr=0;
110
LED=~LED;
111
num++;
112
if
(num>=60)
113
{
114
num=0;
115
}
116
}
117
}
如何用C语言编写定时器程序?
c语言能写单片机程序吗?
使用c语言编写程序
怎么用C语言编定时器?
C语言 用定时器 模拟多线程
请问单片机的c语言程序怎样转化为汇编程序?
单片机c语言
AVR单片机定时器如何使用?偶是初学者,具体些?
单片机c程序实例
单片机倒计时定时器原理图
应用c语言编写ATmega128单片机对单相电压电流信号采样程序
《单片机C语言程序设计师》岗位培训认证有用吗?对找工作有帮助吗?
请问工业上使用单片机编程,是C语言好,还是VB或其他的好?
写单片机程序用什么语言
写单片机程序用什么语言?
怎样成为单片机C语言的高手?
用单片机c语言写哈夫曼编码
单片机和显示问题c语言11
msp430F149单片机;液晶屏幕;C语言编程;仪表
请问如何使用visual studio编c语言程序
如何使用C语言使程序不响应任何键盘输入
请高手们写一个跑表程序给我参考一下(是用c语言),在单片机msp4301121运行
C语言程序
C语言程序