超声波测距C语言源程序代码

超声波测距C语言源程序代码
超声波测距C语言源程序代码

/*{HZ即单位s的倒数}本晶振为12MHZ,因此外部的时钟频率为12MHZ,所以内部的时钟频率为(12MHZ)/12=1MH

即1000000HZ,而机械频率为1/(1MHZ),即每完成一次计算(即定时器的值加一)用时0.000001s, 即1us(微秒).*/

/****************************************************************************** *****/

//具有模式选择.

#include

#define UC unsigned char

#define UI unsigned int

void delay(UI); //延时9.56us程序

sbit beep = P1^3; //用于声音报警

sbit Lv = P1^7; //用于光报警

sbit Hong = P1^6;

sbit QD = P3^7;//K8 //P3^7口(K8)为确定键,

sbit GX = P3^1;//K7 //P3^3口(K2)为修改键,

sbit SX = P3^6;//K6 //P3^2(K3)为测量键.

sbit BX = P3^0;//K5 //个(K7),十(K6),百(K5),三位修改键

sbit a = P1^2;//百位//数码管位选

sbit b = P1^1;//十位

sbit c = P1^0;//个位

sbit trig = P1^4; //方波发射端

sbit echo = P1^5; //超声波接收端

void IntConfiguration(); //用来"设置中断"的函数,P3^3口(K2)为修改键,P3^2(K3)为测量键.

void TimeConfiguration(); //用来"设置定时器"的函数

sbit K1 = P3^4;//动态

sbit K4 = P3^5;//静态//用于进行模式切换(K1、K4键)

void xiaxian(); //修改函数,用来修改下限

void shangxian(); //修改函数,用来修改上限

UI min[3]={0,5,0}; //报警极限,拆分为"百十个"三位

UI max[3]={3,0,0}; //MIN,MAX 用来存储最大和最小值

void MINxianshi(UI); //最小范围和最大范围的显示

void MAXxianshi(UI);

UC code CharacterCode[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//数码管数字字符(P2口)

/********************************主函数*********************************************/

void main()

{

TimeConfiguration(); //设置定时器0

IntConfiguration(); //设置中断允许,K4键为修改键,K8键为确定键

while(1)

{

MINxianshi(40); //1.50169000s

MAXxianshi(40); //1.50098300s

}

}

/*******************************超声波测距函数********************************************/

void zhongduan_0() interrupt 0 //测量中断函数(外部中断0)

{

UI moshi = 0;

UI juli = 0;

UI time = 0;

UI MAX, MIN;

UI TT = 0;//用于第一次测量时给P1^5口置一,以便正确读取数值

UI t1, t2, t3;

UI GE = 0, SHI = 0, BAI = 0; //先定义三个变量,用来显示测量的距离.

a = 0;

b = 0;

c = 0;

P2 =~ 0x00; //防止最后显示的那个数码管一直亮

MAX = max[0]*100 + max[1]*10 + max[2]; //计算最大与最小值

MIN = min[0]*100 + min[1]*10 + min[2];

while(1)//下面进行测量

{

while(1) /*先进行模式判断*/

{

if(0 == K1)

{

moshi = 1;

break; //模式1为动态测量

}

if(0 == K4)

{

moshi = 2;

break; //模式2为静态测量

}

if(0 == QD)

return; //结束测量函数

}

/********************************************计算距离************************************************/

loop: beep = 1;//关掉定时器

Lv = 1;

Hong = 1;//关掉灯

a = 0;

b = 0;

c = 0;

P2 =~ 0x00;//防止最后显示的那个数码管一直亮

if( (0 == QD)&&(1 == moshi) )

break;

if( (0 == QD)&&(2 == moshi) )

{

delay(55500);

if(0 == QD)

{

delay(55500);

if(0 == QD)

break;

}

}

t1 = 35,

t2 = 35;

t3 = 35;

trig = 0;

echo = 0;

delay(2); //初始化拉低两个端口

trig = 1;

delay(2);

trig = 0; //输出端输出27us的高电压,并将输出端口拉低

while(echo == 0); //判断是否有回波返回,有则开启定时器

TR0 = 1; //当有高电平输出时,开启定时器

while(echo == 1);

TR0 = 0; //当高电平变成低电平时,关闭定时器

++TT; //测量值加一,记录测量次数

if(1 == TT)

{

delay(55500);

TH0 = 0x00;TL0 = 0x00; //定时器的初值,定时器的定时为

65536us.

goto loop;

}

time = TL0 + TH0*256; //接下来显示测量的距离

TH0 = 0x00;TL0 = 0x00; //定时器的初值,定时器的定时为65536us.

juli = ( int )( (time*0.034)/2 );

BAI = ( (juli%1000)/100 ); SHI = ( (juli%100)/10 ); GE = ( juli%10 );

/******************************************两种模式的距离显示********************************************/

if(juli > MAX)

{

Hong = 0;

Lv = 1;

while( t1-- )

{

a = 0;

b = 1;

c = 1;

P2 =~ CharacterCode[BAI];

delay(400);

a = 1;

b = 0;

c = 1;

P2 =~ CharacterCode[SHI];

delay(400);

a = 1;

b = 1;

c = 0;

P2 =~ CharacterCode[GE];

delay(390);

beep = 0;

if( (1 == moshi)&&(0 == t1) )

goto loop;

if(moshi == 2)

{

t1 = 2;

if(0 == QD)

goto loop;

}

}

else if(juli < MIN)

{

Lv = 0;

Hong = 1;

while( t2-- )

{

a = 0;

b = 1;

c = 1;

P2 =~ CharacterCode[BAI];

delay(500);

a = 1;

b = 0;

c = 1;

P2 =~ CharacterCode[SHI];

delay(500);

a = 1;

b = 1;

c = 0;

P2 =~ CharacterCode[GE];

delay(400);

beep = 0;

delay(100);

beep = 1;

if( (1 == moshi)&&(0 == t2) )

goto loop;

if(2 == moshi)

{

t2 = 2;

if(0 == QD)

goto loop;

}

}

}

else

{

beep = 1;

Hong = 1;

while( t3-- )

{

a = 0;

b = 1;

c = 1;

P2 =~ CharacterCode[BAI];

delay(600);

a = 1;

b = 0;

c = 1;

P2 =~ CharacterCode[SHI];

delay(600);

a = 1;

b = 1;

c = 0;

P2 =~ CharacterCode[GE];

delay(600);

if( (1 == moshi)&&(0 == t3) )

goto loop;

if(2 == moshi)

{

t3 = 2;

if(0 == QD)

goto loop;

}

}

}//显示结束

}

}

/****************************************************************************** *****/

void zhongduan_1() interrupt 1 //定时器溢出时的中断,显示测得的距离(定时器中断0) {

TH0 = 0x00;//定时器的初值,定时器的定时为65536us,

TL0 = 0x00;

}

/****************************************************************************** *****/

void zhongduan_2() interrupt 2 //修改键(K4)的中断函数(外部中断1)

{

xiaxian();

while(QD==0);

shangxian();

}

/****************************************************************************** ****/

void MINxianshi(UI TT) //显示最小距离

{

while(TT--)

{

a = 0;

b = 1;

c = 1;

P2 =~ CharacterCode[min[0]];

delay(500);

a = 1;

b = 0;

c = 1;

P2 =~ CharacterCode[min[1]];

delay(500);

a = 1;

b = 1;

c = 0;

P2 =~ CharacterCode[min[2]];

delay(500);

}

P2 =~ 0x00;

delay(55500);

}

void MAXxianshi(UI TT) //显示最大距离

{

while(TT--)

{

a = 0;

b = 1;

c = 1;

P2 =~ CharacterCode[max[0]];

delay(500);

a = 1;

b = 0;

c = 1;

P2 =~ CharacterCode[max[1]];

delay(500);

a = 1;

b = 1;

c = 0;

P2 =~ CharacterCode[max[2]];

delay(500);

}

P2 =~ 0x00;

delay(55500);

}

/****************************************************************************** *****/

void delay(UI T) //延时程序

{

while(T--);

}

/****************************************************************************** *****/

void IntConfiguration() //设置中断函数

{

//优先级设置

PT2 = 0;

PS = 0;

PT1 = 0;

PX1 = 0;

PT0 = 1;

PX0 = 0;

IT1 = 1; //外部中断0为跳变沿触发

EX1 = 1; //P3^3口(K4键)修改键,中断允许开启

IT0 = 1; //外部中断1为跳变沿触发

EX0 = 1; //P3^2口(K1键)测量键,中断允许开启

ET0 = 1; //定时器0的中断允许开启

EA = 1;

}

void TimeConfiguration() //设置定时器,以及定时器的初值

{

TMOD = 0x01;//设定只使用0号定时器; 模式:定时器; 工作方式:1号工作方式.

//下面是定时器的初始值, TR0,TR1是用来开启定时器的

TH0 = 0x00;//定时器的初值,定时器的定时为50us.

TL0 = 0x00;

/*1号定时器不用,所以没有TH1,TL1*/

}

/****************************************************************************** *****/

void xiaxian() //修改下限

{

while(1)

{

if(BX==0)//百位

{

P2=~0x00;

min[0]++;

if(min[0]==10)

min[0]=0;

delay(60000);

}

a = 0;

b = 1;

c = 1;

P2 =~ CharacterCode[min[0]];

delay(100);

if(SX==0)//十位

{

P2=~0x00;

min[1]++;

if(min[1]==10)

min[1]=0;

delay(60000);

}

a = 1;

b = 0;

c = 1;

P2 =~ CharacterCode[min[1]];

delay(100);

if(GX==0)//个位

{

P2=~0x00;

min[2]++;

if(min[2]==10)

min[2]=0;

delay(60000);

}

b = 1;

c = 0;

P2 =~ CharacterCode[min[2]];

delay(100);

if(QD==0)

{

a = 0;

b = 0;

c = 0;

P2 = 0xff;

break;

}

}

}

void shangxian() //修改上限{

while(1)

{

if(BX==0)//百位

{

P2=~0x00;

max[0]++;

if(max[0]==10)

max[0]=0;

delay(60000);

}

a = 0;

b = 1;

c = 1;

P2 =~ CharacterCode[max[0]];

delay(100);

if(SX==0)//十位

{

P2=~0x00;

max[1]++;

if(max[1]==10)

max[1]=0;

delay(60000);

}

a = 1;

b = 0;

P2 =~ CharacterCode[max[1]];

delay(100);

if(GX==0)//个位

{

P2=~0x00;

max[2]++;

if(max[2]==10)

max[2]=0;

delay(60000);

}

a = 1;

b = 1;

c = 0;

P2 =~ CharacterCode[max[2]];

delay(100);

if(QD == 0)

{

a = 0;

b = 0;

c = 0;

P2 = 0xff;

while(QD == 0);

break;

}

}

}

/****************************************************************************** ******/

51单片机超声波测距程序

//晶振:11.0592 //TRIG:P1.2 ECH0:P1.1 //波特率:9600 #include #include #include #define uchar unsigned char #define uint unsigned int sbit RX=P0^2; sbit TX=P0^3; unsigned int time=0; unsigned int timer=0; float S=0; bit flag =0; void Conut(void) { time=TH0*256+TL0; TH0=0; TL0=0; S=(time*1.87)/100; //算出来是CM if(flag==1) //超出测量 { flag=0; printf("-----\n"); } printf("S=%f\n",S); } void delayms(unsigned int ms) { unsigned char i=100,j; for(;ms;ms--) { while(--i)

{ j=10; while(--j); } } } void zd0() interrupt 1 //T0中断用来计数器溢出,超出测距范围{ flag=1; //中断溢出标志 } void StartModule() //T1中断用来扫描数码管和计800ms启动模块{ TX=1; //800MS启动一次模块 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0; } void main(void) { TMOD=0x21; //设T0为方式1,GATE=1; SCON=0x50; TH1=0xFD; TL1=0xFD; TH0=0; TL0=0;

C语言程序设计第三版谭浩强课后习题答案完整版

1.6 编写一个程序,输入a、b、c 三个值,输出其中最大值。 课后习题答案完整版 第一章 1.5 请参照本章例题,编写一个C 程序,输出以下信息: ************************** Very Good! ************************** 解:mian() {int a,b,c,max; printf( “请输入三个数a,b,c:\n ” ); scanf( “%d,%d,%”d ,&a,&b,&c); C语言程序设计第三版谭浩强 解: mian() {printf( ”); “************************** printf( “”X “ n” ); printf( “Very Good!” \ n”); printf( “”X “ n” ); printf( “************************** ); max=a; if(max

{char #include c1='a',c2='b',c3= 'c',c4= ' \101 ',c5= ' 116'; printf( “a%cb%c n”,c1,c2,c 3); printf( “ b%c %c” ,c4,c5); } 解: aa 口bb 口口口cc 口口口口口口abc A 口N 3.7 要将"China" 译成密码,译码规律是:用原来字母后面的第 4 个字母代替原来的字母.例如,字母"A" 后面第 4 个字母是"E" . "E"代替"A"。因此,"China"应译为"Glmre" 。请编一程序,用赋初值的方法使cl 、c2、c3、c4、c5 五个变量的值分别为, ' C'、h'、i '、n'、a'经过运算,使cl、c2、c3、c4、c5分别变为'G'、' I '、' m >' r'、’ e',并输出。main() { char c1=' C' ,c2=' h' ,c3= ' i ' ,c4= ' n' ,c 5=' a' ; c1+=4; c2+=4; c3+=4; c4+=4; c5+=4; printf(" 密码是%c%c%c%c%c\n",c1,c2,c3,c4,c5); } 运行结果: 密码是GImre 3.9 求下面算术表达式的值。 解: 1 )x+a%3*(int)(x+y)%2/4

C语言程序设计习题答案(1-5章)

C 语言程序设计习题答案 习题一 C 语言程序设计概述 一、名词解释 (1)程序P1 (2)程序设计P1 (3)机器语言P1 (4)汇编程序P2 (5)高级语言P2 (6)编译程序P3 (7)解释程序P3 (8)算法P4 (9)结构化的程序设计P9 二、简述题 1. 设计程序时应遵循哪些基本原则?P4 答:正确性、可靠性、简明性、有效性、可维护性、可移植性。 2. 算法的要素是什么?算法具有哪些特点? 答:算法的要素是:操作与控制结构;算法的特点有:有穷性、确定性、有效性、有零个或多个输入、有一个或多个输出。 3. 算法的表示形式有哪几种? 答:算法的表示形式有:自然语言、传统流程图、伪代码、结构化的流程图(N_S 流程图,盒图)。 4. 有哪三种基本结构? 答:三种基本结构是:顺序结构、选择结构和循环结构。 5. 传统流程图与N-S 流程图最大的区别是什么? 答:N-S 流程图去掉了在传统流程图中常用的流程线,使得程序的结构显得更加清晰、简单。 三、用传统流程图、N-S 图分别表示求解以下问题的算法。 1. 有3个数a ,b ,c ,要求按由大到小的顺序把它们输出。 2. 依次将10个数输入,求出其中最大的数 和最小的数并输出。 3. 求1+2+3+…+100的值。 4. 求1×2×3×…×10的值。

5. 求下列分段函数的值。 6. 求100~200之间的所有素数。 7. 求一元二次方程ax 2+bx+c=0的根。分别考虑d=b 2-4ac 大于0、等于0和小于0三种情况。 四、注释下面C 程序的各个组成部分。 main() /*主函数 */ { /*程序开始 */ int a,k,m; /*定义三个用来存放整数的变量 */ a=10; /*将整数10赋值给变量a */ k=2; /*将整数2赋值给变量k */ m=1; /*将整数1赋值给变量1 */ a=(k+m)*k/(k-m); /*先求出算术表达式的值,并将其赋值给变量a */ printf("%d\n",a); /*在屏幕上打印出变量a 的值 */ } /*程序结束 */ 习题二 数据类型、运算符与表达式 一、选择题 1~10:BCDCB DDBCA 11~20: ADDAA DBADC 21~28: DABAD CDD 3X (X<1) 4X-1 (X=1) 5(X-1)+6 (1

超声波测距程序(详细C语言数码管显示)

超声波测距程序(详细C语言数码管显示) #include //头文件 #include// _nop_() 函数延时1US用 #include #include #define uchar unsigned char #define uint unsigned int #define nop _nop_() sbit csb=P1^0;//超声波发送端口为P1.0 sbit bai=P2^2;//数码管百位 sbit shi=P2^1;//数码管十位 sbit ge=P2^0;//数码管个位 uchar flag;//超声波接收标志 float juli1;//距离变量,用来数码管显示用 int juli; uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管0到9的代码 int xianshi[3]; void delayshow(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void ledshow(void) { xianshi[0]=juli/100; xianshi[1]=((juli%100)/10); xianshi[2]=juli%10; bai=0; P0=table[xianshi[0]]; delayshow(2); bai=1; delayshow(2); shi=0; P0=table[xianshi[1]]; delayshow(2); shi=1;

C语言程序设计第三版习题库答案

C 语言程序设计(第三版)习题库 1、设圆半径r=,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf 输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字。请编程序。 #include<> main(){ floatr,h,C1,Sa,Sb,Va,Vb; scanf(__”%f ”__,&r); scanf(”%d ”,__&h _);; C1=2**r; Sa=*r*r; Sb=4*Sa; Va=4**r*r*r/3; Vb=Sa*h; printf(___”Cl=%.2fSa=%.2fSb=%.2fVa=%.2fVb=%.2f ”,Cl,Sa,Sb,Va,Vb ); } 2、输入一个华氏温度,要求输出摄氏温度。公式为c=5(F-32)/9 输出要求有文字说明,取位2小数。 #include<> main(){ floatF,c; scanf("%f",&F); ____c=5*(F-32)/9______; printf("c=%.2f",c); } 3、有一函数:?? ???≥-<≤-<=10113101121x x x x x x y 写一程序,输入x 值,输出y 值。 #include<> main(){ intx,y; printf("输入x :"); scanf("%d",&x); if(x<1){/*x<1*/ y=x; printf("x=%3d,y=x=%d\n",x,y);

}elseif(____x<10_______){/*1≤x-10*/ _____y=2*x-1_______; printf("x=%3d,y=2*x-1=%d\n",x,y); }else{/*x≥10*/ y=3*x-11; printf("x=%3d,y=3*x-11=%d\n",x#include"" main() { intx,y; scanf("%d",&x); if(x<1) {y=x;} elseif(x>=1&&x<10) {y=2*x-1;} else {y=3*x-11;} printf("%d",y); }#include"" main() { intx,y; scanf("%d",&x); if(x<1) {y=x;} elseif(x>=1&&x<10) {y=2*x-1;} else {y=3*x-11;} printf("%d\n",y); }#include"" main() { intx,y; scanf("%d",&x); if(x<1) {y=x;} elseif(x>=1&&x<10) {y=2*x-1;} else {y=3*x-11;} printf("%d",y); }scanf("%d",&x);

C语言实用程序设计100例流程图

C语言实用程序100例 第一篇基础与提高 实例1利用库函数编写基本显示程序 实例2变量属性 实例3运算符与类型 实例4关于程序结构 实例5显示函数曲线图 实例6二分法选代的应用 实例7多变的立方体 实例8一维整型数组应用(1) 实例9一维整型数组应用(2) 实例10一维整型数组应用(3) 实例11一维整型数组应用(4) 实例12二维数组应用(1)——显示杨辉三角实例13二维数组应用(2)——魔方阵 实例14字符数组应用(1)——逻辑判断 实例15字符数组应用(2)——数据模拟 实例16二维数组应用——字符比较 实例17利用指针进行数据处理 实例18指针与字符串 实例19利用指针处理二维数组 实例20一级指针 实例21利用指针传递参数值 实例22结构体的应用 实例23链表的应用(1)

实例24链表的应用(2) 实例25链表的应用(3) 实例26共用体的应用 实例27枚举类型应用 实例28位运算 买例29义件加密 实例30文件的按记录随机读写 第二篇图形与多媒体 实例31改变文字背景色 实例32及本颜色设置 实例33制作表格 实例34制作多样的椭圆 实例35美丽的透视图形 实例36错位窗口 实例37能移动的矩形 实例38多变的填充矩形 实例39黄黑相间的矩形与圆 实例40六叶图案 实例41特殊图案 实例42国际象棋棋盘 实例43制作楼梯 实例44使用线类型函数设置多个汉字实例45彩色群点 实例46饼图 买例47产品折线图 实例48直方图 实例49变大变色的拒形与国

实例50多变的填充多边形 实例51流星球 实例52小球动态碰撞 买倒53多,曲线 实例54多变的圆与环 实例55优美的球体 实例56运动的小车 实例57统计动画消失次数 实例58运行的时钟 实例59直升飞机 实例60演绎“生命游戏” 实例61猜猜看 买例62艺术清屏 买倒63制作火焰 实例64动态绘制256条不同颜色的直线实例65红绿蓝三原色渐变 第三篇综合小程序 实例66两个矩阵相乘 实例67艺术钟 实例68家庭财务管理小程序 实例69用系统时间实现随机数 实例70闪动的多彩圆 实例71检查系统有无鼠标 实例72圆形光盘与矩形 实例73动态渐变图案 实例74往返两地间的小车 实例75飘扬的红旗

超声波测距仪单片机课设实验资料报告材料

微机原理与单片机系统课程设计 业:专轨道交通信号与控制 级:班1305 交控

姓名:贺云鹏 学号: 201310104 指导教师:建国 交通大学自动化与电气工程学院 30 日 12 2015 年月 超声波测距仪设计设计说明1 设计目的1.1 测量声波在发超声波测距的原理是利用超声波在空气中的传播速度为已知,根据发射和接收的时间差计算出发射点到障碍射后遇到障碍物反射回来的时间,物的实际距离。超声波测距主要应用于倒车提醒、建筑工地、工业现场等的距离测量。 超声波在气体、液体及固体中以不同速度传播,定向性好、能量集中、传输过程中衰减较小、反射能力较强。超声波能以一定速度定向传播、遇障碍物后形成反射,利用这一特性,通过测定超声波往返所用时间就可计算出实际距离,从而实现无接触测量物体距离。超声波测距迅速、方便,且不受光线等因素影响,广泛应用于水文液位测量、建筑施工工地的测量、现场的位置监控、振动仪车辆倒车障碍物的检测、移动机器入探测定位等领域。 1.2 设计方法 本课题包括数据测距模块、显示模块。测距模块包括一个HC-SR04超声波测距模块和一片AT89C51单片机,该设计选用HC-SR04超声波测距模块,通过单片机对超声波进行计时并根据超AT89C51发射和接受超声波,使用HC-SR04.声波在空气中速度为340米每秒的特性计算出距离。显示模块包括一个4位共阳极LED数码管和AT89C51单片机,由AT89C51单片机控制数码管动态显示距离。 1.3 设计要求 采用单片机为核心部件,选用超声波模组,实现对距离的测量,测量距离能够通过显示输出(LED,LCD)。 2 设计方案及原理 2.1超声波测距模块设计

超声波C语言程序

超声波测距C程序#include #include"MAX485.h" #define uint unsigned int #define uchar unsigned char long int time,l; /* 时间*/ bit CLflag; /* 测量标志*/ sbit Trig=P2^0; /* 发射*/ sbit Echo=P3^2; /* 外部中断0检测接收信号*/ #define ss=0.344 char number[4]; /* 存储数据*/ /*********************延时函数****************************/ void delay1( int j ) { int i; for(i=0;i

基于单片机的超声波测距系统实验报告

基于单片机的超声波测距系统实验报告

一、实验目的 1.了解超声波测距原理; 2.根据超声波测距原理,设计超声波测距器的硬件结构电路; 3.对设计的电路进行分析能够产生超声波,实现超声波的发送与接收,从而实现利用 超声波方法测量物体间的距离; 4.以数字的形式显示所测量的距离; 5.用蜂鸣器和发光二极管实现报警功能。 二、实验容 1.认真研究有关理论知识并大量查阅相关资料,确定系统的总体设计方案,设计出系 统框图; 2.决定各项参数所需要的硬件设施,完成电路的理论分析和电路模型构造。 3.对各单元模块进行调试与验证; 4.对单元模块进行整合,整体调试; 5.完成原理图设计和硬件制作; 6.编写程序和整体调试电路; 7.写出实验报告并交于老师验收。 三、实验原理 超声波测距是通过不断检测超声波发射后遇到障碍物所反射的回波,从而测出发射和接收回波的时间差t,然后求出距S=Ct/2,式中的C为超声波波速。由于超声波也是一种声波,其声速C与温度有关。在使用时,如果温度变化不大,则可认为声速是基本不变的。如果测距精度要求很高,则应通过温度补偿的方法加以校正。声速确定后,只要测得超声波往返的时间,即可求得距离。这就是超声波测距仪的机理,单片机(AT89C51)发出短暂的40kHz信号,经放大后通过超声波换能器输出;反射后的超声波经超声波换能器作为系统的输入,锁相环对此信号锁定,产生锁定信号启动单片机中断程序,得出时间t,再由系统软件对其进行计算、判别后,相应的计算结果被送至LED显示电路进行显示。 (一)超声波模块原理: 超声波模块采用现成的HC-SR04超声波模块,该模块可提供 2cm-400cm 的非接触式距离感测功能,测距精度可达高到 3mm。模块包括超声波发射器、接收器与控制电路。基本工作原理:采用 IO 口 TRIG 触发测距,给至少 10us 的高电平信号;模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2。实物如下图1。其中VCC 供5V 电源,GND 为地线,TRIG 触发控制信号输入,ECHO 回响信号输出等四支线。

超声波测距C语言源程序代码

超声波测距C语言源程 序代码 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

/*{HZ即单位s的倒数}本晶振为12MHZ,因此外部的时钟频率为12MHZ,所以内部的时钟频率为(12M H Z)/12=1M H 即1000000HZ,而机械频率为1/(1MHZ),即每完成一次计算(即定时器的值加一)用时, 即1us(微秒).*/ /*************************************************************************** ********/ #include<> #define UC unsigned char #define UI unsigned int void delay(UI); sbit BX = P3^0;void TimeConfiguration(); a = 0; b = 0; c = 0; P2 =~ 0x00; goto loop; } time = TL0 + TH0*256; juli = ( int )( (time*/2 ); BAI = ( (juli%1000)/100 ); SHI = ( (juli%100)/10 ); GE = ( juli%10 ); /******************************************两种模式的距离显示 ********************************************/ if(juli > MAX) { Hong = 0; Lv = 1; while( t1-- ) { a = 0; b = 1; c = 1; P2 =~ CharacterCode[BAI]; delay(400); a = 1; b = 0; c = 1; P2 =~ CharacterCode[SHI]; delay(400); a = 1; b = 1; c = 0; P2 =~ CharacterCode[GE]; delay(390);

C语言程序设计教程第三版(李凤霞)习题答案

教材习题答案 第一章 习题 一、单项选择题 1. C 2. B 3. B 4. C 5. D 6. A 7. C 8. A 二、填空题 1. 判断条件 2. 面向过程编程 3. 结构化 4. 程序 5. 面向对象的程序设计语言 6. 基本功能操作、控制结构 7. 有穷性 8. 直到型循环结构 9. 算法 10.可读性 11.模块化 12.对问题的分解和模块的划分

习题 一、单项选择题 1. B 2. D 3. C 4. B 5. A 6. A 7. B 8.C 二、填空题 1. 主 2. C编译系统 3. 函数、函数 4. 输入输出 5. 头 6. .OBJ 7. 库函数 8. 文本 第三章 习题 一、单项选择题 1. D 2. B 3. A

5. C 6. D 7. D 8. B 9. B 10.C 11.A 12.D 13.C 14.C 15.C 16.A 17.C 18.C 19.C 20.D 21.A 22.D 23.D 24.D,A 25.D 26.A 27.B 二、填空题 1. 补码 2. 308 10 - ±

~)308 10 ,15 —6 2. 308 10 - ± (~)308 10 ,15

6 3. 逻辑 4. 单目,自右向左 5. 函数调用 6. a 或 b ( 题目有错 , 小括号后面的 c<=98 改成( c>=97&&c<=98 )就可以得到所给的答案了) 7.

8. 65 , 89 第四章 习题 一、单项选择题 1. D 2. C 3. D 4. A 5. D 6. B 7. A 8. C 9. B 10.B 二、填空题 1. 一

C语言程序设计课程设计报告

《C语言程序设计》课程设计报告 (2013— 2014学年第 3 学期) 题目:C语言课程设计 专业:软件工程 班级:软件工程技术2班 姓名学号: 1 林燕萍 指导教师:吴芸 成绩: 计算机科学与技术系 2014 年6月23日

目录 一、课程设计的目的与要求 (1) 二、方案实现与调试 (3) 掷骰子游戏 (5) 射击游戏 (7) 计算存款本息之和 (8) 肇事逃逸 (10) 礼炮 (12) 汽车加油 (14) 大优惠 (16) 金币 (19) 三、课程设计分析与总结 (23) 附录程序清单 (25) 一、课程设计的目的与要求(含设计指标) C语言是一种编程灵活,特色鲜明的程序设计语言。C语言除了基知识,如概念,方法和语法规则之外更重要的是进行实训,以提高学习者的动手和编程能力,从应试课程转变为实践工具。 这是学习语言的最终目的。结合多年来的教学经验,根据学生的学习情况,为配合教学过程,使“项目教学法”能在本质上促使学生有更大进步,特编写了该《C语言程序设计任务书》,以在实训过程中给学生提供帮助。达到如下目的: 1.在课程结束之前,让学生进一步了解C程序设计语言的编程功能; 2.让学生扎实掌握C程序设计语言的相关知识; 3.通过一些有实际意义的程序设计,使学生体会到学以致用,并能将程序设计的知识与专业知识有效地结合,更全面系统地了解行业知识。 编写程序要求遵循如下基本要求: ①模块化程序设计 ②锯齿型书写格式

③必须上机调试通过 二、方案实现与调试 掷骰子游戏 2.1.1 题目内容的描述 1) 两人轮流掷骰子,每次掷两个,每人最多掷10次。 2) 将每人每次的分值累加计分 3) 当两个骰子点数都为6时,计8分;当两个点数相等且不为两个6时,计7分;当两个点数不一样时,计其中点数较小的骰子的点数。 4) 结束条件:当双方都掷10次或经过5次后一方累计分数多出另一方的30%及以上。最后显示双方分数并判定优胜者。 2.1.2输入数据类型、格式和内容限制和输出数据的说明 数据类型:整型;内容限制:随机数的产生;输入数据结果:胜利的一方 2.1.3主要模块的算法描述 本算法的思路过程:首先要随机产生随机数,然后进行算法输出数值,执行条件判断输入结果,最后比较结果,判断胜利的一方。 程序流程图 图1 掷骰子游戏 调试过程及实验结果

基于51单片机的超声波测距系统

基于51单片机的超声波测距系统 贾源 完成日期:2011年2月22日

目录 一、设计任务和性能指标 (3) 1.1设计任务 (3) 1.2性能指标 (3) 二、超声波测距原理概述 (4) 2.1超声波传感器 (5) 2.1.1超声波发生器 (5) 2.1.2压电式超声波发生器原理 (5) 2.1.3单片机超声波测距系统构成 (5) 三、设计方案 (6) 3.1AT89C2051单片机 (7) 3.2超声波测距系统构成 (8) 3.2.1超声波测距单片机系统 (9) 图3-1:超声波测距单片机系统 (9) 3.2.2超声波发射、接收电路 (9) 图3-1:超声波测距发送接收单元 (10) 3.2.3显示电路 (10) 四.系统软件设计 (11) 4.1主程序设计 (11) 4.2超声波测距子程序 (12) 4.3超声波测距程序流程图 (13) 4.4超声波测距程子序流程图 (14) 五.调试及性能分析 (14) 5.1调试步骤 (14) 5.2性能分析 (15) 六.心得体会 (15) 参考文献 (16) 附录一超声波测系统原理图 (18) 附录二超声波测系统原理图安装图 (19) 附录三超声波测系统原理图PCB图 (20) 附录四超声波测系统原理图C语言原程序 (21) 参考文献 (26)

一、设计任务和性能指标 1.1设计任务 利用单片机及外围接口电路(键盘接口和显示接口电路)设计制作一个超声波测距仪器,用LED数码管把测距仪距测出的距离显示出来。 要求用Protel 画出系统的电路原理图,印刷电路板,绘出程序流程图,并给出程序清单。 1.2性能指标 距离显示:用三位LED数码管进行显示(单位是CM)。 测距范围:25CM到 250CM之间。误差:1%。

具有实时语音播报功能的超声波测距仪(C程序)

#include //调用单片机头文件 #define uchar unsigned char //无符号字符型宏定义变量范围0~255 #define uint unsigned int //无符号整型宏定义变量范围0~65535 #include //数码管段选定义0 1 2 3 4 5 6 7 8 9 uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //断码 //数码管位选定义 uchar code smg_we[]={0xe0,0xd0,0xb0,0x70}; uchar dis_smg[8] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8}; sbit smg_we1 = P3^4; //数码管位选定义 sbit smg_we2 = P3^5; sbit smg_we3 = P3^6; sbit smg_we4 = P3^7; sbit c_send = P3^2; //超声波发射 sbit c_recive = P3^3; //超声波接收 uchar smg_i = 3; //显示数码管的个位数 bit flag_300ms ; long distance; //距离 uint set_d; //距离 uchar flag_csb_juli; //超声波超出量程 uint flag_time0; //用来保存定时器0的时候的 /***********************语音模块控制IO口的定义************************/ sbit VRST = P2^3; sbit VBUSY= P2^7; sbit VSDA = P2^6; sbit VCS = P2^5; sbit VSCL = P2^4; uchar yujing[3]; /*************************** 语音地址的安排 0 - 9 :对应数字0到9 0b : 点 0c : 米 0d : 已超出量程

C语言程序设计第三版谭浩强课后习题答案完整版

C语言程序设计第三版谭浩强 课后习题答案完整版 第一章 1.5请参照本章例题,编写一个C程序,输出以下信息:************************** V ery Good! ************************** 解: mian() {printf(“**************************”); printf(“\n”); printf(“V ery Good!\n”); printf(“\n”); printf(“**************************”); } 1.6 编写一个程序,输入a、b、c三个值,输出其中最大值。解: mian() {int a,b,c,max; printf(“请输入三个数a,b,c:\n”); scanf(“%d,%d,%d”,&a,&b,&c); max=a; if(max main() { char c1=?C?,c2=?h?,c3=?i?,c4=?n?,c5=?a?; c1+=4; c2+=4; c3+=4; c4+=4; c5+=4; printf("密码是%c%c%c%c%c\n",c1,c2,c3,c4,c5); } 运行结果: 密码是Glmre 3.9求下面算术表达式的值。 (1)x+a%3*(int)(x+y)%2/4 设x=2.5,a=7,y=4.7 (2)(float)(a+b)/2+(int)x%(int)y 设a=2,b=3,x=3.5,y=2.5 (1)2.5 (2)3.5 3.10写出程序运行的结果。 main() {int i,j,m,n; i=8; j=10; m=++i; n=j++; printf(“%d,%d,%d,%d”,i,j,m,n); } 解: 9,11,9,10 3.12 写出下面表达式运算后a的值,设原来a=12。设a和n都已定义为整型变量。 (1)a+=a (2)a-=2 (3)a*=2+3 (4)a/=a+a (5)a%=(n%=2),n的值等于5 (6)a+=a-=a*=a 解: (1) 24 (2) 10 (3) 60 (4) 0 (5) 0 (6) 0 第四章 4.4若a=3,b=4,c=5,x=1.2,y=2.4,z=-3.6,u=51274,n=128765,c1=’a’,c2=’b’。想得到以下输出格式和结果,请写出程序(包括定义变量类型和设计输出)。 a=_3_ _b=_4_ _c=_5 x=1.200000,y=2.400000,z=-3.600000 x+y=_3.600_ _y+z=-1.20_ _z+x=-2.40 c1=ˊaˊ_or_97(ASCII)

用51单片机实现HC-SR04超声波测距程序

#include //包括一个52标准内核的头文件 #define uchar unsigned char //定义一下方便使用 #define uint unsigned int #define ulong unsigned long sbit Trig = P1^0; //产生脉冲引脚 sbit Echo = P3^2; //回波引脚 sbit test = P1^1; //测试用引脚 uchar code SEG7[10]={~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x90};//数码管0-9 uint distance[4]; //测距接收缓冲区 uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定义寄存器 bit succeed_flag; //测量成功标志 //********函数声明 void conversion(uint temp_data); void delay_20us(); void main(void) // 主程序 { uint distance_data,a,b; uchar CONT_1; i=0; flag=0; test =0; Trig=0; //首先拉低脉冲输入引脚 TMOD=0x11; //定时器0,定时器1,16位工作方式 TR0=1; //启动定时器0 IT0=0; //由高电平变低电平,触发外部中断 ET0=1; //打开定时器0中断 EX0=0; //关闭外部中断 EA=1; //打开总中断0 while(1) //程序循环 { EA=0; Trig=1; delay_20us(); Trig=0; //产生一个20us的脉冲,在Trig引脚 while(Echo==0); //等待Echo回波引脚变高电平 succeed_flag=0; //清测量成功标志 EX0=1; //打开外部中断 TH1=0; //定时器1清零 TL1=0; //定时器1清零 TF1=0; //

c语言程序设计流程图详解

c语言程序设计流程图详解 介绍常见的流程图符号及流程图的例子。 本章例1-1的算法的流程图如图1-2所示。本章例1-2的算法的流程图如图1-3所示。 在流程图中,判断框左边的流程线表示判断条件为真时的流程,右边的流程线表示条件为假时的流程,有时就在其左、右流程线的上方分别标注“真”、“假”或“T、”“F或”“Y、”“N”注“真”、“假”或“T、”“F或”“Y、”“N”

另外还规定,流程线是从下往上或从右向左时,必须带箭头,除此以外,都不画箭头,流程线的走向总是从上向下或从左向右。 2.算法的结构化描述 早期的非结构化语言中都有goto语句,它允许程序从一个地方直接跳转到另一个地方去。 执行这样做的好处是程序设计十分方便灵活,减少了人工复杂度,但其缺点也是十分突出的,一大堆跳转语句使得程序的流程十分复杂紊乱,难以看懂也难以验证程序的正确性,如果有错,排起错来更是十分困难。这种转来转去的流程图所表达的混乱与复杂,正是软件危机中程序人员处境的一个生动写照。而结构化程序设计,就是要把这团乱麻理清。 经过研究,人们发现,任何复杂的算法,都可以由顺序结构、选择(分支)结构和循环结构这三种基本结构组成,因此,我们构造一个算法的时候,也仅以这三种基本结构作为“建筑 单元”,遵守三种基本结构的规范,基本结构之间可以并列、可以相互包含,但不允许交叉,不允许从一个结构直接转到另一个结构的内部去。正因为整个算法都是由三种基本结构组成的,就像用模块构建的一样,所以结构清晰,易于正确性验证,易于纠错,这种方法,就是结构化方法。遵循这种方法的程序设计,就是结构化程序设计。 相应地,只要规定好三种基本结构的流程图的画法,就可以画出任何算法的流程图。 (1)顺序结构 顺序结构是简单的线性结构,各框按顺序执行。其流程图的基本形态如图1-4所示,语句 的执行顺序为:A→B→C。 (2)选择(分支)结构 这种结构是对某个给定条件进行判断,条件为真或假时分别执行不同的框的内容。其基本形状有两种,如图1-5a)、b)所示。图1-5a)的执行序列为:当条件为真时执行A,否则执 行B;图1-5b)的执行序列为:当条件为真时执行A,否则什么也不做。 (3)循环结构 循环结构有两种基本形态:while型循环和do-while型循环。 a.while型循环 如图1-6所示。 其执行序列为:当条件为真时,反复执行A,一旦条件为假,跳出循环,执行循环紧后的语句。 b.do-while型循环 如图1-7所示。

超声波测距C语言源程序代码

/*{HZ即单位s的倒数}本晶振为12MHZ,因此外部的时钟频率为12MHZ,所以内部的时钟频率为(12MHZ)/12=1MH 即1000000HZ,而机械频率为1/(1MHZ),即每完成一次计算(即定时器的值加一)用时0.000001s, 即1us(微秒).*/ /****************************************************************************** *****/ //具有模式选择. #include #define UC unsigned char #define UI unsigned int void delay(UI); //延时9.56us程序 sbit beep = P1^3; //用于声音报警 sbit Lv = P1^7; //用于光报警 sbit Hong = P1^6; sbit QD = P3^7;//K8 //P3^7口(K8)为确定键, sbit GX = P3^1;//K7 //P3^3口(K2)为修改键, sbit SX = P3^6;//K6 //P3^2(K3)为测量键. sbit BX = P3^0;//K5 //个(K7),十(K6),百(K5),三位修改键 sbit a = P1^2;//百位//数码管位选 sbit b = P1^1;//十位 sbit c = P1^0;//个位 sbit trig = P1^4; //方波发射端 sbit echo = P1^5; //超声波接收端 void IntConfiguration(); //用来"设置中断"的函数,P3^3口(K2)为修改键,P3^2(K3)为测量键. void TimeConfiguration(); //用来"设置定时器"的函数 sbit K1 = P3^4;//动态 sbit K4 = P3^5;//静态//用于进行模式切换(K1、K4键) void xiaxian(); //修改函数,用来修改下限 void shangxian(); //修改函数,用来修改上限 UI min[3]={0,5,0}; //报警极限,拆分为"百十个"三位 UI max[3]={3,0,0}; //MIN,MAX 用来存储最大和最小值 void MINxianshi(UI); //最小范围和最大范围的显示 void MAXxianshi(UI); UC code CharacterCode[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管数字字符(P2口) /********************************主函数*********************************************/ void main() { TimeConfiguration(); //设置定时器0 IntConfiguration(); //设置中断允许,K4键为修改键,K8键为确定键 while(1) {

基于单片机的超声波测距报警系统设计

综合性课程设计报告基于proteus仿真软件的超声波测距报警控制器设计 院系:计算机与通信工程学院 专业:电子信息工程 学号: 姓名: 指导教师: 设计时间:2012/6/27 综合课程设计任务书

专业:电子信息工程班级:4091603: 设计题目:基于proteus仿真软件的超声波测距报警控制器设计 一、设计实验条件 keil C和proteus仿真软件 二、设计任务 1)总体功能设计 2)硬件电路设计 3)软件设计 4)工作总结 三、设计说明书的容 1.设计题目与设计任务(设计任务书) 2.前言(绪论)(设计的目的、意义等) 3.主体设计部分(各部分设计容、总结分析、结论等) 4.结束语 5.参考文献 (答辩时间18周星期日晚7:30,地点:综合楼1313室) 四、设计时间与设计时间安排 1、设计时间:2周 2、设计时间安排: 熟悉实验设备、实验、收集资料:2 天 设计计算、绘制技术图纸:5 天 编写课程设计说明书:2 天 答辩:1 天 目录

一、设计题目 (2) 二、设计任务及要求 (3) 三、设计容 (3) 1.绪论 (3) 2.总体方案 (4) 2.1 总体设计方案 (4) 2.2超声波测距框图 (4) 3.系统硬件设计 (5) 3.1 硬件设计方案 (5) 3.2 各主要模块的硬件设计 (6) 4.系统软件设计 (10) 4.1 程序设计 (10) 4.2 程序流程图 (10) 四、结束语 (13) 五、参考文献 (13) 附录A 系统仿真图 (14) 附录B程序代码 (15) 一、设计题目 基于proteus仿真软件的超声波测距报警控制器设计

相关文档
最新文档