给个建议
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语言编写程序)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)