51单片机4路抢答器的原理及C语言源程序(精选5篇)

时间:2019-05-14 16:33:12下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《51单片机4路抢答器的原理及C语言源程序》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《51单片机4路抢答器的原理及C语言源程序》。

第一篇:51单片机4路抢答器的原理及C语言源程序

51单片机4路抢答器的原理及C语言源程序

单片机,当然不只是51,51单片机是一种稍通用型的单片机,通过I/O口的定义,可以实现多种控制功能。

抢答器,原理:如果为四路,当其中任一路控下后,其他几路即失效,结果为第一次按下的,可以用数码管或是LED灯来显示,当然这里只是讲原理与编程,具体可以根据抢答器路数及显示方式更改程序即可。源程序如下:

/*用的是AT89S52开发板,独立按键接口如下,就用这四路。先按下的用LED灯来显示,对应第一个到第四个LED灯,其他再按无效,如果想再次实现,可手动复位单片机*/ #include sbit key1=P3^0;//定义按键,根据需要连接线路,如独立按键(4路)sbit key2=P3^1;sbit key3=P3^2;sbit key4=P3^3;/*void delay(unsigned int cnt)//如果有抖动或是干扰,可以用个小延时去抖 { while(--cnt);} */ void main(){ bit Flag;while(!Flag){ if(!key1){P1=0xFE;Flag=1;} /*LED灯来显示按下的键,第一个灯,我这里是8位LED灯,即:0111 1111,反过来读数为:1111 1110 即:0xFE *,P1口对应LED灯,给P1赋值/

else if(!key2){P1=0xFD;Flag=1;} //第二个灯亮 else if(!key3){P1=0xFB;Flag=1;} //第三个灯亮

else if(!key4){P1=0xF7;Flag=1;} //第四个灯亮,意味着第四路首先按下 } while(Flag);//可以再加个I/O,控制Flag,这样初始化,继续抢答,还可以设计按下时的声音

} 以上程序测试只能测试一次,如再想测试,只能手动复位单片机。当然,可以根据此原理,设计出功能强大的抢答器。如加入声音提示,数码管或是LCD液晶显示,裁判确定后可复位继续抢答等。

当然,用51单片机,是浪费,可根据I/O口(抢答路数)来用其他的单片机实现。

第二篇:c语言源程序

基于单片机msp430和温度传感器ds18b20的水温度控制系统的c语言源程序(不是测量,要有加热跟制冷)

我这是用STC做的,应该很容易移植到MPS430上的给你参考一下。#include #include #define uchar unsigned char #define uint unsigned int

sbit scl=P1^3;sbit sda=P1^4;

sbit key1=P1^6;sbit key2=P1^7;sbit key3=P2^0;sbit key4=P2^1;

sbit lcrs=P3^7;//数据/命令 sbit lcwr=P3^5;//读/写 sbit lcden=P3^4;//使能

sbit DS=P2^2;

/*sbit lcrs=P3^4;//数据/命令 sbit lcwr=P3^7;//读/写 sbit lcden=P3^5;//使能 */ sbit jrk=P2^2;sbit cyk=P2^3;sbit xhk=P2^4;bit flag=0,rsg=0,not=0,he=0,in=0;int acon=0,bcon=0,dcon=0,econ=0, temp=0,y=0,j=0,l=0,cfj=0,ec=0,dc=0,at;uchar code table[]={48,49,50,51,52,53,54,55,56,57};uchar code ta1[]={“Temperature UP”};uchar code ta2[]={“Temperature DN”};uchar code ta3[]={“Inflator Cycle”};uchar code ta4[]={“Inflator Time ”};uchar code ta5[]={“ Heating UP ”};uchar code ta6[]={“ Inflator ”};uchar code table7[]={“Temperature”};uchar table1[]={0,0,0,'.',0};uchar table3[]={“AptitudeAquarium”};uchar table4[]={0,0,0,0,0};uchar n,c=0;void delay(uchar);void wen_kong();void xh();void rso();void weno();

void Init_Com(void){ TMOD = 0x11;PCON = 0x00;TH1=0x61;TL1=0x99;EA=1;ET1=1;TR1=1;} void delay(uchar count)//delay { uint i;while(count){ i=200;while(i>0)i--;count--;} } ////初始化18B20///////// bit init18b20(void){ uint i;bit no;DS=0;i=103;while(i>0)i--;DS=1;i=4;while(i>0)i--;no=DS;if(no==0){ DS=1;i=100;while(i>0)i--;no=DS;if(no==1)not=0;else not=1;} else not=1;return(not);}

bit tmpread()bit(void)//读一位

{ uint i;bit dat;DS=0;i++;DS=1;i++;i++;dat=DS;i=8;while(i>0)i--;return(dat);}

uchar tmpread()(void)//读一个字节 { uchar i,j,dat;dat=0;for(i=1;i<=8;i++){ j=tmpread()bit();dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里

} return(dat);}

void tmpwritebyte(uchar dat)//写一个字节到 ds18b20 { uint i;uchar j;bit testb;for(j=1;j<=8;j++){ testb=dat&0x01;dat=dat>>1;if(testb)//write 1 { DS=0;i++;i++;DS=1;i=8;while(i>0)i--;} else { DS=0;//write 0 i=8;while(i>0)i--;DS=1;i++;i++;} } }

int tmp()//DS18B20温度读取 { float tt;int a,b;if(init18b20()==0){ WDT_CONTR=0x36;/////喂狗 EA=0;delay(1);

tmpwritebyte(0xcc);// 跳过读ROM操作 tmpwritebyte(0x44);// 启动温度转换 delay(10);init18b20();delay(1);tmpwritebyte(0xcc);tmpwritebyte(0xbe);a=tmpread();b=tmpread();temp=b;temp<<=8;//将高字节温度数据与低字节温度数据整合 temp=temp|a;c=b>>4;

tt=temp*0.0625;

temp=tt*10+0.5;//放大10倍输出并四舍五入 EA=1;return temp;} else not=1;}

//////1062///////// void ydelay(uint x){ uint a,b;for(a=x;a>0;a--)for(b=10;b>0;b--);} void write_com(uchar com){ P0=com;lcwr=0;lcrs=0;lcden=0;ydelay(10);lcden=1;ydelay(10);lcden=0;lcwr=1;}

void write_date(uchar date)//写数据 {

P0=date;lcwr=0;lcrs=1;lcden=0;ydelay(10);lcden=1;ydelay(10);lcden=0;lcwr=1;}

void init1602()//初始化 { write_com(0x38);//设置显示模式 ydelay(20);write_com(0x0c);//开显示 ydelay(20);write_com(0x06);//指针和光标自动加一 ydelay(20);write_com(0x01);//清屏指令 ydelay(20);}

///////显示程序////// void display(int num){ uint i,A1,A2;WDT_CONTR=0x35;/////喂狗 if(c!=0)num=~num+1;A1=num/1000;A2=num%1000/100;if(not==0){

if(c!=0){ c=0;table1[0]='-';} else if(A1==0)table1[0]=' ';else

table1[0]=table[A1];if(A1==0)if(A2==0)table1[1]=' ';else table1[1]=table[A2];

table1[2]=table[num%1000%100/10];table1[4]=table[num%1000%100%10];} else { table1[0]='?';table1[1]='?';table1[2]='?';table1[4]='?';}

write_com(0x80);for(i=0;i<11;i++){write_date(table7[i]);delay(2);} write_com(0x8b);for(i=0;i<5;i++){write_date(table1[i]);delay(2);} write_com(0xc0);for(i=0;i<16;i++){ if(he==1)write_date(ta5[i]);else if(in==1)write_date(ta6[i]);else write_date(table3[i]);} c=0;WDT_CONTR=0x35;/////喂狗 } ////显示2//////////////////// display2(uchar bh,int dat){ uchar a,A,B;WDT_CONTR=0x35;/////喂狗 //write_com(0x01);//清屏指令 y=dat;y=y&0x8000;if(y!=0)dat=~dat+1;A=dat/1000;B=dat%1000/100;if((bh!=4)&&(bh!=5)){ if(A!=0)table4[0]=table[dat/1000];else if((c!=0)||(y!=0)){ c=0;y=0;table4[0]='-';} else table4[0]=' ';if(B!=0)table4[1]=table[B];else table4[1]=' ';table4[2]=table[dat%1000%100/10];table4[3]='.';table4[4]=table[dat%1000%100%10];} else { table4[0]=' ';if((c!=0)||(y!=0)){ c=0;y=0;table4[1]='-';} else table4[1]=' ';table4[2]=' ';table4[3]=table[dat%1000%100/10];table4[4]=table[dat%1000%100%10];}

write_com(0xc4);delay(2);for(a=0;a<5;a++)write_date(table4[a]);delay(2);write_com(0x80);switch(bh){ case 1:for(a=0;a<14;a++)write_date(ta1[a]);break;case 2:for(a=0;a<14;a++)write_date(ta2[a]);break;case 3:for(a=0;a<14;a++)write_date(ta3[a]);break;case 4:for(a=0;a<14;a++)write_date(ta4[a]);break;default:break;} }

///////////x24c02////////////////// void delay24(){;;}

void init24c02()//初始化 { sda=1;delay24();scl=1;delay24();}

void start()//开始信号 { sda=1;delay24();scl=1;delay24();sda=0;delay24();}

void stop()//停止 { sda=0;delay24();scl=1;delay24();sda=1;delay24();}

void respons()//应答 { uchar i;scl=1;delay24();while((sda==1)&&(i<250))i++;scl=0;delay24();}

void write_byte(uchar date)// 写数据子函数 { uchar i,temp;temp=date;

for(i=0;i<8;i++){ temp=temp<<1;scl=0;delay24();sda=CY;delay24();scl=1;delay24();} scl=0;delay24();sda=1;delay24();}

uchar read_byte()// 读数据子函数 { uchar i,k;scl=0;delay24();sda=1;delay24();for(i=0;i<8;i++){ scl=1;delay24();k=(k<<1)|sda;scl=0;delay24();} return k;} ///////写数据函数/////////////////// void write_add(uchar address,uint date){ start();write_byte(0xa0);respons();write_byte(address);respons();write_byte(date/256);respons();write_byte(date%256);respons();stop();} uchar read_add(uchar address)//读数据函数 { uchar date;start();write_byte(0xa0);respons();write_byte(address);respons();start();write_byte(0xa1);respons();date=read_byte();stop();return date;}

void delay1ms(uchar ms){

uchar i;while(ms--){ for(i = 0;i< 250;i++){ _nop_();_nop_();_nop_();_nop_();} } }

int keyf(int *num,int up,int dn){ uint i;uchar z;for(i=0;i<600;i++){

display2(n,*num);if(key1==0){ delay1ms(30);if(key1==0){ i=0;n++;if(n>=9)n=0;while(!key1)display2(n,*num);break;} } if(key2==0){

delay1ms(10);if(key2==0){ i=0;if(*num>=up)*num=up;else if(n!=4)*num=*num+1;else if(*num<100)*num=*num+5;else

*num=*num+10;for(z=0;z<65;z++){ display2(n,*num);if(key2!=0)break;} while(!key2){ for(z=0;z<2;z++)display2(n,*num);if(*num>=up)*num=up;else if(n!=4)*num=*num+1;else if(*num<100)*num=*num+5;else

*num=*num+10;} } }

if(key3==0){ delay1ms(10);if(key3==0){ i=0;if(*num<=dn)*num=dn;else if(n!=4)*num=*num-1;else if(*num<100)*num=*num-5;else

*num=*num-10;for(z=0;z<65;z++){ display2(n,*num);if(key3!=0)break;} while(!key3){ for(z=0;z<2;z++)display2(n,*num);if(*num<=dn)*num=dn;else if(n!=4)*num=*num-1;else if(*num<100)*num=*num-5;else

*num=*num-10;} } } } return(*num);} void keyjc(){ uchar i=0;if(key1==0){ delay1ms(10);if(key1==0){ EA=0;

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

display(tmp());} if(key1==0){

write_com(0x01);//清屏指令

n++;if(n>=5)n=0;while(!key1){ switch(n){ case 1:display2(n,acon);break;case 0:break;} } if(n==1){ keyf(&acon,1250,-530);if((acon-bcon)<3)bcon=acon-3;} if(n==2){ keyf(&bcon,1240,-550);if((acon-bcon)<3)acon=bcon+3;} write_add(1,acon);//A delay1ms(15);write_add(3,bcon);//B n=0;write_com(0x01);//清屏指令 } EA=1;} } }

key(){ uint i;if(key4==0)delay1ms(50);if(key4==0){ write_com(0x01);//清屏指令

for(i=0;i<500;i++){ if(key4==0){ delay1ms(15);if(key4==0){ i=0;n++;if(n>=5)n=0;while(!key4){ switch(n){ case 1: display2(1,acon);break;case 2: display2(2,bcon);break;default: break;} } } } switch(n){ case 1: display2(1,acon);break;case 2: display2(2,bcon);break;default: break;} } n=0;} }

///////滤波//////// int filter(){ int tm,buf[6];uchar i,j;EA=0;for(i=0;i<6;i++){ buf[i]=tmp();delay1ms(20);WDT_CONTR=0x35;/////喂狗 }

for(j=0;j<5;j++)for(i=0;i<5-j;i++)if(buf[i]>buf[i+1]){ tm=buf[i];buf[i]=buf[i+1];buf[i+1]=tm;} tm=((buf[2]+buf[3])/2);EA=1;return(tm);}

void main(){ uchar b,c;Init_Com();init1602();init24c02();

b=read_add(1);delay1ms(15);c=read_add(2);delay1ms(15);acon=b*256+c;b=read_add(3);delay1ms(15);c=read_add(4);delay1ms(15);bcon=b*256+c;

AUXR=0x01;// 禁止ALE输出 WDT_CONTR=0x35;//启动看门狗 write_com(0x01);//清屏指令

while(1){ at=filter();display(at);keyjc();key();

wen_kong();weno();} }

//////温度控制//////////////

void wen_kong(){ if((flag==0)&&(not==0)){ at=filter();if(at<=bcon)

{ flag=1;jrk=0;xhk=0;he=1;} } }

void weno(){ if(flag){ at=filter();if(at>=acon){ flag=0;jrk=1;if(rsg)xhk=0;else xhk=1;he=0;} } if(not==1){ flag=0;jrk=1;if(rsg)xhk=0;else xhk=1;he=0;} }

第三篇:c语言源程序段

1.有三个整数a,b,c,由键盘输入,输出其中最大的数。#include void main(){ int a,b,c;printf(“输入三个不同的整数: ”);

scanf(“%d%d%d”,&a,&b,&c);if(a>b&&a>c)

printf(“%dn”,a);else

if(b>a&&b>c)

printf(“%dn”,b);

else

printf(“%dn”,c);} 2.编程输入整数a和b,若a2b2大于100,则输出a2b2百位以上的数字,否则输出两数之和。

#include void main(){ int a,b,c,d,e,f;c=10;printf(“输入两个整数:”);scanf(“%d%d”,&a,&b);e=(a*a+b*b)/c;d=(a*a+b*b)%c;f=(a*a+b*b)/(c*c);if((a*a+b*b)<100)

printf(“%dn”,(d+e));else

printf(“%dn”,f);} 3.有一函数:

x(x1) y2x11(1x10)

3x11(x10)编写一程序,输入x,输出y值。#include void main(){ int x,y;printf(“输入一个整数:”);scanf(“%d”,&x);if(x<1)

y=x;else

if(x<10&&x>=1)

y=2*x-11;

else

y=3*x-11;

printf(“%dn”,y);} 4.给出一百分制成绩,要求输出成绩等级’A’,’B’,’C’,’D’,’E’。90分以上为’A’,80-89分为’B’,70-79分为’C’,60-69分为’D’,60分以下为’E’ #include void main(){ int x;printf(“输入学生成绩:”);scanf(“%d”,&x);if(x>=90)

printf(“A”);else

if(x<90&&x>=80)

printf(“B”);

else

if(x<80&&x>=70)

printf(“C”);

else

if(x<70&&x>=60)

printf(“D”);

else

printf(“E”);printf(“n”);} 5.提高题:给一个不多于5位的正整数,要求:①求出它是几位数;②分别打印出每一位数字;③按逆序打印出各位数字,例如原数是321,应输出123。#include void main(){ int a,b,i,k;float j;printf(“jghg:”);scanf(“%d”,&a);j=a;{

for(i=0;j>1;i++)

j=j/10;}

printf(“%dnn”,i);{

for(k=1;k<=i;k++){

b=a%10;

a=a/10;

printf(“%d”,b);} } }.求解一元二次方程a*x2+b*x+c=0 #include

int main(){ int a,b,c,m;double x1,x2,n;

//解为double类型

printf(“请输入ax2+bx+c=0中的a,b,c: n”);scanf(“%d %d %d”,&a,&b,&c);//输入参数

m=(b*b-4*a*c);if(m<0)

printf(“方程无解”);else

n=sqrt((double)m);

//对m进行强制类型转换为double,因为接为double

x1=(-b-m)/(2*(double)a);

x2=(-b+m)/(2*(double)a);

printf(“x1=%.2lf x2=%.2lfn”,x1,x2);return 0;}.有一个分数数列: 23581321,,,求出这个数列前20项之和 1235813#include

double sum(int n){ int i;double part = 0;

for(i = 1.0;i <= n;i++)

part +=(1.0 / i);return 2 * n-part;}

int main(void){ printf(“%.18fn”, sum(20));return 0;} 将从键盘输入的偶数写成两个素数之和。#include #include main(){

int a,b,c,d;

scanf(“%d”,&a);

for(b=3;b<=a/2;b+=2)

{

for(c=2;c<=sqrt(b);c++)

if(b%c==0)break;

if(c>sqrt(b))

d=a-b;

else break;

for(c=2;c<=sqrt(d);c++)

if(d%c==0)break;

if(c>sqrt(d))

printf(“%d=%d+%dn”,a,b,d);

} } 1:5位跳水高手参加10米高台跳水决赛,有好事者让5人据实力预测比赛结果.A选手说:B第二,我第三B选手说:我第二,E第四;C选手说:我第一,D第二;D选手说:C最后,我第三;E选手说:我第四,A第一.决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一错.请编程解出比赛的实际名次.

1.#include void main(){ int a,b,c,d,e;for(a=1;a<=5;a++)for(b=1;b<=5;b++)for(c=1;c<=5;c++)for(d=1;d<=5;d++)for(e=1;e<=5;e++){ if(a!=b&&a!=c&&a!=d&&a!=e)if(b!=c&&b!=d&&b!=e)if(c!=d&&c!=e)if(d!=e)if((b==2)+(a==3)==1)if((b==2)+(e==4)==1)if((c==1)+(d==2)==1)if((c==5)+(d==3)==1)if((e==4)+(a==1)==1)printf(“ A=%d B=%d C=%d D=%d E=%dn”,a,b,c,d,e);} getch();}.2:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

#include void main(){ int i,j,k;for(i=0;i<1000;i++)for(j=10;j<100;j++)for(k=13;k<100;k++)if(i+100==j*j&&i+168==k*k){ printf(“%dn”,i);break;} } 3:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。.#include“stdio.h” #include void main(){ int j,k;int i;for(i=10000;i>1;i--){ k=i;for(j=1;j<=10;j++){ if(k!=(k/2)*2)break;k=k/2-1;} if(k==1)break;} printf(“%dn”,i);} 4.4:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。#include void main(){ int a[4],j,i,b,k;printf(“请输入4位数n”);scanf(“%d”,&b);for(j=1;j<=4;j++){

} for(i=1;i<=4;i++)

b=a[0];a[0]=a[3];a[3]=b;b=a[1];a[1]=a[2];a[2]=b;for(k=1;k<=4;k++)printf(“%d”,a[k-1]);{ } a[i-1]=(a[i-1]+5)%10;a[4-j]=b%10;b=b/10;}

2、编写程序,对输入两个正整数m和n,求出它们的最大公约数和最小公倍数 #include “stdio.h” #include “math.h” void main(){ int n,m,maxgy,mingb,i,p;printf(“please input n and m:”);scanf(“%d%d”,&n,&m);if(n>m){

p=n;n=m;m=p;/*m和n交换*/ } for(i=n;i>=1;i--)

if(m%i==0&&n%i==0)

break;maxgy=i;printf(“nmaxgy=%d mingb=%dn”,maxgy,m*n/maxgy);

}

2、编写程序,对输入两个正整数m和n,求出它们的最大公约数和最小公倍数

#include “stdio.h” #include “math.h” void main(){ int n,m,maxgy,mingb,t,p;printf(“please input n and m:”);scanf(“%d%d”,&n,&m);if(n>m){

p=n;n=m;m=p;/*m和n交换*/ } p=m*n;while(m%n!=0){

t=m%n;

m=n;

n=t;} maxgy=n;printf(“nmaxgy=%d mingb=%dn”,maxgy,p/maxgy);} #include “stdio.h” #include “math.h” void main(){ int n,m,maxgy,p;int maxgy1(int m,int n);printf(“please input n and m:”);scanf(“%d%d”,&n,&m);if(n>m){

p=n;n=m;m=p;/*m和n交换*/ } p=m*n;

maxgy=maxgy1(m,n);printf(“nmaxgy=%d mingb=%dn”,maxgy,p/maxgy);} int maxgy1(int m,int n){ if(n==0)

return m;else return maxgy1(n,m%n);}

3输入n判断n是否为素数 #include “stdio.h” void main(){ int n,i,flag;flag=1;printf(“please input n:”);scanf(“%d”,&n);for(i=2;i

if(n%i==0)

{

flag=0;

break;

} if(flag==1)

printf(“n%d is ssn”,n);else

printf(“n%d is not ssn”,n);} #include “stdio.h”、求100以内的所有素数,并按10个一行进行打印。#include “math.h” void main(){ int n,i,flag,sum;sum=0;for(n=2;n<=100;n++){

flag=1;

for(i=2;i<=sqrt(n);i++)

if(n%i==0)

{

flag=0;

break;

}

if(flag==1)

{

sum++;

printf(“%5d”,n);

if(sum%10==0)

printf(“n”);

} } printf(“n”);}

4、用递归求1到100的和

#include void main(){ long lj(int);printf(“sum=%ldn”,lj(100));} long lj(int n){ if(n==1)

return 1;else

return n+lj(n-1);} 累加法求1到100的和 #include void main(){ int i,sum=0;for(i=1;i<=100;i++)

sum=sum+i;printf(“result=%dn”,sum);} #include void main(){ int i,sum;for(i=1,sum=0;i<=100;sum=sum+i,i++);

printf(“result=%dn”,sum);} #include void main(){ int i,sum;i=1;sum=0;for(;;)//i<=100 {

if(i>100)

break;

sum=sum+i;

i++;} printf(“result=%dn”,sum);}

求20到40以及60到80中所有能被3整除数的和 #include void main(){ int i,sum=0;for(i=20;i<=80;i++){

if(i%3==0)

sum=sum+i;

if(i==40)

i=i+19;} //i%3==0&&i>=20&&i<=40||i>=60&&i<=80 printf(“result=%dn”,sum);} A+aa+aaa+….+a…..a #include void main(){ int a,n,i;long sum=0,t=0;printf(“please input a and n:”);scanf(“%d%d”,&a,&n);for(i=1;i<=n;i++){

t=t*10+a;

sum=sum+t;} printf(“result=%ldn”,sum);}

1、请从键盘上输入年、月、日,求该年月日是该年的第多少天? #include void main(){

int year,month,day,sum=0,i;int days(int,int);printf(“please input year month and day:”);scanf(“%d%d%d”,&year,&month,&day);for(i=1;i

int day;switch(month){ case 1: case 3: case 5: case 7: case 8: case 10: case 12:day=31;break;case 4: case 6: case 9: case 11:day=30;break;case 2:if(year%4==0&&year%100!=0||year%400==0)

} return day;

day=29;else day=28;}

2、求3到1000内所有尾数为3的素数之和。#include #include void main(){

} int ss(int n){

int flag=1,i;for(i=2;i<=sqrt(n);i++)if(n%i==0){

flag=0;break;int i,sum=0;int ss(int);for(i=3;i<=1000;i++)if(ss(i)==1)

if(i%10==3)

sum=sum+i;printf(“result=%dn”,sum);

} } return flag;

3、从键盘上输入一个整数,将它拆成质因子的乘积。例如

18=2*3*3 #include #include void main(){ int n,i;printf(“please input n:”);scanf(“%d”,&n);printf(“%d=”,n);i=2;while(n!=1){

} if(n%i==0){ } else i++;printf(“%d*”,i);n=n/i;printf(“b n”);}

4、从键盘上输入一串字符,统计字母、数字、空格和其它字符的个数。#include #include void main(){

char ch;int c,d,s,o;c=d=s=o=0;while((ch=getchar())!=10){ if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')

c++;else if(ch>='0'&&ch<='9')

d++;else if(ch==' ')

s++;else o++;} printf(“c=%dnd=%dns=%dno=%dn”,c,d,s,o);}

5、从键盘上输入10个数,求它们的最大值。#include #include void main(){

}

int n,i,max;scanf(“%d”,&n);max=n;for(i=1;i<10;i++){ scanf(“%d”,&n);if(max

max=n;} printf(“max=%dn”,max);3. 一个数恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3而6=1+2+3,因此6是完数。编程找出求1000以内的所有完全数。#include “stdio.h” #include “math.h” void main(){ int n,s,i,k;for(n=1;n<=1000;n++){

s=0;

for(i=1;i

if(n%i==0)

s=s+i;

if(n==s)

{

printf(“%5d its factors is ”,n);

for(k=1;k

if(n%k==0)

printf(“%d,”,k);

printf(“b n”);

} } printf(“n”);} .打印出杨辉三角形(要求打印出10行如下图)#include “stdio.h” #include “math.h” void main(){ long i,j,x,y,z,k;long jc(int);for(i=0;i<10;i++){

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

{

x=jc(i);

y=jc(j);

z=jc(i-j);

printf(“%4d”,x/(y*z));

}

printf(“n”);} } long jc(int n){ long x=1,k;if(n==0)

return 1;else

for(k=1;k<=n;k++)

x=x*k;return x;}

#include “stdio.h” #include “math.h” void main(){ long i,j,x,y,z,k;for(i=0;i<10;i++){

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

{

x=y=z=1;

for(k=1;k<=i;k++)

x=x*k;

for(k=1;k<=j;k++)

y=y*k;

for(k=1;k<=i-j;k++)

z=z*k;

printf(“%4d”,x/(y*z));

}

printf(“n”);} }

7.用*打印图形 #include “stdio.h” void main(){ int i,j,k,n;printf(“please input n:”);scanf(“%d”,&n);for(i=1;i<=n;i++)/**/ {

for(j=1;j<=40-i;j++)/**/

printf(“ ”);

for(k=1;k<=2*i-1;k++)/**/

printf(“*”);

printf(“n”);} for(i=n-1;i>=1;i--)/**/ {

for(j=1;j<=40-i;j++)/**/

printf(“ ”);

for(k=1;k<=2*i-1;k++)/**/

}

} printf(“*”);printf(“n”);

第四篇:单片机C语言学习心得

8、指针的使用

8.1 在定义的时候,*ap中的‘*’是指针类型说明符;

在进行指针预算时,x = *ap 中的‘*’是指针运算符。8.2 如果在已定义好的指针变量,并引用,即

int *ap, int a;ap = &a;则在进行指针运算的时候:

(1)*ap与a是等价的,即 *ap就是a;

(2)&*ap:由于*ap与a等价,则&*ap与&a等价(地址);

(3)*&a:由于&a = ap,则*&a与*ap等价,即*&a与a等价(变量);(4)*ap++相当于a++。

8.3 指向数组的指针变量的定义,应用,赋值:

int a[10];int *app;则有两种方法:app = &a[0];或 app = &a;(1)app+I 或a+i就是数组元素a[i]的地址;(2)*(app+i)或 *(a+i)就是元素a[i]中的内容;

(3)指针变量也可以带下表,即app[i]与*(app+i)等价。8.4 数组和指针可以互换,但在代码执行的效率上却大不相同。用数组找元素必须每次计算元素的地址,效率不高;而用指针则直接指向某个元素,不必每次计算地址,可以大大的提高运算效率。8.5 关于指针的运算:

(1)p++(或p+=1):使指针p指向下一个数组元素,地址加1;

(2)*p++:先得到p指向的变量值,再执行p加1,指向下一个数组元素;(3)*++p:先使p加1,指向下一个数组元素,再去p指向的变量值;(4)(*p)++:表示p指向的变量值加1;

(5)若p指向当前数组中的第i个元素,则:

(p--)与a[i--] 等价:先执行*p,然后p自减;(++p)与a[++i] 等价:先执行p自加,再执行*p;(--p)与a[--p] 等价:先执行p自减,再执行*p。

8.6 指向多维数组:

定义一个二维数组:a[3][4];定义一个指针变量:(*p)[4];(注意:列数相同(第二维相同))使指针变量指向数组:p = a;此时: p与a等价:指向数组a[3][4]的第0行首地址;

p+1与a+1等价:指向数组a[3][4]的第1行首地址; p+2与a+2等价:指向数组a[3][4]的第2行首地址;

而:

*(p+1)+3与& a[1][3]等价,指向a[1][3]的地址;

*(*(p+1)+3)与a[1][3]等价,表示a[1][3]的值; 一般的:对于数组a[i][j]来讲,有

*(p+i)+j相当于&a[i][j],表示第i行第j列元素的地址; *(*(p+i)+j)相当于a[i][j],表示第i行第j列元素的值。

8.7 指向结构体:

如果指针p指向结构体数组msg1[0]的首地址,则:

(1)(*p).flg与p->flg和msg1[0].flg三者完全等价,即(*p).成员名 与p->成员名 以及 结构体数组元素成员名三种形式是等价的;

(2)p+1:使指针指向结构数组msg1[0]的下一个元素msg1[1]的首地址;(3)由于指向运算符->的优先级高于自加运算符++,则:

(++p)->flg:先使p自加1指向msg1[1]的地址,再指向msg1[1]的flg成员值;(p++)->flg:先得到msg1[0].flg的值,再使p自加1指向msg1[1]的首地址;

p->flg++:先得到msg1[0].flg的值,使用完后再使msg1[0].flg的值加1; ++p->flg:先将msg1[0].flg的值加1,再使用。

第五篇:单片机C语言学习心得

8、指针的使用

8.1 在定义的时候,*ap中的‘*’是指针类型说明符;

在进行指针预算时,x = *ap 中的‘*’是指针运算符。

8.2 如果在已定义好的指针变量,并引用,即

int *ap, int a;

ap = &a;

则在进行指针运算的时候:

(1)*ap与a是等价的,即 *ap就是a;

(2)&*ap:由于*ap与a等价,则&*ap与&a等价(地址);

(3)*&a:由于&a = ap,则*&a与*ap等价,即*&a与a等价(变量);

(4)*ap++相当于a++。

8.3 指向数组的指针变量的定义,应用,赋值:

int a[10];int *app;

则有两种方法:app = &a[0];或 app = &a;

(1)app+I 或a+i就是数组元素a[i]的地址;

(2)*(app+i)或 *(a+i)就是元素a[i]中的内容;

(3)指针变量也可以带下表,即app[i]与*(app+i)等价。

8.4 数组和指针可以互换,但在代码执行的效率上却大不相同。用数组找元素必须每次计算

元素的地址,效率不高;而用指针则直接指向某个元素,不必每次计算地址,可以大大的提高运算效率。

8.5 关于指针的运算:

(1)p++(或p+=1):使指针p指向下一个数组元素,地址加1;

(2)*p++:先得到p指向的变量值,再执行p加1,指向下一个数组元素;

(3)*++p:先使p加1,指向下一个数组元素,再去p指向的变量值;

(4)(*p)++:表示p指向的变量值加1;

(5)若p指向当前数组中的第i个元素,则:

(p--)与a[i--] 等价:先执行*p,然后p自减;

(++p)与a[++i] 等价:先执行p自加,再执行*p;

(--p)与a[--p] 等价:先执行p自减,再执行*p。

8.6 指向多维数组:

定义一个二维数组:a[3][4];定义一个指针变量:(*p)[4];(注意:列数相同(第二维相同))

使指针变量指向数组:p = a;

此时: p与a等价:指向数组a[3][4]的第0行首地址;

p+1与a+1等价:指向数组a[3][4]的第1行首地址;

p+2与a+2等价:指向数组a[3][4]的第2行首地址;

而:*(p+1)+3与& a[1][3]等价,指向a[1][3]的地址;*(*(p+1)+3)与a[1][3]等价,表示a[1][3]的值; 一般的:对于数组a[i][j]来讲,有*(p+i)+j相当于&a[i][j],表示第i行第j列元素的地址; *(*(p+i)+j)相当于a[i][j],表示第i行第j列元素的值。

8.7 指向结构体:

如果指针p指向结构体数组msg1[0]的首地址,则:

(1)(*p).flg与p->flg和msg1[0].flg三者完全等价,即(*p).成员名 与p->成员名 以及 结

构体数组元素成员名三种形式是等价的;

(2)p+1:使指针指向结构数组msg1[0]的下一个元素msg1[1]的首地址;

(3)由于指向运算符->的优先级高于自加运算符++,则:

(++p)->flg:先使p自加1指向msg1[1]的地址,再指向msg1[1]的flg成员值;(p++)->flg:先得到msg1[0].flg的值,再使p自加1指向msg1[1]的首地址; p->flg++:先得到msg1[0].flg的值,使用完后再使msg1[0].flg的值加1; ++p->flg:先将msg1[0].flg的值加1,再使用。

下载51单片机4路抢答器的原理及C语言源程序(精选5篇)word格式文档
下载51单片机4路抢答器的原理及C语言源程序(精选5篇).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    单片机C语言学习

    单片机C语言之一___________________________________________________________________ _____________________ 预处理 一》宏定义: 1、不带参数: #define 标识符 常量表达......

    C语言编程 “画圆”源程序(精选5篇)

    #include void main { int driver,mode; driver=DETECT; mode=0; initgraph(&driver,&mode,""); setcolor(15); line(66,66,88,88); lineto(100,100); linerel(36,64); ge......

    单片机c语言学习心得(改编)

    单片机c语言学习心得(一) 相信很多爱好电子的朋友,对单片机这个词应该都不会陌生了吧。不过有些朋友可能只听说他叫单片机,他的全称是什么也许并不太清楚,更不用说他的英文全称......

    单片机c语言设计试题答案

    单片机C语言程序设计师试题 一、填空题 1、设X=5AH,Y=36H,则X与Y“或”运算为_________,X与Y的“异或”运算为________。 2、若机器的字长为8位,X=17,Y=35,则X+Y=_______,X-Y=______......

    单片机c语言学习心得转载

    单片机c语言学习心得(一)相信很多爱好电子的朋友,对单片机这个词应该都不会陌生了吧。不过有些朋友可能只听说他叫单片机,他的全称是什么也许并不太清楚,更不用说他的英文全称和......

    c语言编写单片机感想

    用C语言对单片机编程感想 起先接触单片机,单片机的程序是用汇编语言编写的。汇编语言是面向机器的低级语言,保持了机器语言的优点,具有直接和简捷的特点,目标代码简短,占用内存少......

    学习单片机c语言还是语言

    汇编语言(AssemblyLanguage)是面向机器的程序设计语言。汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行......

    单片机C语言知识点大全

    【C语言】 【数据类型】 【转义字符】 【语句】 【#define】 #define 新名 原名 【typedef】 typedef 原类型名 新类型名; 【sbit】 sbit P1_0=P1^0; 在reg52.h或reg51.h的......