51单片机里2个外中断触发计时器开始和结束,将所记得的时间显示出来的程序怎么写啊?
加键盘。用两个按键控制。一个控制开始,一个结束,把他们接到中断上去
就你现在的程序可以正常扫描显示的呀,就是有点闪烁的效果。
但不知道,这是和谁学习的,数码管显示要用定时器定时,中断一次显示一次,这可是仿真,运行速度肯定比实物要慢,所以,就会有闪烁的。
其实,你的主程序中有计算四位数的程序
TEMP[0]=NUMBER[num/1000];
TEMP[1]=NUMBER[num/100%10];
TEMP[2]=NUMBER[num/10%10];
TEMP[3]=NUMBER[num%10];
这是很费时的,这个时间足够显示一位的延时了,所以,就在主程序中调用显示子函数就很好的,何必还定时扫描呢。
这样
void main()
{
TIMER_ini();
while(1)
{
TEMP[0]=NUMBER[num/1000];
TEMP[1]=NUMBER[num/100%10];
TEMP[2]=NUMBER[num/10%10];
TEMP[3]=NUMBER[num%10];
display(4,4);
}
}
问题就解决了。
最后就一句,那计数是很快了,是每秒计一个数吗,还是就是计数?
这样改,要关掉定时器T1的中断。
/*******************************************************************************************************
秒表程序,P0接段位,P2接数码管数位。采用中断精准及时。
********************************************************************/
#include <AT89X55.H>
#define uc unsigned char
uc s,min,h,time,ms;
uc temp[]={0,0,0,0,0,0,0,0};
void display()
{
uc displaycode[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uc i,k;
k=0x01;
for(i=0;i<8;i++)
{
P2=~0;
P0=displaycode[temp[i]];
P2=k;
k=k<<1;
}
P2=~0;
}
void main()
{
if(time==100)
{
s++;
time=0;ms=0;
if(s>59)
{
s=0;min++;
if(min>59)
{
min=0;
h++;
if(h>23)h=0;
}
}
}
temp[0]=h/10;
temp[1]=h%10;
temp[2]=min/10;
temp[3]=min%10;
temp[4]=s/10;
temp[5]=s%10;
temp[6]=ms/10;
temp[7]=ms%10;
while(1)
{
display();
}
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
ET0=1;
EA=1;
IT0=1;
EX0=1;
IT1=1;
EX1=1;
display();
}
void time0() interrupt 0
{
TR0=1;s=0;min=0;h=0;
}
void time1() interrupt 2
{
TR0=0;
}
void time2() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
ms++;
time++;
}
/************************************************
// 中断初始化函数 //
************************************************/
void Init(void)
{
EX1 = 1;//开外部中断1
EX2 = 1;//开外部中断2
TMOD = 0x01;//设置定时器为工作模式1
//定时时间设置为5ms,频率为200Hz
TH0= (65536 - 5000) / 256;
TL0= (65536 - 5000) % 256;
ET0 = 1;//开定时器0中断
EA = 1;//开全局中断
}
************************************************
// 外部中断1中断服务程序 //
************************************************/
void Extern1(void) interrupt 2
{
//外部中断1触发,使能定时器1
TR0 = 1;
}
// 外部中断2中断服务程序 //
************************************************/
void Extern2(void) interrupt 4
{
//外部中断2触发,失能定时器1
TR0 = 0;
}
/************************************************
// 定时器0中断服务程序 //
************************************************/
void Timer0(void) interrupt 1
{
//定时器重装初值
TH0= (65536 - 5000) / 256;
TL0= (65536 - 5000) % 256;
count++;//定义一个计时变量
//数码管显示
if(count == 1)
{
P2 = 0x01;
P0 = ~table[shi0];
}
if(count == 2)
{
P2 = 0x02;
P0 = ~table[ge0];
}
if(count == 3)
{
P2 = 0x04;
P0 = ~table[shi1];
}
if(count == 4)
{
count = 0;
P2 = 0x08;
P0 = ~table[ge1];
}
}
参考一下,有些地方需要修改,自己看着办吧,希望对你有帮助...
网上很多的额
楼主给出显示电路先。
单片机怎么在一个project里面包含两个c程序
这是标准的C语言写法。1. 不管有多少个函数,C总是从main()主函数开始执行。2. 至于你说的一个工程里面包括多个.c的文件,其实每个.c的文件里就是一系列函数而已。如果你要使用这些函数的话你要在头文件里加入#include。比如我要用“init.c”这个文件,则头文件中除了#include"reg51.h"你还要加...
如何同时在一个单片机C语言中同时使用外部中断0和1
这个是可以一起使用的,对应的P口是不一样的,按照中断使用的规则去设置就可以了
51单片机外部中断 P3^2 P3^3,是不是接那个管脚 都可以引起外部中断...
P3^2是外部中断0 P3^3是外部中断1 外部中断0的优先级别高于外部中断1,当两个外部中断都发生时,优先执行中断0.
有一个双串口单片机,我要把串口1的数据发送到串口2中去,串口1波特率9600...
你可以在单片机内部用数组把信息从串口1串到串口2,另外你还要考虑在单片机内部传递的时间,由于串口1速度快,口2速度慢,1:从串口2向串口1传递可以按照9600的波特率。2:从串口1向串口2传递速度只能按照串口2的波特率1200进行。如果对实时性要求不高还是很容易搞定的。
单片机汇编语言中断,外部中断一和外部中断零只能触发一个,之后就不能...
中断结束时,要使用中断返回指令:RETI。楼主的程序中,缺少 RETI,所以,就是在中断后,一直没有返回去,永远处于中断状态。
单片机中XTAL1和XTAL2有什么区别?
1、XTAL1、XTAL2引脚。这类引脚属于外接时钟引脚。前者为片内震荡电路的输入,后者为片内震荡电路的输出。2、RST引脚。这类引脚属于复位引脚,连续输入两个机器周期以上高电平就可以触发机制,完成单片机的复位初始化的工作,单片机就可以从头开始执行程序了。3、PSEN引脚。这类引脚的全称是程序存储器允许...
1. 8031单片机的4个并口的引脚,还具第二功能分别是什么?
8031单片机的4个并口(Port0,Port1,Port2,Port3)的引脚,除了作为普通的I\/O口外,还具有以下第二功能:Port0: P0.0 - P0.7 P0.0:外部中断0引脚(INT0)(低电平有效)P0.1:外部中断1引脚(INT1)(低电平有效)P0.2:定时器0外部计数脉冲输入引脚(T0)(低电平有效)P0.3:定时...
单片机8051的xtal1和xtal2引脚是( )引脚
8051单片机的XTAL1和XTAL2引脚是用于提供外部时钟源的。这两个引脚之间通常连接一个晶体振荡器或陶瓷谐振器,与单片机内部的反相放大器构成一个自激振荡器,从而为单片机提供稳定的时钟信号。2. 如何连接和使用XTAL1和XTAL2引脚:当使用外部时钟源时,XTAL1引脚应接地,XTAL2引脚接外部时钟信号。外部时钟...
用51单片机外部中断0计数时候,一次记得数不是加1,而是跳了几个,在...
嘿嘿 俺来帮你解决 1 选择计数脉冲的上升沿 触发中断 即设外部中断0为边沿触发方式 2 进入外部中断0的中断服务程序后,首先要让外部中断0关中断,避免计一个脉冲时产生多次中断。3 计数加1后,要延时一段时间,让计数脉冲稳定后,再让外部中断0重新开中断。呵呵 赶快试试吧 ...
用一个定时器能使单片机的两个输出口产生2个不同的pwm脉冲吗??懂得话...
提供一种思路,程序没时间写。1、PWM需要周期,因此定时器必须得设置匹配值,达到周期计数时间后复位TC值;2、两个PWM波形需要产生可调的PWM,那么就需要让定时器知道什么时刻该让这个IO口输出高低电平。可以让两个输出提供参数,比如数值是多少后出现高电平,高电平持续多长数值?3、最后就是关键点了,...
岛策乙水: /************************************************// 中断初始化函数 //************************************************/ void Init(void) { EX1 = 1;//开外部中断1 EX2 = 1;//开外部中断2 TMOD = 0x01;//设置定时器为工作模式1 //定时时间设置为5ms,频率为200...
全南县18287381958: 51单片机只有两个外部中断,有哪些方法可以进行外部中断的扩充? - ?
岛策乙水: 把定时器设为计数方式,计数初值为0xFF,自动重载模式,通过触发定时器引脚就可以触发中断了. 在需要有多个外部中断的应用场合,可用8259A可编程中断控制器接口芯片给MCS-51单片机扩展外部中断源.解决MCS-51单片机系统中,如...
全南县18287381958: 51单片机的两个外部中断可否同时开启 - ?
岛策乙水: 可以,只要第二次的中断优先级高于第一次就行.通过设置了中断控制寄存器IP来实现.如果不设置 默认的优先级顺序为:INT0 TO INT1 TI 串口中断. do{}while(P3^3==0); 先执行一次DO里的循环 在P3.3=0(INT1中断) 如果成立继续执行循环 do{}while(P3^3==1); TR1=0; 先执行一次DO里的循环 在P3.3=1(INT1没有中断) 如果成立继续执行循环 启动T1
全南县18287381958: 51单片机如何让两个定时器一个用来计时,另一个用与外部中断 - ?
岛策乙水: 1、你要求的是两个定时器一个用来计时,一个用来外部中断,定时器用作外部中断时是计数器的功能,而非定时器的功能,所以你本来的要求就有问题; 2、你写的程序语法没有问题,但是使用的是一个是外部中断0,另一个是定时器1中断; 3、如果使用定时器1持续定时,你的定时器1里面也应该写 TH1=(65536-50000)%256; TL1=(65536-50000)/256;不装载,进行一次50ms的定时就结束了! 如果满意,望采纳!
全南县18287381958: 单片机可以连续用两个中断吗 比如定时器中断t0和外部中断怎么用 - ?
岛策乙水: 单片机上只要有的 所有功能 都可以来 一起使用,包括各种 中断 可以一起 起用, 比如定时器T0中断和外部INT0中断,自 只要设置T0的定时初始值 并启2113动, 设置外部中断开启 及 触发方5261式 等等, 各种 中断方式 和 单片机 的 其他各种 功能 的 使用方法 等等, 最好 下载 一个4102 单片机 的 数据手册 看看, 上面 有 改 单片机 各种 功能的使用 方法的.1653
全南县18287381958: 51单片机如何开启两个定时器中断0和1 tmod怎么定义 还有开启的语句有哪些 - ?
岛策乙水: TMOD值取决于定时器的工作方式(0,1,2,3),开中断是 EA=1; ET0=1; ET1=1; TR0=1; TR1=1; 如有必要,还要设置TH0和TL0以及TH1和TL1的值
全南县18287381958: 51单片机利用两个外部中断和一个定时器,计算两个中断时间间隔的的程序.急求急求!!! - ?
岛策乙水: 下面的程序用的是定时器1: double time() //你要的函数{ doubule ti;int time;TMOD=0x10;//设置定时器1为工作方式2succeed_flag=0; //定时器溢出赋初值0EA=1; //打开全局中断控制EX0=1;EX1=1; //打开外部中断0,1中断TH1=0; ...
全南县18287381958: 51单片机怎么用定时器记录两次外部中断的时间?C语言应该如何编程? - ?
岛策乙水: 我51的时钟寄存器了解的不多,因此以概念形式来述说下.第一需要定时器初始化: a:中断寄存器初始化 b:计数寄存器初始化 c:重装填寄存器初始化(当计数寄存器计数完了后,使用这个寄存器,还原计数寄存器) d:分频值 主频/2^分频...
全南县18287381958: 单片机程序代写 - ?
岛策乙水: 用两个中断:1外部中断,2计时器中断;例如 电平下降沿触发 外部中断,这时候保存上次的计时值(相当于脉冲信号宽度),计时清0,并开始计时;或者电平下降沿触发 外部中断,计时清0,并开始计时,电平上升沿触发 外部中断,保存计时值(即低电平的宽度);
全南县18287381958: 51单片机中如何再一个外部中断中再嵌入一个定时器中断 - ?
岛策乙水: 要设置中断优先级,在默认情况下,外部中断0的优先级是最高的:外部中断0-->T0溢出中断-->外部中断1-->T1溢出中断-->串行接口中断(按辅助优先级从高到低排列) 但是,改变中断寄存器IP的内容可以改变这个默认设置:7 6 5 4 3 2 1 0 IP - - - PS PT1 PX1 PT0 PX0 上面是IP的各个位的内容,可见从0至4位分别控制外部中断0、T0溢出中断、外部中断1、T1溢出中断、串行接口中断的优先级,在51单片机Reset之后,IP为0(低优先级),所以你想在外部中断0里面嵌套定时器,可以用 setb PT1 或 setb PT0 (根据你的情况) 使定时器的优先级升到最高.