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单片机之温度传感器与液晶显示屏相关推荐

  1. 51单片机~DS18B20温度传感器

    51单片机~DS18B20温度传感器 (一)简介说明: (二)接线: 1. 内部结构: 正温度前五位是0. 负温度前五位是1. 由LS,MS组成的四位十六进制数,和16位二进制数.(先MS后LS) 结 ...

  2. 51单片机DS18B20温度传感器及数码管显示温度

    51单片机DS18B20温度传感器及数码管显示温度 大家好,今天给大家带来的代码及原理解释是,在51单片机在接收DS18B20温度传感器数据,并且在数码管上实时显示温度 DS18B20及数码管显示温度 ...

  3. 51单片机 | DS18B20 温度传感器实验

    文章目录 一.DS18B20介绍 二.硬件设计 三.软件设计 1.数码管显示函数 2.DS18B20 初始化函数及温度读取函数 4.主函数 四.实验现象   这一节我们来学习精度较高的外部 DS18B ...

  4. 51单片机DS18B20温度传感器使用及数码管温度计、LCD1602温度显示代码详解

    温馨提示:读者若要彻底理解并会灵活使用DS18B20温度传感器,请详细阅读中文手册,并且对照代码注释充分分析代码.请不要觉得中文手册内容繁多!如能静心分析,定能深有体会,获益匪浅! 一.DS18B20 ...

  5. 使用51单片机驱动YM12232B型液晶显示屏

    这是一个使用51单片机驱动YM12232B 液晶显示器的例子,本人水平有限,仅供参考. 本实例中将使用51单片机控制YM12232B LCD分别在主窗口和副窗口中显示"科"和&qu ...

  6. 4.5 51单片机-DS18B20温度传感器

    4.5 DS18B20温度传感器 4.5.1 原理图介绍 图4-5-1 图4-5-2 实验板上的DS18B20模块接在单片机的P3.5 IO口上,在插入DS18B20芯片时,圆弧朝上插入,具体效果可以 ...

  7. 51单片机DS18B20温度传感器详解

    DS18B20是一种单总线数字温度传感器,测试温度范围-55℃-125℃,具有体积小,硬件开销低,抗干扰能力强,精度高的特点.单总线,意味着没有时钟线,只有一根通信线.单总线读写数据是靠控制起始时间和 ...

  8. 51单片机DS18B20温度传感器原理及实验

    目录 DS18B20简介 外部结构 内部结构 数据温度的读取 实验 程序实现 附 DS18B20简介 DS18B20 是由 DALLAS 半导体公司推出的一种的"一线总线(单总线)" ...

  9. 【51单片机】温度传感器DS18B20原理

    简介 DS18B20数字温度传感器接线方便,封装后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式.主要根据应用场合的不同而改变其外观.封装后的DS18B20可用于电缆沟测温,高炉水循环测 ...

最新文章

  1. FFmpeg被声明为已否决的解决方案
  2. tomcat拒绝访问是为什么_Tomcat中的connectTimeout和慢攻击
  3. linux中进程退出函数:exit()和_exit()的区别
  4. 基于源码编辑器的跑酷游戏设计
  5. c语言求圆锥的表面积和体积_新人教版六年级下册第三单元《圆柱和圆锥》知识整理...
  6. mysql 之后_MYSQL登陆完之后如何操作???(新手求助)
  7. html调用静态json例子
  8. python爬虫动态解析js_Python爬虫实战入门五:获取JS动态内容—爬取今日头条
  9. java 中的原始类型与原始封装类型
  10. server 2008中新建AD域控制器
  11. Unity3D——SendMessage方法的使用
  12. A+B for Input-Output Practice (I)
  13. robot frame基础知识--变量
  14. hbm.xml支持的类型
  15. java打开dex文件_dex文件反编译工具(Dedexer)
  16. MySQL中的窗口函数
  17. pagesize==0异常问题
  18. matlab科研绘图模板,直接奉上源代码!
  19. scratch打棒球游戏 电子学会图形化编程scratch等级考试四级真题和答案解析2019-12
  20. PS的钢笔,路径,选取,描边(虚线)

热门文章

  1. 每日一记 - 3.6
  2. 深度linux禁用独立显卡,deepin显卡设置
  3. 关于做PDF的FAQ(一)~(四) 1
  4. 这些年盘过的航模、车模、船模
  5. c语言对称矩阵的压缩存储_C++实现对称矩阵的压缩存储 | 术与道的分享
  6. CSDN 博客 修改文章搜索为 bing 搜索,且只搜索自己的博客的方法
  7. 传统企业上云的三个正确姿势是什么?
  8. D1. Chopping Carrots (Easy Version)
  9. 富强鑫注塑机KEBA网口采集方案
  10. 微信小程序仿京东优惠券