|
程序和原理图如下,蜂鸣器一直响,LCD只亮不显示,什么情况?
程序:
- /*************定义接口********************
- P0------DB0~DB7 (LCD1602)
- P2.5------RS (LCD1602)
- P2.6------RW (LCD1602)
- P2.7------E (LCD1602)
- P3.5------SOUNDER (蜂鸣器)
- P3.6------SCK (SHT10) //时钟
- P3.7------DATA (SHT10) //数据
- *****************************************/
- #include <AT89x52.h>
- #include <intrins.h>
- #include <math.h> //Keil library
- #include <stdio.h> //Keil library
- #define TEMPUP 24 //温度上限, 达到该温度蜂鸣器报警
- typedef unsigned char BYTE;
- typedef unsigned int WORD;
- typedef bit BOOL ;
- /*******************************************/
- sbit buzzer = P3^5; //蜂鸣器
- BOOL start;
- /******************************************/
- //************第一部分LCD1602设置******
- //START*************************************/
- #define LCD_DB P0
- sbit LCD_RS=P2^5; //P2^5是p2.5
- sbit LCD_RW=P2^6; //P2^6是p2.6
- sbit LCD_E=P2^7; //P2^7是p2.7
- /******定义函数****************/
- #define uchar unsigned char
- #define uint unsigned int
- void LCD_init(void); //初始化函数
- void LCD_write_command(uchar command); //写指令函数
- void LCD_write_data(uchar dat); //写数据函数
- void LCD_disp_char(uchar x,uchar y,uchar dat);//在某个屏幕位置上显示一个字符,X(0-15),y(1-2)
- void LCD_disp_str(uchar x,uchar y,uchar *str); //LCD1602显示字符串函数
- void delay_n10us(uint n); //延时函数
- /*--------------------------------------
- ;初始化LCD1602
- ;-------------------------------------*/
- void LCD_init(void)
- {
- delay_n10us(10);
- LCD_write_command(0x38);//设置8位格式,2行,5x7
- delay_n10us(10);
- LCD_write_command(0x0c);//整体显示,关光标,不闪烁
- delay_n10us(10);
- LCD_write_command(0x06);//设定输入方式,增量不移位
- delay_n10us(10);
- LCD_write_command(0x01);//清除屏幕显示
- delay_n10us(100); //延时清屏,延时函数,延时约n个10us
- }
- /*--------------------------------------
- ;LCD1602写指令函数
- ;-------------------------------------*/
- void LCD_write_command(uchar dat)
- {
- delay_n10us(10);
- LCD_RS=0; //指令
- LCD_RW=0; //写入
- LCD_E=1; //允许
- LCD_DB=dat;
- delay_n10us(10);
- LCD_E=0;
- delay_n10us(10);
- }
- /*--------------------------------------
- ;LCD1602写数据函数
- ;-------------------------------------*/
- void LCD_write_data(uchar dat)
- {
- delay_n10us(10);
- LCD_RS=1; //数据
- LCD_RW=0; //写入
- LCD_E=1; //允许
- LCD_DB=dat;
- delay_n10us(10);
- LCD_E=0;
- delay_n10us(10);
- }
- /*--------------------------------------
- ;LCD1602显示一个字符函数,在某个屏幕位置上显示一个字符,X(0-15),y(1-2)
- ;-------------------------------------*/
- void LCD_disp_char(uchar x,uchar y,uchar dat)
- {
- uchar address;
- if(y==1)
- address=0x80+x;
- else
- address=0xc0+x;
- LCD_write_command(address);
- LCD_write_data(dat);
- }
- /*--------------------------------------
- ;LCD1602显示字符串函数,在某个屏幕起始位置{X(0-15),y(1-2)}上显示一个字符串
- ;-------------------------------------*/
- void LCD_disp_str(uchar x,uchar y,uchar *str)
- {
- uchar address;
- if(y==1)
- address=0x80+x;
- else
- address=0xc0+x;
- LCD_write_command(address);
- while(*str!='\0')
- {
- LCD_write_data(*str);
- str++;
- }
- }
- /*--------------------------------------
- ;延时函数,延时约n个10us
- ;-------------------------------------*/
- void delay_n10us(uint n) //延时n个10us@12M晶振
- {
- uint i;
- for(i=n;i>0;i--)
- {
- _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- }
- }
- //***************第一部分LCD1602设置*******
- //END****************************************
- //*************第二部分SHT10设置*************
- //START****************************************
- sbit SCK = P3^6; //定义通讯时钟端口
- sbit DATA = P3^7; //定义通讯数据端口
- typedef union //定义了两个共用体
- { unsigned int i;
- float f;
- }value;
- enum {TEMP,HUMI}; //TEMP=0,HUMI=1
- #define noACK 0 //用于判断是否结束通讯
- #define ACK 1 //结束数据传输
- //adr command r/w
- #define STATUS_REG_W 0x06 //000 0011 0
- #define STATUS_REG_R 0x07 //000 0011 1
- #define MEASURE_TEMP 0x03 //000 0001 1
- #define MEASURE_HUMI 0x05 //000 0010 1
- #define RESET 0x1e //000 1111 0
- /****************定义函数****************/
- void s_transstart(void); //启动传输函数
- void s_connectionreset(void); //连接复位函数
- char s_write_byte(unsigned char value);//SHT10写函数
- char s_read_byte(unsigned char ack); //SHT10读函数
- char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode);//测量温湿度函数
- void calc_SHT10(float *p_humidity ,float *p_temperature);//温湿度补偿
- /*--------------------------------------
- ;启动传输函数
- ;-------------------------------------*/
- void s_transstart(void)
- {
- DATA=1; SCK=0; //Initial state
- _nop_();
- SCK=1;
- _nop_();
- DATA=0;
- _nop_();
- SCK=0;
- _nop_();_nop_();_nop_();
- SCK=1;
- _nop_();
- DATA=1;
- _nop_();
- SCK=0;
- }
- /*--------------------------------------
- ;连接复位函数
- ;-------------------------------------*/
- void s_connectionreset(void)
- {
- unsigned char i;
- DATA=1; SCK=0;
- for(i=0;i<9;i++)
- {
- SCK=1;
- SCK=0;
- }
- s_transstart();
- }
- /*--------------------------------------
- ;SHT10写函数
- ;-------------------------------------*/
- char s_write_byte(unsigned char value)
- {
- unsigned char i,error=0;
- for (i=0x80;i>0;i/=2) //shift bit for masking
- {
- if (i & value) DATA=1; //masking value with i , write to SENSI-BU
- else DATA=0;
- SCK=1; //clk for SENSI-BUS
- _nop_();_nop_();_nop_(); //pulswith approx. 3 us
- SCK=0;
- }
- DATA=1; //release DATA-line
- SCK=1; //clk #9 for ack
- error=DATA; //check ack (DATA will be pulled down by SHT11),DATA在第9个上升沿将被SHT10自动下拉为低电
- _nop_();_nop_();_nop_();
- SCK=0;
- DATA=1; //release DATA-line
- return error; //error=1 in case of no acknowledge //返回:0成功,1失败
- }
- /*--------------------------------------
- ;SHT10读函数
- ;-------------------------------------*/
- char s_read_byte(unsigned char ack)
- {
- unsigned char i,val=0;
- DATA=1;
- for (i=0x80;i>0;i/=2)
- { SCK=1;
- if (DATA) val=(val | i);
- _nop_();_nop_();_nop_();
- SCK=0;
- }
- if(ack==1)DATA=0;
- else DATA=1; //如果是校验(ack==0),读取完后结束通讯
- _nop_();_nop_();_nop_();
- SCK=1;
- _nop_();_nop_();_nop_();
- SCK=0;
- _nop_();_nop_();_nop_();
- DATA=1;
- return val;
- }
- /*--------------------------------------
- ;测量温湿度函数
- ;-------------------------------------*/
- char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
- {
- unsigned error=0;
- unsigned int i;
- s_transstart();
- switch(mode)
- {
- case TEMP : error+=s_write_byte(MEASURE_TEMP); break;
- case HUMI : error+=s_write_byte(MEASURE_HUMI); break;
- default : break;
- }
- for (i=0;i<65535;i++)
- if(DATA==0) break;
- if(DATA) error+=1;
- *(p_value) =s_read_byte(ACK);
- *(p_value+1)=s_read_byte(ACK);
- *p_checksum =s_read_byte(noACK);
- return error;
- }
- /*--------------------------------------
- ;温湿度补偿函数
- ;-------------------------------------*/
- void calc_SHT10(float *p_humidity ,float *p_temperature)
- { const float C1=-4.0;
- const float C2=+0.0405;
- const float C3=-0.0000028;
- const float T1=+0.01;
- const float T2=+0.00008;
- float rh=*p_humidity;
- float t=*p_temperature;
- float rh_lin;
- float rh_true;
- float t_C;
- t_C=t*0.01 - 40;
- rh_lin=C3*rh*rh + C2*rh + C1;
- rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;
- if(rh_true>100)rh_true=100;
- if(rh_true<0.1)rh_true=0.1;
- *p_temperature=t_C;
- *p_humidity=rh_true;
- }
- //**********第二部分SHT10设置***************
- //END****************************************
- //*********主函数*****************
- void main(void)
- {
- value humi_val,temp_val;
- unsigned char error,checksum;
- unsigned int wendu,shidu;
- LCD_init();
- s_connectionreset();
- LCD_disp_str(0,1,"TE ");
- LCD_disp_str(0,2,"RH ");
- //*********初始化温度显示区*********
- LCD_disp_str(2,1,"TTT.T C");
- //*********初始化湿度显示区*********
- LCD_disp_str(2,2,"RRR.R%");
- delay_n10us(20000); //延时0.2s
- while(1)
- { error=0;
- error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI);
- error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP);
- if(error!=0) s_connectionreset();
- else
- { humi_val.f=(float)humi_val.i;
- temp_val.f=(float)temp_val.i;
- calc_SHT10(&humi_val.f,&temp_val.f);
- wendu=10*temp_val.f;
- LCD_disp_char(2,1,wendu/1000+'0'); //显示温度百位
- LCD_disp_char(3,1,(wendu%1000)/100+'0'); //显示温度十位
- LCD_disp_char(4,1,(wendu%100)/10+'0'); //显示温度个位
- LCD_disp_char(6,1,(wendu%10)+'0'); //显示温度小数点后第一位
- shidu=10*humi_val.f;
- LCD_disp_char(2,2,shidu/1000+'0'); //显示湿度百位
- LCD_disp_char(3,2,(shidu%1000)/100+'0'); //显示湿度十位
- LCD_disp_char(4,2,(shidu%100)/10+'0'); //显示湿度个位
- LCD_disp_char(6,2,(shidu%10)+'0'); //显示湿度小数点后第一位
- }
- delay_n10us(80000); //延时约0.8s }
- }
- }
复制代码
|
|