急需“基于cx20106的超声波测距的源程序",用1602显示,51单片机C语言编程!!! 谢谢

急需“基于cx20106的超声波测距的源程序",用1602显示,51单片机C语言编程!!! 谢谢,第1张

#include <reg52.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

//===============================LCD1602接口定义=====================

//定义引脚

#define LCM_Data P0 //数据接口

#define Busy 0x80 //用于检测LCM状态字中的Busy标识

sbitLCM_RW = P2^1 //读灶燃蠢写控制输入端

sbitLCM_RS = P2^0 //隐陪寄存器选择输入端

sbitLCM_E = P2^2 //使能信号输入端

voidWritEDAtaLCM (uchar WDLCM)

voidWriteCommandLCM (uchar WCLCM,BuysC)

uchar ReadDataLCM (void)

uchar ReadStatusLCM (void)

voidDisplayOneChar (uchar X,uchar Y,uchar ASCII)

voidDisplayListChar (uchar X,uchar Y,uchar delayms,uchar code *DData)

voidDisplayCursorPos (uchar X, uchar Y)

voidLCMInit (void)

voidDisplayIntData (uchar X, uchar Y,int ZhengShu,uchar Digit,uchar XiaoShu)

voidDisplayCharData (uchar X, uchar Y,uchar ZiFu)

//===============================超声波模块定义========================

sbit RemPin = P3^2// 接收端(这个不能修改,因为是外部中断(INT0)的引脚)

sbit TxPin = P3^5// 发射端

uint length = 0 // 测距的长度0.00M

uchar flag = 0 // 测距的标志 有信号接收=1

void DelayUs(uint us)

{

while(us--)

}

void DelayMs(uint Ms)

{

uint i,TempCyc

for(i=0i<Msi++)

{

TempCyc = 250

while(TempCyc--)

}

}

//==============================LCD1602显示子程序================================================

void WritEDAtaLCM(unsigned char WDLCM)

{

ReadStatusLCM()//检测忙

LCM_Data = WDLCM

LCM_RS = 1

LCM_RW = 0

LCM_E = 0//若晶振速度太高可以在这后加小的延时

LCM_E = 0//延时

LCM_E = 1

}

void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检段缺测

{

if (BuysC) ReadStatusLCM()//根据需要检测忙

LCM_Data = WCLCM

LCM_RS = 0

LCM_RW = 0

LCM_E = 0

LCM_E = 0

LCM_E = 1

}

unsigned char ReadDataLCM(void)

{

LCM_RS = 1

LCM_RW = 1

LCM_E = 0

LCM_E = 0

LCM_E = 1

return(LCM_Data)

}

unsigned char ReadStatusLCM(void)

{

LCM_Data = 0xFF

LCM_RS = 0

LCM_RW = 1

LCM_E = 0

LCM_E = 0

LCM_E = 1

while (LCM_Data &Busy)//检测忙信号

return(LCM_Data)

}

void DisplayOneChar( unsigned char X, unsigned char Y, unsigned char ASCII)

{

X &= 0x1

Y &= 0xF//限制Y不能大于15,X不能大于1

if (X) Y |= 0x40//当要显示第二行时地址码+0x40

Y |= 0x80// 算出指令码

WriteCommandLCM(Y, 0)//这里不检测忙信号,发送地址码

WritEDAtaLCM(ASCII)

}

void DisplayListChar(uchar X,uchar Y,uchar delayms, uchar code *DData)

{

unsigned char ListLength

ListLength = 0

X &= 0x1

Y &= 0xF//限制X不能大于15,Y不能大于1

while (DData[ListLength]!='\0') //若到达字串尾则退出

{

if (Y <= 0xF) //X坐标应小于0xF

{

DisplayOneChar(X, Y, DData[ListLength])//显示单个字符

ListLength++

Y++

DelayMs(delayms)//延时显示字符串

}

else

break//跳出循环体

}

}

void DisplayCursorPos( unsigned char X, unsigned char Y)

{

X &= 0x1

Y &= 0xF//限制Y不能大于15,X不能大于1

if (X) Y |= 0x40//当要显示第二行时地址码+0x40

Y |= 0x80// 算出指令码

WriteCommandLCM(Y, 1)//这里不检测忙信号,发送地址码

}

void LCMInit(void)

{

LCM_Data = 0

WriteCommandLCM(0x38,0)//三次显示模式设置,不检测忙信号

DelayMs(5)

WriteCommandLCM(0x38,0)

DelayMs(5)

WriteCommandLCM(0x38,0)

DelayMs(5)

WriteCommandLCM(0x38,1)//显示模式设置,开始要求每次检测忙信号

WriteCommandLCM(0x08,1)//关闭显示

WriteCommandLCM(0x01,1)//显示清屏

WriteCommandLCM(0x06,1)// 显示光标移动设置

WriteCommandLCM(0x0C,1)// 显示开及光标设置

DelayMs(100)

}

void DisplayIntData(uchar X, uchar Y,int ZhengShu,uchar Digit,uchar XiaoShu)

{

uchar i=0,k=0, BCD[5]={0}

if(Digit>5) Digit=5

if(ZhengShu<0)

{

k=1//负数示志位

ZhengShu=-ZhengShu

}

BCD[4] = ZhengShu / 10000//求出万位数据

ZhengShu = ZhengShu % 10000

BCD[3] = ZhengShu / 1000 //求出千位数据

ZhengShu = ZhengShu % 1000

BCD[2] = ZhengShu / 100 //求出百位数据

ZhengShu = ZhengShu % 100

BCD[1] = ZhengShu / 10 //求出十位数据

BCD[0] = ZhengShu % 10 //求出个位数据

for(i=0i<Digiti++)//输出显示的数值

{

if((i==XiaoShu)&&(0!=XiaoShu))

{

DisplayOneChar(X,Y-i,'.')//输出小数点

Y= Y-1

}

DisplayOneChar(X,Y-i,BCD[i]+0x30)//显示一个字符

}

if(k==1)

DisplayOneChar(X,Y-1,'-')//输出负符

}

void DisplayCharData(uchar X, uchar Y,uchar ZiFu)

{

uchar i=0

uchar ValueBCD[3]

ValueBCD[0] = ZiFu / 100 //求出百位数据

ZiFu = ZiFu % 100

ValueBCD[1] = ZiFu / 10 //求出十位数据

ValueBCD[2] = ZiFu % 10 //求出个位数据

for(i=0i<3i++)//输出显示的数值

{

DisplayOneChar(X,Y+i,ValueBCD[i]+0x30)//显示一个字符

}

}

//==============================超声波模块测试子程序================================================

void delay25us_40KHz(unsigned char us)

{

while(us--)

{

TxPin = 0

_nop_()_nop_()

_nop_()_nop_()

_nop_()_nop_()

_nop_()_nop_()

_nop_()_nop_()

_nop_()

TxPin = 1

_nop_()_nop_()

_nop_()_nop_()

}

TxPin = 1

}

void init0int() interrupt 0

{

uint timer_us = 0

TR0=0 //关闭定时器0

timer_us = TH0*256+TL0

if(timer_us>190)timer_us=timer_us-180//修正测距的距离

length = ((unsigned long)(340)*timer_us)/2000//计算长度,是扩大100倍

flag = 0

EA = 0 //禁止所有中断

}

void timer0int (void) interrupt 1

{

TR0=0//关闭定时器0

length = 0 //超出测量时间显示示0

flag = 1 //

EA = 0 //禁止所有中断

}

void main(void)

{

LCMInit() //1602初始化

EX0 = 1 //允许总中断中断,使能 INT0 外部中断

ET0 = 1

TMOD=0x11 //设定T0为16位时器,设定T1为16位时器

DisplayOneChar( 1, 11, 'M')

DisplayListChar(0,2,0, "Range Finder ") //显示字符串

while(1)

{

DisplayIntData(1, 10,length,5,3)//显示测量距离

TH0=0x00

TL0=0x00

TR0=1 //启动定时器0

EA = 1//允许所有中断

delay25us_40KHz(15)//发出脉冲信号

DelayMs(200)

}

}

CX20106是一款USB 3.0控制器芯片,如果其波形基弊不正常可能有以下几种可能原因:

1. 电源问题:芯片电源电压不稳定、电源噪声大等问题都可能导致波形不正常。

2. PCB设计问题:可能会存在信号线长度过长、布线不规范等问题,导致信号传输质量下降,从而导致波形不正常。

3. 芯片本身故障:芯片的内部器件可能损坏或老化,导致波形不正常。

4. *** 作系统或软件问题:可能是 *** 作系统或软件的问题,例如驱动问题、软件配置错误等,导致芯片无法正常工作。

针对这些问题,建丛困议可以从以下几个方面排查:

1. 检查电源线路和电源质量,保证电源电压正常,电源噪声尽可能小。

2. 检查PCB布线是否规范,信号线长度是否过长,如有问题,应调整PCB设计。

3. 对芯片进行更换或者返修,并进行相关测试,确认是否为芯片本身的问题。

4. 尝试更新驱动程序,检查软件配置,排除软件和 *** 作系统的故障影响渗锋念。

综上所述,检查和解决CX20106波形不正常的问题需要进行多方面的排查和测试,建议对电源、PCB设计、芯片状态、软件配置和驱动程序进行全面检查和排除。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存