C51 初始化通讯接口,允许定时器中断程序1中断,怎么就不通讯了?

51单片机用定制器0正常进入中断,用定时器1不能_百度知道
51单片机用定制器0正常进入中断,用定时器1不能
}void interrupter() interrupt 1{
TH0=0xFC;sbit ADDR1=P1^1;TH0=0xFC;ADDR1=1;TH1=0xFC;reg52;sbit ADDR0=P1^0;void main(void){
ADDR0=0;sbit ADDR3=P1^3,下面是定时器0#include&TL1=0x67;ET1=1.h&sbit ADDR3=P1^3;TMOD=0x01;TL1=0x67;
LED=0;}void interrupter() interrupt 3{
TH1=0xFC;ENLED=0;sbit LED=P0^0;sbit ADDR2=P1^2;sbit ADDR0=P1^0;sbit LED=P0^0;ENLED=0#include&ET0=1;reg52;ADDR2=1;ADDR1=1;
EA=1;sbit ENLED=P1^4;
}上面是定时器1;ADDR2=1;sbit ADDR1=P1^1;
TR0=1;TL0=0x67;ADDR3=1;
}我设定的是0;sbit ENLED=P1^4;sbit ADDR2=P1^2;TMOD=0x10;
LED=0;void main(void){
ADDR0=0;TL0=0x67;
while(1);ADDR3=1;
while(1).h&gt
TH1 = 0x0FCTMOD = 0x10;
TL1 = 0x67;
大神,我新手,TR1=1放到最后,可以了,为什么呢
因为tr1打开定时器就开始走了
我用定时器0怎么可以把TR0=1放前面呢
至于为啥表示不懂
其他类似问题
为您推荐:
其他3条回答
中断函数不要在while循环里,这样会破坏中断程序正常执行。
你看看是不是晶振有问题啊!或者再换一块片子看看!!!
这不科学 个人认为可能是芯片坏了 换个试试
51单片机的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁No input file specified.第一篇:51单片机的中断和定时 - 博客频道 - CSDN.NET
DY90的博客
Stay H Stay Foolish .
分类:C51单片机
自学51单片机也有两个星期了,今天第一次写关于51的博客,也是因为感觉定时和中断挺重要的,要记录一下了。
先谈谈学习51 的感觉,因为之前专业课开的是飞思卡尔的AW60,并且不知道怎么学习一门语言,所以说虽然很想学单片机,但还是什么都没学会,现在学习51单片机也算是入门学习了。想想机电专业的,大四了,才入门......唉......这里我就不给神一样的大学教育补刀了,当然也有点自己的原因,这里就不深究了。真的,参加安卓培训之后
我才意识到怎么学习一门语言,也因为这个原因,我决定把自己的兴趣给拾起来,把学习51单片机提到日程中,由于现在主要是学习安卓(以后要靠这个吃饭呢),每天就只安排了两个小时的学习时间,并且前几天学的那些什么点亮小灯的实验、键盘扫描实验都太片面,完全没有难度,今天的中断功能就不同了,是51单片机中的重点难点,也是让51程序看起来高级牛逼的关键。其实我感觉51的中断跟java的多线程是一样一样的,都是为了提高系统的效率,让系统同时做多件事,嗯,闲话说的有点多了....
定时器/计数器
51的定时器/计数器有2个分别是T1和T0,52系列的单片机有3个定时器/计数器,T0和T1是通用定时器/计数器,定时器/计数器2(简称T2)是集定时、计数和捕获三种功能于一体,功能更强。
首先看一下这个简单点的功能,我在实验中用到的定时器的作用是高精度延时的作用,之前使用的通过while和for循环的延时方法都只是大概的时间,而定时器则可以精确设定时间在1微秒(10^-6)左右(以晶振频率为11.0592MHZ来说),其最大的时间取值为0.071,可见已经可以达到钟表的误差水准了。
定时器/计数器0和1的方式控制寄存器TMOD:
&&T1 & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &T0
T1和T0分别代表单片机两个计数器
GATE:门控制位。当门控制位GATE=1时,定时器/计数器的运行受外部引脚输入电平的控制。其中INT0引脚控制T0,INT1引脚控制T1.当控制引脚为高电平且TR0或TR1置1时,相应的定时器/计数器才被选通。当门控制位GATE=0时,只要TR0或TR1置1,相应的定时器/计数器就被选通,此时不受外部引脚的控制。
C/T:该位为0的时候,用作定时器,该位为1的时候,用做计数器。
13位定时器/计数器
16为定时器/计数器
自动重新装入的8位定时器/计数器
T0分成两个8位计数器,T1停止计数
模式0: &&13位的计数器。由一个高8位(0~7)计数器(TH0或TH1)和一个具有32为分频的低8位
& & &&计数器中的(TL0或TL1)的低5位(0~4)组合成。
模式1:16位的计数器。(TH1,TL1)
模式2:自动装载8位计数器。主要应用在串口波特率发生器。
模式3:将16位计数器分成两个独立的8位计数器TL0和TH0.定时器/计数器的工作模式3只适用于
模式0&模式3:几乎不用。
特殊功能寄存器TCON
& &T1 & & & & & & & & & & & & & & & T0 & & & & & & & & & & & & & & & &定时中断 &
溢出标志位TF1/TF0:当定时器T1/T0溢出时,硬件自动将TF0/TF1置1,并申请中断。当进入中断服务程序时,硬件又将自动清零TF1/TF0.
启/停控制位TR1/TR0:该位由软件置位和复位。当GATE为0时,TR0/TR1置位为1时T0/T1开始计数,TR1/TR0复位为0时T1/T0停止计数;当GATE为1时,TR1/TR0为1时且INT1/INT0输入高电平时,T1/T0开始计数。
TCON和TMOD复位后都会自动变成0x00.
T2的控制寄存器T2CON和T2MOD及其程序访问
1、控制寄存器T2CON
CP/RL2(D0):定时器/计数器2的捕获或重新再装入选择位。当CP/RL2=1时,如果EXEN2=1,则在T2EX(P1.1)引脚上的负跳变将触发捕获操作,即将TH2和TL2的内容传递给RCAP2H和RCAP2L;当CP/RL2=0时,若EXEN2=1,则T2计数满回0溢出或T2EX(P1.1)引脚上的负跳变,都将触发重新再装入操作,即将RCAP2H和RCAP2L的内容传递给TH2和TL2;当RCLK=1或TCLK=1时,CP/RL2标志位不起作用。T2的计数满回0溢出时,将强制T2进行自动重新再装入操作。重新再装入操作常用于串行口的波特率发生器。CP/RL2位须由软件置位或复位。
C/T2(D1):定时器/计数器2的定时或计数功能选择位。当C/T2=1时,选择计数器工作方式,下降沿触发,计数脉冲来自于外引脚T2CLK;当C/T2=0时,选择为定时器工作方式,做波特率发生器是,对f(osc)/2计数,不做波特率发生器时,对f(osc)/12计数。C/T2位须由软件置位或复位。
TR2(D2):定时器/计数器2的启动停止控制位。当软件置位TR2为1时,启动T2开始计数;复位TR2为0时,停止计数。
EXEN2(D3):定时器/计数器2的 外部触发允许标志位。当EXEN2=1时,如果T2不是正在工作在串口通信端口的时钟,则在T2EX引脚(P1.1)上的负跳变将触发捕获或重新再装入,并置EXF2位为1,请求中断;当EXEN2=0时,在T2EX引脚(P1.1)上的负跳变对T2不起作用。
TCLK(D4):串行口发送时钟标志位。当TCLK=1时,串行通信端使用T2的回0溢出信号作为串行口1和3的发送时钟;当TCLK=0时,使用T1的回0溢出信号作为发送时钟。TCLK位须由软件置位或复位。
RCLK(D5):串行口接受时钟标志位。当RCLK=1时,串行口通信端使用T2的回0溢出信号作为串行口1和3的接收时钟;当RCLK=0时,使用T1的回0溢出脉冲作为接收时钟。RCLK位须由软件置位或复位。
EXF2(D6):定时器/计数器2回外部中断请求标志位。当EXEN2=1时且T2EX引脚上出现负跳变而引起捕获或重新再装入时,则EXEN2置位,并向CPU申请中断,此时若允许T2中断,CPU将响应中断,并转向中断服务程序,EXF2也必须由软件复位。
TF2(D7):定时器/计数器2的溢出中断请求标志位。当T2计数溢出复位为0时,由内部硬件置位TF2,并申请中断。但在波特率发生器方式下,当RCLK位或TCLK置位为1时,T2计数溢出将不对TF2置位,此时必须由软件复位。
定时器/计数器2的工作模式:
T2CON的控制位和T2工作模式的对应关系
RCLK+TCLK
16为自动再装入
波特率发生器
2、控制寄存器T2MOD:
D7~D0:保留位,做其他用途。
T2OE:T2输出启动位。
DCEN:置位为1时,允许T2加1计数或减1计数。
使用定时器的方法:
第一:赋值TMOD寄存器,用来指定定时/计数器的工作模式。
第二:赋值TH0、TL0或TH1、TL1,设置计数寄存器的初值,精确设定好定时时间。
第三:如果需要使用中断,则可以对IE赋值,启动定时器中断。
第四:设置特殊功能寄存器TCON,对TR0、TR1置位,通过打开TR来让定时器进行工作。(也可设置为中断模式)
设定初值:
(2^位数-X)*12/晶振频率=时间。
X---&0xXXXX.
例:TH1 = 0 &TL1 = 0X66;
12(65536 – x) / = 0.02s
例:小灯的1秒间隔闪烁
#include&reg52.h&
typedef unsigned &int & &uint16;
typedef unsigned &char & uint8;
sbit LED=P0^0;
void main()
uint16 num=0;
TMOD=0x01;//设置使用定时器T0的模式1,此时不受外部输入引脚的控制
TH0=0xB8;//设置TH0
TL0=0x00;//设置TL0
TR0=1;//开始定时
if(TF0==1)
TF0=0;//溢出标志位归零
num++;
if(num==50)
LED=~LED;//LED引脚电位反转
这里只介绍了定时器的一种情况,其他的应该差不多一样,计数器的功能还没遇到,暂时先这样吧。
中断请求标志及其访问:
1、TCON的中断标志
TF1:定时器/计数器T1的溢出标志位。当定时器/计数器T1产生溢出时,单片机将自动置TF1=1。此时,CPU响应中断,转向相应的中断服务程序,并自动置TF1=0.
TF0:定时器/计数器T0的溢出标志位。当定时器/计数器T0产生溢出时,单片机将自动置TF0=1。此时,CPU响应中断,转向相应的中断服务程序,并自动置TF0=0.
IE1:外部中断1请求标志位。当单片机INT1端口的中断信号有效的时候,单片机将自动置IE1=1请求中断。CPU响应中断请求,转向对应的中断服务程序,并自动置IE1=0.
IT1:外部中断1的中断触发方式控制位。当IT1=0的时候,为低电平触发方式;当IT1=1的时候,为下降沿触发方式。
IE0:外部中断0请求标志位。当单片机INT0端口的中断信号有效的时候,单片机将自动置IE0=1请求中断。CPU响应中断请求,转向对应的中断服务程序,并自动置IE0=0.
IT0:外部中断0的中断触发方式控制位。当IT0=0的时候,为低电平触发方式;当IT0=1的时候,为下降沿触发方式。
2、SCON的中断标志:
RI:串行接口接受数据中断请求标志位。当单片机的串行接口接受完一个数据后,硬件自动置RI=1.此时,CPU响应中断,转向相应的中断服务程序。注意此时不会自动Ri清零,须在软件置R=0。
TI:串行接口发送数据中断请求标志位。当单片机的串行接口发送完一个数据后,硬件自动置TI=1。此时,CPU响应中断,转向相应的中断服务程序,注意此时不会自动TI清零,须在软件中置TI=0。
中断允许标志及其访问:
EA:中断允许或禁止总控制位。当置EA=0时,单片机将禁止所有中断,不响应任何中断请求;当EA=1时,单片机允许各个中断,此时还需要有其他标志位确定各个中断的允许或禁止。
ES:串行中断允许或禁止控制位。当置ES=0时,禁止串行口中断;当置ES=1时,允许串行口中断。
ET1:定时器/计数器T1允许或禁止标志位。当置ET1=0时,禁止定时器/计数器T1中断;当置ET1=1时,允许定时器/计数器T1中断。
EX1:外部中断1允许或禁止标志位。当置EX1=0时,禁止外部中断1;当置EX1=1时,允许外部中断1。
ET0:定时器/计数器T0允许或禁止标志位。当置ET0=0时,禁止定时器/计数器T0中断;当置ET0=1时,允许定时器/计数器T0中断。
EX0:外部中断0允许或禁止标志位。当置EX0=0时,禁止外部中断0;当置EX0=1时,允许外部中断0。
中断优先级标志及其访问:
PS:串行接口中断优先级设置位。当置PS=0时,该中断源被定义为低优先级;当置PS=1时,该中断源被定义为高优先级。
PT1:定时器/计数器T1优先级设置位。当置PT1=0时,该中断源被定义为低优先级;当置PT1=1时,该中断源被定义为高优先级。
PX1:外部中断1优先级设置位。当置PX1=0时,该中断源被定义为低优先级;当置PX1=1时,该中断源被定义为高优先级。
PT0:定时器/计数器T0优先级设置位。当置PT0=0时,该中断源被定义为低优先级;当置PT0=1时,该中断源被定义为高优先级。
PX0:外部中断0优先级设置位。当置PX0=0时,该中断源被定义为低优先级;当置PX0=1时,该中断源被定义为高优先级。
中断的运行过程大概是:设置中断类型,允许中断(EA)----&满足中断标志位----&开始执行中断程序
执行顺序,如果多个同优先级的中断请求同时发出,则CPU按照一定的查询次序来决定中断执行的顺序。51系列单片机对中断的查询次序为“外部中断0---》定时器/计数器T0---》外部中断1---》定时器/计数器T1---》串行接口中断”。
如果一个低优先级的中断请求正在执行,则可以中断该服务程序,然后执行本次中断请求。如果一个高优先级或同优先级的中断请求正在执行,则当前中断请求不会立即执行。
任何正在执行的指令在未完成前,中断请求都不会响应。
如果程序正在执行读写寄存器IE和IP指令,则执行完该命令后,需要再执行一条其他指令才可以相应中断。
如果程序正在执行返回指令,则执行完该命令后,需要再执行一条其他指令才可以响应中断。
格式:例 void It0(void) interrupt (中断源)X
中断源:0(外部中断0) 1(定时器/计数器T0) 2(外部中断1) 3(定时器/计数器T1) 4(串行接口中断) 5(定时器/计数器T2) 6(PCA中断)。
例:下面是一个利用中断和定时器/计数器T0实现数码管间隔一秒加一的程序。
&#include &reg52.h&
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
code uint8 number[] = {0x3F,0x06,0x5B,0x4F,
& & & 0x66,0x6D,0x7D,0x07,
& & & 0x7F,0x6F,0x77,0x7C,
& & & 0x39,0x5E,0x79,0x71};
uint32 i=0;
uint16 counter = 0;
sbit BCD6 = P1^5;
sbit BCD5 = P1^4;
sbit BCD4 = P1^3;
sbit BCD3 = P1^2;
sbit BCD2 = P1^1;
sbit BCD1 = P1^0;
void mdelay(void);
void init_delay(void);
void init_interrupt(void);
void show(uint32 temp);
void init_delay()
TMOD = 0x01;//设置使能T0
TH0 = 0xB8;
TL0 = 0x00;
TR0 = 1;//使能定时器/计数器
void init_interrupt()
ET0 = 1;//设置定时器/计数器T0中断
EA = 1;//中断使能
void mdelay()
uint16 n = 100;
for(;n&0;n--);
void main(void)
init_delay();
init_interrupt();
if(i == 50)
counter++;
show(counter);
//中断程序
void interrupt_timer1() interrupt 3
TH0 = 0xB8;
TL0 = 0x00;
i++;
void show(uint32 temp)
P0 = number[temp/];
P0 = number[temp/10000%10];
P0 = number[temp/1000%10];
P0 = number[temp/100%10];
P0 = number[temp/10%10];
P0 = number[temp%10];
排名:千里之外
(6)(1)(2)(0)C51单片机,用到定时器0、定时器1,分别用途定时和串口通信_百度知道
C51单片机,用到定时器0、定时器1,分别用途定时和串口通信
if(Fen&P3_2 = ;unsigned char K = 0;定时器0初始化函数
/ 串口通信中断入口 {
RI = 0;开总中断
ET0 = 1!P3_2;/
TR1 = 0;/ i--)
for(j = 500; j &
}}void UARTInterrupt(void) interrupt 4
while(;/
TMOD = 0x02;
tmp = SBUF;圈记数!TI);=0、第3和第4可正常切换工作!
TI = 0;/
TMOD = 0x20;
TR1 = 1;计时
unsigned char Miao = 0;
if(Fen2 == 1)
TMOD = 0x02;/&#47、定时器1恢复工作(串口通信)完成后4;定时器1 工作于模式2(作串口通信用)
SCON = 0x50;}void mc(unsigned char i){
if(Miao&*---------定义全局变量------------*&#47,谢谢;TMOD = 0x02;//
} //
Fen2 = 1;//
Fen2 = 0;/ 0;/ j--);/分 unsigned int Fen2 = 0;///
ET0 = 0; 0,请高手帮忙;
SBUF =void delay(unsigned int i);void InitUART_1(void)
TMOD = 0x20;
TR0 = 1; //&#47!
} void delay(unsigned int i){for(i=i;定时器1 工作于模式2(作串口通信用) 打开
if(flag == 1)
ES=0定时器0;
TH0 = 0x00!TI);/*SBUF =
if(K&gt,分别用途定时和串口通信;/定时器0 工作于模式2(作定时器用)
TH0 = 0x00;//
void SendOneByte(unsigned char c){
EA = 1.h&秒
unsigned int Fen = 0;
LedNumVal = SBUF ;&#47,要实现一个这样的功能1、首先定时器1工作(串口通信)完成后、定时器0恢复工作(开始定时)完成后5;
TR0 = 0;++Q;/
while(;/i&
ET0 = 1;&#47,2;//
mc(tmp)、定时器0启动工作(开始定时)完成后3;计数器0中断
TR0 = 1;/开定时器/函数声名 void mc(unsigned char i);&#47,互不影响
下面是我写的;定时器0 工作于模式2
PCON = 0x00,有很多问题;
ES=1;/}void Timer1Interrupt(void) interrupt 1/&#47,以实现以上功能!#include &
Fen = 0;reg51;/ InitUART_1();flag = 1;
Miao = 0;delay(10); i & /}void dsqcsh(void)/
TL0 = 0x48;
for(i; /
TH1 = 0xFD;/
TL1 = TH1;
++F 定时时间200us
TL0 = 0x48;=i*2)
LedNumVal = F定时器/计数器0开始计时
}void main(void){ dsqcsh();
++Miao,每走一圈加1
/&#47!P3_2;
&#47、定时器1
提问者采纳
定时器0、定时器1是2个互相独立的定时计数器
可以同时工作
用不着互相切换来工作。
其他类似问题
为您推荐:
您可能关注的推广
串口通信的相关知识
其他1条回答
用不着这切换来切换去吧,
你这两功能可以同时运行嘛 定时和通讯可以同时运行
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁浏览:3954次
评论:0条 &时间:
在生产控制中,通常需要对S7-400H系统的信息和状态进行监控,例如监控CPU的主从状态、..

我要回帖

更多关于 定时器中断程序 的文章

 

随机推荐