欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

LCD1602液晶顯示模版+超聲波測距(C51)

作者:佚名   來源:本站原創   點擊數:  更新時間:2014年04月10日   【字體:





LCD1602display.h
#ifndef _LCD1602DISPLAY_H_
#define _LCD1602DISPLAY_H_
#include<reg52.h>
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
//************************LCD引腳定義
sbit LCM_RS=P2^5;
sbit LCM_RW=P2^6;
sbit LCM_E=P2^7;
//**************************延時
void delay();
//**************************初始化
void InitLCM();
//****************************讀狀態
uchar ReadStatusLCM();
//******************************讀數據
//uchar ResdDataLCM();
//***************************寫指令
void WriteCommandLCM(uchar WCLCM, Busy);
//***************************寫數據
void WriteDataLCM(uchar WDLCM);
//******************************顯示1個字符
void DisplayOneChar(uchar X,uchar Y,uchar DData);
//******************************顯示字符串
void DisplayListChar(uchar X,uchar Y,uchar code  *DData);
#endif
 
LCD1602display.c
#include "LCD1602display.h"
//********************延時
void delay(uchar z)
{
 uchar i,j;
 for(i=z;i>0;i--)
  for(j=110;j>0;j--);
}
//**********************LCM初始化
void InitLCM()
{
 WriteCommandLCM(0x38,0);  //三次顯示模式設置,不檢測忙信號
 delay(1);
 WriteCommandLCM(0x38,0);
 delay(1);
 WriteCommandLCM(0x38,0);
 delay(1);
 WriteCommandLCM(0x38,1);  //顯示模式設置:16×2顯示,5×7點陣,8位數據接口
 WriteCommandLCM(0x0c,1);  //顯示模式設置:顯示開,無光標
 WriteCommandLCM(0x06,1);  //顯示模式設置:光標右移,字符不移
 WriteCommandLCM(0x01,1);  //清屏幕指令,將以前的顯示內容清除
}
//*********************讀狀態
uchar ReadStatusLCM()
{
 P0 = 0x80;
 LCM_RS = 0;
 LCM_RW = 1;
 LCM_E = 1;
 while (P0 & 0x80); //檢測忙信號
 return(0);
}
//***********************讀數據
/*uchar ResdDataLCM()
{
 LCM_RS=1;
 LCM_RW=1;
 LCM_E=1;
 return(0);
} */
//**********************寫指令
void WriteCommandLCM(uchar WCLCM, Busy)
{
 if(Busy) ReadStatusLCM();
 P0=WCLCM;
 LCM_RS=0;
 LCM_RW=0;
 LCM_E=0;
 LCM_E=1;
}
//***********************寫數據
void WriteDataLCM(uchar WDLCM)
{
 ReadStatusLCM();
 P0=WDLCM;
 LCM_RS=1;
 LCM_RW=0;
 LCM_E=0;
 LCM_E=1;
}
//*************************顯示字符
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
 if(Y) X|=0X40;   //Y=1顯示第二行,Y=0顯示第一行
 X|=0X80;
 WriteCommandLCM(X,1); //X用來選擇哪一位,1是用來忙檢測
 WriteDataLCM(DData); //DData用來寫數據
}
//**************************顯示字符串
void DisplayListChar(uchar X,uchar Y,uchar code *DData)
{
 uchar ListLength;
 ListLength=0;
 while(DData[ListLength]!='\0')
 {
  if(X<=15)
  {
   DisplayOneChar( X,Y,DData[ListLength]);
   ListLength++;
   X++;
  }
 }
}


main.c
#include<reg52.h>
#include<intrins.h>
#include"LCD1602display.h"
sbit TX=P2^1;
sbit RX=P2^0;
uint time=0; //存放定時器的值
ulong S=0;  //距離值
bit flag=0;  //量程溢出標志位
uchar code range[]="==Range Finder==";
uchar code ASCII[]="0123456789.";
uchar code table0[]="Distance:000.0cm";
uchar code table1[]="Out of range !!!";
uchar distance[4]={0,0,0,0}; //用于分別存放距離的值0.1mm、mm、cm和m的值
//*************************************啟動模塊
void StartModule()
{
 TX=1;    //啟動超聲波模塊
 _nop_();  //一個機器周期
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();  //共15機器周期,約15us
 TX=0;   //關閉模塊
}
//***************************距離計算程序
void Count()
{
 time=TH0*256+TL0;
 TH0=0;
 TL0=0;
 S=(time*1.7)/10;    //單位mm,us
 if(S>5000||flag==1)  //超出測量范圍或者定時器計數滿后溢出但沒收到回波
 {
  flag=0;      
  DisplayListChar(0,1,table1);
 }
 else
 {
  distance[3]=S/1000;  //m
  distance[2]=S%1000/100; //cm
  distance[1]=S%100/10; //mm 
  distance[0]=S%10;  //0.1mm
  DisplayListChar(0, 1, table0);
  DisplayOneChar(9,  1, ASCII[distance[3]]);
  DisplayOneChar(10, 1, ASCII[distance[2]]);
  DisplayOneChar(11, 1, ASCII[distance[1]]);
  DisplayOneChar(12, 1, ASCII[10]);
  DisplayOneChar(13, 1, ASCII[distance[0]]);
 }
}
//**********************************超聲波高電平脈沖寬計算程序
void Timer_Count()
{
 TR0=1;   //啟動定時器0
 while(RX);  //當Echo管腳為高電平一直計數
 TR0=0;   //當Echo管腳變為電平時停止計數
 Count();
}
//*******************************主函數
void main()
{
 uint a;
 InitLCM();
 DisplayListChar(0,0,range);
 DisplayListChar(0,1,table0);
 TMOD=0x01;  //設置定時器0為工作方式1
 TH0=0;
 TL0=0;
 EA=1;   //開總中斷
 ET0=1;   //開定時器中斷
 while(1)
 {
  RX=0;  //剛剛開始Echo腳為低電平(未收到回波)
  StartModule();
  for(a=8000;a>0;a--)    //此for語句用來顯示延時,使數據變化不那么快
  {
   if(RX==1) Timer_Count();   //如果收到回波則開始計算高電平脈寬及其顯示
  } 
 }
}
//**********************************中斷函數
void Timer0 () interrupt 1
{
 TH0=0;
 TL0=0;
 flag=1;    //中斷溢出標志
 RX=0;   //Echo腳置為低電平
}
 

關閉窗口