51单片机如何同时使用定时器和计数器采集数据?
实现效果:计数器对P3^5口的低电平个数进行计数,定时器每200ms采集一次计数器得到的值(采集之后,计数器值归零),急用,c语言程序,感谢!...
实现效果:计数器对P3^5口的低电平个数进行计数,定时器每200ms采集一次计数器得到的值(采集之后,计数器值归零),急用,c语言程序,感谢!
展开
5个回答
展开全部
这是我根据频率计程序修的
//用定时计数器1作为脉冲计数器(P3.5引脚正是输入功能),定时器0作为定时器用,定时50ms产生中断
//中断4次后(即0.2s)读计数器1的数据
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
//定义以I/O口的功能
sbit rs=P1^3;//液晶屏写选择,0命令 1数据
sbit rw=P1^4;//液晶屏读写选择
sbit lcden=P1^5;//液晶屏使能
#define db P2 //定义P2为数据输出口,写数据时用db代替P2,增加液晶屏程序的通用性
//更改硬件接线时,只更改此处,而不必去更改液晶屏读写子程序
uchar aa;//计中断次数
uint bb,cc,dd;//保存计数器的值
void Delay1ms(unsigned int i) //1ms延时程序
{
unsigned int j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
void init()//初始化设置
{
TMOD=0x51;//定时器1作为计数器,定时器0作为定时器用
TH1=0;//计数器清0
TL1=0;
EA=1;//开总中断
ET0=1;//允许定时器0中断
TH0=0x4c;
TL0=0x5c;
TR1=1;//启动计数器
TR0=1;//启动定时器
aa=0;
}
void write_com(uchar com)//向液晶屏写命令
{
db=com;
rs=0;
rw = 0;
lcden=0;
Delay1ms(10*12);
lcden=1;
Delay1ms(10*12);
lcden=0;
}
void write_date(uchar date)//向液晶屏写数据
{
db=date;
rs=1;
rw = 0;
lcden=0;
Delay1ms(10*12);
lcden=1;
Delay1ms(10*12);
lcden=0;
}
void init2()//液晶屏初始化
{
rw=0;
write_com(0x38);//显示模式16字*2行,5*7点阵,数据口8位
Delay1ms(10*12);
write_com(0x0f);//开显示,显示光标,光标闪烁
Delay1ms(10*12);
write_com(0x06);//写完数据后数据指针和光标位置自动加1
Delay1ms(10*12);
write_com(0x01);//屏幕清除
Delay1ms(10*12);
}
void display4(unsigned int number) //单行多位显示程序
{
uchar A1,A2,A3,A4,A5;
init2();//液晶屏初始化
A1=number/10000%10;//分离出十万,万,千,百,十,个
A2=number/1000%10;
A3=number/100%10;
A4=number/10%10;
A5=number%10;
write_com(0x80);//第1个数据的位置设定,第1行第1列
Delay1ms(10);
write_date(0x30+A1);//写数据
Delay1ms(10);
write_date(0x30+A2);
Delay1ms(10);
write_date(0x30+A3);
Delay1ms(10);
write_date(0x30+A4);
Delay1ms(10);
write_date(0x30+A5);
Delay1ms(10);
}
void main()//主程序很简单
{
init();//初始化
while(1)//循环程序
{
dd=bb*256+cc;//0.2S的计数值
display4(dd);//显示
Delay1ms(100); //延时
}
}
void timer0()interrupt 1//注意:定时器0的中断序号为1
{
aa++;
TH0=0x4c;
TL0=0x5c;
if(aa==4)//中断4次,共0.2S
{
TR1=0;//暂停计数
aa=0;
bb=TH1;//读出计数器数据
cc=TL1;
TL1=0;//计数器清0
TH1=0;
TR1=1;//重新启动计数器
}
}
//用定时计数器1作为脉冲计数器(P3.5引脚正是输入功能),定时器0作为定时器用,定时50ms产生中断
//中断4次后(即0.2s)读计数器1的数据
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
//定义以I/O口的功能
sbit rs=P1^3;//液晶屏写选择,0命令 1数据
sbit rw=P1^4;//液晶屏读写选择
sbit lcden=P1^5;//液晶屏使能
#define db P2 //定义P2为数据输出口,写数据时用db代替P2,增加液晶屏程序的通用性
//更改硬件接线时,只更改此处,而不必去更改液晶屏读写子程序
uchar aa;//计中断次数
uint bb,cc,dd;//保存计数器的值
void Delay1ms(unsigned int i) //1ms延时程序
{
unsigned int j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
void init()//初始化设置
{
TMOD=0x51;//定时器1作为计数器,定时器0作为定时器用
TH1=0;//计数器清0
TL1=0;
EA=1;//开总中断
ET0=1;//允许定时器0中断
TH0=0x4c;
TL0=0x5c;
TR1=1;//启动计数器
TR0=1;//启动定时器
aa=0;
}
void write_com(uchar com)//向液晶屏写命令
{
db=com;
rs=0;
rw = 0;
lcden=0;
Delay1ms(10*12);
lcden=1;
Delay1ms(10*12);
lcden=0;
}
void write_date(uchar date)//向液晶屏写数据
{
db=date;
rs=1;
rw = 0;
lcden=0;
Delay1ms(10*12);
lcden=1;
Delay1ms(10*12);
lcden=0;
}
void init2()//液晶屏初始化
{
rw=0;
write_com(0x38);//显示模式16字*2行,5*7点阵,数据口8位
Delay1ms(10*12);
write_com(0x0f);//开显示,显示光标,光标闪烁
Delay1ms(10*12);
write_com(0x06);//写完数据后数据指针和光标位置自动加1
Delay1ms(10*12);
write_com(0x01);//屏幕清除
Delay1ms(10*12);
}
void display4(unsigned int number) //单行多位显示程序
{
uchar A1,A2,A3,A4,A5;
init2();//液晶屏初始化
A1=number/10000%10;//分离出十万,万,千,百,十,个
A2=number/1000%10;
A3=number/100%10;
A4=number/10%10;
A5=number%10;
write_com(0x80);//第1个数据的位置设定,第1行第1列
Delay1ms(10);
write_date(0x30+A1);//写数据
Delay1ms(10);
write_date(0x30+A2);
Delay1ms(10);
write_date(0x30+A3);
Delay1ms(10);
write_date(0x30+A4);
Delay1ms(10);
write_date(0x30+A5);
Delay1ms(10);
}
void main()//主程序很简单
{
init();//初始化
while(1)//循环程序
{
dd=bb*256+cc;//0.2S的计数值
display4(dd);//显示
Delay1ms(100); //延时
}
}
void timer0()interrupt 1//注意:定时器0的中断序号为1
{
aa++;
TH0=0x4c;
TL0=0x5c;
if(aa==4)//中断4次,共0.2S
{
TR1=0;//暂停计数
aa=0;
bb=TH1;//读出计数器数据
cc=TL1;
TL1=0;//计数器清0
TH1=0;
TR1=1;//重新启动计数器
}
}
展开全部
TIMER1作计数器,TIMER0作定时器。不能只用一个同时做两件事的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
开两个中断,一个定时,一个计数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
51单片机在兆级晶振下单纯定时器是达不到200ms计时的,需要其他软件程序实现。T0和T1两个分别设置成定时器和计数器没问题,可以实现功能要求。需要帮忙写程序的话 可以私信我
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
系统和硬件都具有升级的空间,但主要还是看你对电脑的用途和要求!这个配置,玩一般电脑游戏,办公等等都不会有问题!没有升级 的必要!当然,对电子产品有狂热追求的那就可以选择升级!显卡,内存,硬盘都有升级空间!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询