请问单片机C语言定时器程序怎么写?
请问单片机C语言定时器程序怎么写?详细讲解定时器的应用,我不知道定时程序怎么写,麻烦各位帮帮忙。...
请问单片机C语言定时器程序怎么写?详细讲解定时器的应用,我不知道定时程序怎么写,麻烦各位帮帮忙。
展开
4个回答
展开全部
你看过汇编吗?与汇编的格式是一样的。具体就是先开中断允许标志位(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 du)
{
uchar ge,shi,flge; //ge拆字后个位的存放处shi拆字后十位的存放处flge ℃的存放处
shi=tab[du/10]; //拆字
send(shi); //给595送数
ge=tab[du%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); //调用显示子程序
}
}
//功能:感应外界温度并用数码管显示
//时间: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 du)
{
uchar ge,shi,flge; //ge拆字后个位的存放处shi拆字后十位的存放处flge ℃的存放处
shi=tab[du/10]; //拆字
send(shi); //给595送数
ge=tab[du%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); //调用显示子程序
}
}
展开全部
//-------------------
//
函数名称:
void
delay_s(uchar
t)
//
函数功能:
利用定时器延时t秒子程序
//-------------------
delay_s(uchar
t)
{
uchar
count,a;
tmod=0x10;
//定时器1,模式1
th0=(65536-50000)/256;
//
定时为50ms
tl0=(65536-50000)%256;
ea=1;
et1=1;
tr1=1;
while(1)
{
if(a==t)break;
}
}
void
timer1()
interrupt
3
//定时器1
{
tr1=0;
th1=(65536-50000)/256;
//
定时为50ms
tl1=(65536-50000)%256;
count++;
if(count==20)
//判断是否到1秒
{
count=0;
a++;
}
tr1=1;
}
//
函数名称:
void
delay_s(uchar
t)
//
函数功能:
利用定时器延时t秒子程序
//-------------------
delay_s(uchar
t)
{
uchar
count,a;
tmod=0x10;
//定时器1,模式1
th0=(65536-50000)/256;
//
定时为50ms
tl0=(65536-50000)%256;
ea=1;
et1=1;
tr1=1;
while(1)
{
if(a==t)break;
}
}
void
timer1()
interrupt
3
//定时器1
{
tr1=0;
th1=(65536-50000)/256;
//
定时为50ms
tl1=(65536-50000)%256;
count++;
if(count==20)
//判断是否到1秒
{
count=0;
a++;
}
tr1=1;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
定时的话用到定时中断 具体用法这里不好说明 最好自己找份基础教材 能解释详细
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
网上下载一个郭天祥的视频教程,土豆还是酷六上有。讲解的非常详细。
祝你好运!!
祝你好运!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询