急求基于凌阳61系列单片机 超声波测距的C语言程序或者汇编程序!!

急求基于凌阳61系列单片机 超声波测距的C语言程序或者汇编程序!!,第1张

#include "SPCE061A.h"

#include "ultrasonic_App.h"

//========================================================================

// 语法格式: int main(void)

// 实现功能: 主程序

// 参数: 无

// 返回值: int 无意义

//========================================================================

void F_Key_Scan_Initial(void)

void F_Key_Scan_ServiceLoop(void)

unsigned int SP_GetCh(void)

void Speech_Resource(unsigned int iSpeechIndex)

void Speech_Result(unsigned int uiResult)

int main(void)

{

unsigned int uiKey

unsigned int Back_data

F_Key_Scan_Initial()

Initial_ult()

while(1)

{

uiKey = SP_GetCh()

switch(uiKey)

{

case 0: break

case 1:

Back_data = measure_Times(1)

if(Back_data==0)

Speech_Resource(12) //结果为0时表示测量出错,播放"咚"

else

Speech_Result(Back_data)

break

case 2:

break

case 3: break

default: break

}

F_Key_Scan_ServiceLoop()

*P_Watchdog_Clear = 0x0001

}

}

//========================================================================

// 文件名称: IRQ.c

// 功能描述: IRQ中断服务程序

// 维护记录: 2006-04-13 V2.0

//========================================================================

#include "SPCE061A.h"

#include "ultrasonic_App.h"

void IRQ3(void)__attribute__((ISR))

void IRQ3(void)

{

*P_INT_Clear = 0x0100 //

EXT1_IRQ_ult()//调用超声波测距的外部中断服务程序

}

//========================================================================

// 文件名称: ultrasonic_App.c

// 功能描述: 超声波测距模组V2.0的功能接口函数

// 维护记录: 2006-02-21 V2.0

//========================================================================

#include "SPCE061A.h"

#define LONG_SEND_TIMER 1000 //中距测距时的40KHz信号发射时长

#define LONG_SEND_TIMER2 3000 //中距测距的补充测距时的40KHz信号发射时长

#define LONG_WAIT_DELAY 600 //中距测距的防余波干扰延时时长

#define LONG_WAIT_DELAY2 1500 //中距测距的补充测距时的防余波干扰延时时长

#define LONG_RES_ADD 0x00B0 //中距测距的结果补偿值

#define LONG_RES_ADD2 0x0220 //中距测距的补充测距时的结果补偿值

#define LOW_SEND_TIMER 250 //短距测距时的40KHz信号发射时长

#define LOW_SEND_TIMER2 1000 //短距测距的补充测距时的40KHz信号发射时长

#define LOW_WAIT_DELAY 180 //短距测距的防余波干扰延时时长

#define LOW_WAIT_DELAY2 400 //短距测距的补充测距时的防余波干扰延时时长

#define LOW_RES_ADD 0x0034 //短距测距的结果补偿值

#define LOW_RES_ADD2 0x00B0 //短距测距的补充测距时的结果补偿值

unsigned int Counter_buf //超声波测距当中,用于保存TimerB计数的变量,相当于时长

unsigned int EXT1_IRQ_flag=0 //外部中断标志变量,用于EXT1的IRQ中断程序和测距程序同步

//========================================================================

// 语法格式: void Initial_ult(void)

// 实现功能: 超声波测距模组的初始化子程序

// 参数: 无

// 返回值: 无

//========================================================================

void Initial_ult(void)

{

unsigned int uiTemp

// 初始化端口主要是IOB8和IOB9

uiTemp = *P_IOB_Dir

uiTemp = uiTemp|0x0200

uiTemp = uiTemp&0xfeff

*P_IOB_Dir = uiTemp

uiTemp = *P_IOB_Attrib

uiTemp = uiTemp|0x0200

uiTemp = uiTemp&0xfeff

*P_IOB_Attrib = uiTemp

uiTemp = *P_IOB_Buffer

uiTemp = uiTemp|0x0300

*P_IOB_Data = uiTemp

}

//========================================================================

// 语法格式: void Delay_ult(unsigned int timers)

// 实现功能: 超声波测距模组的延时子程序

// 参数: unsigned int timers延时的时长(仅是一个相对量)

// 返回值: 无

//========================================================================

void Delay_ult(unsigned int timers)

{

unsigned int i

for(i=0i<timersi++)

{

__asm("nop")

}

}

//========================================================================

// 语法格式: unsigned int Resoult_ult(unsigned int Counter)

// 实现功能: 超声波测距模组的测距数据处理程序,将TimerB的计数值换算为距离

// 参数: Counter 需要换算的计数值

// 返回值: 计算后的距离,厘米为单位

//========================================================================

unsigned int Resoult_ult(unsigned int Counter)

{

unsigned int uiTemp

unsigned long ulTemp

ulTemp = (unsigned long)Counter*33500

ulTemp = ulTemp/196608

ulTemp = ulTemp>>1//除二

uiTemp = (unsigned int)ulTemp

return uiTemp

}

//========================================================================

// 语法格式: unsigned int measure_ult(unsigned int type)

// 实现功能: 超声波测距模组的测距程序,完成一次测距

// 参数: type 选择测距类型,

//type=1 中距测距

//type=0 短距测距

// 返回值: 所测得的距离,以厘米为单位

//========================================================================

unsigned int measure2_ult(unsigned int type)

unsigned int measure_ult(unsigned int type)

{

unsigned int Exit_flag = 1

unsigned int uiTemp

unsigned int uiResoult

unsigned int uiSend_Timer,uiWait_Timer,uiRes_Add

unsigned int uiSystem_Clock

uiSystem_Clock = *P_SystemClock//将当前的系统时钟设置暂时保存起来

*P_SystemClock = 0x0088 //将系统时钟设置为49MHz,分频比为1,强振模式

if(type) //根据type即测距类型,选择不同的测距参数

{

uiSend_Timer = LONG_SEND_TIMER

uiWait_Timer = LONG_WAIT_DELAY

uiRes_Add = LONG_RES_ADD

}

else

{

uiSend_Timer = LOW_SEND_TIMER

uiWait_Timer = LOW_WAIT_DELAY

uiRes_Add = LOW_RES_ADD

}

*P_TimerB_Data = 0xfed2

*P_TimerB_Ctrl = 0x03c0 //enable 40KHz out

Delay_ult(uiSend_Timer) //delay for send the signal

*P_TimerB_Ctrl = 0x0006 //stop 40KHz out

*P_TimerB_Data = 0x0000

*P_TimerB_Ctrl = 0x0001 //TimerB work as a counter at 192KHz

while(*P_TimerB_Data<uiWait_Timer) //等待一定时间后再打开TimerA的计数(来源于EXT1)

{ //以避开余波的干扰

*P_Watchdog_Clear = 0x0001

}

*P_INT_Clear = 0x0100//开中断前先清中断

*P_INT_Ctrl = *P_INT_Ctrl_New|0x0100

*P_INT_Clear = 0xffff //清除中断发生标志

__asm("IRQ ON")//打开总中断使能

EXT1_IRQ_flag = 0//TimerA的溢出中断的标志变量置0

while(Exit_flag)

{

if(EXT1_IRQ_flag==1) //当该变量在timerA的FIQ中断中被置1时表示接收到了回波

{

Exit_flag = 0 //exit

Counter_buf = Counter_buf+uiRes_Add//计数值加上一定的调整数据

uiResoult = Resoult_ult(Counter_buf)//对计数值进行处理,得出距离值

}

if(*P_TimerB_Data>10000) //如计数值大于10000,表示超时

{

Exit_flag = 0 //exit

uiResoult = measure2_ult(type)//再进行一次补充的测距,将会加长40KHz信号发射的量

*P_TimerB_Ctrl = 0x0006//stop timerB

}

uiTemp = *P_TimerB_Data

*P_Watchdog_Clear = 0x0001

}

*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0100)//关掉外部中断

__asm("IRQ OFF")//关掉总中断

*P_SystemClock = uiSystem_Clock//恢复系统时钟的设置

return uiResoult

}

//========================================================================

// 语法格式: void EXT1_IRQ_ult(void)

// 实现功能: 超声波测距模组的测距程序的EXT1中断服务程序,在EXT1的IRQ中断

//中调用

// 参数: 无

// 返回值: 无

//========================================================================

void EXT1_IRQ_ult(void)

{

Counter_buf = *P_TimerB_Data //save the timerB counter

*P_TimerB_Ctrl = 0x0006 //stop timerB

*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0100)//关掉外部中断

*P_INT_Clear = 0xffff //清除中断发生标志

EXT1_IRQ_flag = 1//通知测距程序,外部中断已发生

}

//========================================================================

// 语法格式: unsigned int measure2_ult(void)

// 实现功能: 补充进行一次远距的测量,以保证能够获取测量结果

// 参数: type 选择测距类型,

//type=1 中距测距

//type=0 短距测距

// 返回值: 所测得的距离,以厘米为单位

//========================================================================

unsigned int measure2_ult(unsigned int type)

{

unsigned int Exit_flag = 1

unsigned int uiResoult

unsigned int uiSend_Timer,uiWait_Timer,uiRes_Add

*P_TimerA_Ctrl = 0x0006 //stop TimerA

*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0100)//关掉外部中断

__asm("IRQ OFF")//关掉总中断

*P_INT_Clear = 0xffff //清除掉中断发生标志

if(type) //根据type即测距类型,选择不同的测距参数

{

uiSend_Timer = LONG_SEND_TIMER2

uiWait_Timer = LONG_WAIT_DELAY2

uiRes_Add = LONG_RES_ADD2

}

else

{

uiSend_Timer = LOW_SEND_TIMER2

uiWait_Timer = LOW_WAIT_DELAY2

uiRes_Add = LOW_RES_ADD2

}

*P_TimerB_Data = 0xfed2

*P_TimerB_Ctrl = 0x03c0 //enable 40KHz out

Delay_ult(uiSend_Timer) //delay for send the signal

*P_TimerB_Ctrl = 0x0006 //stop 40KHz out

*P_TimerB_Data = 0x0000

*P_TimerB_Ctrl = 0x0001 //TimerB work as a counter at 192KHz

while(*P_TimerB_Data<uiWait_Timer) //等待一定时间,以避开余波的干扰

{

*P_Watchdog_Clear = 0x0001

}

*P_INT_Ctrl = *P_INT_Ctrl_New|0x0100//打开外部中断

*P_INT_Clear = 0xffff //清除中断发生标志

__asm("IRQ ON")//打开总中断使能

EXT1_IRQ_flag = 0//TimerA的溢出中断的标志变量置0

while(Exit_flag)

{

if(EXT1_IRQ_flag==1) //当该变量在timerA的FIQ中断中被置1时表示接收到了回波

{

Exit_flag = 0 //exit

Counter_buf = Counter_buf+uiRes_Add//计数值加上一定的调整数据

uiResoult = Resoult_ult(Counter_buf)//对计数值进行处理,得出距离值

}

if(*P_TimerB_Data>10000) //如计数值大于10000,表示超时

{

Exit_flag = 0 //exit

uiResoult = 0 //error return data 0

*P_TimerB_Ctrl = 0x0006//stop timerB

}

}

return uiResoult

}

//========================================================================

// 语法格式: unsigned int measure_Times(unsigned int type)

// 实现功能: 组合进行共6次的测距程序,包括对6次测量结果的取平均值处理

// 参数: type 选择测距类型,

//type=1 中距测距

//type=0 短距测距

// 返回值: 所测得的距离,以厘米为单位

//========================================================================

unsigned int measure_Times(unsigned int type)

{

unsigned int uiResoult=0,uiMeasure_Index=0,i

unsigned int uiTemp_buf[6],uiTemp

unsigned int uiSystem_Clock

for(uiMeasure_Index<6uiMeasure_Index++)

{ //循环进行四次测量

uiTemp = measure_ult(type) //进行一次测量,测量类型由type决定

if(uiMeasure_Index==0) //如果为本次测量的第一次测距,则直接保存在缓冲区第一个单元

uiTemp_buf[0] = uiTemp

else

{ //否,则对结果进行比较,进行排序,从大到小排

i = uiMeasure_Index

while(i) //以下为排序的代码

{

if(uiTemp>uiTemp_buf[i-1])

{

uiTemp_buf[i] = uiTemp_buf[i-1]

uiTemp_buf[i-1] = uiTemp

}

else

{

uiTemp_buf[i] = uiTemp

break //退出排序

}

i--

}

}

//两次测量之间的延时等待,利用以下代码软仿真时的cycles数结合设置的CPUCLK进行计算,大概72ms

uiSystem_Clock = *P_SystemClock //将之前的系统时钟的设置用变量保存

*P_SystemClock = 0x000b //设置为FSYS=24.576MHz 分频比为8

for(i=0i<5i++)

{

Delay_ult(1000) //调用延时程序

*P_Watchdog_Clear = 0x0001

}

*P_SystemClock = uiSystem_Clock //恢复系统时钟设置

//此处延时结束

}

//对6次测距的结果进行处理

if(uiTemp_buf[5]==0)

{ //如果缓冲区中的最小的测距值为0,则采用中间4个数据进行平均

uiResoult = uiTemp_buf[1]+uiTemp_buf[2]+uiTemp_buf[3]+uiTemp_buf[4]

uiResoult = uiResoult/4

}

else

{ //否则就取后5个数据进行平均

uiResoult = uiTemp_buf[1]+uiTemp_buf[2]+uiTemp_buf[3]+uiTemp_buf[4]+uiTemp_buf[5]

uiResoult = uiResoult/5

}

return uiResoult

}

凌阳61单片机实现RCL,由C语言编写,凌阳61板实现功能-,C++ Builder,单片机开发/SCM

autocad预览控件.不需要安装autocad即可在界面浏览-,Delphi,绘图程序/Graph Drawing

本程序为基于matlab的小波分析的应用实例。-,matlab,界面编程/GUI Develop

高通brew平台上的BUIW控件中的ImageStaticWidget使用示例-,Visual C++,Static控件/Static control

客观合理化一天一片人体豆腐花规范化广泛非官方大哥大法国-,C++ Builder,界面编程/GUI Develop

本程序为基于matlab的插值分析与Euler解常微分方程的应用实例。-,matlab,界面编程/GUI Develop

用ASP.NET做的酒店管理系统,该系统主要处理酒店日常运营中涉及的客户信息.-,ASP,其他书籍/Other Books

EVC 读写INI文件 EVC 读写INI文件EVC 读写INI文件EVC 读写INI文件EVC 读写INI文件-,Visual C++,文件 *** 作/File Operate

本程序介绍基于matlab的平方根及改进平方根算法。-,matlab,按钮控件/Button control

高通brew平台上的BUIW控件中的slider的示例程序-,Visual C++,界面编程/GUI Develop

塔顶地无可奈何花落去 人威风扫地雪 可耕地枯无可奈何花落去 无可奈何花落去饿-,Visual C++,GDI/图象编程/GDI-Bitmap

oblog31sql oblog31sql oblog31sql oblog31sql oblog31sql-,ASP,Web服务器/Web Server

MATLAB实现简单图象处理的程序,在matlab2006a上通过-,matlab,matlab例程/matlab

源码、运行程序、帮助文件、必须的数据库文件-,Windows_Unix,C#编程/CSharp

dos下的TCP/IP栈库函数,并提供了多种tcp/ip编程demo。 -,DOS,TCP/IP协议栈/TCP/IP Stack

MATLAB进入时显示的图标的程序实现,有动画效果!-,matlab,matlab例程/matlab

地方官梵蒂冈地方官法 方法方法方法方法方法 -,Unix_Linux,TreeView控件/TreeView

几个matlab的编程实例,对初学者有一定的帮助。-,matlab,界面编程/GUI Develop

用ASP.NET做的客户管理系统,该系统以客户管理中涉及的销售管理,合同管理为主体.-,ASP,其他书籍/Other Books

毕毕剥剥毕毕剥剥爸爸 毕毕剥剥毕毕剥剥爸爸 -,DOS,Static控件/Static control

将数据库的资料转档到EXCEL里进行保存-,Delphi,其他小程序/Other windows programs

数字图像中队图像进行模板匹配算法之前的预处理算法!-,Visual C++,图形/文字识别/Graph Recognize

存车处存车处存车处厂 滴滴答答滴滴答答得到 -,DOS,编辑框/EditBox

实数编码GA,也是从网上下载的。非要上传5个才能下载,哎,实在是没办法啊,这个也不知道能不能运行,不能的话请不要骂我哦,谢谢!!-,Visual C++,人工智能/AI-NN-PR

DS1302+AT89C2051的LED钟,可以显示年、周、月、日、小时、分钟、秒-,TEXT,其他小程序/Other windows programs

可耕地 唇形枯 要一地三三大哥有在一码元表的有遥有-,Visual C++,TreeView控件/TreeView

用JAVA写的遗传算法的例子,比较简单,如果解压缩的时候需要密码的话,应该是“1”。写的比较简单。是老早以前写的了。-,Java,人工智能/AI-NN-PR

汇编语言,用C51单片机实现交通灯控制!二极管模拟发光!-,Asm,单片机开发/SCM

通过串口控制步进电机控制器,实现联络,速度控制,步长-,Visual C++,串口编程/Com Port

绝佳的Tab View控件的方式之一,VC++6.0经过运行调试的,可直接使用-,Visual C++,TreeView控件/TreeView

以某中小规模汽车维修厂为案例,用ASP.NET做的仓库管理系统.-,ASP,其他书籍/Other Books

关机程序。。。。。。。。。。。。。。。。。-,Visual C++,Windows编程/Windows Develop

绝佳的Tab View控件的方式之二,VC++6.0经过运行调试的,可直接使用-,Visual C++,界面编程/GUI Develop

在VC6下基于OpenCV的轮廓检测程序,其中图像的二值化 *** 作基于Canny和自适应阈值。通过trackbar来实现不同情况下的轮廓检测。-,Visual C++,图形/文字识别/Graph Recognize

绝佳的Tab View控件的方式之三,VC++6.0经过运行调试的,可直接使用-,Visual C++,界面编程/GUI Develop

用于首先获取需要下载的文件的大小,然后将其分块下载。-,Java,网络编程/WinSock-NDIS

用csocket模拟聊天室,可以在一台机子上模拟,也可以在不同机子上-,Visual C++,网络编程/WinSock-NDIS

这个好象也是从网络上找到一个基本遗传算法的例子,解压缩的时候如果需要密码的话,应该是“1”。-,Visual C++,人工智能/AI-NN-PR

本程序是运用java 语言 编写一款查看 网站源文件的程序 -,Java,其他/Other systems

使用C语言实现菜单控制的源程序,实现了学生成绩的管理.-,C-C++,界面编程/GUI Develop

在打开图像时,点击图像可在打开对话框中实时看到预览,绝好.-,Visual C++,界面编程/GUI Develop

用ASP.NET做的合同管理系统,该系统包括合同进展控制模块,员工管理模块,客户管理模块,项目管理模块,合同管理模块和合同统计模块等.-,ASP,其他书籍/Other Books

语音识别与合成工具箱.具有如下功能:时域分析,频域分析,LPC分析与合成等.-,matlab,matlab例程/matlab

#include<reg52.h>//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit key1=P3^0 //定义按键位置

sbit key2=P3^1

sbit key3=P3^2

sbit key4=P3^3

/*------------------------------------------------

延时子程序

------------------------------------------------*/

void delay(unsigned int cnt)

{

while(--cnt)

}

/*------------------------------------------------

主函数

------------------------------------------------*/

main()

{

P2=0x00

while(1)

{

if(!key1) //按下相应的按键,数码管显示相应的码值

P0=0x06//数码管显示"1"

if(!key2)

P0=0x5B//2

if(!key3)

P0=0x4F//3

if(!key4)

P0=0x66//4

}

}

//如果有干扰请加去抖程序

//控制二极管道理相同,定义一下接口,按下时输出为高电平就行了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7798265.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存