基于51单片机的1602液晶频率计设计(Proteus仿真图和程序)

合集下载

51单片机1602液晶显示频率计

51单片机1602液晶显示频率计

摘要在电子领域内,频率是一种最基本的参数,并与其他许多电参量的测量方案和测量结果都有着十分密切的关系。

由于频率信号抗干扰能力强、易于传输,可以获得较高的测量精度。

因此,频率的测量就显得尤为重要,测频方法的研究越来越受到重视。

频率计作为测量仪器的一种,常称为电子计数器,它的基本功能是测量信号的频率和周期频率计的应用范围很广,它不仅应用于一般的简单仪器测量,而且还广泛应用于教学、科研、高精度仪器测量、工业控制等其它领域。

随着微电子技术和计算机技术的迅速发展,特别是单片机的出现和发展,使传统的电子侧量仪器在原理、功能、精度及自动化水平等方面都发生了巨大的变化,形成一种完全突破传统概念的新一代侧量仪器。

频率计广泛采用了高速集成电路和大规模集成电路,使仪器在小型化、耗电、可靠性等方面都发生了重大的变化。

目前,市场上有各种多功能、高精度、高频率的数字频率计,但价格不菲。

为适应实际工作的需要,本次设计给出了一种较小规模和单片机(AT89S52)相结合的频率计的设计方案,不但切实可行,而且体积小、保密性强、设计简单、成本低、精度高、可测频带宽,大大降低了设计成本和实现复杂度。

频率计的硬件电路是用Protel绘图软件绘制而成,软件部分的单片机控制程序,是以KeilC做为开发工具用C语言编写而成,而频率计的实现则是选用Ptotues仿真软件来进行模拟和测试。

关键词:单片机;AT89S52;频率计;C语言ABSTRACTIn the electronic field, frequency is a kind of most basic parameter, and all there are close relations in the measurement schemes of many other electric parameters and result of measuring. Because the signal anti-interference ability of frequency is strong, easy to transmit, can obtain higher measurement precision. So, the measurement of frequency seems particularly important, the research of the method is being paid attention to.The Frequency meter, as one kind of the measuring instrument, often called the electronic counter, its basic function is that frequency and application of cycle Frequency meter of measuring the signal are in a very large range, it not only applies to general simple instrument measurement but also apply to other fields such as teaching, scientific research, high-accuracy instrument measuring, industrial control extensively. With the rapid development of microelectric technique and computer technology, especially appearance and development of the one-chip computer, the instruments have all changed enormously in such aspects as principle, function, precision and automatic level to enable the traditional electronic side amount, form a kind of side amount instrument of new generation that totally broke through the traditional concept. The Frequency meter has adopted the high-speed integrated circuit and large scale integrated circuit extensively, make the instrument change greatly in such aspects as miniaturize, power consumptive, dependability. At present, there are various digital Frequency meter of multi-function, high precision, high frequency on the market, but the price is high.In order to meet the need of the real work, design and provide one this time The design plan of Frequency meter combining with one-chip computer (AT89S52) on a small scale, not only feasible, and small, of good security, design simply, with low costs, the precision is high, can examine the bandwidth frequently, have reduced the design cost and realized complexity greatly. The hardware circuit of the Frequency meter is drawing with Protel mapping software, the one-chip computer control procedure of the software part, regarded KeilC as the developing instrument to write in C language, but the realization of the Frequency meter was to select to carry on imitating and test with Protues artificial software. Key Words:single chip computer; AT89S52; frequency meter; C language目录1 绪论.................................................... 错误!未指定书签。

基于51单片机的1602液晶频率计设计(Proteus仿真图和程序)

基于51单片机的1602液晶频率计设计(Proteus仿真图和程序)

基于51单片机的1602液晶频率计设计一、Proteus仿真图:二、程序代码//最大测量65536Hz的频率计//原理:T0定时1S,T1计数#include <REG51.H>#include<INTRINS.H>#define uchar unsigned char#define uint unsigned intuint count=0;uint nm=0;uchar Fw,Fq,Fb,Fs,Fg;#define DataPort P0sbit LCM_RS=P2^0;sbit LCM_RW=P2^1;sbit LCM_EN=P2^2;uchar code str0[]={"-Test frequency-"};uchar code str1[]={"F=00000Hz "};//uchar code str2[]={" "};/*******************************/void delay(unsigned int k){unsigned int i,j;for(i=0;i<k;i++){for(j=0;j<121;j++){;}}}//=================================================///* 函数名:void WaitForEnable(void)作用:检测忙碌信号*///================================================//void WaitForEnable(void){DataPort=0xff;LCM_RS=0;LCM_RW=1;_nop_();LCM_EN=1;_nop_();_nop_();//while(DataPort&0x80);delay(5);LCM_EN=0;}//==========================================================// /* 函数名:void WriteCommandLCM(uchar CMD,uchar Attribc)作用:写命令到LCM *///==========================================================// void WriteCommandLCM(uchar CMD,uchar Attribc){if(Attribc)WaitForEnable();LCM_RS=0;LCM_RW=0;_nop_();DataPort=CMD;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;}//=========================================================///* 函数名:void WriteDataLCM(uchar dataW)作用:写数据*///=========================================================// void WriteDataLCM(uchar dataW){WaitForEnable();LCM_RS=1;LCM_RW=0;_nop_();DataPort=dataW;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;}//=========================================================///* 函数名:void InitLcd()作用:LCM初始化*///=========================================================// void InitLcd(){WriteCommandLCM(0x38,1);WriteCommandLCM(0x08,1);WriteCommandLCM(0x01,1);WriteCommandLCM(0x06,1);WriteCommandLCM(0x0c,1);}//=========================================================///*函数名:void DisplayOneChar(uchar X,uchar Y,uchar DData)作用:显示指定坐标的一个字符*///=========================================================// void DisplayOneChar(uchar X,uchar Y,uchar DData){Y&=1;X&=15;if(Y)X|=0x40;X|=0x80;WriteCommandLCM(X,0);WriteDataLCM(DData);}//============================================================// /*函数名:void DisplayListChar(uchar X,uchar Y,uchar code *DData作用:显示指定坐标的一串字符*///============================================================// void DisplayListChar(uchar X,uchar Y,uchar code *DData){uchar ListLength=0;Y&=0x1;X&=0xF;while(X<=15){DisplayOneChar(X,Y,DData[ListLength]);ListLength++;X++;}}//============================================================// /* 函数名:void main(void)作用:主函数*///============================================================////============================================================// /* 函数名:void display()作用:显示函数*///============================================================// void display(){Fw=count/10000+0x30;Fq=count/1000%10+0x30;Fb=count/100%10+0x30;Fs=count/10%10+0x30;Fg=count%10+0x30;DisplayOneChar(2,1,Fw);DisplayOneChar(3,1,Fq);DisplayOneChar(4,1,Fb);DisplayOneChar(5,1,Fs);DisplayOneChar(6,1,Fg);}void InitTime(void){TMOD=0x51;//T0为定时器工作于方式1,T1为计数器工作于方式1TH0=0x4C;//定时器50ms赋高8初值, 12M晶振TL0=0x00;//定时器50ms赋低8初值, 12M晶振TR0=1;//开定时器1TH1=0;//计数器赋高8初值初值TL1=0;//计数器赋低8初值TR1=1;//开计数器0ET0=1;EA=1;}void timeo(void) interrupt 1{TH0=0x4C;//定时器50ms赋高8初值TL0=0x00;//定时器50ms赋低8初值nm=nm+1;if(nm==10){TR1=0; //关闭T1定时器,定时1S完成TR0=0;//关闭T0}}//============================================================// /* 函数名:void main(void)作用:主函数*///============================================================// void main(void){char i;uint temp,temp1;delay(500);InitLcd(); //LCM初始化设置InitTime();for(i=15;i>=0;i--){DisplayListChar(i,0,str0);//显示第一行字符DisplayListChar(i,1,str1);//显示第二行字符delay(100);}while(1){if(nm==10)//定时10*50MS=500ms{temp=TL1;temp1=TH1;count=2*(temp1*256+temp);//定时2乘以500ms=1000ms display();TH1=0;//计数器赋高8初值初值TL1=0;//计数器赋低8初值nm=0;TR1=1;TR0=1;}}}。

基于51单片机数字温度计课设1602的设计和实现

基于51单片机数字温度计课设1602的设计和实现

基于51单片机数字温度计课设1602的设计和实现引言随着科技的发展和时代的进步,人们的生活水平日渐提高,对于环境的要求也越来越高。

其中,温度是一个非常重要的参数。

无论是日常生活还是科学实验,温度的测量都是至关重要的。

本文主要介绍了一个基于51单片机数字温度计课设1602的设计和实现,旨在方便人们测量温度、监测环境的变化。

系统设计设计要求本次的温度计设计需要满足以下要求:1、能够准确测量环境温度,并且实时监测环境的变化。

2、能够以数字的形式将温度值显示在1602液晶显示屏上。

3、具备温度过高或过低时进行声音提示和灯光警告的功能。

硬件选型本次设计采用了如下硬件:1、51单片机:主要负责数据的处理和控制。

2、DS18B20温度传感器:专门用来测量温度。

3、1602液晶显示器:用于显示温度值。

4、蜂鸣器:用来进行声音提示。

5、LED灯:用来进行灯光警告。

6、面包板、电源、杜邦线等。

系统原理DS18B20是一种数字温度传感器,它可以在一个单芯线上实现数字温度测量。

我们可以通过51单片机来对DS18B20进行一系列的控制和读取。

经过一定的计算,我们可以将测得的温度值以数字的形式显示在1602液晶显示器上。

在此基础上,通过对蜂鸣器和LED等的控制,可以进行声音和灯光的警告功能。

系统实现硬件连接根据硬件选型及系统原理,将各个器件以如下图的方式进行连接。

软件设计软件主要分为硬件初始化、温度计算、数码管显示、报警功能等几大部分。

1、硬件初始化:需要初始化IO口、定时器、串口等,将各个硬件初始化,以便后续的使用。

2、温度计算:读取DS18B20传感器寄存器中的数值,并进行一定的计算,将其转化为温度值。

3、数码管显示:将温度值按照规定的格式以数字的形式在1602液晶屏上进行显示。

4、报警功能:当温度过高或过低时,通过蜂鸣器和LED等进行声音和灯光警告。

系统测试经过一系列的硬件和软件设计,我们可以对整个系统进行测试。

首先,在正常温度下,我们可以看到液晶显示屏上显示的温度值以及蜂鸣器和LED等均未进行报警提示。

基于Proteus的单片机1602液晶显示电路的设计

基于Proteus的单片机1602液晶显示电路的设计

2017年第12期农机使 用与维 修15基于 Proteus 的单片机1602液晶显示电路的设计史洁(黑龙江农业经济职业学院,黑龙江牡丹江157041)摘要:硬件电路由AT 89C 51单片机控制器、1602液晶显示组成。

通过C 语言对单片机进行控制操作。

完成了实物电路并在Proteus 软件的基础上对结果进行仿真,得到1602液晶显示效果图。

实验结果表明,在单片机显示领域的设计开发中Proteus 软件具有重要的实用价值,可以大幅缩短开发周期,节约开发成本。

关键词:液晶显示;单片机;Proteus 中图分类号:TP 368.12 文献标识码:A doi :10.14031/ki. njwx.2017.12.010Design of MCU 1602 LCD Circuit Based on ProteusShi Jie(Heilongjiang Agricultural Economy Vocational College , M udanjiang 157041, China )Abstract:The hardw are circuit is composed of AT 89C 51 singlechip controller and 1602 LCD display . C language to con ­trol the operation of the microcontroller . Com pleted the physical circuit , and on the basis of Proteus softw are on the re ­sults of simulation , obtained 1602 LCD display effect diagram . The experim ental results show th at Proteus softw are h as im portant practical value in the design and development of single chip display field , which can greatly shorten the devel ­opm ent cycle and save development costs .Keywords : liquid crystal display , SCM , Proteus〇引言Proteus 软件是英国Labcentei •公司开发的一个电路分 析与实物仿真软件,它具有模拟电路和数字电路仿真功 能,支持主流单片机及其外围电路组成系统的仿真,提供 软件调试功能。

1602液晶应用proteus仿真+源程序

1602液晶应用proteus仿真+源程序

uchar num; sbit lcden=P3^4; //液晶使能端
sbit lcdrs=P3^5; //液晶数据命令选择端 选择写数据还是写命令
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
} void write_com(uchar com)
} void init() { lcden=0; write_com(0x38); //设置 16x2 显示 5x7 点阵,8 位数据接口 write_com(0x0c); //设置开始显示 不显示光标 write_com(0x06); //写一个字符后地址指针加 1 write_com(0x01); //显示清零 数据指针清零 } void main() {
init(); write_com(0x80+0x10); //将数据指针第一行第一个字处, for(num=0;num<13;num++) { write_data(table[num]); delay(5); }
write_com(0x80+0x50); //定义指针位置 for(num=0;num<12;num++)
//写入
{
lcdrs=0; //LCD 选择输入命令
P0=com;
//向 P0 口输入命令
delay(5); lcden=1;
//延时 //打开 LCD 使能
delay(5); lcden=0;
//一个高脉冲 //关闭 LCD 使能
}
void write_data(uchar date)
{

基于51单片机1602液晶显示简易计算器设计..

基于51单片机1602液晶显示简易计算器设计..

#include<reg52.h>#include<math.h>#define uint unsigned int#define uchar unsigned char#define PI 3.141592sbit RS = P2^0;sbit RW = P2^1;sbit EN = P2^2;sbit led=P2^4;sbit speek=P3^7;uchar table0[]={"Welcome to use"};uchar table1[]={"made by Ms. Li"};uchar table2[]={"error"};uchar count;void main(void){uchar error=0,i,first=0,dot1,dot2,dot1_num,dot2_num,minus1,minus2;//错误标志、第一次清屏标记、小数点标记以及小数点个数负号标记、负号个数uchar Sin,Cos,Tan,ln;uchar Key_num,last_key_num; //键号uchar flag=0,equal_flag;double num1=0,num2=0,num=0,result=0,save_result; //运算符、等于符//第一个数、第二个数、计算结果uchar first_num=0,Ans=0,second_num=0; InitLcd();EA=1;ET0=1;TMOD=0X01;TH0=(65536-500)/256;TL0=(65536-500)%256;write_com(0x80+0x40+15);write_Dat('0');write_com(0x80);while(1){while(key_scan()==0xff);TR0=1;if(first==0){first=1;write_com(0x01);}Key_num=key_scan();switch(key_scan()){case 1:if(last_key_num!=Key_num){write_Dat('l');write_Dat('n');ln=1;}break;case 2:if(last_key_num!=Key_num){write_Dat('s');write_Dat('i');write_Dat('n');Sin=1;}break;case 3:if(last_key_num!=Key_num){write_Dat('c');write_Dat('o');write_Dat('s');Cos=1;}break;case 4:if(last_key_num!=Key_num){write_Dat('t');write_Dat('a');write_Dat('n');Tan=1;}break;case 5:if(last_key_num!=Key_num){write_Dat('^');flag=5;}break;case 6:write_Dat('7');num=7;break; case 7:write_Dat('8');num=8;break; case 8:write_Dat('9');num=9;break; case 9:if(last_key_num!=Key_num){write_Dat('+');flag=1;}break;case 10:if(last_key_num!=Key_num){write_Dat('T');flag=6;}break;case 11:write_Dat('4');num=4;break; case 12:write_Dat('5');num=5;break; case 13:write_Dat('6');num=6;break; case 14:if(last_key_num!=Key_num){write_Dat('-');flag=2;}break;case 15:if(last_key_num!=Key_num){if(equal_flag==1){write_com(0x01);write_com(0x80);write_Dat('A');write_Dat('n');write_Dat('s');write_Dat('=');save_result=result;}else{if(Key_num!=1&&Key_num!=2&&Key_num!=3&&Key_num!=4&&Key_num!=22&&Key_num!=23 &&Key_num!=25){write_Dat('A');write_Dat('n');write_Dat('s');if(flag==0){num1=save_result;first_num=1;}else{num2=save_result;second_num=1;}}}}break;case 16:write_Dat('1');num=1;break;case 17:write_Dat('2');num=2;break;case 18:write_Dat('3');num=3;break;case 19:if(last_key_num!=Key_num){write_Dat('*');flag=3;}break;case 21:write_Dat('0');num=0;break;case 22:if(last_key_num!=Key_num){if(flag==0){minus1++;if(minus1==1){write_Dat('-');}}else{minus2++;if(minus2==1){write_Dat('-');}}} break;case 23:if(last_key_num!=Key_num){if(flag==0){dot1++;if(dot1==1){write_Dat('.');}}else{dot2++;if(dot2==1){write_Dat('.');}}} break;case 24:if(last_key_num!=Key_num){write_Dat('/');flag=4;}break;case 25:if(last_key_num!=Key_num){write_Dat('=');equal_flag=1;}break;}if(Key_num!=1&&Key_num!=2&&Key_num!=3&&Key_num!=4&&Key_num!=15&&Key_num!=22 &&Key_num!=23&&Key_num!=25)// 第一个数{if(flag==0){num1=num1*10+num;num=0;if(dot1!=0){dot1_num++;}first_num=1;}if(flag!=0){num2=num2*10+num;num=0;if(dot2!=0){dot2_num++;}second_num=1;}}if(equal_flag==1&&first_num==1){if(dot1!=0){num1=num1/pow(10,dot1_num);dot1=0;}if(dot2!=0){num2=num2/pow(10,dot2_num);dot2=0;}if(minus1!=0){num1=num1*(-1);}if(minus2!=0){num2=num2*(-1);}if(second_num!=0){switch(flag){case 1:result=num1+num2;break;case 2:result=num1-num2;break;case 3:result=num1*num2;break;case 4:if(num2!=0){result=num1/num2;}else{write_com(0x80+0x40+10);for(i=0;i<5;i++){write_Dat(table2[i]);}error=1;} break;case 5: result=pow(num1,num2);break;case 6: result=pow(num1,1/num2);break;}}else if(second_num==0&&Sin==0&&Cos==0&&Tan==0&&ln==0) result=num1;else if(second_num==0&&(Sin==1||Cos==1||Tan==1||ln==1)) {if(Sin==1)result=sin(num1/180*PI)+0.005;if(Cos==1)result=cos(num1/180*PI)+0.005;if(Tan==1)result=tan(num1/180*PI)+0.005;if(ln==1){if(num1>0)result=log(num1)+0.005;else{write_com(0x80+0x40+10);for(i=0;i<5;i++){write_Dat(table2[i]);}error=1;}}}if(error!=1)display(result);}// 清零if(Key_num==20){num1=num2=result=0;flag=equal_flag=0;error=0;first=0;dot1_num=dot2_num=0;minus1=0;minus2=0;first_num=0,second_num=0;Sin=Cos=Tan=ln=0;write_com(0x01);write_com(0x80+0x40+15);write_Dat('0');}last_key_num=Key_num;while(key_scan()!=0xff);}}void time0() interrupt 1{TH0=(65536-600)/256;TL0=(65536-600)%256;count++;speek=!speek;if(count>50){TR0=0;count=0;}}void delay(uint x){uchar y;while(x--)for(y=0;y<120;y++);}void write_com(unsigned char c) {RS=0;RW=0;EN=1;delay(5);P0=c;EN=0;}void write_Dat(unsigned char c) {RS=1;RW=0;EN=1;delay(5);P0=c;EN=0;}void InitLcd(){write_com(0x38); //display modewrite_com(0x06); // write_com(0x0c); // write_com(0x01); // } 显示光标挪动地点显示开及光标设置显示清屏uchar key_scan(){uchar key_num=0xff;uint temp;P3=0x03;P1=0xe0;temp=(P3<<8)|P1;if((temp&0x03e0)!=0x03e0){delay(10);if((temp&0x03e0)!=0x03e0){// 第一行P3=0x03;P1=0xfe;temp=(P3<<8)|P1;switch(temp){case 0x03de:key_num=1; break;case 0x03be:key_num=2; break;case 0x037e:key_num=3; break;case 0x02fe:key_num=4; break;case 0x01fe:key_num=5; break;}//第二行P3=0x03;P1=0xfd;temp=(P3<<8)|P1;switch(temp){case 0x03dd:key_num=6; break;case 0x03bd:key_num=7; break;case 0x037d:key_num=8; break;case 0x02fd:key_num=9; break;case 0x01fd:key_num=10; break;}//第三行P3=0x03;P1=0xfb;temp=(P3<<8)|P1;switch(temp){case 0x03db:key_num=11; break;case 0x03bb:key_num=12; break;case 0x037b:key_num=13; break;case 0x02fb:key_num=14; break;case 0x01fb:key_num=15; break;}//第四行P3=0x03;P1=0xf7;temp=(P3<<8)|P1;switch(temp){case 0x03d7:key_num=16; break;case 0x03b7:key_num=17; break;case 0x0377:key_num=18; break;case 0x02f7:key_num=19; break;case 0x01f7:key_num=20; break;}P3=0x03;//第五行P1=0xef;temp=(P3<<8)|P1;switch(temp){case 0x03cf:key_num=21; break;case 0x03af:key_num=22; break;case 0x036f:key_num=23; break;case 0x02ef:key_num=24; break;case 0x01ef:key_num=25; break;}}}return key_num;}void display(double Data){uchar xs=0,fs=0,i;if(Data<0){fs=1;Data=Data*(-1);}if(Data>(long)Data){xs=1;}if(Data<10)//0~9{if(xs==1){Data=Data*100;write_com(0x80+0x40+11);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/100+'0');write_Dat('.');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}else if(xs==0){write_com(0x80+0x40+14);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data+'0');}}else if(Data<100)//10~99{if(xs==1){Data=Data*100;write_com(0x80+0x40+10);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/1000+'0');write_Dat((long)Data/100%10+'0');write_Dat('.');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}else if(xs==0){write_com(0x80+0x40+13);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/10+'0');write_Dat((long)Data%10+'0');}}else if(Data<1000)//100~999 {if(xs==1){Data=Data*100;write_com(0x80+0x40+9);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/10000+'0');write_Dat((long)Data/1000%10 +'0');write_Dat((long)Data/100%10+'0');write_Dat('.');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}else if(xs==0){write_com(0x80+0x40+12);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/100+'0');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}}else if(Data<10000)//1000~9999 {if(xs==1){Data=Data*100;write_com(0x80+0x40+8);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/100000+'0');write_Dat((long)Data/10000%10+'0');write_Dat((long)Data/1000%10 +'0');write_Dat((long)Data/100%10+'0');write_Dat('.');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}else if(xs==0){write_com(0x80+0x40+11);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/1000+'0');write_Dat((long)Data/100%10+'0');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}}else if(Data<100000)//10000~99999 {if(xs==1){Data=Data*100;write_com(0x80+0x40+7);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/1000000+'0');write_Dat((long)Data/100000%10+'0');write_Dat((long)Data/10000%10+'0');write_Dat((long)Data/1000%10 +'0');write_Dat((long)Data/100%10+'0');write_Dat('.');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}else if(xs==0){write_com(0x80+0x40+10);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/10000+'0');write_Dat((long)Data/1000%10+'0');write_Dat((long)Data/100%10+'0');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}}else if(Data<1000000) //100000~999999{if(xs==1){Data=Data*100;write_com(0x80+0x40+7);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/10000000+'0');write_Dat((long)Data/1000000%10+'0');write_Dat((long)Data/100000%10+'0');write_Dat((long)Data/10000%10+'0');write_Dat((long)Data/1000%10 +'0');write_Dat((long)Data/100%10+'0');write_Dat('.');write_Dat((long)Data/100000%10+'0');write_Dat((long)Data/100000%10+'0');write_Dat((long)Data/10000%10+'0');write_Dat((long)Data/1000%10 +'0');write_Dat((long)Data/100%10+'0');}else if(xs==0){write_com(0x80+0x40+9);if(fs==1)write_Dat('-');elsewrite_Dat(' ');write_Dat((long)Data/100000+'0');write_Dat((long)Data/10000%10+'0');write_Dat((long)Data/1000%10+'0');write_Dat((long)Data/100%10+'0');write_Dat((long)Data/10%10+'0');write_Dat((long)Data%10+'0');}}else{write_com(0x80+0x40+10);for(i=0;i<5;i++){write_Dat(table2[i]);}}}。

51单片机 1602液晶显示 NE555频率计

51单片机 1602液晶显示 NE555频率计

#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit LCD_RS= P2^0;//定义LCD引脚sbit LCD_RW= P2^1;sbit LCD_E= P2^2;uchar code DIS[]={"NE555-------TEST"};//NE555 测试;uchar code dsptab[]={'0','1','2','3','4','5','6','7','8','9'};//字符代表码;uchar i,c[4],a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uint s;/*====================延时子程序====================*/ void delay(uint z){uchar m;for(;z>0;z--)for(m=124;m>0;m--);}void delay400ms(void)////400ms延时{ uchar z = 5;uint m;while(z--){ m=7269;while(m--);}}/*====================LCD1602子程序====================*/ /*-- 读状态--*///读状态子程序;有返回值;返回值类型为CHAR型;//读回的状态通过RETURN返回;uchar read_estate(void) //定义有返回值的函数;{ P0=0Xff; //把LCD端口全置1方便读取信号; LCD_RS=0; //RS置0;LCD_RW=1; //RW置1;LCD_E=0; //E端置0;delay(10); //短延时;LCD_E=1; //E端置1;以锁存数据; while(P0&0x80); //检测忙,则一直循环;return(P0); //返回读取的信号;}/*-- 写数据--*///写数据子程序;无返回值;输入变量I;//I为要写入LCD中的数据;//数据类型CHAR形;void write_data(uchar i) //定义输入变量值I;{read_estate(); //检测忙信号;P0=i; //把I中数据送到LCD数据端;LCD_RS=1; //RS置1;LCD_RW=0; //RW置0;LCD_E=0; //E置0;delay(10); //短延时;LCD_E=1; //E置1;以锁存数据;}/*-- 写指令--*///写指令子程序;无返回值;输入二个变量I和J.//I为要写入LCD的指令;J为判断要不要检测忙.//如果J为0则不判断检测忙;//如果J为1则判断检测忙;void write_dictate(uchar i,j) //定义二个变量;{if(j)read_estate(); //根据需要检测忙;P0=i; //把要写入的数据送到LCD数据端; LCD_RS=0; //RS置0;LCD_RW=0; //RW置0;LCD_E =1; //E端置0;delay(10); //延时;LCD_E =0; //E端置1;以锁存数据;}/*-- LCD初始化--*///LCD初始化程序;主要作用初始化LCD,对LCD进行复位以及设置;void initialization(void) //定义函数;{delay(50); //延时5MS;write_dictate(0x38,0); //写指令38H;不检测忙;delay(50); //延时5MS;write_dictate(0x38,0); //写指令38H;不检测忙;delay(50); //延时5MS;write_dictate(0x38,0); //写指令38H;不检测忙;delay(50);write_dictate(0x38,1); //显示模式设置;检测忙;write_dictate(0x08,1); //关闭显示;检测忙;write_dictate(0x01,1); //显示清屏;检测忙;write_dictate(0x06,1); //显示光标移动设置;检测忙;write_dictate(0x0C,1); //显示开及光标设置;检测忙;}/*-- 在指定位置显示一个字符--*/void displayonechar(uchar x, y,ddata){y &= 0x01;x &= 0x0f; //限制X不能大于15,Y不能大于1if (y) x+= 0x40; //当要显示第二行时地址码+0x40;x+= 0x80; //算出指令码write_dictate(x,0); //这里不检测忙信号,发送地址码write_data(ddata);}/*-- 在指定位置显示一串字符--*/void displaylistchar(uchar x,y,uchar code *ddata){uchar a=0;y&=0x01;x&=0xf;while(ddata[a]>0x20){ if(x<=0xff){displayonechar(x, y,ddata[a]);a++;x++;}}}/*====================MAIN主程序====================*/void main(){delay400ms();//延时400MSinitialization();//LCD复位;displaylistchar(0,0,DIS);//显示NE555 测试;displayonechar(0,1,'F'); //在LCD是显示F=____Hzdisplayonechar(1,1,'=');displayonechar(9,1,'H');displayonechar(10,1,'z');TMOD=0X51; //定义T0为方式一(十六位进制),T1为计数器(16位)TH0=0X3C; //50 msTL0=0XB0;TH1=0X00; //初始值TL1=0X00;TR0=1;TR1=1;ET0=1;ET1=0;EA=1;i=0;/* 显示*/ // 调用显示子程序(显示位,显示行,显示数据)注:显示行“0”为第一行,“1为第二行”while(1){if(s/10000>=1){displayonechar(2,1,dsptab[s/10000]); //万displayonechar(3,1,dsptab[s/1000%10]);//千displayonechar(4,1,'.'); //点displayonechar(5,1,dsptab[s/100%10]);//百displayonechar(6,1,dsptab[s/10%10]); //十displayonechar(7,1,dsptab[s%10]); //个displayonechar(8,1,'K');}else if(s/1000>=1){displayonechar(2,1,' ');displayonechar(3,1,dsptab[s/1000%10]);//千displayonechar(4,1,'.'); //点displayonechar(5,1,dsptab[s/100%10]);//百displayonechar(6,1,dsptab[s/10%10]); //十displayonechar(7,1,dsptab[s%10]); //个displayonechar(8,1,'K');}else if(s/100>=1){displayonechar(2,1,' ');displayonechar(3,1,' ');displayonechar(4,1,' '); //万displayonechar(5,1,' '); //千displayonechar(6,1,dsptab[s/100%10]);//百displayonechar(7,1,dsptab[s/10%10]); //十displayonechar(8,1,dsptab[s%10]); //个}else if(s/10>=1){displayonechar(2,1,' ');displayonechar(3,1,' ');displayonechar(4,1,' '); //万displayonechar(5,1,' '); //千displayonechar(6,1,' ');//百displayonechar(7,1,dsptab[s/10%10]); //十displayonechar(8,1,dsptab[s%10]); //个}else{displayonechar(2,1,' ');displayonechar(3,1,' ');displayonechar(4,1,' '); //万displayonechar(5,1,' '); //千displayonechar(6,1,' ');//百displayonechar(7,1,dsptab[s/10%10]); //十displayonechar(8,1,dsptab[s%10]); //个}}}/* 中断*/void t0()interrupt 1{TH0=0X3C;TL0=0XB0;i++;if(i==20) //1 s时间到时{s=TH1; //555信号发生器的输出口接P3.5(T1) 15脚s=s<<8;s=s+TL1;i=0; //清零TH1=0X00;TL1=0X00;}}/*----------------------------------------------------------------*//*----------------- 1602液晶数据读取子程序-----------------------*///读数据子程序;有返回值,返回值类型为CHAR型;/*uchar read_data(void) //定义有返回值的子函数; {LCD_DATA=0Xff; //LCD数据端口置1; LCD_RS=1; //RS置1;LCD_RW=1; //RW置1; LCD_E=0; //E置0;delay(10); //短延时;LCD_E=1; //E置1;以锁存数据; return(LCD_DATA); //返回读取的值;}/*----------------------------------------------------------------*/。

+1602——51单片机的Proteus实验 源程序

+1602——51单片机的Proteus实验 源程序

C语言源代码//======================================================依次可以从键盘输入0-f,在1602LCD上显示出来(此程序在所买开发板上验证通过)//======================================================//******** 小波电子工作室All rights reserved******//******** 个人主页:/niejinbo **//******** 文件名:lcd_key.1.c ************//******** 功能概要:4*4矩阵键盘扫描***********//******** MCU: STC89C52 晶振:11.0592Mhz **********//******** 设计者:聂金波************//******** 完成日期:2008-07-14 ************//******** 当前版本:0714.1 ************//******** 改进说明:暂无************//******** 补充说明: 从键盘输入0-F,在LCD上显示出来//*********头文件区*******************#include<reg52.h>#include<math.h>#include<absacc.h>#define uchar unsigned char#define uint unsigned int//*********定义变量区*******************sbitdula=P2^6; //关闭数码管显示之用sbitwela=P2^7;sbitlcden=P3^4; //LCD使能信号sbitlcdrs=P3^5; //LCD数据/命令选择信号uchartab_key[50];uchar code tab[]="0123456789abcdef";uchar n=0,temp,key;//*********函数声明区********************void lcd_disp(); //LCD显示函数void lcd_init(); //LCD初始化函数void write_com(uchar); //写命令函数void write_data(uchar); //写数据函数void delay(uint); //延迟函数void key_scan(); //键盘扫描函数void key_manage1(); //键盘功能分配函数void key_manage2();void key_manage3();void key_manage4();void key_manage5();void key_manage6();void key_manage7();void key_manage8();void key_manage9();void key_manage10();void key_manage11();void key_manage12();void key_manage13();void key_manage14();void key_manage15();void key_manage16();//**********主函数开始**********void main(){lcd_init();write_com(1);while(1){key_scan();lcd_disp();}}//**********LCD显示函数开始***********voidlcd_disp(){uchara,i=0;write_com(0x80);for(i=0;i<n;i++){a=tab_key[i];write_data(tab[a]);}}//**********LCD初始化函数开始*********voidlcd_init(){dula=0;wela=0; // 关闭数码管显示lcden=0;write_com(0x38); //设置显示模式:16X2,5X7,8位数据接口write_com(0x0c); //开显示,显示光标,光标闪烁write_com(0x06); //读写一个字符后,地址指针及光标加一,且光标加一整屏显示不移动write_com(0x80); //设置光标指针}//**********写命令函数开始************voidwrite_com(uchar com){lcdrs=0; //低电平写命令P0=com; //写入命令delay(3); //延时约3mslcden=1; //LCD使能端置高电平delay(5); //延时约5mslcden=0; //LCD使能端拉低电平}//**********写数据函数开始************voidwrite_data(uchardat){lcdrs=1; //低电平写数据P0=dat; //写入命令delay(3); //延时约3mslcden=1; //LCD使能端置高电平delay(5); //延时约5mslcden=0; //LCD使能端拉低电平}//**********键盘扫描函数开始****voidkey_scan()//**********扫描第一行********* P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(100);if(temp!=0xf0){temp=P3;switch(temp){case 0xee:key_manage1();break;case 0xde:key_manage2();break;case 0xbe:key_manage3();break;case 0x7e:key_manage4();break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//**********扫描第二行********* P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(100);if(temp!=0xf0)temp=P3;switch(temp){case 0xed:key_manage5();break;case 0xdd:key_manage6();break;case 0xbd:key_manage7();break;case 0x7d:key_manage8();break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//**********扫描第三行********* P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(100);if(temp!=0xf0){temp=P3;switch(temp){case 0xeb:key_manage9();break;case 0xdb:break;case 0xbb:key_manage11();break;case 0x7b:key_manage12();break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//**********扫描第四行********* P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(100);if(temp!=0xf0){temp=P3;switch(temp){case 0xe7:key_manage13();break;case 0xd7:key_manage14();break;case 0xb7:key_manage15();break;case 0x77:break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}}//*********延时函数开始************** void delay(uint k){uinti,j;for(i=k;i>0;i--)for(j=50;j>0;j--);}//******键盘功能分配函数群开始******** // 键盘功能示意图// 设计者:聂金波//** 1 ** 2 ** 3 ** 4 **//** 5 ** 6 ** 7 ** 8 **//** 9 ** 0 ** s ** c **//** M1** M2** M3** M4**void key_manage1(){tab_key[n]=0;n++;}void key_manage2(){tab_key[n]=1;n++;}void key_manage3() {tab_key[n]=2;n++;}void key_manage4() {tab_key[n]=3;n++;}void key_manage5() {tab_key[n]=4;n++;}void key_manage6() {tab_key[n]=5;n++;}void key_manage7() {tab_key[n]=6;n++;}void key_manage8() {tab_key[n]=7;n++;}void key_manage9() {tab_key[n]=8;n++;}void key_manage10()tab_key[n]=9;n++;}void key_manage11(){tab_key[n]=10;n++;}void key_manage12(){tab_key[n]=11;n++;}void key_manage13(){tab_key[n]=12;n++;}void key_manage14(){tab_key[n]=13;n++;}void key_manage15(){tab_key[n]=14;n++;}void key_manage16(){tab_key[n]=15;n++;}Proteus仿真图依次从键盘输入:abcd 277817639 (本人QQ号)4X4矩阵键盘-Proteus截图。

基于51单片机24小时可调时钟1602液晶显示程序

基于51单片机24小时可调时钟1602液晶显示程序

基于51单片机24小时可调时钟1602液晶显示程序#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit key1=P1^0;sbit key2=P1^1;sbit key3=P1^2;sbit key4=P1^3;sbit key5=P1^4;sbit key6=P1^5;sbit rs=P0^0; //液晶的第4端RS由开关独立s2 p3^5控制高电平写数据,低电平写命令。

sbit lecdn=P0^1; //使能端需控制LECDN,p3^6控制。

根据硬件电路而定uchar miao ,fen ,shi,num;uchar miao1,miao2,shi1,shi2,fen1,fen2;uchar table[]="0123456789";void delay(uint x){uint i,j;for(i=x;i>0;i--)for(j=10;j>0;j--);}void write_com(uchar com )//写指令{P2=com;//RW=0;写指令位定义一个io口控制lecdn=0; //起初为低电平时序图rs=0; //写指令rs为低delay(10); //简短延时lecdn=1; //给以高脉冲delay(5);lecdn=0;}void write_data(uchar shu ) //写数据{P2=shu; //将数据送给控制数据位的io口//RW=0;写指令位定义一个io口控制lecdn=0;rs=1; //写数据rs为低区别delay(10);lecdn=1;delay(5);lecdn=0;}void init() //初始化{write_com(0x38); //显示模式设置delay(20);write_com(0x0f); // 显示开关,和光标设置,开关必开,光标不开ox0c,开并闪烁0x0fdelay(20);write_com(0x06); //写完一个数据,数据地址指针自动往后移动一位delay(20);write_com(0x01); //清屏指令,按下复位键上次的结果变清掉。

实验八 LCM1602液晶显示实验

实验八 LCM1602液晶显示实验

void LCD_check_busy(void)
{
while(1)
{
lcden=0;
lcdrs=0;
lcdrw=1;
P0=0xff;
lcden=1;
if(busy==0) break;
}
lcden=0;
}
delay(int x)
{
while(x--);
}
delay_ms(int x)
{
int a,b;
uchar num,i;
uchar code tab[]="My information!";
uchar code tab1[]="1.yixifeng";
uchar
code
tab2[]="2.dianzi2010412337";
uchar code tab3[]="3.MCS-51 EXP8";
uchar code tab4[]="4.LCD DISPLAY";
write_com(0x06);
}
void write_str(uchar *str)
{
while(*str!='\0')
{
while(flag3);
if(flag4){ write_com(0x01);
break; }
write_dat(*str) ;
str++;
delay_ms(50);
}
}
void write_com(uchar com) {
第六脚:E 端为使能端,E 端由高电平跳变为低电平时,液晶模块执行命令。 第 7~14 脚:D0~D7 为 8 位双向数据线。 第 15 脚:背光源正极。 第 16 脚:背光源负极。 2、芯片时序表:

基于Proteus仿真的51单片机数字频率计

基于Proteus仿真的51单片机数字频率计

目录前言 (1)正文 (1)2.1 设计目的和意义 (1)2.2 设计方法和步骤 (1)2.2.1 数字频率计概述 (1)2.2.2 频率测量仪的设计思路与频率的计算 (1)2.2.3 基本设计原理 (2)3.1数字频率计(低频)的硬件结构设计 (2)3.1.1 系统硬件的构成 (2)3.1.2 系统工作原理图 (2)3.1.3 AT89C51单片机及其引脚说明 (3)3.2 信号调理及放大整形模块 (5)3.3 时基信号产生电路 (5)3.4 PROTEUS仿真电路图 (7)3.5 显示模块 (7)3.6 软件设计 (9)总结 (10)参考文献 (11)附录汇编源程序代码 (12)前言本应用系统设计的目的是通过在“单片机原理及应用”课堂上学习的知识,以及查阅资料,培养一种自学的能力。

并且引导一种创新的思维,把学到的知识应用到日常生活当中。

在设计的过程中,不断的学习,思考和同学间的相互讨论,运用科学的分析问题的方法解决遇到的困难,掌握单片机系统一般的开发流程,学会对常见问题的处理方法,积累设计系统的经验,充分发挥教学与实践的结合。

全能提高个人系统开发的综合能力,开拓了思维,为今后能在相应工作岗位上的工作打下了坚实的基础。

正文2.1 设计目的和意义数字频率计以其可靠性高,体积小,价格低,功能全等优点,广泛用于各种智能仪器中。

这些智能仪器的操作在进行仪器校核以及测量控制的过程中,达到了自动优化,传统仪器面板上的开关和按钮被键盘所代替,测试人员在测量时只需按需要的键,省掉了许多繁琐的人工调节。

智能仪器通常能自动选择量程自动校准,这样不仅方便了操作,也提高了测量精度。

2.2 设计方法和步骤2.2.1 数字频率计概述数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。

它是一种用十进制数字显示被测信号频率的数字测量仪器。

它的基本功能是测量正弦信号,方波信号及其他各种单位时间内变化的物理量。

基于proteus的51单片机仿真实例六十四

基于proteus的51单片机仿真实例六十四

基于proteus的51单片机仿真实例六十四、字符液晶LCD1602显示字符串实例标签: proteus单片机实例液晶字符2010-02-20 00:121、本例用1602液晶循环右移显示一串字符串。

显示模式设置如下1)16*2显示,5*7点阵,8位数据接口2)开显示,有光标且光标闪烁3)光标右移,字符不移动2、由于一次只能向液晶写入一个字符,因此如果需要显示字符串的话,需要用到指针或者字符串数组,然后再设置一个循环,从第一个字符开始写入液晶,直到写到字符串结束标志“\0”为止。

字符显示地址的确定:由于1602液晶在第一个地址显示完毕后,能够自动指向先一个地址,因此只需要指定字符串的第一个字符显示的地址即可,3、在keil c51中新建工程ex52,编写如下程序代码,编译并生成ex52.hex文件//LCD1602.C//液晶控制与显示程序#include <reg51.h>#include <intrins.h>sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚//延时函数void delayms(unsigned int ms){unsigned char i;while(ms--){for(i = 0;i < 120;i++);}}//忙检测函数unsigned char busy_check(void){unsigned char LCD_Status; //定义忙状态变量RS = 0; //RW = 1;EN = 1;delayms(1);LCD_Status = P0; //读取忙状态EN = 0;return LCD_Status; //返回忙状态}//写命令void write_LCD_Command(unsigned char cmd){while((busy_check() & 0x80) == 0x80); //等待忙状态结束 RS = 0;RW = 0;EN = 0;P0 = cmd;EN = 1;delayms(1);EN = 0;}//写数据void write_LCD_data(unsigned char dat){while((busy_check() & 0x80) == 0x80);RS = 1;RW = 0;EN = 0;P0 = dat;EN = 1;delayms(1);EN = 0;}//初始化void init_LCD(void){write_LCD_Command(0x38); //显示模式设置 delayms(1);write_LCD_Command(0x01); //清屏delayms(1);write_LCD_Command(0x06); //字符进入模式:屏幕不动,字符后移delayms(1);write_LCD_Command(0x0c); //显示开,关光标delayms(1);}//显示字符串void ShowString(unsigned char x,unsigned char y,unsigned char *str) {unsigned char i = 0;//设置起始位置if(y == 0){write_LCD_Command(0x80 | x);}if(y == 1){write_LCD_Command(0xc0 | x);}//输出字符串for(i = 0; i < 16;i++){write_LCD_data(str[i]);}}4、在proteus中新建仿真文件ex52.dsn,电路原理图如下所示5、将ex52.hex文件载入at89c51中,启动仿真,观察运行结果。

LCD1602学习——Proteus仿真(显示操作)

LCD1602学习——Proteus仿真(显示操作)

LCD1602学习——Proteus仿真(显⽰操作)学习关键:先看懂液晶操作时序图(写操作:写命令、写数据)读状态输⼊RS=L,R/W=H,E=H输出D0—D7=状态字写指令输⼊RS=L,R/W=L,D0—D7=指令输出⽆码,E=⾼脉冲读数据输⼊RS=H,R/W=H,E=H输出D0—D7=数据写数据输⼊RS=H,R/W=L,D0—D7=数据,E=输出⽆⾼脉冲由时序图可知,写操作时(包括写指令、写数据),RS=0;RW=0;再进⾏I/O⼝写操作,然后使能端⼝完成⼀次⾼脉冲(——⾼——低),这是液晶就会执⾏写操作的内容;1602液晶模块内部的控制器共有11条控制指令,如表10-14所⽰:序号指令RS R/W D7D6D5D4D3D2D1D01清显⽰00000000012光标返回000000001*3置输⼊模式00000001I/D S4显⽰开/关控制0000001D C B5光标或字符移位000001S/C R/L**6置功能00001DL N F**7置字符发⽣存贮器地址0001字符发⽣存贮器地址8置数据存贮器地址001显⽰数据存贮器地址9读忙标志或地址01BF计数器地址10要写的数据内容10写数到CGRAM或DDRAM)11读出的数据内容11从CGRAM或DDRAM读数思路:1、控制液晶显⽰输出,需要对其进⾏写数据(写数据前,同样需要先告诉液晶你下⼀步要在哪⾥写,因此写数据前,要写命令先设定数据指针)程序设计⽅式:write_com();//写命令函数,write_date();//写数据函数2、由于要先进⾏初始化,(初始化实际就是对液晶写指令,告诉其⼯作⽅式等)因此初始化函数⾥⾯⾃然就需要调⽤写命令函数write_com();程序结构如下:int init(){ EN = 0; write_com(0X38);//设置16*2显⽰,5*7点阵,8位数据接⼝ write_com(0X0C);//设置开显⽰,不显⽰光标 write_com(0X06);//写⼀个字符时,整屏右移 write_com(0X01);//显⽰清零 return 0;} 主函数部分程序结构:int main(){ init();//调⽤初始化函数 write_com(0x80);//调⽤写指令函数,设置写数据开始指针(第⼀⾏) for(x=0;x<6;x++)//数据写⼊循环程序 { write_date(table[x]); delay(150); } write_com(0x80+0x40); ;//调⽤写指令函数,设置写数据开始指针(第⼆⾏) for(x=0;x<17;x++)//数据写⼊循环程序 { write_date(table1[x]); delay(150); } while(1);return 0;}完整程序如下:1 #include<reg52.h>2int init(); //声明初始化函数3int write_com(unsigned char);//声明写命令函数4int write_date(unsigned char);//声明写数据函数5int delay(unsigned char);//声明延迟函数6 unsigned char x;7 sbit RS = P1^0;8 sbit RW = P1^1;9 sbit EN = P1^2;10 unsigned char code table[]="HELLO!";11 unsigned char code table1[]="MY name is Terry!";1213int main(void)//主函数14 {15 init();16 write_com(0x80);17for(x=0;x<6;x++)18 {19 write_date(table[x]);20 delay(150);21 }22 write_com(0x80+0x40);23for(x=0;x<17;x++)24 {25 write_date(table1[x]);26 delay(150);27 }28while(1);29return0;30 }3132int init()//初始化函数体33 {34 EN = 0;35 write_com(0X38);//设置16*2显⽰,5*7点阵,8位数据接⼝36 write_com(0X0C);//设置开显⽰,不显⽰光标37 write_com(0X06);//写⼀个字符时,整屏右移38 write_com(0X01);//显⽰清零39return0;40 }4142int write_com(unsigned char com)//写命令的函数体43 {44 RS = 0;45 RW = 0;46 P0 = com;47 delay(5);48 EN = 1;49 delay(5);50 EN = 0;51return0;52 }5354int write_date(unsigned char date)//写数据的函数体55 {56 RS = 1;57 RW = 0;58 P0 = date;59 delay(5);60 EN = 1;61 delay(5);62 EN = 0;63return0;64 }6566int delay(unsigned char xms)67 {68 unsigned char x,y;69for(x=xms;x>0;x--)70for(y=110;y>0;y--);71return0;72 }显⽰输出如下:。

仿真液晶1602

仿真液晶1602

/************仿真1602***********/#include<reg52.h>/*52系列单片机头文件*/#define uchar unsigned char/*字符变量宏定义*/#define uint unsigned int/*整型变量宏定义*/sbit rs=P3^5;/*寄存器选择输入*/sbit rw=P3^6;/*读写选择输入*/sbit e=P3^7;/*命令使能断*/uchar aa;/*字符变量*/uchar code write1[]="123456789abcdef";/*第一行显示,数组表示*/ uchar code write2[]="~!@#$%^&*()_+|/";/*第二行显示,数组表示*/ void delay(uint z);/*延时函数申明*/void write_com(uchar com);/*写指令函数*/void write_coo(uchar coo);/*些数据函数*/void init_1602();/*初始化函数*/void main()/*主函数*/{init_1602();/*初始化函数*/write_com(0x80);/*地址设置为第一行*/for(aa=0;aa<16;aa++)/*一行为16个字符,aa++*/{write_coo(write1[aa]);/*写数据到液晶*/}write_com(0x80+0x40);/*地址设置为第二行*/for(aa=0;aa<16;aa++)/*一行为16个字符,aa++*/{write_coo(write2[aa]);/*写数据到液晶*/}while(1);/*程序停止,保持显示。

*/}void delay(uint z)/*延时函数*/{uint x,y;/*整型变量x,y*/for(x=z;x>0;x--)/*for循环延时*/for(y=110;y>0;y--);}void write_com(uchar com)/*写指令函数*/{rs=0;/*rs=0为选择指令*/rw=0;/*rw=0.写选择*/P1=com;/*读指令*/e=1;/*e一个高脉冲执行读命令*/delay(1);/*稍微延时给时间读*/e=0;}void write_coo(uchar coo)/*写数据函数*/{rs=1;/*rs=1为选择数据*/rw=0;/*rw=0.写选择*/P1=coo;/*读数据*/e=1;/*e一个高脉冲执行读命令*/delay(1);/*稍微延时给时间读*/e=0;}void init_1602()/*初始化函数*/{write_com(0x38);/*1602功能设定*/write_com(0x01);/*清屏设定*/write_com(0x06);/*模式设定,地址指针自动加1*/write_com(0x0f);/*显示屏幕,光标,游标,闪不闪设定*/}/*由于本程序是在proteus仿真测试,一些参数设置不够严格。

基于proteus仿真1602液晶电子时钟(附1602字符液晶详细资料)

基于proteus仿真1602液晶电子时钟(附1602字符液晶详细资料)

基于proteus仿真1602液晶电子时钟(附1602字符液晶详细资料)#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a};sbit rs=P2^0;sbit rw=P2^1;sbit e=P2^2;uchar hshi,hge, mshi,mge,shi, ge,num,num1,num2,aa;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void lcd_com(uchar com) {rs=0;rw=0;P1=com;delay(1);e=1;e=0;}void lcd_dat(uchar dat) {rs=1;rw=0;P1=dat;delay(1);e=1;e=0;}void init(){lcd_com(0x38);delay(1);lcd_com(0x0c);delay(1);lcd_com(0x01);delay(1);TMOD=0X01;TH1=(65536-50000)/256; TL1=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void display(uchar hshi,uchar hge,uchar mshi,uchar mge,uchar shi,uchar ge){lcd_com(0x80);lcd_dat(table[hshi]);lcd_com(0x81);lcd_dat(table[hge]);lcd_com(0x82);lcd_dat(table[10]);lcd_com(0x83);lcd_dat(table[mshi]);lcd_com(0x84);lcd_dat(table[mge]);lcd_com(0x85);lcd_dat(table[10]);lcd_com(0x86);lcd_dat(table[shi]);lcd_com(0x87);lcd_dat(table[ge]);}void main(){init();while(1){if(aa==20){aa=0;num++;num2=3;num1=34;if(num==60){num=0;num1++;if(num1==60){num1=0;num2++;if(num==24) {num2=0;}}}hshi=num2/10;hge=num2%10;mshi=num1/10;mge=num1%10;shi=num/10;ge=num%10;}display(hshi,hge,mshi,mge,shi,ge);}}void timer0() interrupt 1{TH0=(65536-50000)/256;TH0=(65536-50000)/256;aa++;}所谓1602是指显示的内容为16*2,即可以显示两行,每行16个字符。

1602液晶显示工作原理及其在单片机中的应用(基于Proteus仿真)

1602液晶显示工作原理及其在单片机中的应用(基于Proteus仿真)

1602液晶显示原理及其在单片机中的应用基于Proteus仿真前言:本文详细介绍了1602液晶显示器的工作原理,并在后面举例说明了其在单片机中的应用,所举例子包含Proteus仿真电路图,源程序,程序注释详细清楚。

这有助于更好地理解与掌握1602液晶显示器。

1、1602 LCD基本参数:1602 LCD内置HD44780(目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的)专用液晶显示控制器,分为带背光和不带背光两种,带背光的比不带背光的厚,是否带背光在应用中并无差别。

显示容量为16×2个字符,即可以显示2行,每行16个字符。

芯片工作电压:4.5—5.5V;最佳工作电压为5.0V;工作电流:2.0mA(5.0V电压下);(补充说明:在电子工业中,背光是一种照明的形式,常被用于LCD显示上。

背光式和前光式不同之处在于背光是从侧边或是背后照射,而前光顾名思义则从前方照射。

他们被用来增加在低光源环境中的照明度和电脑显示器、液晶荧幕上的亮度,以和CRT显示类似的方式产生出光。

)2、1602 LCD引脚功能:1602芯片(在proteus中名字为LM016L) 采用标准的14脚(无背光)或16脚(带背光)接口,如右图所示,各引脚功能如下:VSS:电源地VDD:电源正极VEE:液晶显示偏压,为对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。

(补充说明:整体回路中的某个点,测量它相对某个基准点的电压(是整体回路电压的1/n)就称之为该点的偏压,各段电路的偏压之和就是整体回路电压,相应位置的电流就是偏压电流。

)RS:数据/命令选择信号,高电平时选择数据寄存器、低电平时选择指令寄存器。

RW(read/write,读/写):读/写控制信号,高电平时进行读操作,低电平时进行写操作。

当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。

基于proteus的51单片机仿真lcd1602

基于proteus的51单片机仿真lcd1602

基于proteus的51单片机仿真实例六十三、字符液晶LCD1602显示单个字符实例1、字符液晶LCD1602显示字符的过程:使用1602型液晶显示字符必须解决三个问题:代县字符ASCII标准妈的产生;液晶显示模式的设置;字符显示位置的指定。

1)字符ASCII标准码产生常用字符的标准ASCII码无需人工产生,在程序中定义字符常量或字符串常量时,C语言在编译后会自动产生其标准ASCII码。

职演讲澄澄的标准ASCII码通过单片机的IO口送入数据线使用存储器(DDRAM),部控制线路就会自动将字符传送到显示器上。

2)液晶显示模式的设置要让液晶显示字符,必须对有无光标、光标的移动方向、光标是否闪烁及字符的移动方向等进行设置。

这样才能获得所需的显示效果。

1602液晶显示模式的设置是通过控制指令对部的控制器进行控制而实现的。

常用的控制指令需要查询液晶的数据手册获得。

3)字符显示位置的指定想要在液晶的某一位置显示特定的字符,则必须指定其显示位置,显示位置的地址需要查询1602型LCD部地址获得。

2、1602型LCD的读写操作LCD是一个慢速显示器件,所以在写每一条指令之前一定要先读取LCD的忙碌状态(当然也可以通过加入一个比较长的延时时间来避开液晶的忙状态,但是这种方法并不合理)。

如果LCD正忙于处理其他指令,就需要等待处理结束;如果不忙,再执行写操作。

为此,1602型液晶专门设了一个忙碌标志位BF,该位位于从1602读取的8位数据的最高位,如果BF为0,表示LCD处于空闲状态,反之则处于忙碌状态。

3、1602液晶显示一个字符的操作过程为:读状态--写指令--写数据--自动显示。

1)读状态要将待显字符写入液晶模块,首先就要检测LCD是否忙碌,只有在LCD处于空闲状态的时候,才能够将待显字符写入2)写指令写指令包括写显示模式控制指令和写入地址。

3)写数据写数据实际上是将待显字符的标准ASCII码写入LCD的数据显示存储器(DDRAM)4)自动显示数据写入液晶模块后,字符产生器(CGROM)将自动读出字符的字形点阵数据,并将字符显示在液晶屏上,这个过程由LCD自动完成,无需人工干预4、1602液晶的初始化过程使用1602液晶显示字符之前,需要对其显示模式进行初始化设置,过程如此下:1)延时15ms,给液晶一段反应时间2)写指令0x38H,尚未开始工作,所以这里不需要检测忙信号,将液晶的显示模式设置为“16*2显示,5*7点阵,8位数据接口”3)延时5ms4)写指令,不需要检测忙信号5)延时5ms6)写指令,不需要检测忙信号7)延时5ms(连续设置3次,确保设置成功)8)以后每次写指令,读/写数据操作都要检测忙信号5、在keil c51中新建工程ex51,编写如下程序代码,编译并生成ex51.hex文件//用LCD显示字符'A'#include<reg51.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚/*****************************************************函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒***************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/void delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。

LCD1602液晶显示实验实验报告及程序

LCD1602液晶显示实验实验报告及程序

实验三 LCD1602液晶显示实验姓名专业学号成绩一、实验目的1.掌握Keil C51软件与proteus软件联合仿真调试的方法;2.掌握LCD1602液晶模块显示西文的原理及使用方法;3.掌握用8位数据模式驱动LCM1602液晶的C语言编程方法;4.掌握用LCM1602液晶模块显示数字的C语言编程方法。

二、实验仪器与设备1.微机一台 C51集成开发环境仿真软件三、实验内容1.用Proteus设计一LCD1602液晶显示接口电路。

要求利用P0口接LCD1602液晶的数据端,~做LCD1602液晶的控制信号输入端。

~口扩展3个功能键K1~K3。

参考电路见后面。

2.编写程序,实现字符的静态和动态显示。

显示字符为第一行:“1.姓名全拼”,第二行:“2.专业全拼+学号”。

3.编写程序,利用功能键实现字符的垂直滚动和水平滚动等效果显示。

显示字符为:“1.姓名全拼 2.专业全拼+学号 EXP8 DISPLAY ”主程序静态显示“My information!”四、实验原理液晶显示的原理:采用的LCD显示屏都是由不同部分组成的分层结构,位于最后面的一层是由荧光物质组成的可以发射光线的背光层,背光层发出的光线在穿过第一层偏振过滤层之后进入包含成千上万水晶液滴的液晶层,液晶层中的水晶液滴都被包含在细小的单元格结构中,一个或多个单元格构成屏幕上的一个像素。

当LCD中的电极产生电场时,液晶分子就会产生扭曲,从而将穿越其中的光线进行有规则的折射,然后经过第二层过滤层的过滤在屏幕上显示出来。

1.LCD1602采用标准的14引脚(无背光)或16引脚(带背光)接口,各引脚接口说明如表:2.1602液晶模块内部的控制器共有11条控制指令,如表所示:3.芯片时序表:4.1602LCD的一般初始化(复位)过程(1) 延时15ms。

(2) 写指令38H(不检测忙信号)。

(3) 延时5ms。

(4) 写指令38H(不检测忙信号)。

(5) 延时5ms。

PROTUS仿真51单片机测频程序

PROTUS仿真51单片机测频程序

PROTUS仿真51单片机测频程序频率计:LCD1602 显示在不增加外部计数硬件的情况下,本试验软件可测最高频率达到460KHz工作原理:1S 钟内对输入脉冲所计数的次数则为频率值。

16 位二进制加法计数器的最大计数值为65535。

设置定时器0 工作在定时方式1,定时1S。

设置定时器1 工作在计数方式1,对输入脉冲进行计数,溢出产生中断。

将定时器 1 中断定义为优先。

在中断处理程序里对中断次数进行计数。

1S 到后,将中断次数和计数器里的计数值取出进行综合数据处理,处理后的数据送LCD1602 显示。

/********************程序名:频率计功能:双通道频率测量,未加分频的情况下最高测频值65KHZ 网站:51 单片机教程网51hei 作者:周勇日期:2010 年4 月10 日*********************/#includesbit led=P1 ;sb itrs=P3 ;//rs=P2 ;sb it e=P3 ;//e=P2 ;sb it shift=P1 ;#defin e uchar unsigned char#define uint unsigned intuint time,aa;uint num,ff;uchar qian,bai,shi,ge;void delay_ms(uint z){uint x,y;for(x=z;x>0;x--) for(y=100;y>0;y--);}void writecom(uchar com)//写命令{ rs=0; // rw=0; P2=com; delay_ms(5); e=1; delay_ms(5); e=0;}void writedate(uchar date)//写数据{ rs=1; //rw=0; P2=date; delay_ms(5); e=1; delay_ms(5); e=0;}void lcd_init(){ P2=0xff; led=1; writecom(1);//清除显示delay_ms(20); writecom(0x38);//设置液晶为16*2 矩阵,5*7 点阵,8 位数据接口(写命令)delay_ms(20); writecom(0x0E);//设置液晶开显示,显示光标,光标闪烁(写命令) delay_ms(20); writecom(0x06);//设置地址自动向右加1(写命令) delay_ms(20); writecom(0x80);//光标指针位置初始化(写命令) delay_ms(20);}void。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于51单片机的1602液晶频率计设计一、Proteus仿真图:二、程序代码//最大测量65536Hz的频率计//原理:T0定时1S,T1计数#include <REG51.H>#include<INTRINS.H>#define uchar unsigned char#define uint unsigned intuint count=0;uint nm=0;uchar Fw,Fq,Fb,Fs,Fg;#define DataPort P0sbit LCM_RS=P2^0;sbit LCM_RW=P2^1;sbit LCM_EN=P2^2;uchar code str0[]={"-Test frequency-"};uchar code str1[]={"F=00000Hz "};//uchar code str2[]={" "};/*******************************/void delay(unsigned int k){unsigned int i,j;for(i=0;i<k;i++){for(j=0;j<121;j++){;}}}//=================================================///* 函数名:void WaitForEnable(void)作用:检测忙碌信号*///================================================//void WaitForEnable(void){DataPort=0xff;LCM_RS=0;LCM_RW=1;_nop_();LCM_EN=1;_nop_();_nop_();//while(DataPort&0x80);delay(5);LCM_EN=0;}//==========================================================// /* 函数名:void WriteCommandLCM(uchar CMD,uchar Attribc)作用:写命令到LCM *///==========================================================// void WriteCommandLCM(uchar CMD,uchar Attribc){if(Attribc)WaitForEnable();LCM_RS=0;LCM_RW=0;_nop_();DataPort=CMD;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;}//=========================================================///* 函数名:void WriteDataLCM(uchar dataW)作用:写数据*///=========================================================// void WriteDataLCM(uchar dataW){WaitForEnable();LCM_RS=1;LCM_RW=0;_nop_();DataPort=dataW;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;}//=========================================================///* 函数名:void InitLcd()作用:LCM初始化*///=========================================================// void InitLcd(){WriteCommandLCM(0x38,1);WriteCommandLCM(0x08,1);WriteCommandLCM(0x01,1);WriteCommandLCM(0x06,1);WriteCommandLCM(0x0c,1);}//=========================================================///*函数名:void DisplayOneChar(uchar X,uchar Y,uchar DData)作用:显示指定坐标的一个字符*///=========================================================// void DisplayOneChar(uchar X,uchar Y,uchar DData){Y&=1;X&=15;if(Y)X|=0x40;X|=0x80;WriteCommandLCM(X,0);WriteDataLCM(DData);}//============================================================// /*函数名:void DisplayListChar(uchar X,uchar Y,uchar code *DData作用:显示指定坐标的一串字符*///============================================================// void DisplayListChar(uchar X,uchar Y,uchar code *DData){uchar ListLength=0;Y&=0x1;X&=0xF;while(X<=15){DisplayOneChar(X,Y,DData[ListLength]);ListLength++;X++;}}//============================================================// /* 函数名:void main(void)作用:主函数*///============================================================////============================================================// /* 函数名:void display()作用:显示函数*///============================================================// void display(){Fw=count/10000+0x30;Fq=count/1000%10+0x30;Fb=count/100%10+0x30;Fs=count/10%10+0x30;Fg=count%10+0x30;DisplayOneChar(2,1,Fw);DisplayOneChar(3,1,Fq);DisplayOneChar(4,1,Fb);DisplayOneChar(5,1,Fs);DisplayOneChar(6,1,Fg);}void InitTime(void){TMOD=0x51;//T0为定时器工作于方式1,T1为计数器工作于方式1TH0=0x4C;//定时器50ms赋高8初值, 12M晶振TL0=0x00;//定时器50ms赋低8初值, 12M晶振TR0=1;//开定时器1TH1=0;//计数器赋高8初值初值TL1=0;//计数器赋低8初值TR1=1;//开计数器0ET0=1;EA=1;}void timeo(void) interrupt 1{TH0=0x4C;//定时器50ms赋高8初值TL0=0x00;//定时器50ms赋低8初值nm=nm+1;if(nm==10){TR1=0; //关闭T1定时器,定时1S完成TR0=0;//关闭T0}}//============================================================// /* 函数名:void main(void)作用:主函数*///============================================================// void main(void){char i;uint temp,temp1;delay(500);InitLcd(); //LCM初始化设置InitTime();for(i=15;i>=0;i--){DisplayListChar(i,0,str0);//显示第一行字符DisplayListChar(i,1,str1);//显示第二行字符delay(100);}while(1){if(nm==10)//定时10*50MS=500ms{temp=TL1;temp1=TH1;count=2*(temp1*256+temp);//定时2乘以500ms=1000ms display();TH1=0;//计数器赋高8初值初值TL1=0;//计数器赋低8初值nm=0;TR1=1;TR0=1;}}}。

相关文档
最新文档