📄 text2.c
字号:
/****************************************************************************/
//头文件
#include <reg51.h>
#include <string.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define SLAVE 0x02 //从机地址
/****************************************************************************/
//引脚定义
sbit DQ = P1^0;
sbit ad = P1^1;
sbit SID = P1^3; //数据
sbit SCLK = P1^4; //时钟
sbit test = P1^2;
sbit k1=P0^2;
sbit k2=P0^7;
sbit a =P3^4;
sbit b =P3^5;
sbit P15=P1^5;
/*****************************************************************************/
/****************************************************************************/
//定义全局变量
uchar data shidu1,shidu2;
uchar data temp_data[2]={0x00,0x00};
uchar data display[5]={0x00,0x00,0x00,0x00,0x00};
uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
uint k=0;
int ot0;
/****************************************************************************/
/****************************************************************************/
//函数声明
void lcm_w_word(unsigned char *str) ; //写字符 例:lcm_w_word("您好!");
void lcm_w_test(bit start,unsigned char ddata); //(0,指令) (1,数据)
void lcm_w_byte(unsigned char bbyte); //写一个字节给lcm
void delaynms(unsigned int di); //延时
void lcm_init(void); //lcm初始化
void lcm_clr(void); //清屏
read_temp();
ow_reset(void);
void delay(int t);
void write_byte(uchar val);
uchar read_byte(void);
work_temp();
//void Timer0() interrupt 1 using 0;
void int0();
void int1();
out();
/********************************************************/
void DelayM(unsigned int a);
void DelayM(unsigned int a){//延时函数 1MS/次
unsigned char i;
while( --a != 0){
for(i = 0; i < 125; i++); //一个 ; 表示空语句,CPU空转。
} //i 从0加到125,CPU大概就耗时1毫秒
}
/**********************************************************************/
//延迟函数 11us
void delay(int t)
{
for(;t>0;t--);
}
//18B20复位函数
ow_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();
DQ=0;
delay(50);
DQ=1;
delay(6);
presence=DQ;
}
delay(45);
presence= ~DQ;
}
DQ=1;
}
//18B20写命令函数 向总线上写一个比特
void write_byte(uchar val)
{
uchar i;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();
DQ=val&0x01;
delay(6);
val=val/2;
}
DQ=1;
delay(1);
}
//18B20读1比特函数,从总线上读取一个字节
uchar read_byte(void)
{
uchar i;
uchar value=0;
for (i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ=0;
_nop_();_nop_();_nop_();_nop_();
DQ=1;_nop_();_nop_();_nop_();_nop_();
if(DQ)value|=0x80;
delay(6);
}
DQ=1;
return(value);
}
//读取温度函数
read_temp()
{
ow_reset();
write_byte(0xCC);
write_byte(0xBE);
temp_data[0]=read_byte();
temp_data[1]=read_byte();
ow_reset();
write_byte(0xCC);
write_byte(0x44);
}
work_temp()
{
uchar n=0;
if (temp_data[1]>127)
{
temp_data[1]=(256-temp_data[1]);
temp_data[0]=(256-temp_data[0]);
n=1;
}
display[4]=temp_data[0]&0x0f;
display[0]=ditab[display[4]];
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
display[3]=display[4]/100;
display[1]=display[4]%100;
display[2]=display[1]/10;
display[1]=display[1]%10;
if(!display[3])
{
display[3]=0x00;
if(!display[2])
{
display[2]=0x00;
}
}
if(n)
{
display[3]=0x0a;
}
}
/****************************************************************************/
//初始化LCM
void lcm_init(void) {
delaynms(100); //启动等待,等LCM讲入工作状态
lcm_w_test(0,0x30); //8 位介面,基本指令集
lcm_w_test(0,0x0c); //显示打开,光标关,反白关
lcm_w_test(0,0x01); //清屏,将DDRAM的地址计数器归零
delaynms(100); //启动等待,等LCM讲入工作状态
}
/******************************************************************************/
//写指令或数据 (0,指令) (1,数据)
void lcm_w_test(bit start, unsigned char ddata) {
unsigned char start_data,Hdata,Ldata;
if(start==0)
start_data=0xf8; //0:写指令
else
start_data=0xfa; //1:写数据
Hdata=ddata&0xf0; //取高四位
Ldata=(ddata<<4)&0xf0; //取低四位
lcm_w_byte(start_data); //发送起始信号
delaynms(5); //延时是必须的
lcm_w_byte(Hdata); //发送高四位
delaynms(5); //延时是必须的
lcm_w_byte(Ldata); //发送低四位
delaynms(5); //延时是必须的
}
/******************************************************************************/
//发送一个字节(底层函数)
void lcm_w_byte(unsigned char bbyte) {
unsigned char i;
for(i=0;i<8;i++){
SID=bbyte&0x80; //取出最高位
SCLK=1;
SCLK=0;
bbyte<<=1; //左移
}
}
/******************************************************************************/
//延时(LCM占用)
void delaynms(unsigned int di) {
unsigned int da,db;
for(da=0;da<di;da++);
for(db=0;db<10;db++);
}
/*****************************************************************************/
//清屏函数
void lcm_clr(void){
lcm_w_test(0,0x01);
delaynms(40); //启动等待,等LCM讲入工作状态
}
/*****************************************************************************/
//向LCM发送一个字符串,长度64字符之内。
//应用:lcm_w_word("您好!");
void lcm_w_word(unsigned char *str){
while(*str != '\0'){
lcm_w_test(1,*str++);
}
*str = 0;
}
void int0() interrupt 0 using 0
{
ot0=0;
lcm_clr();//清屏
while(ot0==!1)
{
lcm_w_word(" 进入设置系统 报警温度 ");//显示欢迎字
//----------|-------1-------|-------3-------|-------2-------|-------4-------|-----//标尺
// lcm_w_word(" ");//显示欢迎字
// lcm_w_word(" ");//显示欢迎字
// lcm_w_word(" ");//显示欢迎字
}
}
void int1() interrupt 2 using 1
{
lcm_clr();//清屏
ot0=1;
DelayM(500);
}
void ssio(void)interrupt 4 using 1
{
RI=0;
lcm_w_test(1,0x30+SBUF);
DelayM(1000);
//收到地址后翻转一次
}
/******************************************************************************
void Timer0() interrupt 1 using 0
{
out();
k=0;
}
out()
{
lcm_w_word(1,0x30+(k%10));
lcm_w_word(1,0x30+(k%100));
lcm_w_word(1,0x30+(k%1000));
lcm_w_word(1,0x30+(k%10000));
}
/*****************************************************************************/
//---主程序---//
main()
{
/* lcm_init();//初始化液晶显示器
lcm_w_word("调试串口中 ");
DelayM(1000);
P15=0x00;
TMOD=0x20; //T/C1定义为方式2
TL1=0xfd; //置初值
TH1=0xfd;
PCON=0x00;
TR1=1;
SCON=0xf0; //串行口为方式3
ES=1;EA=1; //开串行口中断
RI=1;
while(1);
*/
lcm_init();//初始化液晶显示器
lcm_clr();//清屏
// lcm_w_word("智能加湿器 ");
ow_reset();
write_byte(0xcc);
write_byte(0x44);
EX0=1;
EX1=1;
EA=1;
IT0=1;
IT1=1;
PX0=0;
PX1=1;
ad=0;
DelayM(10);
ad=1;
while(1)
{
read_temp();
work_temp();
lcm_w_word("作者王奇文 展钰");
lcm_w_word("温度");
// lcm_w_test(1,0x30+display[3]);
lcm_w_test(1,0x30+display[2]);
// lcm_w_test(1,0x30+display[1]);
lcm_w_test(1,0x30+display[0]);
lcm_w_word("度 ");
lcm_w_word("智能温度显示器 ");
DelayM(10);
// ad=1;
DelayM(1000);
lcm_clr();
}
//----------|-------1-------|-------3-------|-------2-------|-------4-------|-----//标尺
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -