当前位置:首页 » 编程语言 » c语言单片机定时器

c语言单片机定时器

发布时间: 2022-07-07 04:32:29

⑴ 单片机的定时器c语言编程中:TH0与TL0为什么是TH0=(65536-50000)/256;TL0=(65536-50000)%256

1、首先第一步要定时器0设置于模式1时,然后由高8位TH0和低8位TL0两个8位寄存器组成,注意的是当设定计算值为65536-50000=15536(D)时,转换为十六进制就是3CB0(H),此时,TH0=3C,TL0=B0分别装入就可以了。

⑵ 单片机C语言定时器如何调用

单片机中通过中断的方式来调用定时器。


具体的调用方式可以参考通过如下程序:

程序功能:利用定时器进行定时,实现每秒中led闪烁一次

#include<reg52.h>
sbitled=P0^0;
unsignedintnum;
voidmain(void)
{
TMOD=0x00;//工作方式0
TH0=(8192-5000)/32;//12M晶振下定时5ms
TL0=(8192-5000)%32;
EA=1; //开总中断
ET0=1; //开定时器中断
TR0=1; //启动定时器
while(1)
{
if(num==200) //定时1秒钟到
{
num=0; //计数器清零
led=~led; //led灯取反,实现1秒闪烁一次
}
}
}

voidtimer()interrupt1//定时器1工作与方式0
{
TH0=(8192-5000)/32;//重装初值
TL0=(8192-5000)%32;
num++; //计数器加1

}

⑶ 单片机C语言用定时器1工作方式1怎么写

#include<reg52.h>
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uinti,num;
voidmain()
{
i=0;
num=0;
TMOD=0x10;//设置定时器1为工作方式1【查看TMOD每一位的含义,你就知道怎么设置了】
EA=1;//开总中断
ET1=1;//开定时器1中断
TR1=1;//启动定时器0
TH0=(65536-50000)/256;//定时器0计数初值高位
TL0=(65536-50000)%256;//定时器0计数初值低位
P2=0xFE;
P0=0xc0;
while(1)
{
if(i==10)
{
P2=0xff;
}
if(i==20)
{
i=0;
P2=0xfe;
num++;
if(num==10)num=0;
P0=table[num];
}
}
}
voidtime()interrupt1
{
TH0=(65536-50000)/256;//计数初值重载
TL0=(65536-50000)%256;
i++;
}

⑷ 单片机c语言里怎么用2个定时器

是51单片机吗?
如果是51单片机,你可以使用tmod设置两个定时器,然后使用tr0、tr1分别启动两个定时器。pt0置为“1”,就可以中断定时器1的服务函数,相反,如果pt1置为“1”就可以中断定时器0的服务函数。
如果不设置pt的值,默认为“0”,这样的话,t0和t1谁也不能中断谁。

⑸ 求单片机定时器简单程序(C语言)详解。不胜感激~

用定时器0中断做流水灯,程序如下:#include<reg52.h>#include<intrins.h> //包含_crol_()循环左移函数
unsigned char temp,count;void init() //初始化函数{ TMOD=0x01;//设置定时器0为工作方式1 TH0=(65536-50000)/256;//装初值,高8位 TL0=(65536-50000)%256;//装初值,低8位 EA=1;//开总中断 ET0=1;//开定时器0中断 TR0=1;//启动定时器0 temp=0xfe; count=0;//记数值清0}void main(){ init(); while(1){ P1=temp;}}void timer0() interrupt 1 using 1 //定时器0中断函数{ TH0=(65536-50000)/256;//重装初值,同上 TL0=(65536-50000)%256; count++;//计数值加1 if(count==10)//500ms{ count=0;//计数值清0 temp=_crol_(temp,1);循环左移一位}

⑹ 请问单片机C语言定时器程序怎么写

你看过汇编吗?与汇编的格式是一样的。具体就是先开中断允许标志位(IE里面对应的各个位)在设定TMOD工作方式。下一步就是设定初始值了(TH、TL)。设置完这些就可以开定时器了。写中断中段函数是是需要另加interrupt 加上一个常数(比如是定时器0就在后面加上1)。我用89S52芯片编过一个定时器程序你参考一下,希望对你有一点帮助。
//功能:感应外界温度并用数码管显示
//时间:2005年6月20日
//设计人:
#include<reg52.h>
#define uchar unsigned char
sbit ad0809_oe=P1^0; //定义各个位
sbit ad0809_start=P1^1;
sbit ad0809_ale=P1^2;
sbit ls595_rclk=P1^3;
sbit ad0809_eoc=P1^5;
sbit ls595_oe=P1^4;
sbit ls595_ser=P3^0;
sbit ls595_srclr=P3^1;
uchar nn,mm;
uchar code tab[]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84};
send(uchar); //声明函数
AD(uchar);
void display(uchar);
void init();
//********普通口输入数据*****************
send(uchar shu) //普通口串行输入
{
unsigned char i,k;
k=0x01;
for(i=0;i<8;i++)
{
if(k==(k&shu)) //判断每位上是否为1
ls595_ser=1;
else
ls595_ser=0;
k<<=1; //左移一位
ls595_srclr=0; //输入一个上升沿讲数送入595中
ls595_srclr=1;
}
}
//*****************595显示子程序********************
void display(uchar )
{
uchar ge,shi,flge; //ge拆字后个位的存放处shi拆字后十位的存放处flge ℃的存放处
shi=tab[/10]; //拆字
send(shi); //给595送数
ge=tab[%10];
send(ge);
flge=0xb1;
send(flge);
ls595_rclk=0; //上升沿送出数据
ls595_rclk=1;
}
//*******************初始化程序********************
void init() //初始化AD、定时器
{
ad0809_start=0; //Start管教上升沿将AD内部寄存器清零
ad0809_start=1;
ad0809_ale=1; //ALE高电平选择通道
nn=0;
mm=0;
TMOD=0x01; //定时器初始化
//IE=0x82;
EA=1;
ET0=1;
TCON=0x00;
TL0=(65536-50000)%256; //定时50ms
TH0=(65536-50000)/256;

}
AD(uchar wen)
{
// unsigned char tt=0;
// ad0809_ale=1; //选择通道
ad0809_start=1;
ad0809_start=0; //start下降沿启动转换信号
while(ad0809_eoc==0); //判断转换是否结束
ad0809_oe=1; //转换结束送出转换数据
wen=P2;
return (wen);
}

//**************中断服务程序*********************
void tiam0() interrupt 1 using 1 //中断服务程序
{
TL0=(65536-50000)%256; //定时50ms
TH0=(65536-50000)/256;
nn++;
if(nn==10) //0.5秒M加一
{
mm++;
nn=0;
}
}

//****************主程序***************************
void main()
{
unsigned char bb,aa,cc; //bb=计算后得到温度,aa=AD输出数据
unsigned char wen; //wen存放转换的得到的数据
init();
// wen=17;
ls595_oe=0;
cc=0;
TR0=1;
while(1)
{
aa=AD(wen);
// ad0809_oe=0;
aa=~aa;
bb=aa/4;
if(mm==2)
{
mm=0;
cc=bb;
}
display(cc); //调用显示子程序

}
}

⑺ 单片机c语言 如何用定时器得到随机数

keil
c中有生成
随机数
的函数,可以直接调用。

⑻ 51单片机定时中断C语言的写法步骤,可追加分数

程序说明:51单片机定时器0工作于方式一,定时50ms中断一次
晶振为12M
#include

void
main
{
TOMD
=
0X01;
//配置定时器0工作于方式一
TH1
=
(65536-50000)/256;
//高八位装入初值
TL1
=
(65536-50000)%256;
//低八位装入初值
ET0
=
1;
//开定时器0中断
EA
=
1;
//开总中断
TR0
=
1;
//启动定时器0
while(1)
{

}
}
void
Timer0_int()
interrupt
1
{
//重新装初值
TH1
=
(65536-50000)/256;
//高八位装入初值
TL1
=
(65536-50000)%256;
//低八位装入初值
}
/***************************************************************************************************************/
上面是比较好理解的。如果实在要求简洁的话,看下面的,跟上面功能一样
#include

void
main
{
TOMD
=
0X01;
//配置定时器0工作于方式一
TH1
=
0x3c;
//高八位装入初值
TL1
=
0xb0;
//低八位装入初值
IE
=
0x82;//开总中断并开定时器0中断
TR0
=
1;
//启动定时器0
while(1)
{

}
}
void
Timer0_int()
interrupt
1
{
//重新装初值
TH1
=
0x3c;
//高八位装入初值
TL1
=
0xb0;
//低八位装入初值}

⑼ 单片机c语言编程中关于定时器赋值的问题

程序是利用2种类型数据转换的方式来赋值的,一般来讲16位数赋给8位数时,高8位就被屏蔽掉,只赋值低8位给th0和th1。
程序中有点问题的,,其中TH1是放高8位地址所以应该放左移后的8位数,而TL1是放低8位地址,直接复制就可以,,不用&0xff,&了浪费了运行时间。
TH1=(0xffff-40000)>>8;
TL1=(0xffff-40000);
就可以了。

⑽ 求高手用C语言写一下89C51单片机内部定时器中断典型运用

说一下思路吧,使用两个定时器(T0和T1),T0为P0.0的接的LED定时,T1为P0.1接LED定时,需要两个变量led1_time和led2_time来计时(单位是秒),然后分别根据LED的状态来判断led1_time(或led2_time)需要计多少秒,按照你的要求,LED1(P0.0)亮时led1_time需要计时3秒,LED1灭时led1_time需要计时7200秒,即两个小时,对于LED2(P0.1)也是一样的道理。那么,废话说完了,接下来看代码吧!!!

#include<reg51.h>

typedefunsignedcharuint8;
typedefunsignedintuint16;

sbitled1=P0^0;
sbitled2=P1^1;

staticuint16led1_time=0x00;
staticuint8led2_time=0x00;
staticuint8led1_a_second=0x00;
staticuint8led2_a_second=0x00;

#defineA_SECOND(0x14)/*定时50ms,20中断得一秒钟*/
#defineTH_VALUE(0x3c)/*定时器溢出值,高位*/
#defineTL_VALUE(0xb0)/*定时器溢出值,地位*/
#defineLED1_ON_TIME(0x03)/*LED1亮3秒*/
#defineLED2_ON_TIME(0x01)/*LED2亮1秒*/
#defineLED1_OFF_TIME(0x1c20)/*LED1灭7200秒,两个小时*/
#defineLED2_OFF_TIME(0x02)/*LED2灭2秒*/

#defineLED_ON1/*高电平LED亮*/
#defineLED_OFF0/*低电平LED灭*/
/*
*初始化定时器函数
*/
staticvoidinit_time(void){

TMOD=0x11;/*使用T0、T1两个定时器,均选择模式1,定时模式*/
TH0=TH_VALUE;
TL0=TL_VALUE;
TH1=TH_VALUE;
TL1=TL_VALUE;
ET0=1;/*允许T0中断*/
ET1=1;/*允许T1中断*/
EA=1;/*打开总中断*/
TR0=1;/*开启定时器T0*/
TR1=1;/*开启定时器T1*/
}

voidmain(void){

led1=LED_ON;/*上电点亮LED1、LED2*/
led2=LED_ON;

init_time();/*初始化定时器*/

while(1){
/*
*检测LED1状态,如果LED1处于亮的状态,
*那么3秒后熄灭LED1;如果LED1是灭的,
*那么两个小时后点亮LED1。
*/
if(led1==LED_ON){

if(led1_time>=LED1_ON_TIME){

led1_time=0x00;
led1=LED_OFF;
}
}elseif(led1==LED_OFF){

if(led1_time>=LED1_OFF_TIME){

led1_time=0x00;
led1=LED_ON;
}
}
/*
*检测LED2状态,如果LED2处于亮的状态,
*那么1秒后熄灭LED2;如果LED2是灭的,
*那么2秒后点亮LED2。
*/
if(led2==LED_ON){

if(led2_time>=LED2_ON_TIME){

led2_time=0x00;
led2=LED_OFF;
}
}elseif(led2==LED_OFF){

if(led2_time>=LED2_OFF_TIME){

led2_time=0x00;
led2=LED_ON;
}
}
}

}
/*
*T0定时器中断向量值为1,中断地址为0x000b
*/
voidP0_0_timing(void)interrupt1{

TH0=TH_VALUE;
TL0=TL_VALUE;
/*
*如果计时满1秒,则led1_time加一,
*led1_time的单位是秒。
*/
led1_a_second++;
if(led1_a_second>=A_SECOND){

led1_a_second=0x00;
led1_time++;
}
}
/*
*T1定时器中断向量值为3,中断地址为0x001b
*/
voidP0_1_timing(void)interrupt3{

TH1=TH_VALUE;
TL1=TL_VALUE;
/*
*如果计时满1秒,则led2_time加一,
*led2_time的单位是秒。
*/
led2_a_second++;
if(led2_a_second>=A_SECOND){

led2_a_second=0x00;
led2_time++;
}
}

有用点一下采纳,谢谢!

热点内容
滑板鞋脚本视频 发布:2025-02-02 09:48:54 浏览:433
群晖怎么玩安卓模拟器 发布:2025-02-02 09:45:23 浏览:557
三星安卓12彩蛋怎么玩 发布:2025-02-02 09:44:39 浏览:744
电脑显示连接服务器错误 发布:2025-02-02 09:24:10 浏览:537
瑞芯微开发板编译 发布:2025-02-02 09:22:54 浏览:147
linux虚拟机用gcc编译时显示错误 发布:2025-02-02 09:14:01 浏览:240
java驼峰 发布:2025-02-02 09:13:26 浏览:652
魔兽脚本怎么用 发布:2025-02-02 09:10:28 浏览:538
linuxadobe 发布:2025-02-02 09:09:43 浏览:212
sql2000数据库连接 发布:2025-02-02 09:09:43 浏览:726