當前位置:首頁 » 編程語言 » 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++;
}
}
}