1. C51单片机定时器和中断有什么联系
定时器是经过多少个周期之后执行什么程序
中断是有中断请求时中断正在运行的程序,没有中断请求时不影响
当有中断或者中断优先级高于正在运行的程序时就产生中断进入中断程序
2. c51单片机c语言编程中定时器和中断的关系,程序如下,坐等!!!
你的定时器中断进不了吧, 因为你没开定时器中断允许位ET0=1
另: 定时器模式设置好后TMOD=0x01, 打开定时器中断允许ET0=1, 然后TR0=1启动定时器就可以了
3. 求高手写 用51单片机C语言 TMOD=0X01 定时一秒的程序
#include <reg51.h>
#define uchar unsigned char
sbit LED=P1^0;
uchar time;
void initT0( )
{
TMOD = 0x01; //定时器0,工作方式1
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256; //50ms中断一次
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main(void)
{
initT0();
while(1)
if(time==20) //中断20次,1s
{
time=0;
LED=~LED; //P1.0上的LED1s亮或灭一次
}
}
void T0int( ) interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
time++;
}
4. 求51单片机c语言程序,使用定时器中断,当接受的下降沿时,开始定时,定时一分钟,定时结束后跳出中断
//假设晶振12MHZ,检测的是P1.1下降沿
#include "reg51.h"
unsigned int YSJS;
sbit K1 = P1^1;
void main(void)
{
TMOD |= 0X10; //定时器1工作于方式1,16位定时器
TL1 = 0x78; //设置定时初值
TH1 = 0xEC; //定时器1定时时间=5000us
ET1 = 1; //使能定时器1中断
EA =1; //开总中断
K1 = 1;
YSJS = 0;
while(1)
{
if(K1==0)TR1 = 1; //启动定时器1
if(YSJS == 12000) //已定时一分钟
{
//这里加入你自己定时一分钟后要做的处理
}
}
}
void TIMER1(void) interrupt 3 //定时器1中断函数使用默认寄存器组
{
TL1 = 0x78; //设置定时初值
TH1 = 0xEC; //定时器1定时时间=5000us
YSJS++;
if(YSJS==12000) //已定时一分钟
{
TR1 = 0;关闭定时器1
}
}
5. 51单片机C语言对流水灯编程,用定时中断做
#include<reg52.h>
#defineucharunsignedchar
ucharm=0,i=0;
voidmain()
{
TMOD|=0x01;//定时器0工作方式为1
TH0=(65536-50000)/256;//装初值
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器中断
TR0=1;//开启定时器
while(1);//等待中断
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
m++;
if(m==5)//12M晶振定时5*50MS=250MS
{
m=0;
P1=~(0X01<<i);//P1接8个LED
if(++i==8)
i=0;
}
}
[补充]
延时函数是一种粗略计算延时时间的函数
是通过让单片机执行空指令,达到等待延时的目的。
经常被应用在对延时时间要求不太严格的场合。
而定时器中断,则是通过对晶振时钟进行计数
由于晶振的频率一般是很稳定的,所以晶振的脉冲频率基本稳定
从而通过对脉冲进行计数即可得到准确的延时目的。
中断延时函数和定时器中断延时没有明确的对应关系。
主要是根据你的应用场合来确定使用哪种函数。
6. 定时器延时问题(51单片机,c语言)
你的这两个函数void delayms(uint)和void display(uchar,uchar,uchar,uchar)我可以肯定的告诉你,没有问题。你的这个程序其实就是想显示0000~5959之间的数,而且这个数是每20秒+1顺序递增的。之所以没有任何反应,那是你的主程序没有挂起,也就是在while(1)里没有没有大括号,程序执行一次就结束了,所以你什么都看不到。应该这样
while(1)
{//加入的成对大括号
for(thou=0;thou<=5;thou++) //千位
for(hun=0;hun<=9;hun++) //百位
for(ten=0;ten<=5;ten++) //十位
for(one=0;one<=9;one++) //个位
{
while(num!=20) //循环一秒
{
display(thou,hun,ten,one);//数码管显示四个数字
}
num=0;
}
}
这样你就可以看到程序运行的结果了,但结果是这样的:四个LED显示管闪得很严重,计划是一亮一灭的,而且0000~5959这个数字几乎显示得不成样子。主要是delayms(5),这个延迟程序你应该尽量控制在20ms之内(主要是人眼残辉的时间极限),短了感觉就全亮,长了就一闪一灭。
不过我很看不惯你的这个程序,我给你一个CPU负担更小,而显示又非常好的程序供你参考:
#include<AT89X52.H>
#define uint unsigned int
#define uchar unsigned char
sbit LED4=P2^0; //数码管千分位
sbit LED3=P2^1; //数码管百分位
sbit LED2=P2^2; //数码管十分位
sbit LED1=P2^3; //数码管个分位
uchar ms20,s1;//20毫秒和1s变量定义(声明)
//定时器T0初始化,10ms秒初值
void InitTimer0(void)
{
TMOD=0x01;
TH0=0x0D8;
TL0=0x0F0;
EA=1;
ET0=1;
TR0=1;
}
void Display(uchar dat4,uchar dat3,uchar dat2,uchar dat1)
{
static uchar k;
P2=P2|0xf0;
switch(k++)
{
case 0:
P0=dat4;
LED4=1;
break;
case 1:
P0=dat3;
LED3=1;
break;
case 2:
P0=dat2;
LED2=1;
break;
case 3:
P0=dat1;
LED1=1;
break;
default:k=0;return;
}
}
void Timer0(void) interrupt 1//1ms中断
{
TH0=0x0D8;
TL0=0x0F0;
ms20++;
s1++;
}
void Main(void)
{
uchar thou,hun,ten,one;
InitTimer0();
while(1)
{
if(s1>=100)//每1秒钟one+1
{
s1=0;
if(one++>=9)
{
one=0;
if(ten++>=5)
{
ten=0;
if(hun++>=9)
{
hun=0;
if(thou++>=5) thou=0
}
}
}
}
if(ms20==2)//每20毫秒调用一次显示函数
{
Display(thou,hun,ten,one);
ms20=0;
}
}
}
7. 51单片机c语言定时器控制流水灯
#include //51系列单片机定义文件
#define uchar unsigned char //定义无符号字符
#define uint unsigned int //定义无符号整数
void delay(uint); //声明延时函数
void main(void)
{
uint i;
uchar temp;
while(1)
{
temp=0xFE;
for(i=0;i<8;i++) //8个流水灯依次全部点亮
{
P1=temp;
delay(500); //调用延时函数
temp<<=1;
}
}} void delay(uint t) //定义延时函数
{
register uint bt;
for(;t;t--)
for(bt=0;bt<255;bt++);
}
8. 51单片机C语言定时器定时2小时灯亮2小时灯灭,如此循环!
如果想实现无限循环那就采用死循环方式,可以无限的循环如while(1){};然后设定定时器定时时间为1s(此值需要根据单片机确定是否可以设定这么大),其次,设定一个变量对时间进行计数,根据计数情况做出相应的改变,程序可以这样设定:
unsigned char gucLEDStatus = 0x00; //全局变量,表示灯当前的状态 0为灭,1为亮
volatile unsigned int gusTimeCnt; //全局变量对时间计数
int main()
{
//增加定时器初始化并开放中断
while(1)
{
if(gucLEDStatus == 0x01) //当前为亮状态
{
if(gusTimeCnt >= 7200) //两个小时时间到
{
gusTimeCnt = 0x00; //清零
gucLEDStatus = 0x00; //灯为灭状态
//此处加程序代码,控制灯为灭的状态
}
else
{
//此处加程序代码,控制灯为亮的状态,此处会重复执行,可以进行控制
}
}
else if(gucLEDStatus == 0x00) //灯为灭的状态
{
if(gusTimeCnt >= 3600) //1个小时
{
gusTimeCnt = 0x00;
gucLEDStatus = 0x01; //亮状态
//增加程序代码,控制灯亮
}
else
{
//增加程序代码,控制灯灭,此处会重复执行,可以进行控制
}
}
}
return 0;
}
在中断函数中,对gusTimeCnt进行递增即可!
9. c编程时,51单片机怎么用定时器写一个延时1ms的子函数
好办
用C51,方式一
void delay(unsigned int T) //T的单位取微秒
{
signed int cnt; //这里用符号数的相反数 就是2^16-n的原码,也可以定义无符号数自己换成2^16-n
cnt=-(fosec*1.0/12)*T; // fosec的单位MHz
TMOD=0x01;
TH0=(unsigned char)(cnt>>8);
TL0=(unsigned char)cnt;
TR0=1;
while(!TF0);
TR0=0;
TF0=0;//加这句是为了可以循环使用
}
10. 如何用51单片机做能定6小时的定时器要c语言程序
51单片机一次最大只能定时65536us,你算一下,要定时多少次。