利用1个按键完成一个按键计数程序。

利用1个按键完成一个按键计数程序。,第1张

给个建议

1,打开一个定时器,模式选用自动重载,中断为125us

2,,利用定时器建立一个时基,申请全局变量time_125us,time_1ms,time_100us,time_1s等等建立一个时钟。

3,按键消抖用采集计数法,不能用延时

4,显示哪一位用个标志,这个标志在时基里处理

5,整个主循环里不应该有忙延时,除非这个忙延时不超过50us,当然也有例外

6,整个主循环循环一次应该在1到2ms内扫描结束,最多不能超过5个ms,当然也有例外,这样才能体现出所有的子程序好像是并行执行的,像你这种简单的程序应该是200--300us内执行完

把电路中显示器周边的三极管、电阻删除,直接用IO接口,连接显示器。

再试试下列程序。

#include<reg51h>

#define uchar unsigned char

#define uint unsigned int

uchar i, dat[3];

uint n,mb;

uchar code wei[3]={0xfb,0xfd,0xfe};//位驱动码

uchar code duan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//字型码

sbit P3_2=P3^2;

void delay(uint x)//延迟程序

{

uint a,b;

for(a=0;a<20;a++) for(b=x;b>0;b--);

}

void init() //初始化程序

{

TMOD=0x01; //定时器0工作方式1

TH0=0xec; //5MS每次中断

TL0=0x78;

EA=1;

ET0=1;

TR0=1;

EX0=1; //外部中断0允许

IT0=1; //外部中断0边沿触发

}

void main()

{

init();

while(1) {

for(i = 0; i < 3; i++) {

P2 = wei[i];

P0 = ~duan[dat[i]];

delay(30);

P2 = 0;

}

}

}

void External0() interrupt 0//外部中断0

{

n++;

}

void Timer0() interrupt 1//定时中断程序

{

TH0 = 0xec;

TL0 = 0x78;

if(n == 0) dat[0] = dat[1] = dat[2] = 0;//5秒检测不到 n复位

else {

mb = 12000 / n;

dat[2] = mb % 10;//取个位

mb = mb / 10;

dat[1]=mb % 10;

dat[0]=mb / 10;

}

n = 0;

}

#include <reg51h>

unsigned char i,j,t,m,DelayTime,DispBuf[3];

unsigned int n,mb;

unsigned char code

BitTab[3]={0xf7,0xef,0xdf};//位驱动码

unsigned char code

DispTab[10]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84};//字形码

sbit P3_0=P3^0;

void delay(DelayTime);

main() //主程序

{

TMOD=0x01; //定时器T0工作于方式1

TH0=0xec;

TL0=0x78; //T0定时时间为5ms

IE=0X83; //开中断

IT0=1; //外部中断0为边沿触发方式

TR0=1; //开定时器T0

for(;;) //脉搏指示灯控制

{

if(P3_0==0)

{

delay(200);

P3_0=1;

}

}

}

external0() interrupt 0//外部中断服务程序

{

P3_0=0; //点亮指示灯

if(n==0)

mb=0;

else

mb=12000/n; //计算每分钟脉搏数

DispBuf[2]=mb%10;//取个位数

mb=mb/10;

DispBuf[1]=mb%10;//取十位数

DispBuf[0]=mb/10;//取百位数

n=0;

}

Timer0() interrupt 1//定时中断服务程序

{

TH0=0xec;

TL0=0x78;

t=BitTab[j];//取位值

P3=P3|0x38;//P33-P35送1

P3=P3&t; //P33-P35输出取出的位值

t=DispBuf[j];//取出待显示的数

t=DispTab[t];//取字形码

P1=t; //字型码由P3输出显示

j++; //j作为数码管的计数器,取值0-2,显示程序通过它确认显示哪个数码管

if(j==3)

j=0;

n++;

if(n==2000)//10秒钟测不到心率,n复位

n=0;

}

void delay(DelayTime)//延时子程序

{

for(;DelayTime>0;DelayTime--)

{

for(i=0;i<250;i++)

;

}

}

#include <iostream>

#include <string>

#include <fstream>

using namespace std;

int main()

{

string file_name("D:/DLtxt"); //文件路径,可以自己修改

ifstream in_file(file_namec_str()); //打读的方式打开一个文件

if (!in_file) //打开失败,则不存在

{

ofstream file(file_namec_str()); //创建一个新文件

file << 1;  //写入1

}

else

{

int num;

in_file >> num; //读取一个数

ofstream out_file(file_namec_str());

out_file << num + 1; //写入+1后的值

}

return 0;

}

#include "stdioh"

#include "stdlibh"

void main()

{

FILE fp;

char ch;

int charCounts=0,numCounts=0,numSum=0;

if((fp=fopen("testtxt","r"))==0)//注意,由于不知道想打开的文件的位置和名称,随意写的一个文件名,自己要按文件的路径和名称做修改

{

printf("文件读取失败!\n");

exit(0);

}

while((ch=fgetc(fp))!=EOF)

{

if(ch>='0'&&ch<='9')

numCounts++;

else

charCounts++;

}

numSum=numCounts+charCounts;

printf("该文件中数字字符共有%d个,除数字这外的其它字符共有%d个,总计字符数%d。\n",numCounts,charCounts,numSum);

fclose(fp);

}

以上就是关于利用1个按键完成一个按键计数程序。全部的内容,包括:利用1个按键完成一个按键计数程序。、单片机计数程序问题、脉搏计数器的程序(用C语言编写程序)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9288782.html

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

发表评论

登录后才能评论

评论列表(0条)

保存