BH1750数字光强度测试仪设计LCD1602显示+51单片机C语言程序

合集下载

51单片机驱动LCD1602程序设计(C语言)

51单片机驱动LCD1602程序设计(C语言)
51 单片机驱动 LCD1602 程序设计(C 语言)
字符液晶绝大多数是基于 HD44780 液晶芯片的,控制原理是完全相同的,因此 HD44780 写 的控制程序可以很方便地应用于市面上大部分的字符型液晶。字符型 LCD 通常有 14 条引脚线或 16 条引脚线的 LCD,多出来的 2 条线是背光电源线 VCC(15 脚)和地线 GND(16 脚),其控制原理 与 14 脚的 LCD 完全一样,定义如下表所示:
for(i=0;i<count;i++) {
if (0 == y) x |= 0x80; //当要显示第一行时地址码+0x80; else x |= 0xC0; //在第二行显示是地址码+0xC0; Write_com(x); //发送地址码 Write_dat(*p); //发送要显示的字符编码 x++; p++; }
01110
○■■■○
10001
■○○○■
10001
■○○○■
10001
■○○○■
11111
■■■■■
10001
■○○○■
10001
■○○○■
上图左边的数据就是字模数据,右边就是将左边数据用“○”代表 0,用“■”代表 1。看出是个“A”
字了吗?在文本文件中“A”字的代码是 41H,PC 收到 41H 的代码后就去字模文件中将代表 A 字的
字符型 LCD 的引脚定义
HD44780 内置了 DDRAM、CGROM 和 CGRAM。DDRAM 就是显示数据 RAM,用来寄存 待显示的字符代码。共 80 个字节,其地址和屏幕的对应关系如下表:
也就是说想要在 LCD1602 屏幕的第一行第一列显示一个"A"字,就要向 DDRAM 的 00H 地址写 入“A”字的代码就行了。但具体的写入是要按 LCD 模块的指令格式来进行的。在 1602 中我们用前 16 个就行了。第二行也一样用前 16 个地址。对应如下:

基于51单片机的1602液晶显示温度和时间的C程序

基于51单片机的1602液晶显示温度和时间的C程序

//液晶显示温度#include "AT89X52.H"#define Ddata P0sbit RS=P2^7; //命令数据控制端sbit RW=P2^6; //读写选择端sbit LCDE=P2^5; //液晶使能端sbit DQ=P2^0; //ds18b20与单片机连接口#define uchar unsigned char#define uint unsigned intunsigned char hour=0,min=0,sec=0; //定义初值unsigned int count=0;unsigned char line1[16]={" temp: "}; //16个字符unsigned char line2[16]={" time: 00:00:00"}; //16个字符unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'}; //数组uchar data disdata[5];uint tvalue; //温度值uchar tflag; //温度正负标志void time();/*************************lcd1602程序**************************/ void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<110;j++);}void delay5ms()//延时5毫秒(不够精确的){unsigned int i;for (i=0;i<1000;i++);}void delay50us(){register int i;for (i=0;i<20;i++);}void delay(){unsigned char m,n;for(m=255;m>0;m--)for(n=255;n>0;n--);}void wr_com(unsigned char comm) //********写控制字符程序E=1 RS=0RW=0 **********//{LCDE=0; //使能端RS=0; //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。

LCD1602液晶显示C程序

LCD1602液晶显示C程序

1、关于1602液晶的电气参数一般市场上的1602液晶使用的驱动器为HD44780U或HD44780S,市场上大部分液晶用的是后者。

HD44780S的供电电压为5V±10%,而HD44780U的供电电压为2.7V~5.5V。

也就是说,绝大部分1602液晶只能工作在5V电压下,其供电电压必须为5V。

经过试验发现,1602液晶的供电虽然必须为5V,但其控制总线和数据总线可以用3.3V电平(因为对于TTL电平,一般大于2.5V以上都算高电平,不过最可靠的是大于3.6V),只不过在3.3V电平下,数据的通信速度会大大降低,这一点需要在写驱动时注意。

需要时,可以将MCU的IO配置为漏极开路方式,用上拉电阻拉到5V电平;实在不能配置为漏极开路方式时,请查阅MCU的电气参数,在允许的条件下,直接使用电阻弱上拉也可以。

2、硬件连接1602液晶可以使用4位或8位通信模式,通信可以是双向的或单向的,双向通信主要是为了读取LCD忙标志和AC地址寄存器和DDRAM和CGRAM中的值,一般用处不大,因为1602不支持点阵绘图功能。

在连接时,注意4位通信方式下,LCD只使用DB7~DB4,一般情况下会使用MCU 某端口的高4位或低4位与之连接,注意写驱动时在必要的情况下对端口的其它几位要保护,防止破坏其数据;当然如果没有使用其它4位时则不必要保护(奇怪,不使用其它4位干嘛用4位通信方式嘛?)。

还要注意的是,如果需要双向通信,则必须选择既能做输入又能做输出的IO口,特别是对于RS、RW和E这三条控制线,若能选择支持位寻址的IO口则可以方便编程。

3、底层驱动问题通用1602液晶的时序如图:(1)、写时序(2)、读时序总的说来,按照这个时序图来编写驱动程序是不会出什么问题的,只是要深刻理解时序图中各参数的涵义。

编程中要特别关注E这根控制线。

写操作的时序应该是:①、RS=0(写指令寄存器)或RS=1(写数据寄存器);②、RW=0(写操作);③、将数据写到数据线上;④、E=1;⑤、E=0 。

BH1750数字光强度测试仪设计LCD1602显示+51单片机C语言程序完整版

BH1750数字光强度测试仪设计LCD1602显示+51单片机C语言程序完整版

//***************************************// BH1750FVI IIC测试程序// 使用单片机STC89C51// 晶振:11.0592M// 显示:LCD1602// 作者:dice szj QQ:15023134// 编译环境Keil uVision2//****************************************#include <REG51.H>#include <math.h> //Keil library#include <stdio.h> //Keil library#include <INTRINS.H>#define uchar unsigned char#define uint unsigned int#define DataPort P0 //LCD1602数据端口sbit SCL=P1^0; //IIC时钟引脚定义sbit SDA=P1^1; //IIC数据引脚定义sbit LCM_RS=P2^4; //LCD1602命令端口sbit LCM_RW=P2^5; //LCD1602命令端口sbit LCM_EN=P2^6; //LCD1602命令端口#define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS 地址引脚不同修改//ALT ADDRESS引脚接地时地址为0x46,接电源时地址为0xB8typedef unsigned char BYTE;typedef unsigned short WORD;BYTE BUF[8]; //接收数据缓存区uchar ge,shi,bai,qian,wan; //显示变量int dis_data; //变量void delay_nms(unsigned int k);void InitLcd();void Init_BH1750(void);void WriteDataLCM(uchar dataW);void WriteCommandLCM(uchar CMD,uchar Attribc);void DisplayOneChar(uchar X,uchar Y,uchar DData);void conversion(uint temp_data);void Single_Write_BH1750(uchar REG_Address); //单个写入数据uchar Single_Read_BH1750(uchar REG_Address); //单个读取内部寄存器数据void Multiple_Read_BH1750(); //连续的读取内部寄存器数据//------------------------------------void Delay5us();void Delay5ms();void BH1750_Start(); //起始信号void BH1750_Stop(); //停止信号void BH1750_SendACK(bit ack); //应答ACKbit BH1750_RecvACK(); //读ackvoid BH1750_SendByte(BYTE dat); //IIC单个字节写BYTE BH1750_RecvByte(); //IIC单个字节读//-----------------------------------//*********************************************************void conversion(uint temp_data) // 数据转换出个,十,百,千,万{wan=temp_data/10000+0x30 ;temp_data=temp_data%10000; //取余运算qian=temp_data/1000+0x30 ;temp_data=temp_data%1000; //取余运算bai=temp_data/100+0x30 ;temp_data=temp_data%100; //取余运算shi=temp_data/10+0x30 ;temp_data=temp_data%10; //取余运算ge=temp_data+0x30;}//毫秒延时**************************void delay_nms(unsigned int k){unsigned int i,j;for(i=0;i<k;i++){for(j=0;j<121;j++){;}}}/*******************************/void WaitForEnable(void){DataPort=0xff;LCM_RS=0;LCM_RW=1;_nop_();LCM_EN=1;_nop_();_nop_();while(DataPort&0x80);LCM_EN=0;}/*******************************/void WriteCommandLCM(uchar CMD,uchar Attribc). {if(Attribc)WaitForEnable();LCM_RS=0;LCM_RW=0;_nop_(); DataPort=CMD;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;}/*******************************/void WriteDataLCM(uchar dataW){WaitForEnable();LCM_RS=1;LCM_RW=0;_nop_(); DataPort=dataW;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;}/***********************************/void InitLcd(){WriteCommandLCM(0x38,1); WriteCommandLCM(0x08,1); WriteCommandLCM(0x01,1); WriteCommandLCM(0x06,1); WriteCommandLCM(0x0c,1);}/***********************************/void DisplayOneChar(uchar X,uchar Y,uchar DData) {Y&=1;X&=15;if(Y)X|=0x40;X|=0x80;WriteCommandLCM(X,0);WriteDataLCM(DData);}/**************************************延时5微秒(STC90C52RC@12M)不同的工作环境,需要调整此函数,注意时钟过快时需要修改当改用1T的MCU时,请调整此延时函数**************************************/void Delay5us(){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}/**************************************延时5毫秒(STC90C52RC@12M)不同的工作环境,需要调整此函数当改用1T的MCU时,请调整此延时函数**************************************/void Delay5ms(){WORD n = 560;while (n--);}/**************************************起始信号**************************************/void BH1750_Start(){SDA = 1; //拉高数据线SCL = 1; //拉高时钟线Delay5us(); //延时SDA = 0; //产生下降沿Delay5us(); //延时SCL = 0; //拉低时钟线}/**************************************停止信号**************************************/void BH1750_Stop(){SDA = 0; //拉低数据线SCL = 1; //拉高时钟线Delay5us(); //延时SDA = 1; //产生上升沿Delay5us(); //延时}/**************************************发送应答信号入口参数:ack (0:ACK 1:NAK)**************************************/void BH1750_SendACK(bit ack){SDA = ack; //写应答信号SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线Delay5us(); //延时}/**************************************接收应答信号**************************************/bit BH1750_RecvACK(){SCL = 1; //拉高时钟线Delay5us(); //延时CY = SDA; //读应答信号SCL = 0; //拉低时钟线Delay5us(); //延时return CY;}/**************************************向IIC总线发送一个字节数据**************************************/void BH1750_SendByte(BYTE dat){BYTE i;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最高位SDA = CY; //送数据口SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线Delay5us(); //延时}BH1750_RecvACK();}/**************************************从IIC总线接收一个字节数据**************************************/BYTE BH1750_RecvByte(){BYTE i;BYTE dat = 0;SDA = 1; //使能内部上拉,准备读取数据, for (i=0; i<8; i++) //8位计数器{dat <<= 1;SCL = 1; //拉高时钟线Delay5us(); //延时dat |= SDA; //读数据SCL = 0; //拉低时钟线Delay5us(); //延时}return dat;}//*********************************void Single_Write_BH1750(uchar REG_Address){BH1750_Start(); //起始信号BH1750_SendByte(SlaveAddress); //发送设备地址+写信号BH1750_SendByte(REG_Address); //内部寄存器地址,// BH1750_SendByte(REG_data); //内部寄存器数据,BH1750_Stop(); //发送停止信号}//********单字节读取*****************************************/*uchar Single_Read_BH1750(uchar REG_Address){ uchar REG_data;BH1750_Start(); //起始信号BH1750_SendByte(SlaveAddress); //发送设备地址+写信号BH1750_SendByte(REG_Address); //发送存储单元地址,从0开始BH1750_Start(); //起始信号BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号REG_data=BH1750_RecvByte(); //读出寄存器数据BH1750_SendACK(1);BH1750_Stop(); //停止信号return REG_data;}*///*********************************************************////连续读出BH1750内部数据////*********************************************************void Multiple_read_BH1750(void){ uchar i;BH1750_Start(); //起始信号BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号for (i=0; i<3; i++) //连续读取2个地址数据,存储中BUF {BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据if (i == 3){BH1750_SendACK(1); //最后一个数据需要回NOACK }else{BH1750_SendACK(0); //回应ACK}}BH1750_Stop(); //停止信号Delay5ms();}//初始化BH1750,根据需要请参考pdf进行修改****void Init_BH1750(){Single_Write_BH1750(0x01);}//*********************************************************//主程序********//*********************************************************void main(){float temp;delay_nms(100); //延时100msInitLcd(); //初始化LCDInit_BH1750(); //初始化BH1750while(1) //循环{Single_Write_BH1750(0x01); // power onSingle_Write_BH1750(0x10); // H- resolution modedelay_nms(180); //延时180msMultiple_Read_BH1750(); //连续读出数据,存储在BUF中dis_data=BUF[0];dis_data=(dis_data<<8)+BUF[1]; //合成数据,即光照数据temp=(float)dis_data/1.2;conversion(temp); //计算数据和显示DisplayOneChar(0,0,'L');DisplayOneChar(1,0,'i');DisplayOneChar(2,0,'g');DisplayOneChar(3,0,'h');DisplayOneChar(4,0,'t');DisplayOneChar(5,0,':');DisplayOneChar(7,0,wan); //显示数据DisplayOneChar(8,0,qian);DisplayOneChar(9,0,bai);DisplayOneChar(10,0,shi);DisplayOneChar(11,0,ge);DisplayOneChar(13,0,'l'); //显示数单位DisplayOneChar(14,0,'x');}}。

51单片机驱动1602液晶显示器c程序

51单片机驱动1602液晶显示器c程序

51单片机驱动1602液晶显示器c程序/*程序效果:单片机控制液晶显示器1602 显示字母数字,用户自行更改io程序原创安全:51hei*/#includereg52.h //头文件#define uchar unsigned char //宏定义#define uint unsigned intuchar code table[]=“51HEI XING XING “ ; //显示的字母uchar code table1[]=“51HEI MCUXUE YUAU” ;sbit lcdrs=P1; //寄存器选择引脚sbit lcdwr=P1;//读写引脚sbit lcde=P1 ; //片选引脚void delay(uchar x) //延时子函数{uchar i,j;for(i=x;i0;i--) for(j=110;j0;j--);}void write_com(uchar com) //写指令子函数{ //根据1602 液晶显示器协议编写P2=com; lcdrs=0;lcdwr=0;delay(5);lcde=0; delay(5);lcde=1; }void write_dat(uchar dat) //写数据子函数{P2=dat; lcdrs=1;lcdwr=0;delay(5);lcde=0;delay(5);lcde=1;}void init() //初始化子函数{write_com(0x01); //清屏write_com(0x3f); //功能设置write_com(0x0d); //显示控制write_com(0x06); //输入方式设置}void main(){ uchar i; //定义局部变量init();write_com(0x80+0x02+0x10); //指针的位置for(i=0;i15;i++) //显示{ write_dat(table[i]); delay(50); //延时,用于调节速度不匹配}write_com(0x80+0x40+0x10);for(i=0;i16;i++){ write_dat(table1[i]); delay(50);}for(i=0;i16;i++){ write_com(0x18); delay(50);} while(1);}tips:感谢大家的阅读,本文由我司收集整编。

LCD1602控制C语言编程讲解

LCD1602控制C语言编程讲解

LCD1602之msp430单片机和C51单片机C语言/**************************************************************************/1.msp430单片机C语言/*************************************************************************/#include"msp430f6638.h"/*******************************************P5.3----E P57 P56 P55 P54 P53 P52 P51 P50P5.4----RSP5.5----RW P57 P56 RW RS E P52 P51 P50P2OUT---wdata********************************************/#define uchar unsigned char;#define uint unsigned int;//*********显示字符串可将字符串放入数组,例如显示ancd efdg******//**定义一个数组**//**uchar code ttt[]="ancd efdg";//字符串用双引号引起来,空格计入字符串的元素/*uchar code kkk[]="ffba ggddmm";//上句加空格9个元素,该句加两个空格12个元素/**********************************元素个数在循环显示时要使用*****/*********************为循环显示字符串还得定义一个变量**/// uchar n;/定义变量nvoid delay(int time) //延迟函数{while(time--); //延迟时间}void writeCommandLcd(unsigned char comd)// 写入命令{P5OUT &= ~0x10; //RS清0 (运算后P5=xxx0 xxxx,即RS=0其他位状态不变) P5OUT &= ~0x20; //RW清0 (运算后P5=xx0x xxxx, 即RW=0其他位状态不变) P5OUT &= ~0x08; //使能E清0 (运算后P5=xxxx 0xxx, 即E=0其他位状态不变)//上面三个语句执行完后P5OUT=xx000xxx,用P5OUT&=~0x38;可一次完成。

51单片机计算器1602显示程序

51单片机计算器1602显示程序
{
delay_jsq(5);
if(P2!=0xfb)
{
if(P2!=0xfb)
{
temp=P2&0xf0;
switch(temp)
{
case 0xe0:num=8;
break;
case 0xd0:num=9;
break;
case 0xb0:num=10;
break;
case 0x70:num=11;
case 0x70:num=7;
break;
}
}
while(P2!=0xfd);
if(j!=0)
{
write_lcd1602(0x01,0);
delay(1);
j=0;
}
if(num==4||num==5||num==6&&num!=7)//如果按下的是'4','5'或'6'
{
if(flag1==0)//没有按过符号键
break;
}
}
}
}
void main()
{
ini_lcd1602();
while(1)
{
keyscan_4_4();
}
}
write_lcd1602(0x06,0);
delay(1);
write_lcd1602(0x01,0);
delay(1);
num_1=0;
i=0;
j=0;
a=0; //第一个参与运算的数
b=0; //第二个参与运算的数
c=0;
flag1=0; //flag1表示是否有符号键按下,
fuhao=0; // fuhao表征按下的是哪个符号

LCD 1602静态显示程序(C语言例程)

LCD 1602静态显示程序(C语言例程)
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_init()
{//LCD初始化设定
lcd_wcmd(0x38);//
delay(1);
lcd_wcmd(0x0c);//
delay(1);
lcd_wcmd(0x06);//
#include <reg51.h>
#include <intrins.h>
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;
sbit rs= P2^0;//
sbit rw = P2^1;
sbit ep = P2^2;
* Description: *
*字符LCD显示演示程序*
*在第一行显示welcome *
*在第一行显示 *
* *
*******************************************************************************/
_nop_();
ep = 0;
}
lcd_pos(BYTE pos)
{//设定显示位置
lcd_wcmd(pos | 0x80);
}
lcd_wdat(BYTE dat)
{//写入字符显示数据到LCD
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P0 = dat;

我的51单片机之 液晶1602 的C语言和汇编编程

我的51单片机之 液晶1602 的C语言和汇编编程

//三次显示模式设置,不检测忙信号
//显示模式设置,开始要求每次检测忙信号 //关闭显示 //显示清屏 // 显示光标移动设置 // 显示开及光标设置
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
#include<reg51.h>
#include<intrins.h>
#define DBPort P1 //液晶数据口
sbit RW=P0^1; //寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器
sbit RS=P0^0; //读写信号线,高电平时进行读操作,低电平时进行写操作。
sbit E=P0^2;
void main(void) {
Delay400Ms(); Init(); //LCM 初始化 DisplayListChar(0, 1, uctech); DisplayListChar(0, 0, net); while(1); }
//第二行第一列开始 //第一行第一列开始
//写数据 void WriteData(unsigned char WD) {
ReadStatus(); //检测忙 DBPort = WD; RS = 1; RW = 0; E = 0; //可加小延时 delay(); E = 1; }
//写指令 void WriteCommand(unsigned char WC,BuysC) {
if (BuysC) ReadStatus(); DBPort = WC; RS = 0; RW = 0; E = 0; E = 1; }

LCD1602液晶显示实验实验报告及程序

LCD1602液晶显示实验实验报告及程序

LCD1602液晶显示实验实验报告及程序一、实验目的本次实验的主要目的是熟悉并掌握 LCD1602 液晶显示屏的工作原理和编程方法,能够成功实现字符在液晶屏幕上的显示和控制。

二、实验原理LCD1602 是一种工业字符型液晶,能够显示 16x2 个字符,即每行16 个字符,共 2 行。

它的工作原理是通过控制液晶分子的偏转来实现字符的显示。

LCD1602 有 16 个引脚,主要引脚功能如下:1、 VSS:接地。

2、 VDD:接电源(通常为+5V)。

3、 V0:对比度调整引脚,通过外接电位器来调节屏幕显示的对比度。

4、 RS:寄存器选择引脚,高电平时选择数据寄存器,低电平时选择指令寄存器。

5、 RW:读写选择引脚,高电平时进行读操作,低电平时进行写操作。

6、 E:使能引脚,下降沿触发。

7、 D0 D7:数据引脚,用于传输数据和指令。

LCD1602 的指令集包括清屏、归位、输入方式设置、显示开关控制、光标或显示移位、功能设置、CGRAM 和 DDRAM 地址设置以及读忙标志和地址等。

三、实验设备与材料1、单片机开发板2、 LCD1602 液晶显示屏3、杜邦线若干4、电脑四、实验步骤1、硬件连接将 LCD1602 的 VSS 引脚接地。

将 VDD 引脚接+5V 电源。

将 V0 引脚通过一个 10K 的电位器接地,用于调节对比度。

将 RS、RW、E 引脚分别连接到单片机的三个 I/O 口。

将 D0 D7 引脚连接到单片机的 8 个 I/O 口。

2、软件编程包含必要的头文件。

定义与 LCD1602 连接的 I/O 口。

编写初始化函数,包括设置显示模式、清屏、输入方式等。

编写写指令函数和写数据函数,用于向LCD1602 发送指令和数据。

编写显示字符串函数,实现字符在屏幕上的显示。

3、编译下载程序使用编译软件对编写的程序进行编译,生成可执行文件。

将可执行文件下载到单片机开发板中。

4、观察实验结果给开发板上电,观察 LCD1602 液晶显示屏上是否正确显示预设的字符。

lcd1602显示(c语言)简单测试

lcd1602显示(c语言)简单测试

因编译器出了问题,加汉字注释老是编译不能通过,故所加注释较少,看一下lcd1602的资料就明白了电路图如下(该图只是仿真图,做实物时要1脚应加一小电阻,实物中1602还有两个脚,是背光电源正负极,正极要加可变电阻调节亮度,网上能找到详细的电路图):原程序:#include<reg51.h>unsigned char code str1[]={"count: "};unsigned char data disdata[1];unsigned int snum=0;sbit RS=P3^0;sbit RW=P3^1;sbit EN=P3^2;void delay1ms(unsigned int t)延时{unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<100;j++);}void wr_com(unsigned char com)//写指令// { delay1ms(1);RS=0;RW=0;EN=0;P2=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据// { delay1ms(1);;RS=1;RW=0;EN=0;P2=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x08);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void numpro()循环显示数字{ delay1ms(250);delay1ms(250);if(snum==20)snum=0;elsesnum++;disdata[0]=snum/10+0x30;disdata[1]=snum%10+0x30;wr_com(0x86);wr_dat(disdata[0]);wr_com(0x87);wr_dat(disdata[1]);wr_com(0xc6);wr_dat(disdata[0]);wr_com(0xc7);wr_dat(disdata[1]);}void display(unsigned char *p)//显示字符串// {while(*p!='\0'){wr_dat(*p);p++;delay1ms(1);}}void main(){ lcd_init();wr_com(0x80);display(str1);wr_com(0xc0);display(str1);while(1){numpro(); }}。

51单片机 lcd1602测试C程序

51单片机 lcd1602测试C程序

51单片机 lcd1602测试C程序///原创,绝对正版...嘻嘻嘻~~~//********************************************************************** //lcd_1602测试C程序//RS接P2^5,RW接P2^6,E接P2^7,P0口为数据口//如果硬件正常,则在液晶屏幕上显示第一行为"Weclome!",第二行显示"Ilove you!"//**********************************************************************//********************************************************************** #include <reg51.h>sbit rs_1602=P2^5;sbit rw_1602=P2^6;sbit en_1602 =P2^7;#define lcd_data P0 //加上拉//********************************************************************** //1602LCD延时Zms函数//********************************************************************** void delay_1602(int z){ int x,y;for(x=0;x<z;x++)for(y=0;y<=111;y++);}//****************************************************************** **** //1602LCD写地址函数//****************************************************************** **** void adr_write(unsigned char adr){delay_1602(5);en_1602=0;rs_1602=0;rw_1602=0;en_1602=1;lcd_data=adr;en_1602=0;}//****************************************************************** **** //1602LCD写数据函数//****************************************************************** **** void ddr_write(unsigned char ddr){delay_1602(5);en_1602=0;rs_1602=1;rw_1602=0;en_1602=1;lcd_data=ddr;en_1602=0;}//****************************************************************** ****//1602LCD初始化函数//****************************************************************** ****void lcd_init(void){en_1602=0;adr_write(0x38); //两行显示,5*7模式adr_write(0x01);//清显示adr_write(0x0c); //整体显示打开,不显示光标adr_write(0x06);adr_write(0x80);//从第一行的第一个位置开始显示}//****************************************************************** ****//1602LCD显示字符串数据函数//****************************************************************** ****void str_write(unsigned char *str){while(*str!='\0'){ddr_write(*str);str++;}}//****************************************************************** ****//1602LCD显示定位函数//****************************************************************** ****void set_point(unsigned char x,y){if(!x)adr_write(0x80+y);elseadr_write(0x80+0x40+y);}void main(void){lcd_init(); //LCD1602初始化while(1){set_point(0,4);str_write("Welcome!");set_point(1,2);str_write("I love you!!"); }}。

计算机控制课程设计单片机光照强度检测系统本科论文

计算机控制课程设计单片机光照强度检测系统本科论文

摘要BH1750是一款新型的测光芯片,本设计系统就是基于BH1750设计的测光系统,它可以自动检测光照强度的强弱并显示让人们知道此时光照强度的强弱。

人们可以通过看此装置的显示了解现在的光照状态,做合理的光照调节。

该设计可分为三部分:即光照检测部分、信号处理部分、光强显示部分。

对于光照检测部分是利用BH1750作为检测元件及信号处理元件,其内部集成了AD转换芯片。

它可以完成从光强到电信号的转换并将信号处理进行处理。

对输入信号处理后,就可以用来显示了。

对于显示部分可利用LCD1602来显示,不同的光强对应于不同的数值,就能简单的显示出不同的光强了。

本设计就是由单片机STC89C52RC芯片,BH1750模块和1602液晶为核心,辅以必要的电路,构成了一个单片机光照强度检测系统。

该光照强度检测系统可以通过检测光照强度,使得光照在低于或高于一定强度的时候发出警示,是一种常用的测试仪器。

关键词:51单片机,LM7805,BH1750,1602液晶目录0 引言 (1)1设计内容与要求 (1)1.1 设计任务 (1)1.2 设计要求 (1)2 方案总体设计 (1)2.1 光照强度采集方案设计 (2)2.2 控制芯片及实现方案 (3)2.3 数据显示方案 (3)2.4 系统总体框图 (4)3 硬件设计 (5)3.1 单片机最小系统 (5)3.2 BH1750采集模块 (6)3.3 液晶显示模块 (6)3.4 系统电源 (7)3.5 整体电路和PCB图 (8)4 软件设计 (9)4.1 keil软件介绍 (9)4.2 程序流程图 (10)4.3 各模块程序 (10)5 仿真与实现 (15)5.1 Proteus软件介绍 (15)5.2 仿真过程 (16)5.3 实物制作与调试 (17)6 总结 (18)7 参考文献 (19)0 引言随着改革开放的不断深化和城镇化的不断发展,越来越多的人移居到城市生活,而这需要足够的食物作为支撑。

手把手教你使用LCD1602(C程序+每个语句的详细说明)

手把手教你使用LCD1602(C程序+每个语句的详细说明)
#ifndef __LCD_H__
#define __LCD_H__
#include<reg52.h> //包含单片机寄存器的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
#include<delay.h>
#include<hwjm.h>
//------------------------------------------------------------------------------
extern void LCDINT();//1602LCD初始化
//---------------------------------------------------------------------------------------------------
extern void lcd_set_mode(uchar DL, uchar N, uchar F);//功能设定/*显示设置函数*/
{
write_com(0x02);
}
//-------------------------------------------------------------------------------/*向LCM1602写命令*/
void write_com(uchar dictate)//将指令写入液晶
void lcd_display_mode(uchar D, uchar C,uchar B) //显示设置函数
{
unsigned char mode=0x08;
if(D) mode |= 0x04;//显示功能:0关1开

LCD1602液晶显示实验实验报告及程序

LCD1602液晶显示实验实验报告及程序

实验三LCD1602液晶显示实验姓名____ 专业____ 学号—成绩__________一、实验目的1.掌握Keil C51软件与proteus软件联合仿真调试的方法;2.掌握LCD1602液晶模块显示西文的原理及使用方法;3.掌握用8位数据模式驱动LCM1602液晶的C语言编程方法;4.掌握用LCM1602液晶模块显示数字的C语言编程方法。

二、实验仪器与设备1.微机一台C51集成开发环境仿真软件三、实验内容1.用Proteus设计一 LCD1602液晶显示接口电路。

要求利用P0口接LCD1602 液晶的数据端,~做LCD1602液晶的控制信号输入端。

~口扩展3个功能键K1~K3参考电路见后面。

2.编写程序,实现字符的静态和动态显示。

显示字符为第一行:“ 1•姓名全拼”,第二行:“ 2.专业全拼+学号” o3.编写程序,利用功能键实现字符的垂直滚动和水平滚动等效果显示。

显示字符为:“ 1.姓名全拼2.专业全拼+学号 EXP8 DISPLAY”主程序静态显示“ My in formation ! ”四、实验原理液晶显示的原理:采用的LCD显示屏都是由不同部分组成的分层结构,位于最后面的一层是由荧光物质组成的可以发射光线的背光层,背光层发出的光线在穿过第一层偏振过滤层之后进入包含成千上万水晶液滴的液晶层,液晶层中的水晶液滴都被包含在细小的单元格结构中,一个或多个单元格构成屏幕上的一个像素。

当LCD中的电极产生电场时,液晶分子就会产生扭曲,从而将穿越其中的光线进行有规则的折射,然后经过第二层过滤层的过滤在屏幕上显示出来。

1. LCD1602采用标准的14引脚(无背光)或16引脚(带背光)接口,各3.芯片时序表:4.1602LCD勺一般初始化(复位)过程(1)延时 15mso(2)写指令38H (不检测忙信号)。

(3)延时5ms(4)写指令38H (不检测忙信号)。

(5)延时5ms(6)写指令38H (不检测忙信号)。

基于51单片机的用 LCD1602 显示时钟的程序

基于51单片机的用 LCD1602 显示时钟的程序

用LCD1602 显示的时钟2012-04-30 15:04有这样一个题目:求一个为51 单片机编写的LCD 电子时钟的设计,简单就好!希望说一下怎么设计这个时钟,都需要些什么东西,最重要的——把这个设计需要的程序写出来。

设计的任务:以单片机控制的时钟,在LCD 显示器上显示当前的时间。

设计的基本要求:1.使用文字型LCD 显示器显示当前时间。

2.显示格式为“时时:分分:秒秒”。

3.用4个功能键操作来设置当前时间。

各个功能键的功能如下:K1:进入设置现在的时间。

K2:设置小时。

K3:设置分钟。

K4:确认完成设置。

4. 程序执行后工作指示灯LED 闪烁,表示程序开始执行,LCD 显示“00:00:00”,然后开始计时。

题目链接:/question/416705477.html//==================================================提到设计时钟,很多人都想到了时钟芯片DS1302,都说它简单、准确。

其实,这是个误区。

仅仅使用一般的单片机,简单的编程,达到相同DS1302 的准确度,并不是难事。

如果不要求计算平闰年、不要求分清大小月、不要求计算星期几,只是要求一个简单的时钟(及日历),用DS1302,就是自寻烦恼。

大家可以打开题目链接,看看其中的一些答案,就可以看出使用DS1302 是多么的繁琐了,简直就是一场噩梦。

做而论道以前就使用普通的单片机和LCD1602 设计过《时钟与日历》,程序设计的非常合理,时间精度就完全取决于晶振的精度。

设计出来的时钟,几个月都差不上一秒。

针对这个题目,做而论道翻出了以前的设计,删节了一些不需要的功能,设计出了符合题目要求的时钟,用PROTEUS 仿真截图如下:程序用C 语言编写,全部代码如下://---------------------------------------------------#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define KEY_IO P3#define LCD_IO P0sbit LCD_RS = P2^0;sbit LCD_RW = P2^1;sbit LCD_EN = P2^2;sbit SPK = P1^2;sbit LED = P2^4;bit new_s, modify = 0;char t0, sec = 50, min = 59, hour = 23;char code LCD_line1[] = "Designed by ZELD"; char code LCD_line2[] = "Timer: 00:00:00 "; char Timer_buf[] = "23:59:50";//---------------------------------------------------void delay(uint z){uint x, y;for(x = z; x > 0; x--) for(y = 100; y > 0; y--);//---------------------------------------------------void W_LCD_Com(uchar com) //写指令{LCD_RS = 0; LCD_IO = com; // LCD_RS和R/W都为低电平时,写入指令LCD_EN = 1; delay(5); LCD_EN = 0; //用EN输入一个高脉冲}//---------------------------------------------------void W_LCD_Dat(uchar dat) //写数据{LCD_RS = 1; LCD_IO = dat; // LCD_RS为高、R/W为低时,写入数据LCD_EN = 1; delay(5); LCD_EN = 0; //用EN输入一个高脉冲}//---------------------------------------------------void W_LCD_STR(uchar *s) //写字符串{while(*s) W_LCD_Dat(*s++);}//---------------------------------------------------void W_BUFF(void) //填写显示缓冲区{Timer_buf[7] = sec % 10 + 48; Timer_buf[6] = sec / 10 + 48;Timer_buf[4] = min % 10 + 48; Timer_buf[3] = min / 10 + 48;Timer_buf[1] = hour % 10 + 48;Timer_buf[0] = hour / 10 + 48;W_LCD_Com(0xc0 + 7); W_LCD_STR(Timer_buf);}//---------------------------------------------------uchar read_key(void){uchar x1, x2;KEY_IO = 255;x1 = KEY_IO;if (x1 != 255) {delay(100);x2 = KEY_IO;if (x1 != x2) return 255;while(x2 != 255) x2 = KEY_IO;if (x1 == 0x7f) return 0;else if (x1 == 0xbf) return 1;else if (x1 == 0xdf) return 2;else if (x1 == 0xef) return 3;else if (x1 == 0xf7) return 4;}return 255;//---------------------------------------------------void Init(){LCD_RW = 0;W_LCD_Com(0x38); delay(50);W_LCD_Com(0x0c);W_LCD_Com(0x06);W_LCD_Com(0x01);W_LCD_Com(0x80); W_LCD_STR(LCD_line1);W_LCD_Com(0xC0); W_LCD_STR(LCD_line2);TMOD = 0x01; //T0定时方式1TH0 = 0x4c;TR0 = 1; //启动T0PT0 = 1; //高优先级, 以保证定时精度ET0 = 1;EA = 1;}//---------------------------------------------------void main(){uint i, j;uchar Key;Init();while(1) {//-------------------------------if (new_s) { //如果出现了新的一秒, 修改时间new_s = 0; sec++; sec %= 60;if(!sec) { min++; min %= 60;if(!min) { hour++; hour %= 24;}}W_BUFF(); //写显示//-------------------------------if (!sec && !min) { //整点报时for (i = 0; i < 200; i++) {SPK = 0; for (j = 0; j < 100; j++);SPK = 1; for (j = 0; j < 100; j++);} }}//-------------------------------Key = read_key(); //读出按键switch(Key) { //分别处理四个按键case 0: modify = 1; break;case 1: if(modify) {min++; min %= 60; W_BUFF(); break;}case 2: if(modify) {hour++; hour %= 24; W_BUFF(); break;}case 3: modify = 0; break;} }}//---------------------------------------------------void timer0(void) interrupt 1 //T0中断函数, 50ms执行一次{TH0 = 0x4c;t0++; t0 %= 20; //20, 一秒钟if(t0 == 0) {new_s = 1; LED = ~LED;}if(modify) LED = 0;}//===================================================呵呵,全部程序,也不过120 行左右。

基于51单片机的液晶LCD1602显示程序源代码(带LCD1602液晶接口电路))

基于51单片机的液晶LCD1602显示程序源代码(带LCD1602液晶接口电路))

液晶LCD1602显示字符和数字程序源代码/***********************液晶LCD1602测试程序源代码*************************单片机型号:STC15W4K56S4,内部晶振:22.1184M。

功能:液晶LCD1602显示功能测试。

操作说明:液晶LCD1602显示字符和倒计时。

**************************************************************************/#include "stc15.h" //包含头文件stc15.h#include <intrins.h> //包含头文件intrins.h#define Busy 0x80 //LCD忙sbit LCD_D0 = P0^0; //LCD_D0对应P0.0sbit LCD_D1 = P0^1; //LCD_D1对应P0.1sbit LCD_D2 = P0^2; //LCD_D2对应P0.2sbit LCD_D3 = P0^3; //LCD_D3对应P0.3sbit LCD_D4 = P0^4; //LCD_D4对应P0.4sbit LCD_D5 = P0^5; //LCD_D5对应P0.5sbit LCD_D6 = P0^6; //LCD_D6对应P0.6sbit LCD_D7 = P0^7; //LCD_D7对应P0.7sbit LCD_RS = P1^0; //LCD_RS对应P1.0sbit LCD_RW = P1^1; //LCD_RW对应P1.1sbit LCD_EN = P3^4; //LCD_EN对应P3.4void delay(unsigned int t); //delay延时函数void delay_us(unsigned int t); //delay_us延时函数void delay_ms(unsigned int t); //delay_ms延时函数void Delay5Ms(void); //5Ms延时函数void GPIO_1602_Configuration(void); //LCD1602液晶IO口初始化void WriteDataLCD(unsigned char WDLCD); //LCD写数据函数void WriteCommandLCD(unsigned char WCLCD,BuysC); //LCD写命令函数unsigned char ReadDataLCD(void); //LCD读数据函数unsigned char ReadStatusLCD(void); //LCD读状态函数void LCDInit(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显示一个字符串unsigned char code welcome[] = {"Hello My Friends"};//液晶LCD1602显示Hello My Friendsunsigned char code countdown[] = {"CountDown: S"};//液晶LCD1602显示CountDown: Svoid delay(unsigned int t) //delay延时函数{while(t--);}void delay_us(unsigned int t) //delay_us延时函数{unsigned char i;while(t--){i=3;while(i--)delay(1);}}void delay_ms(unsigned int t) //delay_ms延时函数{while(t--){delay_us(t);}}void Delay5Ms(void) //5ms延时函数{unsigned int TempCyc = 3552;while(TempCyc--);}void GPIO_1602_Configuration(void) //LCD1602液晶IO口初始化{P0M1 = P3M1&0x00;P0M0 = P3M0&0x00;P1M1 = P3M1&0xfc;P1M0 = P3M0&0xfc;P3M1 = P4M1&0xef;P3M0 = P4M0&0xef;}unsigned char ReadStatusLCD(void) //测试LCD忙碌状态{LCD_D7 = 1; //LCD的D7置1LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 1; //LCD管脚RW设置成高电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 1; //LCD管脚E设置成高电平while(LCD_D7); //检测忙信号return(Busy); //表示当前忙}void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if(BuysC) ReadStatusLCD(); //根据需要检测忙LCD_EN = 0; //LCD管脚E设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 0; //LCD管脚RW设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时P0 = WCLCD; //将数据送入P0口,即写入指令或地址_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void WriteDataLCD(unsigned char WDLCD) //LCD写数据函数{ReadStatusLCD(); //读取LCD状态LCD_EN = 0; //LCD管脚E设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 1; //LCD管脚RS设置成高电平LCD_RW = 0; //LCD管脚RW设置成低电平P0 = WDLCD;//将数据送入P0口,即将数据写入液晶模块_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void LCDInit(void) //LCD初始化{WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);WriteCommandLCD(0x08,1); //关闭显示WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); //显示光标移动设置WriteCommandLCD(0x0C,1); //显示开及光标设置}void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCD(X,0); //这里不检测忙信号,发送地址码WriteDataLCD(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不能大于1 while (DData[ListLength]>=0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}void main(void){GPIO_1602_Configuration(); //LCD1602液晶IO口初始化delay_ms(10); //延时LCDInit(); //LCD1602初始化delay_ms(10); //延时DisplayListChar(0,0,welcome); //LCD1602显示Hello My Friends delay_ms(10); //延时DisplayListChar(0,1,countdown); //LCD1602显示CountDown: S delay_ms(10); //延时DisplayOneChar(14,1,0x39); //LCD1602显示9delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x38); //LCD1602显示8delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x37); //LCD1602显示7delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x36); //LCD1602显示6delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x35); //LCD1602显示5delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x34); //LCD1602显示4delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x33); //LCD1602显示3delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x32); //LCD1602显示2delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x31); //LCD1602显示1delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x30); //LCD1602显示0delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时while(1){;}}程序源代码是编译通过并在电路板上测试过参考液晶LCD1602接口电路图该程序的实际运行效果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//***************************************// BH1750FVI IIC测试程序// 使用单片机STC89C51// 晶振:11.0592M// 显示:LCD1602// 作者:dice szj QQ:15023134// 编译环境Keil uVision2//****************************************#include <REG51.H>#include <math.h> //Keil library#include <stdio.h> //Keil library#include <INTRINS.H>#define uchar unsigned char#define uint unsigned int#define DataPort P0 //LCD1602数据端口sbit SCL=P1^0; //IIC时钟引脚定义sbit SDA=P1^1; //IIC数据引脚定义sbit LCM_RS=P2^4; //LCD1602命令端口sbit LCM_RW=P2^5; //LCD1602命令端口sbit LCM_EN=P2^6; //LCD1602命令端口#define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS 地址引脚不同修改//ALT ADDRESS引脚接地时地址为0x46,接电源时地址为0xB8typedef unsigned char BYTE;typedef unsigned short WORD;BYTE BUF[8]; //接收数据缓存区uchar ge,shi,bai,qian,wan; //显示变量int dis_data; //变量void delay_nms(unsigned int k);void InitLcd();void Init_BH1750(void);void WriteDataLCM(uchar dataW);void WriteCommandLCM(uchar CMD,uchar Attribc);void DisplayOneChar(uchar X,uchar Y,uchar DData);void conversion(uint temp_data);void Single_Write_BH1750(uchar REG_Address); //单个写入数据uchar Single_Read_BH1750(uchar REG_Address); //单个读取内部寄存器数据void Multiple_Read_BH1750(); //连续的读取内部寄存器数据//------------------------------------void Delay5us();void Delay5ms();void BH1750_Start(); //起始信号void BH1750_Stop(); //停止信号void BH1750_SendACK(bit ack); //应答ACKbit BH1750_RecvACK(); //读ackvoid BH1750_SendByte(BYTE dat); //IIC单个字节写BYTE BH1750_RecvByte(); //IIC单个字节读//-----------------------------------//*********************************************************void conversion(uint temp_data) // 数据转换出个,十,百,千,万{wan=temp_data/10000+0x30 ;temp_data=temp_data%10000; //取余运算qian=temp_data/1000+0x30 ;temp_data=temp_data%1000; //取余运算bai=temp_data/100+0x30 ;temp_data=temp_data%100; //取余运算shi=temp_data/10+0x30 ;temp_data=temp_data%10; //取余运算ge=temp_data+0x30;}//毫秒延时**************************void delay_nms(unsigned int k){unsigned int i,j;for(i=0;i<k;i++){for(j=0;j<121;j++){;}}}/*******************************/void WaitForEnable(void){DataPort=0xff;LCM_RS=0;LCM_RW=1;_nop_();LCM_EN=1;_nop_();_nop_();while(DataPort&0x80);LCM_EN=0;}/*******************************/void WriteCommandLCM(uchar CMD,uchar Attribc) {if(Attribc)WaitForEnable();LCM_RS=0;LCM_RW=0;_nop_();DataPort=CMD;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;}/*******************************/void WriteDataLCM(uchar dataW){WaitForEnable();LCM_RS=1;LCM_RW=0;_nop_();DataPort=dataW;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;}/***********************************/void InitLcd(){WriteCommandLCM(0x38,1); WriteCommandLCM(0x08,1); WriteCommandLCM(0x01,1); WriteCommandLCM(0x06,1); WriteCommandLCM(0x0c,1);}/***********************************/void DisplayOneChar(uchar X,uchar Y,uchar DData) {Y&=1;X&=15;if(Y)X|=0x40;X|=0x80;WriteCommandLCM(X,0);WriteDataLCM(DData);}/**************************************延时5微秒(STC90C52RC@12M)不同的工作环境,需要调整此函数,注意时钟过快时需要修改当改用1T的MCU时,请调整此延时函数**************************************/void Delay5us(){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}/**************************************延时5毫秒(STC90C52RC@12M)不同的工作环境,需要调整此函数当改用1T的MCU时,请调整此延时函数**************************************/void Delay5ms(){WORD n = 560;while (n--);}/**************************************起始信号**************************************/void BH1750_Start(){SDA = 1; //拉高数据线SCL = 1; //拉高时钟线Delay5us(); //延时SDA = 0; //产生下降沿Delay5us(); //延时SCL = 0; //拉低时钟线}/**************************************停止信号**************************************/void BH1750_Stop(){SDA = 0; //拉低数据线SCL = 1; //拉高时钟线Delay5us(); //延时SDA = 1; //产生上升沿Delay5us(); //延时}/**************************************发送应答信号入口参数:ack (0:ACK 1:NAK)**************************************/void BH1750_SendACK(bit ack){SDA = ack; //写应答信号SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线Delay5us(); //延时}/**************************************接收应答信号**************************************/bit BH1750_RecvACK(){SCL = 1; //拉高时钟线Delay5us(); //延时CY = SDA; //读应答信号SCL = 0; //拉低时钟线Delay5us(); //延时return CY;}/**************************************向IIC总线发送一个字节数据**************************************/void BH1750_SendByte(BYTE dat){BYTE i;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最高位SDA = CY; //送数据口SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线Delay5us(); //延时}BH1750_RecvACK();}/**************************************从IIC总线接收一个字节数据**************************************/BYTE BH1750_RecvByte(){BYTE i;BYTE dat = 0;SDA = 1; //使能内部上拉,准备读取数据,for (i=0; i<8; i++) //8位计数器{dat <<= 1;SCL = 1; //拉高时钟线Delay5us(); //延时dat |= SDA; //读数据SCL = 0; //拉低时钟线Delay5us(); //延时}return dat;}//*********************************void Single_Write_BH1750(uchar REG_Address){BH1750_Start(); //起始信号BH1750_SendByte(SlaveAddress); //发送设备地址+写信号BH1750_SendByte(REG_Address); //内部寄存器地址,// BH1750_SendByte(REG_data); //内部寄存器数据,BH1750_Stop(); //发送停止信号}//********单字节读取*****************************************/*uchar Single_Read_BH1750(uchar REG_Address){ uchar REG_data;BH1750_Start(); //起始信号BH1750_SendByte(SlaveAddress); //发送设备地址+写信号BH1750_SendByte(REG_Address); //发送存储单元地址,从0开始BH1750_Start(); //起始信号BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号REG_data=BH1750_RecvByte(); //读出寄存器数据BH1750_SendACK(1);BH1750_Stop(); //停止信号return REG_data;}*///*********************************************************////连续读出BH1750内部数据////*********************************************************void Multiple_read_BH1750(void){ uchar i;BH1750_Start(); //起始信号BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号for (i=0; i<3; i++) //连续读取2个地址数据,存储中BUF {BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据if (i == 3){BH1750_SendACK(1); //最后一个数据需要回NOACK }else{BH1750_SendACK(0); //回应ACK}}BH1750_Stop(); //停止信号Delay5ms();}//初始化BH1750,根据需要请参考pdf进行修改****void Init_BH1750(){Single_Write_BH1750(0x01);}//*********************************************************//主程序********//*********************************************************void main(){float temp;delay_nms(100); //延时100msInitLcd(); //初始化LCDInit_BH1750(); //初始化BH1750while(1) //循环{Single_Write_BH1750(0x01); // power onSingle_Write_BH1750(0x10); // H- resolution modedelay_nms(180); //延时180msMultiple_Read_BH1750(); //连续读出数据,存储在BUF中dis_data=BUF[0];dis_data=(dis_data<<8)+BUF[1]; //合成数据,即光照数据temp=(float)dis_data/1.2;conversion(temp); //计算数据和显示DisplayOneChar(0,0,'L');DisplayOneChar(1,0,'i');DisplayOneChar(2,0,'g');DisplayOneChar(3,0,'h');DisplayOneChar(4,0,'t');DisplayOneChar(5,0,':');DisplayOneChar(7,0,wan); //显示数据DisplayOneChar(8,0,qian);DisplayOneChar(9,0,bai);DisplayOneChar(10,0,shi);DisplayOneChar(11,0,ge);DisplayOneChar(13,0,'l'); //显示数单位DisplayOneChar(14,0,'x');}}。

相关文档
最新文档