单片机与LCD液晶显示器应用程序举例
单片机lcd液晶屏电子时钟C程序

单片机lcd液晶屏电子时钟C程序————————————————————————————————作者:————————————————————————————————日期:/********************************************************************* 文件名:液晶1602显示.c* 描述: 该程序实现了对液晶1602的控制。
* 创建人:东流,2009年4月10日* 版本号:2.0***********************************************************************/ #include<reg52.h>#define uchar unsigned char#define uint unsigned intuint count,t;int shi=1,fen=11,miao=22,nian=12,yue=7,ri=1;uchar shijian[16]={"time 00-00-00 t"},shijian1[16]={"date 00-00-00 "};//这三个引脚参考资料sbit E=P2^7; //1602使能引脚sbit RW=P2^6; //1602读写引脚sbit RS=P2^5; //1602数据/命令选择引脚sbit LE = P3^7;sbit key1 = P3^2; //小时修改建sbit key2 = P3^3; //分钟修改键sbit key3 = P3^4; //显示选择键/********************************************************************* 名称: delay()* 功能: 延时,延时时间大概为5US。
* 输入: 无* 输出: 无***********************************************************************/void delay(){uint n=250;while(n--);}/********************************************************************* 名称: bit Busy(void)* 功能: 这个是一个读状态函数,读出函数是否处在忙状态* 输入: 输入的命令值* 输出: 无***********************************************************************/ bit Busy(void){bit busy_flag = 0;RW = 1;E = 1;delay();busy_flag = (bit)(P0 & 0x80);E = 0;return busy_flag;}/********************************************************************* 名称: wcmd(uchar del)* 功能: 1602命令函数* 输入: 输入的命令值* 输出: 无***********************************************************************/ void wcmd(uchar del){while(Busy());RS = 0;RW = 0;E = 0;delay();P0 = del;delay();E = 1;delay();E = 0;}/********************************************************************* 名称: wdata(uchar del)* 功能: 1602写数据函数* 输入: 需要写入1602的数据* 输出: 无***********************************************************************/void wdata(uchar del){while(Busy());RS = 1;RW = 0;E = 0;delay();P0 = del;delay();delay();E = 0;}/********************************************************************* 名称: L1602_init()* 功能: 1602初始化,请参考1602的资料* 输入: 无* 输出: 无***********************************************************************/void L1602_init(void){wcmd(0x38);wcmd(0x0c);wcmd(0x06);wcmd(0x01);}void timeInit(){TMOD = 0X01; //定义定时器1工作方式16位定时c/t选为定时器GATE 选TR1控制TL0 = (65536-10000)%256;TH0 = (65536-10000)/256;TR0=1;EA=1;ET0=1;}void timeint() interrupt 1{TL0 = (65536-10000)%256;TH0 = (65536-10000)/256;count++;}/****************************时间日期设定*************************/void shijianxian(){if(count>=100){miao++;count=0;}if(miao>=60){fen++;miao=0;}if(fen>=60){shi++;fen=0;}if(shi>=24){ri++;shi=0;}if(ri>30){yue++;ri=1;}if(yue>12){nian++;;yue=1;}if(nian==99){nian=0;}if((key1==0)&((t%6)==0)){delay();if((key1==0)&((t%6)==0)){shi++;if(shi>23) shi=0;}delay();}if((key3==0)&((t%6)==0)){delay();if((key3==0)&((t%6)==0)){shi--;if(shi<0) shi=23;}}if((key1==0)&((t%6)==1)){delay();if((key1==0)&((t%6)==1)){fen++;if(fen>59) fen=0;}delay();}if((key3==0)&((t%6)==1)){delay();if((key3==0)&((t%6)==1)){fen--;if(fen<0) fen=59;}delay();}if((key1==0)&((t%6)==2)){delay();if((key1==0)&((t%6)==2)) yue++;delay();}if((key1==0)&((t%6)==3)){delay();if((key1==0)&((t%6)==3)) ri++;delay();}}/**********************************时间显示*******************************/void shijianxian1(){shijian[6]=shi/10+48;shijian[7]=shi%10+48;shijian[9]=fen/10+48;shijian[10]=fen%10+48;shijian[12]=miao/10+48;shijian[13]=miao%10+48;shijian[8]=45;shijian[11]=45;shijian[15]=t+48;}/**********************************日期显示*******************************/void riqi(){shijian1[6]=nian/10+48;shijian1[7]=nian%10+48;shijian1[9]=yue/10+48;shijian1[10]=yue%10+48;shijian1[12]=ri/10+48;shijian1[13]=ri%10+48;shijian1[8]=45;shijian1[11]=45;}/********************************************************************* 名称: Main()* 功能: 主函数* 输入: 无* 输出: 无***********************************************************************/ void Main(){uint i;L1602_init();timeInit();while(1){shijianxian();shijianxian1();if(key2==0){delay();if( (key2==0))t++;if(t>=6) t=0;delay();}riqi();for(i=0;i<16;i++){wcmd(0xc0+i);wdata(shijian[i]);wcmd(0x80+i);wdata(shijian1[i]);}}}。
单片机控制lcd显示

实验三矩阵键盘检测一、实验目的:掌握键盘的识辨方法及键盘消抖知识。
二、实验要求:依次按动键盘,使LED数码管依次显示0—F。
请自行设计电路、编写程序。
三、实验原理:通过在Keil C51中对单片机AT89C52进行编程,硬件电路中单片机P2口与4×4键盘矩阵连接,P0口与七段数码管连接。
通过keyscan()子程序进行键盘扫描,返回键值并显示在数码管上。
四、实验电路图:五、程序代码:/*16键盘3数码管显示平方,使用P0+锁存器控制3个LED*/#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar keyscan();uchar num,num1,num2,temp,bai,shi,ge;void display(uchar bai,uchar shi,uchar ge);uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=100;y>0;y--);}void main(){while(1){num2=keyscan();P3=table[num2];}}uchar keyscan()//行扫描方法识别矩阵键盘{P2=0xfe;temp=P2;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P2;temp=temp&0xf0;if(temp!=0xf0){temp=P2;switch(temp){case 0xee:num=0;break;case 0xde:num=1;break;case 0xbe:num=2;break;case 0x7e:num=3;break;}}}P2=0xfd;temp=P2;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P2;temp=temp&0xf0;if(temp!=0xf0){temp=P2;switch(temp){case 0xed:num=4;break;case 0xdd:num=5;break;case 0xbd:num=6;break;case 0x7d:num=7;break;}}}P2=0xfb;temp=P2;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P2;temp=temp&0xf0;if(temp!=0xf0){temp=P2;switch(temp){case 0xeb:num=8;break;case 0xdb:num=9;break;case 0xbb:num=10;break;case 0x7b:num=11;break;}}}P2=0xf7;temp=P2;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P2;temp=temp&0xf0;if(temp!=0xf0){temp=P2;switch(temp){case 0xe7:num=12;break;case 0xd7:num=13;break;case 0xb7:num=14;break;case 0x77:num=15;break;}}}return num;}。
单片机控制LCD液晶显示器(含程序)

液晶显示器一.实验目的:1.了解全点阵图形LCD的结构和原理掌握在MSP430上如何使用外设。
2.了解LCD显示器的工作原理、种类(笔段型、点阵字符型、点阵图形)及主要性能指标。
3.掌握图形点阵LCD的编程使用方法;理解LCD显示模块命令的种类、功能及使用方法。
4.了解LCD字符生成软件的使用方法(见附录)。
二.实验内容:1.在LCD上显示Hello和中文字“南京工业大学”。
2.通过键盘控制Hello或者中文字符在LCD上左右、上下移动。
3.学会使用字符生成软件来实现任意字符代码的生成和显示。
4.其他另外可以实现的目标:使字符在按键没有松动的情况下连续移动;实现字符的循环移动,即当字符串移动到边界时仍可以移动,显示不完的部分从另一边显示出来。
三.实验原理:1.图形点阵式液晶原理液晶是一种具有规则性分子排列的有机化合物,它既不是液体也不是固体,而是介于固态和液态之间的物质。
液晶具有电光效应和偏光特性,这是它能用于显示的主要原因。
常用的液晶显示器可分成3类,分别是扭曲向列型(Twisted Nematic)、超扭曲向列型(Super TN)和彩色薄膜型。
字符点阵式属于扭曲向列型LCD。
典型的字符点阵式液晶显示器是由控制器、驱动器、字符发生器ROM、字符发生器RAM和液晶屏组成,字符由5*7 点阵或5*10点阵组成。
一般结果如图一所示:图一 128x64 点阵图形液晶模块方框示意图此次实验所用的LCD型号是RT12864CT。
12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128*64全点阵液晶显示器组成。
可完成图形显示,也可以显示8*4个(16*16)汉字。
管脚号管脚名称LEVER 管脚功能描述1 VSS 0 电源地2 VDD +5.0V 电源电压3 V0 - 液晶显示器驱动电压4 D/I(RS) H/L D/I=“H”,表示DB7∽DB0为显示数据D/I=“L”,表示DB7∽DB0为显示指令数据5 R/W H/L R/W=“H”,E=“H”数据被读到DB7∽DB0R/W=“L”,E=“H→L”数据被写到IR或DR6 E H/ R/W=“L”,E信号下降沿锁存DB7∽DB0R/W=“H”,E=“H”DDRAM数据读DB7∽DB07 DB0 H/L 数据线8 DB1 H/L 数据线9 DB2 H/L 数据线10 DB3 H/L 数据线11 DB4 H/L 数据线12 DB5 H/L 数据线13 DB6 H/L 数据线14 DB7 H/L 数据线15 CS1 H/L H:选择芯片(右半屏)信号16 CS2 H/L H:选择芯片(左半屏)信号17 RET H/L 复位信号,低电平复位18 VOUT -10V LCD驱动负电压19 LED+ - LED背光板电源20 LED- - LED背光板电源表1:12864LCD的引脚说明128x64 点阵图形液晶模块的内部结构可分为三个部分:LCD 控制器,LCD 驱动器,LCD 显示装置。
单片机与液晶显示屏的接口设计与形显示应用案例

单片机与液晶显示屏的接口设计与形显示应用案例在电子产品中,单片机与液晶显示屏的接口设计至关重要。
本文将介绍单片机与液晶显示屏的接口设计原理,并结合一个实际案例,详细说明其应用过程。
接口设计原理单片机是一种集成了微处理器、存储器和IO接口等功能于一体的芯片。
而液晶显示屏是一种利用电压控制液晶分子排列方向来呈现图像的显示设备。
要使单片机与液晶显示屏正常工作,首先需要设计一个合适的接口。
接口设计的主要原则包括:电平匹配、速度匹配、稳定性和可靠性。
在连接单片机和液晶显示屏时,需要根据它们的电气特性,选择合适的电平转换电路,保证信号传输的稳定性和可靠性。
此外,需要考虑数据传输速度的匹配,确保数据能够及时准确地传输。
形显示应用案例以一个简单的温度计设计为例,介绍单片机与液晶显示屏的接口设计与显示应用过程。
假设我们使用STM32单片机和16x2字符液晶显示屏。
接口设计步骤如下:1. 连接单片机和液晶显示屏。
2. 设计并实现驱动程序,包括初始化液晶显示屏、发送数据等功能。
3. 编写主程序,采集温度传感器数据,并将其显示在液晶显示屏上。
通过以上步骤,我们可以实现一个简单的温度计应用。
当温度传感器检测到环境温度变化时,单片机采集温度数据,并将其实时显示在液晶显示屏上,方便用户观察。
总结单片机与液晶显示屏的接口设计是电子产品中的重要环节,合理的接口设计可以有效提高产品的性能和稳定性。
通过一个温度计设计案例,我们可以更好地理解接口设计的过程和应用。
希望以上内容对您有所帮助。
单片机与LCD显示屏接口技术原理及应用实践

单片机与LCD显示屏接口技术原理及应用实践概述单片机与LCD显示屏的接口技术是现代电子设备中广泛应用的一项重要技术。
它使得单片机能够与液晶显示屏进行通信,实现信息的输入与输出。
本文将介绍单片机与LCD显示屏接口的原理、常用接口类型以及在实际应用中的应用实践。
一、单片机与LCD显示屏接口原理单片机与LCD显示屏之间通过接口进行数据的传输和控制命令的发送。
接口主要包括数据总线、控制线以及时钟信号。
数据总线用于传输图像数据和字符数据,控制线用于发送控制命令,时钟信号用于同步数据传输。
1.1 数据总线数据总线是单片机与LCD显示屏之间进行数据传输的通道。
位数不同的单片机使用的数据总线宽度也不同,例如8位单片机使用8位数据总线,16位单片机使用16位数据总线。
数据总线的宽度决定了单次传输的数据量,进而影响了图像显示的分辨率和刷新速度。
1.2 控制线控制线用于发送控制命令,例如清屏命令、光标移动命令等。
控制线的数量取决于显示屏的功能需求,常见的控制线包括使能线(EN)、读写线(R/W)、数据/命令选择线(RS)等。
1.3 时钟信号时钟信号用于同步单片机与LCD显示屏之间的数据传输。
单片机通过时钟信号来控制数据的发送和接收时间。
时钟信号的频率决定了数据传输的速度,而数据传输的速度则影响了图像显示的刷新率。
二、常用单片机与LCD显示屏接口类型常见的单片机与LCD显示屏接口类型包括并行接口和串行接口。
2.1 并行接口并行接口是指单片机与LCD显示屏之间通过多根线同时传输数据和控制命令。
并行接口的优点是传输速度快,数据传输稳定可靠,适用于要求高刷新率和高分辨率的应用场景。
然而,并行接口需要占用较多的IO口,使得接口的布线复杂。
2.2 串行接口串行接口是指单片机与LCD显示屏之间通过一根线逐位传输数据和控制命令。
串行接口的优点是占用IO口较少,布线简单,适用于资源有限的应用场景。
然而,串行接口传输速度较慢,对刷新率和分辨率要求较低。
51单片机控制1602LCD显示程序

LCD显示电路#include<reg51.h>sbit RS=P3^7; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P3^6; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^7; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,将BF位定义为P0.7引脚#define Lcd_Data P0#include <string.h>#include<intrins.h> //包含_nop_()函数定义的头文件unsigned char code string1[ ]={0x77,0x75,0x20,0x79,0x61,0x6E,0x67,0x20,0x79,0x61,0x6E,0x67,0x20,0x20,0x20,0x20}; //第一行显示的字符void Lcd_delay1ms() // 函数功能:延时1ms//注:不同单片机不同晶振需要对此函数进行修改{ unsigned char i,j;for(i=0;i<90;i++)for(j=0;j<33;j++);}void Lcd_delay(unsigned int n) // 函数功能:延时若干毫秒,入口参数:n{ unsigned int i;for(i=0;i<n;i++)Lcd_delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。
result=1,忙碌;result=0,不忙***************************************************/bit Lcd_BusyTest(void)bit result;RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;E=1; //E=1,才允许读写_nop_(); //空操作_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间result=BF; //将忙碌标志电平赋给resultE=0;return result;}/*****************************************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate***************************************************/void Lcd_WriteCom (unsigned char dictate){ while(Lcd_BusyTest()==1); //如果忙就等待RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0;E=0; //E置低电平(写指令时就是让E从0到1发生正跳变,所以应先置ぜ? _nop_();_nop_(); //空操作两个机器周期,给硬件反应时间Lcd_Data=dictate; //将数据送入P0口,即写入指令或地址_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:指定字符显示的实际地址x入口参数:注:此函数已经加上了0x80,故只需写上实际地址就行***************************************************/void Lcd_WriteAddress(unsigned char x){ Lcd_WriteCom(x|0x80); //显示位置的确定方法规定为80H+地址码x/*****************************************************函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y(为字符常量)***************************************************/void Lcd_WriteData(unsigned char y){while(Lcd_BusyTest()==1);RS=1; //RS为高电平,RW为低电平时,可以写入数据RW=0;E=0; //E置低电平(写指令时就是让E从0到1发生正跳变所以应先置ぜ?Lcd_Data=y; //将数据送入P0口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:对LCD的显示模式进行初始化设置***************************************************/void Lcd_Int(void){Lcd_delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间Lcd_WriteCom(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口Lcd_delay(5); //延时5msLcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);设置模式次写9// Lcd_WriteCom(0x38);Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x0C); //显示模式设置:显示开,有光标,光标闪烁Lcd_delay(5);Lcd_WriteCom(0x06); //显示模式设置:光标右移,字符不移Lcd_delay(5);Lcd_WriteCom(0x01); //清屏幕指令,将以前的显示内容清零Lcd_delay(5); }void hanying_show(void){unsigned char Lcd_i;Lcd_WriteCom(0x01);//清显示:清屏幕指令Lcd_delay(2);Lcd_WriteAddress(0x00); // 设置显示位置为最左侧Lcd_delay(2);Lcd_i=0;while(string1[Lcd_i]!='\0') //'\0'是数组结束标志需先将字符存入{Lcd_WriteData(string1[Lcd_i]); // 显示字符Lcd_i++;Lcd_delay(4);}}void main(){Lcd_Int(); //1602初始化while(1){hanying_show();}}。
单片机连接串口液晶屏C语言程序

// 接收数据缓存定义, 液晶屏写单片机命令字指令只有 8 字节 #define COMMADN_MAXLENGTH 8 char rCommand[COMMADN_MAXLENGTH]; int rCommandLength=0; // 发送数据缓存定义,本例中一次最多发 30 个寄存器,故长度为 30*2+7=67 #define DATA_MAXLENGTH 67 char sCommand[DATA_MAXLENGTH]; int param1; // 参数 1 是串口屏通过写寄存器 9 设置给单片机的参数 int param2; // 参数 2 是串口屏通过写寄存器 10 设置给单片机的参数 int outstatus; // 输出控制是串口屏通过写寄存器 11 设置给单片机的输出控制状态 static float CosineTable[91] = { { 1.000000 },{ 0.999848 },{ 0.999391 },{ 0.998630 },{ 0.997564 }, { 0.996195 },{ 0.994522 },{ 0.992546 },{ 0.990268 },{ 0.987688 }, { 0.984808 },{ 0.981627 },{ 0.978148 },{ 0.974370 },{ 0.970296 }, { 0.965926 },{ 0.961262 },{ 0.956305 },{ 0.951057 },{ 0.945519 }, { 0.939693},{ 0.933580 },{ 0.927184 },{ 0.920505 },{ 0.913545 }, { 0.906308 },{ 0.898794 },{ 0.891007 },{ 0.882948 },{ 0.874620 }, { 0.866025 },{ 0.857167 },{ 0.848048 },{ 0.838671 },{ 0.829038 }, { 0.819152 },{ 0.809017 },{ 0.798636 },{ 0.788011 },{ 0.777146 }, { 0.766044 },{ 0.754710 },{ 0.743145 },{ 0.731354 },{ 0.719340 }, { 0.707107 },{ 0.694658 },{ 0.681998 },{ 0.669131 },{ 0.656059 }, { 0.642788 },{ 0.629320 },{ 0.615661 },{ 0.601815 },{ 0.587785 }, { 0.573576 },{ 0.559193 },{ 0.544639 },{ 0.529919 },{ 0.515038 }, { 0.500000 },{ 0.484810 },{ 0.469472 },{ 0.453990 },{ 0.438371 }, { 0.422618 },{ 0.406737 },{ 0.390731 },{ 0.374607 },{ 0.358368 }, { 0.342020 },{ 0.325568 },{ 0.309017 },{ 0.292372 },{ 0.275637 }, { 0.258819 },{ 0.241922 },{ 0.224951 },{ 0.207912 },{ 0.190809 }, { 0.173648 },{ 0.156434 },{ 0.139173 },{ 0.121869 },{ 0.104528 }, { 0.087156 },{ 0.069756 },{ 0.052336 },{ 0.034899 },{ 0.017452 }, { 0.000000 } };
基于MSP430单片机的液晶LCD048应用程序

基于MSP430单片机的液晶LCD048应用程序TI公司系列是一种超低功耗的混合信号控制器,其中包括一系列器件,它们针对不用的应用由不同的模块组成。
其中FLASH系列使高效系统变得轻便,FLASH存储器也具有很强的灵便性。
同时为了在低频率的驱动下得到较高的稳定频率,某些MSP430器件上用法了锁频技术FLL或增加型锁频环技术FLL+。
如MSP430F425的时钟模块中用法了FLL+技术,这样可以得到稳定的频率。
液晶驱动MSP430器件上的液晶的控制/驱动将简化液晶显示器的显示。
不同型号的液晶驱动能力不同,我们采纳 MSP430的F42X系列,有128段驱动能力。
液晶的驱动有4种办法:静态,2MUX或1/2占空比,3MUX或1/3占空比, 4MUX或1/4占空比。
对于不同系列、不同型号的液晶驱动原理,控制办法都是一样的,不同点在于驱动液晶段数不一样,或可显示信息的多少不一样。
我们采纳4MUX,这种方式也最容易。
其中需要注重以下两点:(1)液晶的偏压。
因为液晶驱动用法沟通,所以必需按照液晶的工作模MSP430举行偏压设置,详细的操作是:STATIC模式下,R33开路,R03-R23接地,2MUX模式下,分离在R33、R13以及R13、R03之间接上 10K的;3/4MUX模式下,分离在R33、R23之间,R23、R13以及R13、R03之间接上10K的电阻,这样就能保证COM0-COM3 出来供应液晶块的电压符合要求。
(2)频率的设置。
MSP430有三种时钟ACLK(辅助时钟)、MCLK(主时钟)、SMCLK(子时钟),其中液晶的驱动频率FCLK来自ACLK。
在XTIN和XTOUT之间接上振荡频率为32KHz的晶振,Fclk可以按照需要选为1024Hz、512Hz、256Hz、128Hz等。
由FRFQ0和FRFQ1的设置可以满足不同液晶对频率的要求,其中Flcd=2*MUX(rate)*F(framing)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DisplayOneChar(6,0,minite/10+0x30);//液晶上显示分
/*******************************************************************
智能温控器
问题描述:当温控开关打开时,若测得环境温度大于设定温度,则继电器吸合
,启动压缩机工作;若测得环境温度小于设定温度,则继电器释放,
压缩机停止工作。
该实验可以应用于对温度控制精度要求不是很高的场合,例如,粮仓,
void WriteDataLCM(uchar WDLCM); //写数据到LCM子函数
void DisplayOneChar(uchar X,uchar Y,uchar DData); //显示指定坐标的一个字符子函数
void DisplayListChar(uchar X,uchar Y,uchar code *DData); //显示指定坐标的一串字符子函数
uchar code str1[]={"SET: C SA: . C"};
void delay_LCM(uint);//LCD延时子程序
void initLCM( void);//LCD初始化子程序
void lcd_wait(void);//LCD检测忙子程序
void WriteCommandLCM(uchar WCLCM,uchar BusyC); //写指令到ICM子函数
LCM_EN=0;
}
*******************************************************************/
#include<reg51.h>
#include<intrins.h>
#include <absacc.h>
#define uchar unsigned char
WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号
}
/****************显示指定坐标的一个字符子函数*************/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
Y&=1;
X&=15;
a=ReadOneChar();//读取温度值低位
b=ReadOneChar();//读取温度值高位
temp1=b<<4;
temp1+=(a&0xf0)>>4;
temp2=a&0x0f;
temp=((b*256+a)>>4); //当前采集温度值除16得实际温度值
}
/***************液晶显示子函数1正常显示*****************/
LCM_RS=1; //选中数据寄存器
LCM_RW=0;//写模式
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}
/***********lcm内部等待函数*************/
void lcd_wait(void)
{
DATAPORT=0xff;
LCM_EN=1;
void WriteOneChar(uchar dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}
/**************读取ds18b20当前温度************/
void init_timer0(void);//定时器初始化
void displayfun1(void);
void displayfun2(void);
void displayfun3(void);
void displayfun4(void);
void keyscan(void );//键盘扫描子程序
if(Y)X|=0x40; //若y为1(显示第二行),地址码+0X40
X|=0x80; //指令码为地址码+0X80
WriteCommandLCM(X,0);
WriteDataLCM(DData);
}
/***********显示指定坐标的一串字符子函数***********/
void DisplayListChar(uchar X,uchar Y,uchar code *DData)
{
DATAPORT=0;
delay_LCM(15);
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
delay_LCM(5);
WriteCommandLCM(0x38,0);
delay_LCM(5);
WriteCommandLCM(0x38,0);
delay_LCM(5);
LCM_RS=0;
LCM_RW=1;
_nop_();
while(DATAPORT&BUSY)
{ LCM_EN=0;
_nop_();
_nop_();
LCM_EN=1;
_nop_();
_nop_();
}
LCM_EN=0;
}
/**********LCM初始化子函数***********/
void initLCM( )
{
uchar ListLength=0;
Y&=0x01;
X&=0x0f;
while(X<16)
{
DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++;
}
}
/***********ds18b20延迟子函数(晶振12MHz)*******/
void delay_18B20(unsigned int i)
#define uint unsigned int
#define BUSY 0x80 //lcd忙检测标志
#define DATAPORT P0 //定义P0口为LCD通讯端口
#define PLAYE_ADDR XBYTE[0XBFFF] //语音报警地址
sbit RED_ALARM=P1^0;//红色指示灯
sbit WRITE_ALARM=P1^1;//白色指示灯
sbit GREEN_ALARM=P1^2;//绿色指示灯
sbit P1_4=P1^4;//时钟调整
sbit P1_5=P1^5;//时钟加
sbit P1_6=P1^6;//时钟减
sbit DQ = P2^4;//定义ds18b20通信端口
sbit LCM_RS=P2^0;//数据/命令端
[2]《电子制作》2006.11
[3]
注意:此文档为仿真程序,若要在试验板上验证,需要须改一下函数
void lcd_wait(void)
{
DATAPORT=0xff;
LCM_EN=1;
LCM_RS=0;
LCM_RW=1;
_nop_();
while(DATAPORT&BUSY);
delay_18B20(100); // this message is wery important
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
delay_18B20(100);
{
while(i--);
}
/**********ds18b20初始化函数**********************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(8); //稍做延时
DQ = 0; //单片机将DQ拉低
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/*************ds18b20写一个字节****************/
void displayfun1(void)
{
WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示,不闪烁,检测忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
DisplayOneChar(3,0,hour/10+0x30);//液晶上显示小时
void ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作