当前位置:首页 » 编程语言 » c语言计数器设计
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言计数器设计

发布时间: 2022-09-09 12:43:07

Ⅰ 用c语言写两个计数器的小程序。

很多人回家过年了,所以回答少,程序已通过
#include<stdio.h>
/*第一个程序:*/

main()
{
int i=1, m=0;
printf("请输入一个数:\n");
while(i!=0){ //while 循环开始当i等于0时,程序中止;
scanf("%d",&i); //从键盘获取数值,如果i=0,则退出并输出m的值
//printf("\n");
if (i==1) m++; //如果i=1,则m+1;
}
printf("输入 '1' 的次数:%d\n",m);
}

//第二个程序 在第一个基础上稍修改即可
main()
{
int i=1, n,m=0;
printf("请输入N:\n");
scanf("%d",&n);
printf("请输入一个数:\n");
while(i!=0){
scanf("%d",&i); //从键盘获取数值,如果i=0,则退出并输出m的值
if (i>n) m++; //如果i>n,则m+1;
}
printf("大于N次数:%d\n",m);
}

Ⅱ 脉搏计数器的程序(用C语言编写程序)

#include <reg51.h>
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;//P3.3-P3.5送1
P3=P3&t; //P3.3-P3.5输出取出的位值
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++)
;
}
}

Ⅲ 基于51单片机的简易计数器设计c程序

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9
uchar scanled;
uchar disdat[4];
uint ss,time;
sbit led=P1^0;
void dischg()
{
disdat[3]=ss%10;
disdat[2]=(ss/10)%10;
disdat[1]=(ss/100)%10;
disdat[0]=(ss/1000)%10;
}
void t0isr() interrupt 1
{
ss++;
dischg();
}
void t1isr() interrupt 3//显示
{
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
P2=1<<scanled;
P0=~ledtab[disdat[scanled]];
scanled++;
scanled%=4;
time++;
if(time>100){time=0;led=~led;}
}
main()

{
TMOD=0x16;
TH0=0xff;
TL0=0xff;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
TR1=1;
TR0=1;
ET0=1;
ET1=1;
EA=1;
led=0;
scanled=0;
ss=0;
dischg();
while(1);
}

Ⅳ 设计一个一元多项式简单的计算器(数据结构C语言版)急

除以上功能外,还有乘法和除法的计算和导数计算呢。
这是我以前做的数据结构课程设计。希望能帮上你的忙。

#include<stdio.h>
#include<malloc.h>
typedef struct Polynomial{
float coef;
int expn;
struct Polynomial *next;
}*Polyn,Polynomial; //Polyn为结点指针类型
void Insert(Polyn p,Polyn h){
if(p->coef==0) free(p); //系数为0的话释放结点
else{
Polyn q1,q2;
q1=h;q2=h->next;
while(q2&&p->expn<q2->expn){ //查找插入位置
q1=q2;
q2=q2->next;
}
if(q2&&p->expn==q2->expn){ //将指数相同相合并
q2->coef+=p->coef;
free(p);
if(!q2->coef){ //系数为0的话释放结点
q1->next=q2->next;
free(q2);
}
}
else{ //指数为新时将结点插入
p->next=q2;
q1->next=p;
}
}
}//Insert
Polyn CreatePolyn(Polyn head,int m){//建立一个头指针为head、项数为m的一元多项式
int i;
Polyn p;
p=head=(Polyn)malloc(sizeof(struct Polynomial));
head->next=NULL;
for(i=0;i<m;i++){
p=(Polyn)malloc(sizeof(struct Polynomial));//建立新结点以接收数据
printf("请输入第%d项的系数与指数:",i+1);
scanf("%f %d",&p->coef,&p->expn);
Insert(p,head); //调用Insert函数插入结点
}
return head;
}//CreatePolyn
void DestroyPolyn(Polyn p){//销毁多项式p
Polyn q1,q2;
q1=p->next;
q2=q1->next;
while(q1->next){
free(q1);
q1=q2;//指针后移
q2=q2->next;
}
}
void PrintPolyn(Polyn P){
Polyn q=P->next;
int flag=1;//项数计数器
if(!q) { //若多项式为空,输出0
putchar('0');
printf("\n");
return;
}
while (q){
if(q->coef>0&&flag!=1) putchar('+'); //系数大于0且不是第一项
if(q->coef!=1&&q->coef!=-1){//系数非1或-1的普通情况
printf("%g",q->coef);
if(q->expn==1) putchar('X');
else if(q->expn) printf("X^%d",q->expn);
}
else{
if(q->coef==1){
if(!q->expn) putchar('1');
else if(q->expn==1) putchar('X');
else printf("X^%d",q->expn);
}
if(q->coef==-1){
if(!q->expn) printf("-1");
else if(q->expn==1) printf("-X");
else printf("-X^%d",q->expn);
}
}
q=q->next;
flag++;
}//while
printf("\n");
}//PrintPolyn
int compare(Polyn a,Polyn b){
if(a&&b){
if(!b||a->expn>b->expn) return 1;
else if(!a||a->expn<b->expn) return -1;
else return 0;
}
else if(!a&&b) return -1;//a多项式已空,但b多项式非空
else return 1;//b多项式已空,但a多项式非空
}//compare
Polyn AddPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针
Polyn qa=pa->next;
Polyn qb=pb->next;
Polyn headc,hc,qc;
hc=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hc->next=NULL;
headc=hc;
while(qa||qb){
qc=(Polyn)malloc(sizeof(struct Polynomial));
switch(compare(qa,qb)){
case 1:
{
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
break;
}
case 0:
{
qc->coef=qa->coef+qb->coef;
qc->expn=qa->expn;
qa=qa->next;
qb=qb->next;
break;
}
case -1:
{
qc->coef=qb->coef;
qc->expn=qb->expn;
qb=qb->next;
break;
}
}//switch
if(qc->coef!=0){
qc->next=hc->next;
hc->next=qc;
hc=qc;
}
else free(qc);//当相加系数为0时,释放该结点
}//while
return headc;
}//AddPolyn
Polyn SubtractPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针
Polyn h=pb;
Polyn p=pb->next;
Polyn pd;
while(p){ //将pb的系数取反
p->coef*=-1;
p=p->next;
}
pd=AddPolyn(pa,h);
for(p=h->next;p;p=p->next) //恢复pb的系数
p->coef*=-1;
return pd;
}//SubtractPolyn
float ValuePolyn(Polyn head,float x){//输入x值,计算并返回多项式的值
Polyn p;
int i;
float sum=0,t;
for(p=head->next;p;p=p->next){
t=1;
for(i=p->expn;i!=0;){
if(i<0){t/=x;i++;}//指数小于0,进行除法
else{t*=x;i--;}//指数大于0,进行乘法
}
sum+=p->coef*t;
}
return sum;
}//ValuePolyn
Polyn Derivative(Polyn head){//求解并建立a的导函数多项式,并返回其头指针
Polyn q=head->next,p1,p2,hd;
hd=p1=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hd->next=NULL;
while(q){
if(q->expn!=0){ //该项不是常数项时
p2=(Polyn)malloc(sizeof(struct Polynomial));
p2->coef=q->coef*q->expn;
p2->expn=q->expn-1;
p2->next=p1->next;//连接结点
p1->next=p2;
p1=p2;
}
q=q->next;
}
return hd;
}//Dervative
Polyn MultiplyPolyn(Polyn pa,Polyn pb){//求解并建立多项式a*b,返回其头指针
Polyn hf,pf;
Polyn qa=pa->next;
Polyn qb=pb->next;
hf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hf->next=NULL;
for(;qa;qa=qa->next){
for(qb=pb->next;qb;qb=qb->next){
pf=(Polyn)malloc(sizeof(struct Polynomial));
pf->coef=qa->coef*qb->coef;
pf->expn=qa->expn+qb->expn;
Insert(pf,hf);//调用Insert函数以合并指数相同的项
}
}
return hf;
}//MultiplyPolyn
void DevicePolyn(Polyn pa,Polyn pb){//求解并建立多项式a*b,返回其头指针
Polyn hf,pf,af,temp1,temp2,q;
Polyn qa=pa->next;
Polyn qb=pb->next;
hf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点,存储
hf->next=NULL;
pf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点,存储余数
pf->next=NULL;
temp1=(Polyn)malloc(sizeof(struct Polynomial));
temp1->next=NULL;
temp2=(Polyn)malloc(sizeof(struct Polynomial));
temp2->next=NULL;
temp1=AddPolyn(temp1,pa);
while(qa!=NULL&&qa->expn>=qb->expn){
temp2->next=(Polyn)malloc(sizeof(struct Polynomial));
temp2->next->coef=(qa->coef)/(qb->coef);
temp2->next->expn=(qa->expn)-(qb->expn);
Insert(temp2->next,hf);
pa=SubtractPolyn(pa,MultiplyPolyn(pb,temp2));
qa=pa->next;
temp2->next=NULL;
}
pf=SubtractPolyn(temp1,MultiplyPolyn(hf,pb));
pb=temp1;
printf("商是:");
PrintPolyn(hf);
printf("余数是:");
PrintPolyn(pf);
}//DevicePolyn

int main(){
int m,n,flag=0;
float x;
Polyn pa=0,pb=0,pc,pd,pe,pf;//定义各式的头指针,pa与pb在使用前付初值NULL
printf("请输入a的项数:");
scanf("%d",&m);
pa=CreatePolyn(pa,m);//建立多项式a
printf("请输入b的项数:");
scanf("%d",&n);
pb=CreatePolyn(pb,n);//建立多项式a
//输出菜单
printf("**********************************************\n");
printf("操作提示:\n\t1.输出多项式a和b\n\t2.建立多项式a+b\n\t3.建立多项式a-b\n");
printf("\t4.计算多项式a在x处的值\n\t5.求多项式a的导函数\n\t6.建立多项式a*b\n");
printf("\t7.建立多项式a/b\n\t8.退出\n**********************************************\n");
for(;;flag=0){
printf("执行操作");
scanf("%d",&flag);
if(flag==1){
printf("多项式a:");PrintPolyn(pa);
printf("多项式b:");PrintPolyn(pb);continue;
}
if(flag==2){
pc=AddPolyn(pa,pb);
printf("多项式a+b:");PrintPolyn(pc);
DestroyPolyn(pc);continue;
}
if(flag==3){
pd=SubtractPolyn(pa,pb);
printf("多项式a-b:");PrintPolyn(pd);
DestroyPolyn(pd);continue;
}
if(flag==4){
printf("输入x的值:x=");
scanf("%f",&x);
printf("多项式a的值%g\n",ValuePolyn(pa,x));continue;
}
if(flag==5){
pe=Derivative(pa);
printf("多项式a的导函数:");PrintPolyn(pe);
DestroyPolyn(pe);continue;
}
if(flag==6){
pf=MultiplyPolyn(pa,pb);
printf("多项式a*b:");PrintPolyn(pf);
DestroyPolyn(pf);continue;
}
if(flag==7){
DevicePolyn(pa,pb);
continue;
}
if(flag==8) break;
if(flag<1||flag>8) printf("Error!!!\n");continue;
}//for
DestroyPolyn(pa);
DestroyPolyn(pb);
return 0;
}

Ⅳ 单片机c语言,设计一个计数器,中断一次,数码管数字从0起加1, 4位的数码管

我直接拿一个现成的例子吧。这个是用定时器中断的,你可以改成外部中断。这是8位的数码管,对4位稍加修改就行了。
#include <reg52.h> //包括一个52标准内核的头文件
#include<intrins.h>
/****************************声明函数*****************************/
void x8led(unsigned long ddd);
void delay882us(void);
/*****************************定义IO******************************/
sbit P20=P2^0;
sbit P21=P2^1;
sbit S16=P3^0;
sbit S15=P3^1;
sbit S14=P3^2;
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
bit f=0;//位变量
/***************************定时器2中断**************************/
timer2() interrupt 5
{
static unsigned char t;
TF2=0;
t++;
if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ
{
t=0;
f=1;//每次长时间的溢出,就置一个标记,以便主程序处理
}
}
/*****************************数码管扫描**************************/
void x8led(unsigned long ddd)
{
unsigned char q,r=0;
unsigned char l[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};
//0-9的字段码
unsigned char xx[8]={0,0,0,0,0,0,0,0};
unsigned char y[8]={0x80,0x40,0x20,0x10,0x8,0x4,0x2,0x1};
xx[0]=ddd%10;
xx[2]=ddd/10%10;
xx[1]=ddd/100%10;
xx[3]=ddd/1000%10;
xx[4]=ddd/10000%10;
xx[6]=ddd/100000%10;
xx[5]=ddd/1000000%10;
xx[7]=ddd/10000000;//求出八位数,分别放在八个变量中
for(q=0;q<8;) //循环扫描
{
q++;
r++;
if(r==8)r=0;
P1=y[r];
P21=1;
delay882us();
P21=0;
P20=1;
P1=l[xx[r]];
delay882us();
P1=0xff;
P20=0;
}
}
/*******************************延时882us*************************/
void delay882us(void)
{
unsigned char i;
for(i=0;i<255;i++)
{
_nop_();
}
}
/*****************************主程序******************************/
void main(void)
{
unsigned long a=0;
RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟
RCAP2L =0x00;
TR2=1; //启动定时器
ET2=1; //打开定时器2中断
EA=1; //打开总中断
while(1)
{
if(f)//发现标记进入处理
{
f=0;//清除标记
a++;
if(a>99999999)a=0;
}
x8led(a);//将a的值送到数码管显示
}
}

Ⅵ C语言设计一个计数器 按一下显示增加一个数,到了预设数报警

#include<stdio.h>
main()
{
char s=7;
int a=10,b;/*预设10个数*/
for(i=0;i<a;i++)
{
scanf("%d",&b);
printf("ADD a %d.is %d math.\n",b,i);
if(i==a-1) printf("%c",s);/*ASCII为7是报警*/
}
}

Ⅶ 利用定时/计数器T0从P1.0输出周期为1s,脉宽为20ms有正脉冲信号,晶振频率为12MHz,求C语言设计程序

#include<reg51.h>
sbitP10=P1^0;
voidTimer0Init(void) //20毫秒@12.000MHz
{
TMOD&=0xF0; //设置定时器模式
TL0=(65536-20000)%256; //设置定时初值
TH0=(65536-20000)/256; //设置定时初值
TF0=0; //清除TF0标志
TR0=1; //定时器0开始计时
}
voidmain()
{
Timer0Init();
P10=1;
while(1);
}

voidtimer0_isr()interrupt1//中断的服务的程序
{
staticintcnt=0;
TL0=(65536-20000)%256; //设置定时初值
TH0=(65536-20000)/256; //设置定时初值
if(++cnt>50)
{
cnt=0;
P10=1;
}
else
{
P10=0;
}
}

Ⅷ C语言设计一个加减计数器,通过两个按键来控制。就是按一个键就加一,按另外一个就减一。求大神帮忙设计

如果是windows上程序。单词按键判断ASCII码,然后变量值++,--就可以了。

#include<stdio.h>
#include<conio.h>
#include<windows.h>
#defineKEYA61//按键盘'+'键(非小键盘)
#defineKEYM45//按键盘'-'键(非小键盘)
intmain()
{
intkey,num=0;
while(1)
{
system("cls");
printf("当前值:%d ",num);
key=getch();
switch(key)
{
caseKEYA:num++;break;
caseKEYM:num--;break;
}
}
return0;
}

如果你是要其他平台,比如单片机上运行,只要对应按钮电平对应防抖代码中对变量++,--就可以了。我之前给别人写个一个单片机的简单程序,里面就有按钮+-的,你可以参考。

以前回答记录

Ⅸ 以51单片机为基体 用C语言设计一个计数器 要求显示数据8位 有复位功能 时间间隔1秒 动态显示

void dis_cnter(void) 显示计数器值子程序开始
{uchar i; 定义字符型局部变量i
P3_7=1;P3_6=1; 消隐有效,允许显示
for(i=0;i8;i++) 循环8次
{SBUF=SEG7[cnt];while(!TI);TI=0;} 根据8个单元的计数值查表发送显示
P3_7=0; 关闭消隐,正常显示
} 显示计数器值子程序结束

void cnter(void) 计数转换子程序开始
{uchar i; 定义字符型局部变量i
for(i=0;i7;i++) 循环8次
{if(cnt9){cnt=0;cnt[i+1]++;}}若计数器某位值大于9,则该位回0,
而高位被进位加1
------------------------------------
if(cnt[7]9){for(i=0;i8;i++)cnt=0;} 若计数器最高位值大于9,则计数器全清0
} 计数转换子程序结束

void pt_cnt(void) 输出控制子程序开始
{
if((cnt[0]==pre_cnt[0])&&(cnt[1]==pre_cnt[1])&&
(cnt[2]==pre_cnt[2])&&(cnt[3]==pre_cnt[3])&&
(cnt[4]==pre_cnt[4])&&(cnt[5]==pre_cnt[5])&&
(cnt[6]==pre_cnt[6])&&(cnt[7]==pre_cnt[7])) 若计数值等于预置值
out_flag=1; 输出标志置1
else out_flag=0; 否则输出标志置0
=================================================
if(out_flag)drv=0; 若输出标志为1,输出端(P3.4)置0,驱动光耦U2
else drv=1; 否则输出端(P3.4)置1
} 输出控制子程序结束

void main(void) 主程序开始
{ IE=0x84; 开放CPU中断,开放外中断1的中断
IT1=1; 置外中断1为边沿触发
while(1) 无限循环
{P3_6=0;P3_7=1; 禁止发送给显示器,消隐有效
SBUF=0x00;while(!TI);TI=0; 向IC2发送0x00,使IC2输出为全0
if((P3&0x24)!=0x24)keydown_flag=1; 检测P3.2、P3.5是否为高电平。
若不为高电平,说明有键按下,键被按下标志置1
else keydown_flag=0; 否则,键被按下标志置0
-------------------------------------------------------------------------------
SBUF=0xfe;while(!TI);TI=0; 向IC2发送0xfe
if(!P3_2)set_flag=!set_flag; 若P3.2为0,说明S9键按下,标志set_flag取反
==================================================
if(!set_flag){cnter();dis_cnter();pt_cnt();delay(100);}
若标志set_flag为0,调用计数、显示计数、输出控制的子程序
else {scan_key();dis_pre_cnter();delay(10);}
否则标志set_flag为1,调用扫描S1~S8键、显示预置值的子程序
=====================================================
if(keydown_flag)delay(300); 因有键按下,调用延时300mS子程序,
以免调整键值的速度过快
}
} 主程序结束

void extern_int1(void) interrupt 2 using 1 外中断1服务子程序
{
cnt[0]++; 计数器的最低位加1
}

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

看了一下你的要求,单片机里有个GATE位的设置如果你懂得用,编这个程序就不难了。下面是我个人按照你要求刚编的程序:
/***********************
功能:内部定时/计数器记录脉冲个数和这些脉冲通过后所用的时间。
硬件:单片机用AT89c51,12M晶振。
原理:当门控位GATE为“1”时,TR0/1=1,INT0/1才能启动定时器。
利用这个特性可以测量外部输入脉冲的宽度。
分析:设外部脉冲由(P3.2)输入,T0工作于定时方式1(16位计数),
GATE设为1.测试时,应在INT0低电平时,设置TR0为1(避免检测
到正在进行的脉冲);当INT0为高电平时,就启动计数,INT0再
次变低时,停止计数。此计数值与机器周期的乘积即为被测正脉
冲的宽度。因晶振为12MHz,机器周期为1us.
************************/
#include <reg51.h>
//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++;
}
}
}