超声波测距,51单片机和c8051单片机程序.doc_第1页
超声波测距,51单片机和c8051单片机程序.doc_第2页
超声波测距,51单片机和c8051单片机程序.doc_第3页
超声波测距,51单片机和c8051单片机程序.doc_第4页
超声波测距,51单片机和c8051单片机程序.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C8051F410单片机程序/-#include / SFR declarations#include #include #define uint unsigned int #define uchar unsigned charsbit Trig=P07;sbit Echo=P06;sbit lcden=P24;sbit lcdrs=P25;sbit sdi=P26;sbit clk=P27;unsigned long s;bit flag =0;unsigned char code table1= Ce De Jv Li is ;unsigned char code table2=Chao Chu fan Wei;unsigned char code table3=JingQue:;unsigned char table8;/-/ Function PROTOTYPES/-void PORT_Init (void);void Oscillator_Init();void write_595(unsigned char da);void lcd_init(void);void write_com(unsigned char com);void write_data(unsigned char da);void delay(unsigned int z);void delaym(uchar i);void delaym(uchar i) while(i-);/-/ MAIN Routine/-void main() uchar num; PCA0MD &= 0x40;/禁止看门狗 PORT_Init (); Oscillator_Init();/时钟初始化 lcd_init(); while(1) TMOD=0x01;/EA=1;/IE=0x80; /开启总中断 /TR0=0; TH0=0; TL0=0;/ET0=1; /允许T0中断 /IE=0x80; /开启总中断 Trig=1; delaym(200); Trig=0;while(!Echo); TR0=1; /开启计数 while(Echo);/当RX为1计数并等待 TR0=0;/关闭计数 s=(TH0*256+TL0)*0.17*4;table0=s/1000+0x30;table1=(s%1000)/100+0x30;table2=(s%100)/10+0x30;table3=.;table4=s%10+0x30;table5=c;table6=m;table7=*; if(s=7000|flag=1|s5) /超出测量范围 write_com(0x80+0x40);for(num=0;num17;num+)write_data(table2num);delay(10); else write_com(0x80+0x48); for(num=0;num8;num+) write_data(tablenum); delay(10); write_com(0x80+0x40); for(num=0;num8;num+) write_data(table3num); delay(10); delay(1000); /*函数名称:void PORT_Init(void)功能描述:初始化I/O输入:无输出:无全局变量:XBR1调用模块:无*/void PORT_Init (void) P2MDOUT = 0xC0; XBR1= 0x40; /*使能交叉开关和弱上拉*/*函数名称:void Oscillator_Init()功能描述:初始化Oscillator,时钟为片内时钟八分频3.0625Mhz输入:无输出:无全局变量:无调用模块:无*/void Oscillator_Init()OSCICN = 0x84;/ 系统时钟初始化为片内时钟的8分频,3.0625Mhz/*函数名称:void write_595(unsigned char da)功能描述:使用MC74HC595AD将串行数据转化为八位并行数据输出输入:da输出:无全局变量:无调用模块:无备注:使用时钟频率为系统时钟初始化为片内时钟的8分频,3.0625Mhz*/void write_595(unsigned char da)int i;for(i=0;i8;i+)/先送高位,再送低位clk=0;da=_crol_(da,1);sdi=da&0x01;clk=1;clk=0;_nop_();clk=1;/*函数名称:void lcd_init(void)功能描述:1602液晶初始化输入:无输出:无全局变量:无调用模块:write_com()备注:无*/void lcd_init(void) uchar num;lcden=0;write_com(0x38);write_com(0x0C);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num17;num+)write_data(table1num);delay(5);/*函数名称:void write_com(unsigned char com)功能描述:1602液晶写指令输入:com输出:无全局变量:无调用模块:write_595()备注:无*/void write_com(unsigned char com)lcdrs=0;write_595(com);delay(15);lcden=1;delay(15);lcden=0;/*函数名称:void write_data(unsigned char da)功能描述:1602液晶写数据输入:command输出:无全局变量:无调用模块:write_595()备注:无*/void write_data(unsigned char da)lcdrs=1;write_595(da);delay(15);lcden=1;delay(15);lcden=0;/*函数名称:void delay(unsigned int z)功能描述:延时函数2Mhz时钟下延时1ms输入:z输出:无全局变量:无调用模块:无备注:无*/void delay(unsigned int z) unsigned int ii,jj; for(ii=0;iiz;ii+) for(jj=0;jj180;jj+) _nop_(); void zd0() interrupt 1 /T0中断用来计数器溢出,超过测距范围 flag=1; /中断溢出标志Echo=0;89c51或52#include /器件配置文件#include #include sbit Rcho=P36;sbit Trig=P37;sbit LCM_RW=P25 ; /定义LCD引脚sbit LCM_RS=P26;sbit LCM_E=P27;#define LCM_Data P0sbit Key_Data=P31; /定义Keyboard引脚sbit Key_CLK=P32;#define Busy 0x80 /用于检测LCM状态字中的Busy标识void LCMInit(void); /LCD初始化函数void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);/LCD显示一个字符函数void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);/LCD显示一个字符串函数void Delay5Ms(void); /延时5毫秒函数void Delay400Ms(void); /延时400毫秒函数void Decode(unsigned char ScanCode);void WriteDataLCM(unsigned char WDLCM); /LCD1602写数据函数void WriteCommandLCM(unsigned char WCLCM,BuysC); /LCD写命令函数/unsigned char ReadDataLCM(void);unsigned char ReadStatusLCM(void);unsigned char code Range = Wang Li Yong; unsigned char code ASCII13 = 0123456789.-M;unsigned char code table=Jv Li = 000.0 cm;unsigned char code table1=Chao Chu fan Wei;/static unsigned char DisNum = 0; /显示用指针 unsigned int time=0;unsigned long S=0;bit flag =0;unsigned char disbuff4= 0,0,0,0,;/写数据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 LCMInit(void) /LCM初始化LCM_Data = 0;WriteCommandLCM(0x38,0); /三次显示模式设置,不检测忙信号Delay5Ms(); WriteCommandLCM(0x38,0);Delay5Ms(); WriteCommandLCM(0x38,0);Delay5Ms(); WriteCommandLCM(0x38,1); /显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1); /关闭显示WriteCommandLCM(0x01,1); /显示清屏WriteCommandLCM(0x06,1); / 显示光标移动设置WriteCommandLCM(0x0c,1); / 显示开及光标设置/按指定位置显示一个字符void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)Y &= 0x1;X &= 0xF; /限制X不能大于15,Y不能大于1if (Y) X |= 0x40; /当要显示第二行时地址码+0x40;X |= 0x80; /算出指令码WriteCommandLCM(X, 1); /发命令字WriteDataLCM(DData); /发数据/按指定位置显示一串字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)unsigned char ListLength; ListLength = 0;Y &= 0x1;X &= 0xF; /限制X不能大于15,Y不能大于1while (DDataListLength0x19) /若到达字串尾则退出if (X =7000)|flag=1) /超出测量范围 flag=0; DisplayListChar(0, 1, table1); else disbuff0=S%10; disbuff1=S/10%10; disbuff2=S/100%10; disbuff3=S/1000; DisplayListChar(0, 1, table); DisplayOneChar(9, 1, ASCIIdisbuff3); DisplayOneChar(10, 1, ASCIIdisbuff2); DisplayOneChar(11, 1, ASCIIdisbuff1); DisplayOneChar(12, 1, ASCII10); DisplayOneChar(13, 1, ASCIIdisbuff0); /*/ void zd0() interrupt 1 /T0中断用来计数器溢出,超过测距范围 flag=1; /中断溢出标志Rcho=0; /*/ void StartModule() /启动模块 Trig=1; /启动一次模块 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();/* _nop_(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论