第一篇:抢答器~C51~带程序
前 言
在电视和学校中我们会经常看到一些智力抢答的节目,如果要是让抢答者用举手等方法,主持人很容易误判,会造成抢答的不公平,比赛中为了准确、公正、直观地判断出第一抢答者,所设计的抢答器通常由数码显示、灯光、音响等多种手段指示出第一抢答者。为了使这种不公平不发生,只有靠电子产品的高准确性来保障抢答的公平性。
功能分为基本功能和扩展功能,基本功能是能够实现抢答器的功能,扩展功能进一步丰富了抢答器的功能,更佳人性化。
基本功能可以有同时供8名选手比赛,分别用8个按钮S0 ~ S7表示;设置一个系统复位按钮和抢答控制按钮,这组开关由主持人控制;抢答器具有锁存与显示功能。即选手按动按钮,扬声器发出声响提示,锁存相应的选手号码并且通过数码管显示。选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。
扩展功能有抢答器具有定时抢答功能,且抢答的时间由主持人设定(如30秒)。当主持人按下启动键后,定时器进行倒计时;参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。
此设计可以用三种方法实现:数字电路,单片机,PLC。其中PLC方案与单片机方案原理相似,但成本太高,故不采用此方案,在此不另作比较。主要在数字电路和单片机两个方案中选择。
AT89C52 是美国ATMEL 公司生产的低电压,高性能CMOS 8 位单片机,片内含8k bytes 的可反复擦写的Flash 只读程序存储器和256 bytes 的随机存取数据存储器(RAM),器件采用ATMEL 公司的高密度、非易失性存储技术生产,与标准MCS-51 指令系统及8052产品引脚兼容,片内置通用8 位中央处理器(CPU)和Flash 存储单元,功能强大AT89C52 单片机适合于许多较为复杂控制应用场合。
基于单片机的八路抢答器是针对目前的抢答器市场而设计的,其高度的准确性,低廉的成本,是绝对有竞争优势,其市场前景巨大。通过本课题的训练,不仅可以研制出一套八路抢答器,还可以使我们通过对单片机电路的设计与编程,达到理论与实践相结合的目的,强化我们四年中的学习知识,能提高解决实际问题的能力。
第一章 设计的依据
1.1 课题的提出
在电视和学校中我们会经常看到一些智力抢答的节目,如果要是让抢答者用举手等方法,主持人很容易误判,会造成抢答的不公平,比赛中为了准确、公正、直观地判断出第一抢答者,所设计的抢答器通常由数码显示、灯光、音响等多种手段指示出第一抢答者。为了使这种不公平不发生,只有靠电子产品的高准确性来保障抢答的公平性。
1.2 实现的系统功能简介
功能分为基本功能和扩展功能,基本功能是能够实现抢答器的功能,扩展功能进一步丰富了抢答器的功能,更佳人性化。
1.基本功能:
(1)同时供8名选手比赛,分别用8个按钮S0 ~ S7表示。
(2)设置一个系统复位按钮和抢答控制按钮,这组开关由主持人控制。(3)抢答器具有锁存与显示功能。即选手按动按钮,扬声器发出声响提示,锁存相应的选手号码并且通过数码管显示。选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。
2.扩展功能:
(1)抢答器具有定时抢答功能,且抢答的时间由主持人设定(如30秒)。当主持人按下启动键后,定时器进行倒计时。
(2)参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。
第二章 总体方案确定
2.1 方案论证
此设计可以用三种方法实现:数字电路,单片机,PLC。其中PLC方案与单片机方案原理相似,但成本太高,故不采用此方案,在此不另作比较。2.1.1数字电路总体方案
如下图所示为数字电路总体方框图。其工作原理为:接通电源后,主持人将开关拨到“清除”状态,抢答器处于禁止状态,编号显示器灭灯,定时器显示设定时间;主持人将开关置“开始”状态,宣布“开始”抢答器工作。定时器倒计时,扬声器给出声响提示。选手在定时时间内抢答时,抢答器完成:优先判断、编号锁存、编号显示、扬声器提示。当一轮抢答之后,定时器停止、禁止二次抢答、定时器显示剩余时间。如果再次抢答必须由主持人再次操作“清除”和“开始”状态开关。
图2.1.1 数字电路方案
2.1.2 MCS-51方案
该方案主要由 抢答、声音警示、灯光指示和计时电路组成,借助较少的外围元件完成抢答的整个过程。系统框图如下图所示。
图2.1.2 单片机方案
2.2 方案确定
通过三个方案比较,单片机控制的设计方案外围的元件也很少,成本比较低,制作简单,实现的功能灵活。由于是单片机控制,对抢答器队参赛选手的动作的先后有很强的分辨力,即使先后只相差几毫秒,抢答器也能分辨出来,抢答器直接显示动作选手的编号和答题时间,并保持到主持人清零为止。所以我选择采用单片机控制的方案来完成抢答器电路。
第三章 硬件设计
3.1 整体电路设计
整个系统可以分为五部分:抢答电路,主持人控制按钮,单片机最小系统,显示电路,蜂鸣器。如下图所示
图3.1 整体电路
3.2 复位电路设计
复位电路采用经典的51系列单片机的复位方法:上电复位和开关复位。通电后,给电容充电,在此过程中,单片机复位;运行时,按下复位按钮,RST端口变为高电平,进行复位。复位电路和晶振电路如下:
图3.2 复位电路和晶振电路 3.3 显示电路的设计
显示电路和扬声器电路如下图所示:
图3.3.1 显示电路 图3.3.2 扬声器电路
3.4 控制电路实现
主持人的按键有四个,分别是:开始、复位、加
1、减1。按键一般按下的过程中有抖动,需要消抖处理,本设计中采用了并联电容处理,实际调试过程中证明效果很好,故软件不需要再次做消抖处理。
图3.4.1 选手按键电路 图3.4.2 主持人控制电路
3.5 硬件电路设计小结
经过几十个昼夜奋战,硬件电路终于调试成功,想想开始的时候什么都不确定,第一次焊接好了之后,到处都是问题,到现在的稳定运行,真的有一种莫大的满足感。特别是消抖这一块,一直是我们设计不稳定运行的主因,在指导老师的悉心指导下,在院系领导的关怀下,我们的问题也一一迎刃而解。
第四章 软件设计
4.1 总体设计
第五章 电路调试
5.1硬件调试
基本电路板检查: 根据前面的研究完成各个电路模块的原理设计并生成PCB图,制作电路板,进行实验调试。
(1)检查印制板的印制线是否有断路,是否有毛刺,是否与其它线或是焊盘粘连,焊盘是否有脱落,过孔是否有未金属化现象等等。
(2)先用万用表复核目测中认为可疑的连接或是接点,检查它们的通短状态是否与设计规定相符。再检查各种电源线与地线之间是否有短路现象,如有再仔细检查出并排除。短路现象一定要在器件安装及加电前检查出。
(3)路接通电源后,用手摸一下芯片是否发热,如果发热,立即关掉电源,稍后再进行再次检测;如果没有发热,再测试芯片的VCC端电压是否达到设计要求,接地端是否都接地。
主控模块调试: 在本次设计中,主控模块是非常重要的部分,它不仅是本次设计的核心,同时在后面的8255A显示也是起关键的作用。在本次硬件调试中也遇到了问题,接上电源的时候,数码管不亮,没有任何显示,于是我做了如下的工作:(1)检查电源是否通电,发现指示灯亮着;(2)编程使P1为低电平,检查到P1输出为低;(3)检查P0口未接上拉电阻,接上数码管发亮了。
由次我深刻的认识到:制作电路板是一个比较繁琐的过程,它需要我们时刻都要用心去做,每个环节都不能忽视,只有这样才能达到锻炼的目的。
5.2软件调试
当硬件制作完成后,软件制作也是不可轻视的部分,是实现电路的功能的关键部分,通过本次毕业设计,总结经验如下:
(1)先进行人工检查。写好程序后,不立刻烧入单片机,先对纸面上的程序进行人工检查。由于采用C语言编程,所以要特别小心地检查语法错误,如括号不配对,漏写分号等,通过仔细的检查,发现并排除这些错误。
(2)人工检查无误后,上机调试。在编译时给出的语法错误的信息,根据提示的信息具体找出程序中错误之处并改之,从上至下逐一改正。应当注意的是:有的提示出错行并不是真正出错的行,如果在提示出错的行上找不到错误的话,则应该到上行再找。
(3)当确认程序无语法错误和逻辑错误时,通过直接下载到单片机来调试。采用的是自下到上的调试方法,即单独调好每一个模块,然后再连接成一个完整的系统调试。
(4)程序烧入单片机后,观察各个部件的工作是否正常,功能是否实现。如不能正常工作,则继续检查程序中的相应模块,必要时从上到下重新检查程序。
总 结
抢答器丰富了我们的生活,社会中本来就充满着竞争。只是没有很明显的表现出来,通过运用它我们可以很好的证明自己的胆识和自信,所以做起抢答器来,也很想去了解它,对于八路抢答器原理说起来很简单,也没什么复杂性,所以看似很简单,但实践中却发现不是那么回事,实际调试的过程中,一点问题都不能存在,否则它就不运行,真正体会到了什么叫一丝不苟,什么叫锲而不舍。在以后的工作和学习中,我一定会深刻运用这次的心得体会。
总之,这次实践是非常成功的,我们追求的是理论与实践并存,这次毕业设计就很好的为大学生表现自己综合能力提供有力的平台。实践中也发了自己有一点不懂的地方,通过这次实践才彻底搞懂,这证明了理论学习后还是需要实践课程的。
在这个过程中,通过老师的指导和自己的摸索,学会了自己学习新知识,查找资料的方法,我想这应该是我们大学中应该掌握的方法。
致 谢
本设计经过一个学期的的时间,到今天终于完成了。在此,向我的指导老师表示最诚挚的谢意。从课题的选择,前期的准备工作、方案的制定,系统的开发与调试,到论文的撰写修改定稿都渗透了老师的心血。在这三个月中,老师以他渊博的学识、卓越的才智、严谨的治学精神和求实创新的工作作风以及平易近人的态度使我受益匪浅,在学习中给我很大的启迪和帮助,对我的指导更是给我留下了极为深刻的印象。使我在这次毕业设计中学到了许多知识。
在整个课题的研究和设计过程中,还得到了其他院系和实验室的老师们的帮助和支持,在我设计时遇到困难时,他们给予了我不少的帮助和鼓励,再次表示诚挚的感谢。正是由于他们的帮助,才使这次设计能顺利的完成。
此外,我还要特别感谢大学四年里的老师和同学,感谢我们系的全体老师以及所有关心我,帮助我,鼓励我的人,没有你们的无私帮助,我是很难完成我的毕业设计的,谢谢你们。
参考文献
[1] 康华光,《电子技术基础.数字部分(第四版)》[M],北京:高等教育出版社,2003.
[2] 李广弟,《单片机基础》[M],北京:北航出版社,2001.
[3] 梁超,一款基于单片机技术的电子抢答器[J ],机电工程技术,2005,34(1). [4] 李朝青,单片机原理及接口技术[M],北京:北京航空航天大学出版社,1999. [5] 齐向东,多功能数字显示抢答器[J ].黄石高等专科学院学报,1996.
附录
附录1数字抢答器原理图
附录2 AT89S52芯片主程序
#include
sbit P2_4=P2^4;///加1键 sbit P2_5=P2^5;//减1键 sbit P2_6=P2^6;//确认键 sbit P2_7=P2^7;//蜂鸣器
uchar a=20,b=0,c=0;unsigned
int gong=100,yi=100,er=100,san=100,si=100,wu=100,liu=100,qi=100,ba=100;//8组得分变量
uchar disp[]={0,0,0,0};//四个显示单元
uchar dispbit[]={0xfe,0xfd,0xfb,0xf7};//数码管扫描代码 uchar dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xbf};//共阳数码管数字代码
//------------------------数码管显示子程序
void display(void){ uchar i,j;disp[3]=b;//求得四个单元值 disp[2]=10;disp[1]=a/10;disp[0]=a%10;for(i=0;i<4;i++)//循环四次送四个单元供显示 { P0=dispcode[disp[i]];P2=dispbit[i];for(j=0;j<255;j++);} } //--------------void display1(void){ uchar i,j;disp[3]=b;disp[2]=gong/100;disp[1]=gong%100/10;disp[0]=gong%100%10;for(i=0;i<4;i++){ P0=dispcode[disp[i]];P2=dispbit[i];for(j=0;j<255;j++);} } //------------中断定时50ms子程序 void t0(void)interrupt 1 using 1 { c++;TH0=0x3c;//定时器0附初值 TL0=0xb0;} //--------------------------void main(void){unsigned int d;//条件判断,用于第一个人按到后,后面的人再按不管用.TMOD=0x01;//用定时器定时50MS TH0=0x3c;//定时器0附初值 TL0=0xb0;ET0=1;EA=1;while(1){ P2_7=1;// display();if(c==20)// { c=0;a--;} if(P2_4==0)// { while(P2_4==0);// if(a==99){ a=0;a--;} a++;//} if(P2_5==0)//{ while(P2_5==0);if(a==0)a=100;a--;} if(P2_6==0)//蜂鸣器不响 一秒到,秒减1 加1键 松开键 定时加1 减1键 确认键 { while(P2_6==0);TR0=1;} if(a==0)//定时时间到报警一直响 { TR0=0;P2_7=0;} if(tj==1){ while(P2_6==1){ display1();if(P2_4==0){ while(P2_4==0);if(b==1)//加分
{ yi=yi+10;gong=yi;}
if(b==2){er=er+10;gong=er;}
if(b==3){san=san+10;gong=san;}
if(b==4){si=si+10;gong=si;}
if(b==5){wu=wu+10;gong=wu;}
if(b==6){liu=liu+10;gong=liu;}
if(b==7){qi=qi+10;gong=qi;}
if(b==8){ba=ba+10;gong=ba;}
} if(P2_5==0){while(P2_5==0);if(b==1){yi=yi-10;gong=yi;}//减分
if(b==2){er=er-10;gong=er;}
if(b==3){san=san-10;gong=san;}
if(b==4){si=si-10;gong=si;}
if(b==5){wu=wu-10;gong=wu;}
if(b==6){liu=liu-10;gong=liu;}
if(b==7){qi=qi-10;gong=qi;}
if(b==8){ba=ba-10;gong=ba;}
} }while(P2_6==0);tj=0;a=20,b=0;} if(tj==0){ switch(P1&0xff)//程序判断是哪一组抢答 {case 0xef:b=5;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=wu;break;case 0xdf:b=6;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=liu;break;case 0xbf:b=7;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=qi;break;case 0x7f:b=8;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=ba;break;case 0xfe:b=1;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=yi;break;case 0xfd:b=2;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=er;break;case 0xfb:b=3;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=san;break;case 0xf7:b=4;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=si;break;default: break;} } } }
第二篇:C语言实验报告,含递归(带程序)
一、写一个函数intdigit(int n,int k),它返回数n的从右边向左的第k个十进数字位值。例如,函数调用digit(1234,2)将返回值3。
二、写一个函数intisprime(intn),当n是质数时,函数返回非零值;当n是合数时,函数返回零值。
三、写一个函数reverse(chars[]),将字符串s[]中的字符存储位置颠倒后重新存于s[]中。试分别用递归和非递归两种形式编写。
四、写一个主函数输入测试数据(自己指定),并调用上述函数,检查函数功能的正确性。要求:把预备知识、步骤、程序框图、调试好的程序及存在的问题写在下面(不够可以附页)。
#include
#include
intdigit(int n,int k);
intisprime(intn);
void reverse(chars[]);//非递归实现
void reverse1(chars[]);//递归实现
int digit(int n,int k)
{
int m1,m2,i;
m1=n;
m2=0;
while(m1!=0)//统计n数字的位数
{
m1=m1/10;
m2=m2+1;
}
if(k<=0||k>m2)return 0;//不能正确截取
m1=n;
for(i=1;i m1=m1/10; m2=m1%10;//取第k位 return m2; } intisprime(intn)//是素数返回1,是合数返回0 { int i; if(n<0) n=-n; if(n==1)return 0; for(i=2;i<=n/2;i++) if(n%i==0) break; if(i>n/2) return 1; else return 0; } void reverse(chars[],int len)//非递归,字符串倒置 { int i;char ch; for(i=0;i { ch=s[i];s[i]=s[len-1-i];s[len-1-i]=ch; } } voidreverse1(chars[],int m,int n)//递归方法实现 { char ch; ch=s[m];s[m]=s[n];s[n]=ch; if(m<=n) reverse1(s,m+1, n-1); } void main() { int n=123456,k=4,len; char str[80]=“abcdefghij”,str1[80],str2[80]; if(digit(n,k)==0) printf(“%d输入错误n”,k); else printf(“%d的右边第%d位是:%dn”,n,k,digit(n,k)); if(isprime(k)==0) printf(“%d是合数n”,k); else printf(“%d是素数n”,k); len=strlen(str); printf(“原字符串n”); strcpy(str1,str); puts(str1); reverse(str1,len); printf(“倒置以后的字符串n”); puts(str1); }printf(“原字符串n”);strcpy(str2,str);puts(str2);reverse1(str2,0,len-1);printf(“倒置以后的字符串n”);puts(str2); #include unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,//0~f显示表 0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};unsigned char code table0[]={0xf1,0xf2,0xf4,0xf8}; //P2口位选 unsigned char code table2[]={0xef,0xdf,0xbf,0x7f}; //P3口送行信号 unsigned char display[]={0,0,0,0};//显示位 void sw1(); //子函数申明 void sw2();void sw3();void sw4();void xianshi();void init();unsigned char temp,num2,x,x1,x2,a,count; //变量声明 int num,num1;unsigned char key;unsigned char i,j;sbit P3_4=P3^4;sbit P3_5=P3^5;sbit P3_6=P3^6;sbit P3_7=P3^7;sbit k1=P1^0; //位申明(时间加)sbit k2=P1^1; //位申明(时间减)sbit k3=P1^2; //位申明(开始)sbit k4=P1^3; //位申明(复位)sbit sp=P1^4; //蜂鸣器 sbit l1=P1^5; //LED显示 sbit l2=P1^6; //LED显示 void delay(unsigned char z) //延时1ms子函数 { unsigned char x,y; for(x=z;x>0;x--) for(y=110;y>0;y--);} void init() //初始化子函数 { a=0;TMOD=0x01; //定时器T0工作方式设定 TH0=(65536-10000)/256;//装初值 TL0=(65536-10000)%256;EA=1; //开定时器T0 ET0=1; if(k1==0) //判断时间加K1是否按下 { delay(5); //延时躲过抖动 if(k1==0) //再次确认是否按下K1 { num++; //时间自加1 if(num==99) //如果时间num=99,清零num { num=0; } num2=num; //将num值赋值给num2 while(k1==0);//等待K1松手 } } if(k2==0) //判断时间减K2是否按下 { delay(5); //延时躲过抖动 if(k2==0) //再次确认是否按下K2 { num--; //时间自减1 if(num==-1)//如果时间num=-1,赋值num=99 { num=99; } num2=num;//将num值赋值给num2 while(k2==0);//等待K2松手 } } if(k3==0) //判断开始按钮K3是否按下 { delay(5); //延时躲过抖动 if(k3==0)//再次确认是否按下K3 { x++; //自加1 if(x==2)//假如x=2,清零x { x=0; } } } } void keyboad() //按键检测子函数 { while(1) { P3=0xff; //读引脚前需写入高电平 P3_4=0; //置第一行线为低 temp=P3; //P3口信息送入temp中 temp=temp & 0x0f;//屏蔽高四位,保留低四位 if(temp!=0x0f)//判断:假如列线有不为高的时候,执行if循环体 { delay(5);//延时躲过抖动 temp=P3; temp=temp & 0x0f; if(temp!=0x0f) { temp=P3; temp=temp & 0x0f;//判断是哪个键按下 switch(temp) { case 0x0e: //第一行第四个按下 {delay(5);num1=4;l2=0;xianshi();} //第一行第一个键按下 break; case 0x0d: //第一行第三个按下 {delay(5);num1=3;l2=0;xianshi();} break; case 0x0b: //第一行第二个按下 {delay(5);num1=2;l2=0;xianshi();} break; case 0x07: //第一行第一个按下 {delay(5);num1=1;l2=0;xianshi();} break;//第一行第一个键按下 } } } P3=0xff; P3_5=0; temp=P3; temp=temp & 0x0f; if(temp!=0x0f) { delay(5);//延时躲过抖动 temp=P3; temp=temp & 0x0f; if(temp!=0x0f) { temp=P3; temp=temp & 0x0f; switch(temp) { case 0x0e: {delay(5);num1=8;l2=0;xianshi();} break; case 0x0d: {delay(5);num1=7;l2=0;xianshi();} break; case 0x0b: {delay(5);num1=6;l2=0;xianshi();} break; case 0x07: {delay(5);num1=5;l2=0;xianshi();} break; } } } P3=0xff; P3_6=0; temp=P3; temp=temp & 0x0f; if(temp!=0x0f) { delay(5);//延时躲过抖动 temp=P3; temp=temp & 0x0f; if(temp!=0x0f) { temp=P3; temp=temp & 0x0f; switch(temp) { case 0x0e: {delay(5);num1=12;l2=0;xianshi();} break; case 0x0d: {delay(5);num1=11;l2=0;xianshi();} break; case 0x0b: {delay(5);num1=10;l2=0;xianshi();} break; case 0x07: {delay(5);num1=9;l2=0;xianshi();} break; //第二行第四个键按下//第二行第三个键按下//第二行第二个键按下//第二行第一个键按下//第三行第四个键按下//第三行第三个键按下//第三行第二个键按下//第三行第一个键按下 } } } P3=0xff; P3_7=0; temp=P3; temp=temp & 0x0f; if(temp!=0x0f) { delay(5);//延时躲过抖动 temp=P3; temp=temp & 0x0f; if(temp!=0x0f) { temp=P3; temp=temp & 0x0f; switch(temp) { case 0x0e: {delay(5);num1=16;l2=0;xianshi();} break; case 0x0d: {delay(5);num1=15;l2=0;xianshi();} break; case 0x0b: {delay(5);num1=14;l2=0;xianshi();} break; case 0x07: {delay(5);num1=13;l2=0;xianshi();} break; } temp=P3; P0=table[key]; } } } } void xianshi(){ TR0=0; //停止定时计数 num=0; //倒计时num清零 sp=1; //成功抢答,蜂鸣器叫 delay(100); //延时一段时间 sp=0; //关蜂鸣器 //第四行第四个键按下//第四行第三个键按下//第四行第二个键按下//第四行第一个键按下 while(1) { for(a=0;a<4;a++)//显示部分位选 { delay(5); P2=table0[a]; P0=table[display[a]]; } display[0]=num/10; //倒计时显示0 display[1]=num%10; display[2]=num1/10; //显示抢答者号 display[3]=num1%10; if(k4==0) //判断复位键K4是否按下 { num=num2; //num2值赋值给num num1=0; //清零抢答者号显示 TR0=1; //启动定时器TO l1=1; //D1,D2关闭 l2=1; return; } } } void main() //主函数 { l1=1; //D1,D2关闭 l2=1; sp=0;//初始化蜂鸣器 x=0; num=num2=30; //赋初值 while(1) { if(x==1) //开始键按下 { delay(5); TR0=1; //启动定时 while(1) { keyboad();//调用按键检测子函数 if(k4==0)//判断复位键是否按下 { l1=1;//D1,D2关闭 l2=1; delay(5); num=num2;//倒计时时间30秒赋值给num TR0=1;//启动定时器T0 } } } else //开始键没有按下 { for(a=0;a<4;a++) //显示部分位选 { delay(5); P2=table0[a]; P0=table[display[a]]; } display[0]=num/10;//倒计时显示0 display[1]=num%10; display[2]=num1/10; //显示抢答者号 display[3]=num1%10; init(); //初始化 } } } void time0()interrupt 1 //定时器T0中断 { TH0=(65536-10000)/256; //重装初值 TL0=(65536-10000)%256;count++; //中断次数记录 if(k4==0) //复位键K4检测 { num=num2; TR0=1; num1=0; return; } for(a=0;a<4;a++) { delay(10); P2=table0[a]; P0=table[display[a]]; } display[0]=num/10; //倒计时显示0 display[1]=num%10; display[2]=num1/10;//显示抢答者号 display[3]=num1%10; if(count==100) //1秒定时是否已到 { count=0; //清零记录 num--; //显示倒计时自减一 if(num<6) //倒计时倒数6秒,D2亮,蜂鸣器报警 { l1=~l1; sp=1; delay(100); sp=0; if(num==0) //倒计时为0,D2亮,蜂鸣器报警 { l1=0; sp=1;delay(200);sp=0; delay(100); sp=1;delay(200);sp=0; delay(100); sp=1;delay(200);sp=0; } if(num==0) { while(1) { xianshi(); //调用延时子函数 if(k4==0)//假如复位键按下 { l1=1; //D1,D2灭 l2=1; num=num2;//30秒倒计时赋值给num TR0=1;//启动定时器T0 return; } } } } } x2++;if(x2==4){ x2=0;} P3=table2[x2]; //分别给行线送低电? 工程学院 实 验 报 告 课 程 名 称: c程序设计 课 程 代 码: 8234510 学院(直属系): 年级/专业/班: 2010级汽电1班 学 生 姓 名: 学 号: 31201008030 实验总成绩: 任 课 教 师: 开 课 学 院: 工程学院 实验中心名称: 交通实验中心 西华大学实验报告(理工类) 开课学院及实验室:汽车学院机房(5d-215)实验时间: 年 月 日 1、实验目的 2、实验设备、仪器及材料 3、实验内容 一般实验: 3.1实验方案设计与选择(设计性、创新性实验需写该项内容)3.2实验原理及实验步骤(实验工作原理或实验的主要操作过程)3.3实验记录(核心代码及调试过程) 注解:理工科实验需记录实验过程中的数据、图表、计算、现象观察等,实验过程中出现的问题; 其它如在计算机上进行的编程、仿真性或模拟性实验需记录程序核心代码以及程序在调式过程中出现的问题及解决方法;记录程序执行的结果。 上机实验: 3.1上机实验的内容及要求 3.2算法设计思想与算法实现步骤 3.3程序核心代码,程序调试过程中出现的问题及解决方法 3.4 程序运行的结果 4、实验总结 4.1实验结果分析及问题讨论 4.2实验总结心得体会 注解:实验总结的内容根据不同学科和类型实验要求不一样,一般理工科类的实验需要对实验结果进行分析,并且对实验过程中问题进行讨论;在计算机上进行的编程、仿真性或模拟性实验需要对上机实践结果进行分析,上机的心得体会及改进意见。其它实验应总结实验过程写出心得体会及改进意见。 1、实验目的(1)熟悉c语言的集成环境,了解菜单的使用方法。(2)掌握c语言程序上机的编辑、编译、连接、运行的基本步骤。(3)了解c语言程序的结构。 2、实验设备、仪器及材料(1)硬件环境 微型计算机(intel x86系列cpu)一台(2)软件环境 windows98/2000/xp操作系统 vc6.0集成开发环境 3、实验内容 3.1上机实验的内容及要求(1)熟悉vc中常用菜单项及对应快捷键的使用方法。(2)熟悉c语言程序上机的编辑、编译、连接、运行的基本步骤。(3)编程实现一个字符串的输出。(4)编程输出两个数的最大值。(5)计算由键盘输入的任意两个整数的积。3.2算法设计思想与算法实现步骤(1)编程实现一个字符串的输出为程序一,编程中,定义一个空函数后,直接由利用printf输出字符串。(2)编程输出两个数的最大值为程序二,编程中,用scanf函数输入两个数,再用选择函数判定两数大小,最后用printf函数输出最大值。(3)计算由键盘输入的任意两个整数的积为程序三,编程中,用scanf函数输入两数,再由乘积函数进行求积运算。 3.3程序核心代码,程序调试过程中出现的问题及解决方法 (1)程序核心代码 程序一: #include #include #include 当分别添加上丢失的符号后,问题解决,程序编辑成功。3.4 程序运行的结果 程序一运行结果: 程序二运行结果: 程序三运行结果: 4、实验总结 4.1程序运行结果分析及思考题讨论 根据程序运行结果和编程之前的预期结果一致,说明编程成功。 对于程序的结构应该熟记在心,而且在vc6.0集成开发环境中不需要用户去进行连接的操作,这一步的操作电脑会自动完成。4.2实验总结心得体会 对第一次c语言编程上机实验,对编程还有很多不是很熟悉的地方,需要在接下来的学习中进一步熟 练掌握操作。而且在以后的编程中对于printf,csanf函数的运用将会更多。在编程中还必须小心翼翼,如果出现编译错误,可参看界面下方的错误提示,这对于编程成功很有帮助。 1、实验目的篇二:c程序设计实验三实验报告 实 验 报 告 工学院 土木工程专业 09级 2011 至 2012 学 第 1 学期 学号:xxxxxx 姓名:xxxxxx 2011 年10月 08日 第3~4节 综合 楼 325教室 篇三:c语言实验报告1 实验名称:熟悉c程序的运行环境 一、实验目的和要求 了解turbo c++ 3.0的基本操作方法,学会独立使用该系统 编辑、编译、连接和运行一个c程序 通过运行简单的c程序,初步了解c源程序的特点 二、实验内容和原理 1.输入并运行一个简单、正确的程序 # include 三、实验环境 1.硬件:pc机; 2.软件:windows操作系统、turboc++ 3.0。 四、算法描述及实验步骤 1.内容1(1)启动tc++3.0,新建一个c文件; (2)输入程序1; (3)保存文件; (4)编译源程序,观察屏幕上显示的编译信息,修改出现的错误,直到编译成功,再次保存文件; (5)连接程序、运行程序,观察运行结果。2.内容2(1)启动tc++3.0,新建一个c文件; (2)输入程序2; (3)保存文件; (4)编译源程序,观察屏幕上显示的编译信息,修改出现的错误,直到编译成功; (5)连接程序、运行程序,观察运行结果。3.内容3(1)启动tc++3.0,新建一个c文件; (2)输入程序2; (3)保存文件; (4)编译源程序,观察屏幕上显示的编译信息,修改出现的错误,直到编译成功; (5)连接程序、运行程序; (6)输入数据,观察运行结果。 五、调试过程 1.输入后,按alt+f9编译,出现如下信息: 成功编译。 2.输入后,按alt+f9编译,出现如下信息: 经分析是由于int a, b, sum与sum=a+b俩句未加;导致。3.输入后,按alt+f9编译,出现如下信息: 经分析是由于int a, b, c句未加;导致。 修改后编译结果如下: 六、实验结果 1.2.3.输入123,654运行结果如下: 输入1989,1988运行结果如下: 七、总结 经过本次上机实验,我基本了解turbo c++ 3.0的操作方法,学会在该系统上编辑、编译、连接和运行一个c程序。同时也明白在编译过程中应留心一些细节问题(如一个语句结束要加“;”),也学会通过编译错误信息找出错误,并修正错误。 实验名称:数据类型、函数和表达式 八、实验目的和要求 掌握c语言数据类型,熟悉如何定义整型、字符型和实型变量并赋值 掌握不同类型数据之间赋值的规律 学会使用c的有关算法运算符及表达式,特别是自加(++)和自减(--)运算符的使用 进一步熟悉c程序的编辑、编译、连接和运行的过程 九、实验内容和原理 2.输入并运行下面程序,分析运行结果。# include m=++i; n=j++; printf(%d,%d,%d,%d,i,j,m,n); } 十、实验环境 1.硬件:pc机; 2.软件:windows操作系统、turboc++ 3.0。 十一、算法描述及实验步骤 (1)启动tc++3.0,新建一个c文件; (2)输入程序; (3)保存文件; (4)编译源程序,观察屏幕上显示的编译信息,修改出现的错误,直到编译成功; (5)连接程序、运行程序,观察分析运行结果。 十二、调试过程 1.经分析错误是由于printf(%c%c, c1, c2)后未加;导致。 修改后运行如下: 2.成功运行 3.printf(%u, %un a, b);改成printf(%u, %un, a, b);成功运行 4. 成功运行。 十三、实验结果 1.2.3.4.十四、总结篇四:c程序实验报告 《程序设计综合训练》 第一部分 设 计 报 告 专 业: 软件工程 班 级: 12软件1 学 号: 12144131 姓 名: 陈 雷 指导教师: 钱 进、吕 萍 成 计算机工程学院 2013年3月 目 录 (1)题目名称、内容、来源(如2010年省计算机等级考试秋季上机试卷2)。 (2)解题的基本思路,(3)设计方案,功能模块框图与程序流程图等。 (4)算法设计:算法描述、实现方法、详细流程图等。 (5)源代码:主要模块的代码与注释。 (6)程序调试:调试过程与步骤,发现的问题,解决的办法等。 (7)测试:运行程序,输入测试数据,判断是否达到预期目的。测试数据要有 典型意义,要注意临界值的选取,注意测试数据的广泛性和普适性。第二部分 (1)题目名称、内容。 (2)解题的基本思路,(3)设计方案,功能模块框图与程序流程图等。 (4)算法设计:算法描述、实现方法、详细流程图等。 (5)程序调试:调试过程与步骤,发现的问题,解决的办法等。 (6)测试:运行程序,输入测试数据,判断是否达到预期目的。测试数据要有 典型意义,要注意临界值的选取,注意测试数据的广泛性和普适性。 (7)总结:收获与体会,有实际内容,忌空洞无物,忌千篇一律,400字左右。 (8)附录:源代码(含注释)。 第一部分 2010秋03等级考试 1.编写函数int noco(int n,int *a)。函数动能是验证是验证n的立方可表示为n个连续奇数之和,若找到这样的表示则将连续奇数按从小到大的顺序存放到a指向的数组中并且函数返回1,否则函数返回0。2.编写函数main。函数功能是声明数组a,分别用整数1~10及数组a作为实参调用函数noco,并将结果数据按以下屏幕输出所示形式输出到屏幕及文件myf2.out中。#include printf(%d^3=,n); } else { printf(false);} fprintf(fp,false);fprintf(fp,%d^3=,n);for(i=0;i } k=k-2;for(j=0;j 1.编写函数long find_m(int n)。函数功能是查找满足以下条件的整数m:(1)m是 n的整数倍;(2)m的十进制表示中仅由0和1组成。函数返回找到的m的值。2.编写main 函数。函数功能是声明变量n和m,输入一个整数到n中(n<100), 用n作实参调用函数find_m,将n及找到的整数m输出到屏幕及文件myf2.out.#include 一列(列下标为0)和第二列(列下标为1)的值按如下规则生成第3列各元素的值,再以行为单位重排a数组各行元素的值,使得所有行按第3列元素从小到大有序。 第3列生成规则: 用数组a作为实参调用cresort函数,将a数组中数据输出到屏幕及文件myf2.out.#include stdio.h #define n 5 int isprime(int m){ int i;} void cresort(int a[][3],int n){ int i,j,k,m,c,t;for(i=0;i switch(c){ case 0:a[i][2]=1;break;case 2:a[i][2]=4;break;for(i=2;i<=m/2;i++)if(m%i==0)return 0;return 1;篇五:c程序设计实验报告 《c语言程序设计》实验报告 学号 不告诉你哦~ 班级 信管一班 姓名 你猜猜~哈哈 一、实验题目 一、编程实验 猜数问题:输入两个整数,并求这两个整数的和,输入所猜的结果,如果输入数比正确的结果要大,提示“猜大了”;如果输入数比正确的结果要小,提示“猜小了”;当猜对结果时提示“猜对了”,结束游戏(用函数调用方式编程)。 二、程序改错实验 输入一个数字 b,求sum=b+bb+bbb+„,改正下列程序中的错误。#include “stdio.h” main(){ int i,j;long int b,sum,temp;scanf(“%d”,&b);do { i++;for(j=0;j<=i;j++)temp+=(long int)pow(10,j-1)*b;sum+=temp;} while(i<=3)printf(“sum=%d”,sum);} 三、编程实验 编写两个矩阵相加减的程序,两矩阵的行列数均由用户输入(两矩阵的行列数要限制最大值),在屏幕上分行列打印出结果(矩阵元素为整型变量)。 解析:两个矩阵可以定义两个二维数组matrixl[m][n],matrix2[m][n]存放,用二重循环进行输入输出或实现对应元素的相加或相减运算,相加后矩阵元素存放在matrixl中,相减后矩阵元素存放在matrix2中(上机实验时输入矩阵的行数m=10, 矩阵的列数n=10)。 #include void delay_100ms(unsigned int t){ unsigned char i,j,k;for(i=t;i>0;i--){ for(j=200;j>0;j--); { for(k=248;k>0;k--); } } } void beep(){ BEEP=1; delay_100ms(100); BEEP=0; } void T0_int()interrupt 1 { static unsigned char count;unsigned char a=1;count++; TH0=(65536-50000)/256; TL0=(65536-50000)%256;if(count==20){ count=0; P0=TAB[pulse_number1--]; } beep(); if(pulse_number1==0) { P0=TAB[0]; TR0=0; while(a) { beep();if(!key5)a=0; } } } void main(){ bit flag; temp=0x00; P2=temp; P0=0x3f; TMOD=0x01; TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;EA=1; TR0=1; while(!flag) { } while(flag);} if(!key1){P0=0x06;beep();flag=1;TR0=0;} else if(!key2){P0=0x5b;beep();flag=1;TR0=0;} else if(!key3){P0=0X4f;beep();flag=1;TR0=0;} else if(!key4){P0=0x66;beep();flag=1;TR0=0;}第三篇:4路抢答器设计程序
第四篇:C程序实验报告
第五篇:51单片机四路抢答器程序