51单片机之温度传感器与液晶显示屏
1、Proteus7.8仿真图:
2、程序代码如下:
#include <AT89X51.H>
#include <intrins.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned charsbit IO = P1^0;
sbit SCLK = P1^1;
sbit RST = P1^2; //pdf中的CE即是RST
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
sbit beep = P1^3;
sbit k1 = P3^0;
sbit k2 = P3^1;
sbit k3 = P3^2;
sbit k4 = P3^5;
sbit LED = P2^7;
sbit DQ = P3^3;uchar LCD_DQY_BUFFER1[30]={"DATE 00-00-00 00:00:00 00.0C"}; // buffer缓冲器 年 13个字符
uchar LCD_DQY_BUFFER2[]={"CLOCK 00:00:00 "}; //时间
uchar DateTime[7];uchar n=0, h=23,m=19,s=0,R=0;
uchar table[]={"0123456789"};
uchar ClockTime[7];uint dian;
uchar A;
uchar temp[6]={10,10,10,10,10,10};/*音乐部分*/
uchar timeh,timel;//用于存放定时器的高8位和低8位
uchar code jianpu[]={//定义<<送别>>简谱 每一个值第一位对应简谱的音调,第二位对应拍的长短
0x54,0x32,0x52,0x88,0x64,0x84,0x58,0x54,0x12,0x22,0x34,0x22,0x12,0x28,0x00,0x00,
0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0x92,0x18,0x00,0x00,
0x64,0x84,0x88,0x74,0x62,0x72,0x88,0x62,0x72,0x82,0x62,0x62,0x52,0x32,0x12,0x28,0x00,0x00,
0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0x92,0x18,0x00,0x00,
0x54,0x32,0x52,0x88,0x64,0x84,0x58,0x54,0x12,0x22,0x34,0x22,0x12,0x28,0x00,0x00,
0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0x92,0x18,0x00,0x00
};
//适合12M的晶振定时器初值表,高低8位分开
uchar code chuzhi[]=
{0xFF,0xFF, //占位0xFC,0x43, //中音1-70xFC,0xad,0xFD,0x0a,0xFD,0x34,0xFD,0x82,0xFD,0xc8,0xFE,0x06,0xFE,0x21, //高音10xFC,0x0C //低音7};
void timer0() interrupt 1 //定时器0(T0)中断服务程序
{TH0=timeh; //将timeh赋给计时器的高8位TL0=timel; //将timel赋给计时器的低8位beep=~beep; //定时器每次到时将蜂鸣器反相
}void delay(uchar z) //延时125MS,设为1个十六分音符,1/4拍
{ uint y;for(z;z>0;z--)for(y=15615;y>0;y--);
}void delay1(uchar z) //延时0.5MS
{ uchar y;for(z;z>0;z--)for(y=243;y>0;y--);
}void music()
{uchar temp; //存放简谱数组中的每一个音符的临时变量uchar i=0;uchar jp; //jp用于取出temp中的高8位和低8位IT0=1; //INT0TMOD=0x01; //设置定时器T0工作于方式1IE=0x82; //允许T0中断while(R==1){temp=jianpu[i];if(temp==0xff)break;jp=temp/16; //取数的高4位,音频数值if(jp!=0){timeh=chuzhi[jp*2]; //构造定时器初值高8位timel=chuzhi[jp*2+1]; //构造定时器初值低8位TR0=1; //开定时器}else{TR0=0; //关定时器beep=1; //关蜂鸣器}delay(temp%16); //取数的低4位,节拍(音符总时延)TR0=0; //唱完一个音停5MSbeep=1;delay1(10);i++;if(k4==0) //闹钟的控制键{R=0;m=m+5;}}
}/*1602部分*/
void DelayMS(uint ms) // 1
{uchar i;while(ms--){for(i=0;i<120;i++);}
}void Write_A_Byte_TO_DQ1302(uchar x) // 2 DQ1302写
{uchar i;for(i=0;i<8;i++){IO=x&0x01;SCLK=1;SCLK=0;x>>=1; //假设x=5,那么x的二进制为0101,x>>1表示x右移1位,即把最右边一位的1删掉,变为010,此时x=2} //
}uchar Get_A_Byte_FROM_DQ1302() // 3 DQ1302取
{uchar i,b=0x00;for(i=0;i<8;i++){b |= _crol_((uchar)IO,i); //左移 //SCLK=1;SCLK=0;}return b/16*10+b%16; //取完8个位,转为十六进制
}uchar Read_Data(uchar addr) // 4 DQ1302读取
{uchar dat;RST = 0;SCLK=0;RST=1;Write_A_Byte_TO_DQ1302(addr);dat = Get_A_Byte_FROM_DQ1302();SCLK=1;RST=0;return dat;
}void GetTime() // 5 获得DateTime[i]数组
{uchar i,addr = 0x81; //位址0x81为读秒,每次进2,直到0x8D读年for(i=0;i<7;i++){DateTime[i]=Read_Data(addr);addr+=2; //将dat放进数组中}
}uchar Read_LCD_State() // 6 1602
{uchar state;RS=0;RW=1;EN=1;DelayMS(1);state=P0;EN = 0;DelayMS(1);return state;
}void LCD_Busy_Wait() // 7
{while((Read_LCD_State()&0x80)==0x80); //当最高位为1时,延时5秒DelayMS(5);
}void Write_LCD_Data(uchar dat) // 8
{LCD_Busy_Wait();RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0; //dat为
}void Write_LCD_Command(uchar cmd) // 9 command命令 控制
{LCD_Busy_Wait();RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMS(1);EN=0; //cmd为地址
}void Init_LCD() // 10 初始化
{Write_LCD_Command(0x38); //显示16*2显示,5*7点阵,8位数据接口DelayMS(1);Write_LCD_Command(0x01); //显示清零,数据指针清零DelayMS(1);Write_LCD_Command(0x06); //写一个字符后地址指针加一DelayMS(1);Write_LCD_Command(0x0c); //设置开显示,不显示光标DelayMS(1);
}void Set_LCD_POS(uchar p) // 11
{Write_LCD_Command(p|0x80); //
}void Display_LCD_String(uchar p,uchar *s) //12 在LCD显示 Display_LCD_String(0x00,LCD_DQY_BUFFER1);
{uchar i;Set_LCD_POS(p); //p为液晶屏地址0x00for(i=0;i<25;i++){Write_LCD_Data(s[i+n]);DelayMS(1);}n++; DelayMS(500);if(n>16)n=0;
}void Display_LCD_String2(uchar p,uchar *s) //12 在LCD显示 Display_LCD_String(0x00,LCD_DQY_BUFFER1);
{uchar i;Set_LCD_POS(p); //p为液晶屏地址0x00for(i=0;i<16;i++){Write_LCD_Data(s[i]);DelayMS(1);}
}void Format_DateTime(uchar d,uchar *a) // 13 Format_DateTime(DateTime[6],LCD_DQY_BUFFER1+5);
{a[0]=d/10+'0'; //0’的ASCII值为48 加‘0’,是为了将前面的数字(1,2···)转换为ASCII码的值a[1]=d%10+'0';
}void Format_DateTime2(uchar d,uchar *a) // 13
{a[0]=d+'0';
}/*键盘扫描和设置闹钟时间*/
void keyscan()
{if(k1==0){DelayMS(100);if(k1==0) //时{h++;if(h>=24){ h=0; }while(!k1); //等待按键释放}}if(k2==0) //分{m=m+1;if(m>=60)m=0;while(!k2);}if(k3==0) //秒{s=s+1;if(s>=60)s=0;while(!k3);}if(k4==0) //控制键{R=0;}
}void GetClockTime()
{ClockTime[0] = h/10;ClockTime[1] = h%10;ClockTime[2] = m/10;ClockTime[3] = m%10;ClockTime[4] = s/10;ClockTime[5] = s%10;
}/*DQ18B20部分 */
void init_tempr()//DQ18B20初始化
{uchar n;DQ=1;DelayMS(8);DQ=0;DelayMS(80); //500usDQ=1;DelayMS(8);n=DQ;DelayMS(4);
}
void write_byte(uchar dat)
{uchar i;for(i=0;i<8;i++){DQ=0;DQ=dat&0x01;DelayMS(4);DQ=1;dat>>=1;}DelayMS(4);
}
uchar read_byte(void)
{uchar i,value;for(i=0;i<8;i++){DQ=0;value>>=1;DQ=1;if(DQ)value|=0x80;DelayMS(4);}return value;
}
uchar readtempr(void)
{uint temp, a,b;init_tempr();write_byte(0xcc);write_byte(0x44);DelayMS(300);init_tempr();write_byte(0xcc);write_byte(0xbe);DelayMS(300);a=read_byte();b=read_byte();temp=b;temp<<=4;temp+=(a&0xf0)>>4;dian=(a&0x0f)*10*6/10; // 小数位转化return temp;
}void dis_deal()
{temp[0]=A/10;temp[1]= A%10;temp[2]=dian/10 ;temp[3]=dian%10 ;
}/*主函数*/
void main()
{SCON = 0X40; // 串行口的工作模式选择TMOD = 0X20; // 定时器0方式2PCON = 0X00; // 波特率倍数TH1 = 0XFD;TL1 = 0XFD;TI = 0;TR1 = 1;TCON=0x05;PX1=1;PT0=0;EX1=1;Init_LCD();while(1){GetTime();Format_DateTime(DateTime[6],LCD_DQY_BUFFER1+5); //年Format_DateTime(DateTime[4],LCD_DQY_BUFFER1+8); //月Format_DateTime(DateTime[3],LCD_DQY_BUFFER1+11); //日Format_DateTime(DateTime[2],LCD_DQY_BUFFER1+14); //时Format_DateTime(DateTime[1],LCD_DQY_BUFFER1+17); //分Format_DateTime(DateTime[0],LCD_DQY_BUFFER1+20); //秒Display_LCD_String(0x00,LCD_DQY_BUFFER1);A=readtempr();dis_deal();Format_DateTime2(temp[0],LCD_DQY_BUFFER1+23); //Format_DateTime2(temp[1],LCD_DQY_BUFFER1+24); //Format_DateTime2(temp[2],LCD_DQY_BUFFER1+26); //keyscan();GetClockTime();Format_DateTime2(ClockTime[0],LCD_DQY_BUFFER2+6);Format_DateTime2(ClockTime[1],LCD_DQY_BUFFER2+7);Format_DateTime2(ClockTime[2],LCD_DQY_BUFFER2+9);Format_DateTime2(ClockTime[3],LCD_DQY_BUFFER2+10);Format_DateTime2(ClockTime[4],LCD_DQY_BUFFER2+12);Format_DateTime2(ClockTime[5],LCD_DQY_BUFFER2+13);Display_LCD_String2(0x40,LCD_DQY_BUFFER2);if( DateTime[2] == h && DateTime[1] == m){R=1; music();}else{R=0;}}
}
3、难点
在温度传感器,51单片机,液晶显示屏之间传递数据
在液晶屏上实现滚动显示
51单片机之温度传感器与液晶显示屏相关推荐
- 51单片机~DS18B20温度传感器
51单片机~DS18B20温度传感器 (一)简介说明: (二)接线: 1. 内部结构: 正温度前五位是0. 负温度前五位是1. 由LS,MS组成的四位十六进制数,和16位二进制数.(先MS后LS) 结 ...
- 51单片机DS18B20温度传感器及数码管显示温度
51单片机DS18B20温度传感器及数码管显示温度 大家好,今天给大家带来的代码及原理解释是,在51单片机在接收DS18B20温度传感器数据,并且在数码管上实时显示温度 DS18B20及数码管显示温度 ...
- 51单片机 | DS18B20 温度传感器实验
文章目录 一.DS18B20介绍 二.硬件设计 三.软件设计 1.数码管显示函数 2.DS18B20 初始化函数及温度读取函数 4.主函数 四.实验现象 这一节我们来学习精度较高的外部 DS18B ...
- 51单片机DS18B20温度传感器使用及数码管温度计、LCD1602温度显示代码详解
温馨提示:读者若要彻底理解并会灵活使用DS18B20温度传感器,请详细阅读中文手册,并且对照代码注释充分分析代码.请不要觉得中文手册内容繁多!如能静心分析,定能深有体会,获益匪浅! 一.DS18B20 ...
- 使用51单片机驱动YM12232B型液晶显示屏
这是一个使用51单片机驱动YM12232B 液晶显示器的例子,本人水平有限,仅供参考. 本实例中将使用51单片机控制YM12232B LCD分别在主窗口和副窗口中显示"科"和&qu ...
- 4.5 51单片机-DS18B20温度传感器
4.5 DS18B20温度传感器 4.5.1 原理图介绍 图4-5-1 图4-5-2 实验板上的DS18B20模块接在单片机的P3.5 IO口上,在插入DS18B20芯片时,圆弧朝上插入,具体效果可以 ...
- 51单片机DS18B20温度传感器详解
DS18B20是一种单总线数字温度传感器,测试温度范围-55℃-125℃,具有体积小,硬件开销低,抗干扰能力强,精度高的特点.单总线,意味着没有时钟线,只有一根通信线.单总线读写数据是靠控制起始时间和 ...
- 51单片机DS18B20温度传感器原理及实验
目录 DS18B20简介 外部结构 内部结构 数据温度的读取 实验 程序实现 附 DS18B20简介 DS18B20 是由 DALLAS 半导体公司推出的一种的"一线总线(单总线)" ...
- 【51单片机】温度传感器DS18B20原理
简介 DS18B20数字温度传感器接线方便,封装后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式.主要根据应用场合的不同而改变其外观.封装后的DS18B20可用于电缆沟测温,高炉水循环测 ...
最新文章
- FFmpeg被声明为已否决的解决方案
- tomcat拒绝访问是为什么_Tomcat中的connectTimeout和慢攻击
- linux中进程退出函数:exit()和_exit()的区别
- 基于源码编辑器的跑酷游戏设计
- c语言求圆锥的表面积和体积_新人教版六年级下册第三单元《圆柱和圆锥》知识整理...
- mysql 之后_MYSQL登陆完之后如何操作???(新手求助)
- html调用静态json例子
- python爬虫动态解析js_Python爬虫实战入门五:获取JS动态内容—爬取今日头条
- java 中的原始类型与原始封装类型
- server 2008中新建AD域控制器
- Unity3D——SendMessage方法的使用
- A+B for Input-Output Practice (I)
- robot frame基础知识--变量
- hbm.xml支持的类型
- java打开dex文件_dex文件反编译工具(Dedexer)
- MySQL中的窗口函数
- pagesize==0异常问题
- matlab科研绘图模板,直接奉上源代码!
- scratch打棒球游戏 电子学会图形化编程scratch等级考试四级真题和答案解析2019-12
- PS的钢笔,路径,选取,描边(虚线)