单片机用c语言编一个程序,要求用内部定时计数器对30个脉冲进行计数,并同时对这三十个脉冲进行计时。

单片机用c语言编一个程序,要求用内部定时计数器对30个脉冲进行计数,并同时对这三十个脉冲进行计时。,第1张

看了一下你的要求,单片机里有个GATE位的设置如果你懂得用,编这个程序就不难了。下面是我个人按照你要求刚编的程序:

/

功能:内部定时/计数器记录脉冲个数和这些脉冲通过后所用的时间。

硬件:单片机用AT89c51,12M晶振。

原理:当门控位GATE为“1”时,TR0/1=1,INT0/1才能启动定时器。

利用这个特性可以测量外部输入脉冲的宽度。

分析:设外部脉冲由(P32)输入,T0工作于定时方式1(16位计数),

GATE设为1测试时,应在INT0低电平时,设置TR0为1(避免检测

到正在进行的脉冲);当INT0为高电平时,就启动计数,INT0再

次变低时,停止计数。此计数值与机器周期的乘积即为被测正脉

冲的宽度。因晶振为12MHz,机器周期为1us

/

#include <reg51h>

//sbit INT0=P3^2;//INT0在头文件里已定义为P3^2口

#define uint unsigned int

uint pulseWidth[30],num;

void init()

{

num=0;

TMOD=0x09;//选择定时器并设T0为方式1

TH0=0x00; //设计数初会为最大值

TL0=0x00;

}

main()

{

init();

while(1)

{

if(num<30) //记录30个脉冲

{

while(INT0);//等待INT0变低

TR0=1; //应在INT0低电平时,设置TR0为1

while(!INT0);//等待INT0变高,启动定时器开始计数

while(INT0); //等待INT0变低,停止定时器开始计数

TR0=0;

pulseWidth[num]=(uint)TL0;

pulseWidth[num]|=(uint)(TH0<<8);

//因机器周期为1us,故pulseWidth数组里存的数目加上单位us,

//即为所求的脉冲宽度

num++;

}

}

}

#include<reg52h>

#define uint unsigned int

#define uchar unsigned char uchar code tabel[]={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

uint num;//计数变量声明sbit wei_ge=P2^0; //个位控制角定义

sbit wei_shi=P2^1; //十位控制角定义

sbit wei_bai=P2^2; //白位控制角定义

sbit wei_qian=P2^3;//千位控制角定义/延时子程序/

void delay(uint xms)

{

uint j;

for(;xms>0;xms--)

for(j=110;j>0;j--);

}/数码管扫描显示子程序/

void shuma_show(uint date)

{

uchar ge,shi,bai,qian;//数码管显示变量声明 ge=date%1000;//个位数换算

shi=date/10%10;//十位换算

bai=date/100%10;//百位换算

qian=date/1000;//千位换算

wei_ge=1;//打开个位显示

P0=tabel[ge]; //数据输入数码管内

delay(2);//延时显示2ms

wei_ge=0;//关闭个位显示 wei_shi=1;//打开个位显示

P0=tabel[shi]; //数据输入数码管内

delay(2);//延时显示2ms

wei_shi=0;//关闭个位显示 wei_bai=1;//打开个位显示

P0=tabel[bai]; //数据输入数码管内

delay(2);//延时显示2ms

wei_bai=0;//关闭个位显示 wei_qian=1;//打开个位显示

P0=tabel[qian]; //数据输入数码管内

delay(2);//延时显示2ms

wei_qian=0;//关闭个位显示

}/初始化子程序/

void inti()

{

wei_ge=wei_shi=wei_bai=wei_qian=0;//各I/O口初始化

TMOD=0x05;//设置计数器0工作方式1,为16位计数器,且为外部计数

TH0=0;//计数器高8位装初值

TL0=0;//计数器低8位装初值

TR0=1;//开计数器

}/主程序/

void main()

{

inti();

while(1)

{

num=TH0255+TL0;//读计数器数据

if(num==10000){TH0=TL0=0;} //计满清零

shuma_show(num);//数码管扫描显示

}

} 你电路图太不清楚了,我随便定义的I/O口,我刚写完的,程序只是编译了没问题,可能会有问题,但问题不大,希望你能够满意,很少有女生学单片机的,加个扣扣如何呢?我现在在学AVR了,觉得51的资源不够用了,做过很多项目,一起交流交流?我的QQ:576689422

我补充一下,t0/t1,就是用来做计数的。。。p34,p35就是对外部电平下降沿的捕捉。。。

你是不是想用外部中断来做,也很好做的。。。连接到p32或者p33就可以了,然后在中断子程序中加1计数。。。

设置一个寄存器,初始化为0;然后将脉冲信号与某个数字比较,若出现脉冲信号大于这个比较数字,则马上判断这个脉冲信号是否回落到小于这个比较数字,若小于,则证明是一个脉冲信号,寄存器数值+1;反之,继续保持判断状态。

1 博图可以用脉冲信号计数

2 脉冲信号计数是通过将脉冲信号输入到计数器中,计数器会自动计数,统计脉冲信号的数量,并输出结果。

博图可以通过将脉冲信号输入到计数器模块中,再通过程序控制读取计数器的数值,从而实现脉冲信号计数的功能。

3 在使用脉冲信号计数功能时,需要注意信号的频率范围、计数器的位数和重复计数的问题,以确保计数的准确性和稳定性。

此外,还可以结合其他模块和功能,如定时器、中断等,实现更加复杂和精确的计数应用。

电路比较简单,程序原理,设置定时器/计数器为16位外部计数状态,主程序中不断地读取计数器数据并显示即可。

51单片机程序大致如下:

TMOD=0x05;

TH0=0;

TL0=0;

TR0=1;

while(1)

a=TH0256+TL0;

display(a);

以上就是关于单片机用c语言编一个程序,要求用内部定时/计数器对30个脉冲进行计数,并同时对这三十个脉冲进行计时。全部的内容,包括:单片机用c语言编一个程序,要求用内部定时/计数器对30个脉冲进行计数,并同时对这三十个脉冲进行计时。、如何单片机编程定时器0外部脉冲计数、MCU如何实现对外部脉冲计数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9356465.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存