搜档网
当前位置:搜档网 › 基于51单片机的1602LCD显示

基于51单片机的1602LCD显示

基于51单片机的1602LCD显示
基于51单片机的1602LCD显示

标签:单片机LCD

基于51单片机的1602LCD显示

基于51单片机的1602LCD显示

LCD(liquid crystal display)为液晶显示器,它一般不会单独使用,而是将LCD面板、驱动与控制电路组合成LCD模块(1iquid crystal display moulde,简称为LCM)来使用。LCM是一种很省电的显示设备,常被应用在数字或微处理器控制的系统,做为简易的人机接口,但人们一般还是习惯称之为LCD显示器。

1 硬件设计

采用51单片机控制1602LCD显示器的电路如下所示。

在桌面上双击图标,打开ISIS 7 Professional窗口(本人使用的是v7.4 SP3中文版)。单击菜单命令“文件”→“新建设计”,选择DEFAULT 模板,保存文件名为“LCD.DSN”。在器件选择按钮

中单击“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表51单片机AT89C51 一片晶体CRYSTAL 12MHz 一只

瓷片电容CAP 22pF 二只电解电容CAP-ELEC 10uF 一只

电阻RES 10K 一只排阻RESPAC-8 10K 一只

1602液晶显示器LM016L 一只

若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U1的31脚,都可以不画,它们都是默认的。

在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER和GROUND放置电源和地。放置好元件后,布好线。左键双击各元件,设置相应元件参数,完成电路图的设计。

2 软件设计

用1602LCD显示两行字符的流程图如下所示。

用1602LCD显示“Welcom to China”和“Hi!Good morning!”的详细C51程序如下。

//用LCD循环显示"Welcome to China"和"Hi!Good morning!"

#include //包含单片机的头文件

#include //包含_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引脚

unsigned char code string[ ]={"Welcome to China"};

unsigned char code string1[ ]={"Hi!Good morning!"};

/*************************************************

函数功能:延时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

delay1ms();

}

/*******************************************

函数功能:判断液晶模块的忙碌状态

返回值:result。result=1,忙碌; result=0,不忙

*******************************************/

unsigned char BusyTest(void)

{

bit result;

RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;

E=1; //E=1,才允许读写

_nop_(); //空操作

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

result=BF; //将忙碌标志电平赋给result

E=0;

return result;

}

/**************************************************

函数功能:将模式设置指令或显示地址写入液晶模块

入口参数:dictate

**************************************************/

void WriteInstruction (unsigned char dictate)

{

while(BusyTest()==1); //如果忙就等待

RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0;

E=0; //E置低电平

_nop_();

_nop_(); //空操作两个机器周期,给硬件反应时间

P0=dictate; //将数据送入P0口,即写入指令或地址

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=1; //E置高电平(正跳变)

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}

/**************************************************

函数功能:将数据(字符的标准ASCII码)写入液晶模块

入口参数:y(为字符常量)

**************************************************/

void WriteData(unsigned char y)

{

while(BusyTest()==1);

RS=1; //RS为高电平,RW为低电平时,可以写入数据

RW=0;

E=0; //E置低电平

P0=y; //将数据送入P0口,即将数据写入液晶模块

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=1; //E置高电平(正跳变)

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}

/******************************************

函数功能:对LCD的显示模式进行初始化设置

******************************************/

void LcdInitiate(void)

{

delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间

WriteInstruction(0x38); //显示模式设置:8位数据,16×2显示,5×7点阵,delay(5); //延时5ms

WriteInstruction(0x38);

delay(5);

WriteInstruction(0x38);

delay(5);

WriteInstruction(0x0f); //显示模式设置:显示开,有光标,光标闪烁

delay(5);

WriteInstruction(0x06); //显示模式设置:光标右移,字符不移

delay(5);

WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除

delay(5);

}

void main(void) //主函数

{

unsigned char i;

LcdInitiate(); //调用LCD初始化函数

delay(10);

while(1)

{

WriteInstruction(0x01); //清显示:清屏幕指令

WriteInstruction(0x80); //第一行显示地址

i = 0;

while(string[i] != '\0')

{ // 显示字符

WriteData(string[i]);

i++;

delay(150);

}

for(i=0;i<4;i++)

delay(250);

WriteInstruction(0xc0); //第二行显示地址

i = 0;

while(string1[i] != '\0')

{ // 显示字符

WriteData(string1[i]);

i++;

delay(150);

}

for(i=0;i<4;i++)

delay(250);

}

}

打开Keil程序(本人使用的是Keil8.05中文版),执行菜单命令“工程”→“新建工程”创建“LCD”项目,并选择单片机型号为AT89C51。执行菜单命令“文件”→“新建”创建文件,输入C语言源程序,保存为“LCD.C”。在Project Workspace窗口中右击源代码组1,选择“添加文件到组‘源代码组l’”将源程序“LCD.C”添加到项目中。

在Keil中执行执行菜单命令“工程”→“创建目标”(或点击“创建目标”快捷按钮),编译源程序。如果编译成功,则在“Output Window”的“创建”窗口中显示没有错误,并创建了“LCD.HEX”文件。

3 仿真与调试

关于Proteus与Keil的联合仿真调试,可参见我以前所写的博文或其它参考资料。

启动Proteus的ISIS,并将其放在屏幕的右上角(可将原理图放大到合适大小);再启动Keil的μVision3,并将其放在屏幕的左下角。

在Keil中执行菜单命令“调试”→“启动/停止调试”,或直接单击图标

,进入Keil调试环境。同时,在Proteus ISIS的窗口中可看出Proteus也进

入了程序调试状态。

在Keil代码编辑窗口中设置相应断点,断点的设置方法:在需要设置断点语句前双击鼠标左键,可设置断点;再次双击,可取消该断点。

在Keil中按F5键(或点击“运行”快捷按钮)运行程序。1602LCD循环显示“Welcom to China”和“Hi!Good morning!”,如下图所示。

或可以点击单步、运行到光标处、全速运行等快捷按钮,以及同时观察工程窗口寄存器页面、存储器窗口等,来进行仿真调试。

51单片机控制4个数码管显示

. //使用AT89c51单片机控制四个数码管动态显示0-9999 ,12MHz #include void jiayi();//加1函数 void chufa();//除法函数 void xianshi();//显示函数 void delay();//延时函数 sbit P2_0=P2^0;//个位位码 sbit P2_1=P2^1;//十位位码 sbit P2_2=P2^2;//百位位码 sbit P2_3=P2^3;//千位位码 unsigned char qianwei,baiwei,shiwei,gewei; unsigned int count=0; unsigned char code dis[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极0-9 void main() { while(1) { jiayi(); chufa(); xianshi(); } } void chufa()//将数字的各个位拆开 { qianwei=count/1000;//千位数 baiwei=count%1000/100; //百位数 shiwei=count%100/10; //十位数 gewei=count%10; //个位数 } void jiayi() { count=count+1; if(count==10000) count=0; } void delay()//延时 { unsigned int i,j; for(i=0;i<10;i++) { for(j=0;j<200;j++); } }

51单片机-八段数码管显示

实验一八段数码管显示 1、实验目的: (1)了解数码管动态显示的原理。 (2)了解74LS164扩展端口的方法。 2、实验要求: 利用实验仪提供的显示电路,动态显示一行数据. 3、实验电路图 LED1LED2LED3LED4LED5LED6 4、实验器材: (1)超想-3000TB综合实验仪 1 台 (2)超想3000仿真器 1 台 (3)计算机 1 台

5、实验连线 无 6、实验说明: (1)本实验仪提供了8段码LED 显示电路,学生只要按地址输出相应数据,就可以实现对显示器的控制。显示共有6位,用动态方式显示。8段数码管是由8155的PB0、PB1经74LS164“串转并”后输出得到。6位位码由8155的PA0口输出,经Ua2003反向驱动后,选择相应显示位。 74LS164是串行输入并行输出转换电路,串行输入的数据位由8155的PB0控制,时钟位由8155的PB1控制输出。写程序时,只要向数据位地址输出数据,然后向时钟位地址输出一高一低两个电平就可以将数据位移到74LS164中,并且实现移位。向显示位选通地址输出高电平就可以点亮相应的显示位。 本实验仪中数据位输出地址为0e102H ,时钟位输出地址为0e102H ,位选通输出地址为 0e101H 。本实验涉及到了8155 I0/RAM 扩展芯片的工作原理以及74LS164器件的工作原理。 (2)七段数码管的字型代码表 显示字形 g f e d c b a 段码 0 0 1 1 1 1 1 1 3fh 1 0 0 0 0 1 1 0 06h 2 1 0 1 1 0 1 1 6bh 3 1 0 0 1 1 1 1 4fh 4 1 1 0 0 1 1 0 66h 5 1 1 0 1 1 0 1 6dh 6 1 1 1 1 1 0 1 7dh 7 0 0 0 0 1 1 1 07h 8 1 1 1 1 1 1 1 7fh 9 1 1 0 1 1 1 1 6fh A 1 1 1 0 1 1 1 77h B 1 1 1 1 1 0 0 7ch C 0 1 1 1 0 0 1 39h D 1 0 1 1 1 1 0 5eh E 1 1 1 1 0 0 1 79h F 1 1 1 1 71h a b c d e f g dp

基于51单片机的LED数码管动态显示

基于51单片机的LED数码管动态显示 LED数码管动态显示就是一位一位地轮流点亮各位数码管,对于每一位LED数码管来说,每隔一段时间点亮一次,利用人眼的“视觉暂留"效应,采用循环扫描的方式,分时轮流选通各数码管的公共端,使数码管轮流导通显示。当扫描速度达到一定程度时,人眼就分辨不出来了。尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,认为各数码管是同时发光的。若数码管的位数不大于8位时,只需两个8位I/O口。 1 硬件设计 利用51单片机的P0口输出段码,P2口输出位码,其电路原理图如下所示。 在桌面上双击图标,打开ISIS 7 Professional窗口(本人使用的是v7.4 SP3中文版)。单击菜单命令“文件”→“新建设计”,选择DEFAULT模板,保存文件名为“DT.DSN”。在器件选择按钮中单击

“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表所示的元件。 51单片机AT89C51 一片 晶体CRYSTAL 12MHz 一只 瓷片电容CAP 22pF 二只 电解电容CAP-ELEC 10uF 一只 电阻RES 10K 一只 电阻RES 4.7K 四只 双列电阻网络Rx8 300R(Ω) 一只 四位七段数码管7SEG-MPX4-CA 一只 三极管PNP 四只 若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U1的31脚,都可以不画,它们都是默认的。 在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER 和GROUND放置电源和地。放置好元件后,布好线。左键双击各元件,设置相应元件参数,完成电路图的设计。 2 软件设计 LED数码管动态显示是一位一位地轮流点亮各位数码管的,因此要考虑每一位点亮的保持时间和间隔时间。保持时间太短,则发光太弱而人眼无法看清;时间太长,则间隔时间也将太长(假设N位,则间隔时间=保持时间X(N-1)),使人眼看到的数字闪烁。在程序中要合理的选择合适的保持时间和间隔时间。而循环次数则正比于显示的变化速度。 LED数码管动态显示的流程如下所示。

51单片机(四位数码管的显示)程序

51单片机(四位数码管的显示)程序 基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。 最佳答案 下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你! #include unsigned char code Dig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码 unsigned char k; //设置全局变量k 为键盘的键值 /************************************键盘延时函数****************************/ void key_delay(void) //延时函数 { int t; for(t=0;t<500;t++); } /************************************键盘扫描函数******************************/ void keyscan(void) //键盘扫描函数 { unsigned char a; P2 = 0xf0; //键盘初始化 if(P2!=0xf0) //有键按下? { key_delay(); //延时 if(P2!=0xf0) //确认真的有键按下? { P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平 key_delay(); a = P2; //a作为缓存 switch (a) //开始执行行列扫描 { case 0xee:k=15;break; case 0xde:k=11;break; case 0xbe:k=7;break; case 0x7e:k=3;break; default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平 a = P2; switch (a)

51单片机数码管显示实验报告

51单片机数码管显示实验 实验内容: 1)编写程序让8只数码管初始显示0,每隔大约1s加1显示(可以用延时函数实现),到数码管显示9后,再从0开始显示,如此循环反复。 2)C语言程序 #include #define uint unsigned int void display(); void num(); int i; unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e}; //共阳极数码管0-F编码表 void delayms(uint); void main() { while(1) { num(); display(); } } void display() { P2=0xff;//消隐P0连接段选,P1节位选 P1=0x00;//8个数码管同时显示 P2=table[i];//数码管显示数码0 delayms(1000);//延时5ms } void num() { if(i<9) i++; else i=0; } void delayms(uint x) { uint i,j; for(i=0;i

3)汇编语言: ORG 0000H LJMP MAIN ORG 0100H ;P2连接段选,P1节位选 MAIN: MOV P1,#00H ;所有的数码管都显示 MOV R2,#00H ;从0开始显示 LOOP: MOV A,R2 ;为下面的基址加变址寄存器寻址方式做准备MOV DPTR,#TAB1 ;把数组的首地址赋给DPTR MOVC A,@A+DPTR ;取数组中的数字 MOV P2,A ;把取得的值送给P0口显示 ACALL DELAY ;延时一会 INC R2 ;为取下一个数加一 CJNE R2,#10,LOOP ;只要数小于10就继续循环显示 MOV R2,#00H ;如果加到10后重新从0开始 LJMP LOOP ;进入循环函数 ;****************************************** TAB1: DB 0C0H,0F9H,0A4H,0B0H,99H; 数组 DB 92H,82H,0F8H,80H,90H RET ;****************************************** DELAY: MOV R3,#3 ;延时函数 DE1: MOV R4,#0FFH DE2: MOV R5,#0FFH DJNZ R5,$ DJNZ R4,DE2 DJNZ R3,DE1 RET ;************************************************* END

数码管动态显示的51单片机时钟设计

一看就会,适合初学者参考 T0,T1同时开中断,和别人的有点不一样 源程序如下 //数码管设计的可调电子钟 //K1,K2分别调整小时和分钟 #include<> #include<> #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99, //共阳段码 0x92,0x82,0xF8,0x80,0x90,0xFF}; uchar DSY_BUFFER[]={0,0,0xBF,0,0,0xBF,0,0}; //显示缓存uchar Scan_BIT; //扫描位,选择要显示的数码管 uchar DSY_IDX; //显示缓存索引 uchar Key_State; //P1端口按键状态 uchar h,m,s,s100; //十分秒,1/100s void DelayMS(uchar x) //延时 { uchar i; while(x--) for(i=0;i<120;i++); } void Increase_Hour() //小时处理函数 { if(++h>23)h=0; DSY_BUFFER[0]=DSY_CODE[h/10]; DSY_BUFFER[1]=DSY_CODE[h%10]; } void Increase_Minute()//分钟处理函数 { if(++m>59) { m=0;Increase_Hour(); } DSY_BUFFER[3]=DSY_CODE[m/10]; DSY_BUFFER[4]=DSY_CODE[m%10]; }

51单片机数码管0到F动态显示

#include #define uchar unsigned char #define uint unsigned int sbit du=P2^6; sbit we=P2^7; uchar num; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delays(uint); void main() { we=1;//打开U2锁存器 P0=0xc0;//送入位选信号 we=0; while(1) { du=1; P0=table[0]; du=0; P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱 we=1; P0=0xfe; we=0; delays(500); du=1; P0=table[1]; du=0; P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱 we=1; P0=0xfd; we=0; delays(500); du=1; P0=table[2]; du=0; P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱 we=1; P0=0xfb; we=0;

delays(500); du=1; P0=table[3]; du=0; P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱 we=1; P0=0xf7; we=0; delays(500); du=1; P0=table[4]; du=0; P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱 we=1; P0=0xef; we=0; delays(500); du=1; P0=table[5]; du=0; P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱 we=1; P0=0xdf; we=0; delays(500); du=1; P0=table[6]; du=0; P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱 we=1; P0=0xfe; we=0; delays(500); du=1; P0=table[7];

51单片机键盘数码管显示(带程序)

期 中 大 作 业 学院:物理与电子信息工程学院

课题: 【利用8255和51单片机实现数码管显示按键数值的程序】要求: 【4*4矩阵键盘,按0到15,数码管上分别显示0~9,A~F】 芯片资料: 8255: 8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。其各口功能可由软件选择,使用灵活,通用性强。8255可作为单片机与多种外设连接时的中间接口电路。 8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。同时必须具有与外设连接的接口A、B、C口。由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:与CPU连接部分、与外设连接部分、控制部分。 8255特性: 1.一个并行输入/输出的LSI芯片,多功能的I/O器件,可作为CPU总线与外围的接口。 2.具有24个可编程设置的I/O口,即3组8位的I/O口,分别为PA口、PB口和PC 口。它们又可分为两组12位的I/O口:A组包括A口及C口(高4位,PC4~PC7),B组包括B口及C口(低4位,PC0~PC3)。A组可设置为基本的I/O口,闪控(STROBE)的I/O闪控式,双向I/O三种模式;B组只能设置为基本I/O或闪控式I/O两种模式,而这些操作模式完全由控制寄存器的控制字决定.

引脚说明 RESET:复位输入线,当该输入端处于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成输入方式。 CS:芯片选择信号线,当这个输入引脚为低电平时,即CS=0时,表示芯片被选中,允许8255与CPU进行通讯;CS=1时,8255无法与CPU做数据传输。RD:读信号线,当这个输入引脚为低电平时,即CS=0且RD=0时,允许8255通过数据总线向CPU发送数据或状态信息,即CPU从8255读取信息或数据。WR:写入信号,当这个输入引脚为低电平时,即CS=0且WR=0时,允许CPU将数据或控制字写入8255。 D0~D7:三态双向数据总线,8255与CPU数据传送的通道,当CPU 执行输入输出指令时,通过它实现8位数据的读/写操作,控制字和状态信息也通过数据总线传送。 PA0~PA7:端口A输入输出线,一个8位的数据输出锁存器/缓冲器,一个8位的数据输入锁存器。 PB0~PB7:端口B输入输出线,一个8位的I/O锁存器,一个8位的输入输出缓冲器。 PC0~PC7:端口C输入输出线,一个8位的数据输出锁存器/缓冲器,一个8位的数据输入缓冲器。端口C可以通过工作方式设定而分成2个4位的端口,每个4位的端口包含一个4位的锁存器,分别与端口A和端口B配合使用,可作为控制信号输出或状态信号输入端口。 A1,A0:地址选择线,用来选择8255的PA口,PB口,PC口和控制寄存器。 当A1=0, A0=0时,PA口被选择; 当A1=0, A0=1时,PB口被选择; 当A1=1, A0=0时,PC口被选择; 当A1=1. A0=1时,控制寄存器被选择。 74ls373芯片资料: 74ls373是常用的地址锁存器芯片,它实质是一个是带三态缓冲输出的8D 触发器,在单片机系统中为了扩展外部存储器,通常需要一块74ls373芯片.本

51单片机控制4个数码管显示09999

//使用AT89c51单片机控制四个数码管动态显示0-9999 ,12MHz #include<> void jiayi();//加1函数 void chufa();//除法函数 void xianshi();//显示函数 void delay();//延时函数 sbit P2_0=P2^0;//个位位码 sbit P2_1=P2^1;//十位位码 sbit P2_2=P2^2;//百位位码 sbit P2_3=P2^3;//千位位码 unsigned char qianwei,baiwei,shiwei,gewei; unsigned int count=0; unsigned char code dis[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极0-9 void main() { while(1) { jiayi(); chufa(); xianshi(); } } void chufa()//将数字的各个位拆开 { qianwei=count/1000;//千位数 baiwei=count%1000/100; //百位数 shiwei=count%100/10; //十位数 gewei=count%10; //个位数 } void jiayi() { count=count+1; if(count==10000) count=0; } void delay()//延时 { unsigned int i,j; for(i=0;i<10;i++) { for(j=0;j<200;j++); } }

51单片机数码管显示程序

;该程序库为4位显示,可以设置3个小数点的位置,数据在R2中,LED_DATA EQU P0 ;数码管数据口定义 SHOW1 EQU 30H ;个位 SHOW2 EQU 31H ;十位 SHOW3 EQU 32H ;百位 SHOW4 EQU 33H ;千位 SHOW5 EQU 34H ;万位 XSDW EQU 50H ;小数点位数 ORG 0000H AJMP LOOP ORG 0030H LOOP: MOV P0,#0FFH MOV P1,#0FFH MOV P2,#0FFH MOV P3,#0FFH MOV SP,#60H MOV XSDW,#00H LOOP0: CALL CONVT CALL PLAY JB P3.7,LOOP0 CALL DELAY2MS CALL DELAY2MS CALL DELAY2MS CALL DELAY2MS CALL DELAY2MS CALL DELAY2MS CALL DELAY2MS JB P3.7,LOOP0 JNB P3.7, LOOP1 NOP LOOP1: CALL PLAY JNB P3.7, LOOP1 MOV A,XSDW CJNE A,#3,LOOP2 MOV XSDW,#00H AJMP LOOP0 LOOP2: INC XSDW AJMP LOOP0 ;--------------------------------------------------------- ;代码变换(HEX TO BCD) ;--------------------------------------------------------- CONVT: CLR EA

51单片机数码管加减

实现的功能:按下key1键数字加1,按下key2键数字减1,按下key3键数字归零。并且满足,在不松开按键时,数字会按一定时间间隔持续递增或递减。 数码管显示程序: void display(uchar shu) { uchar bai,shi,ge; bai=shu/100; shi=shu/10%10; Ge=shu%10; P2=0x7f; P0=table[ge]; delay(5); P2=0xbf; P0=table[shi]; delay(5); P2=0xdf; P0=table[bai];

delay(5); } 这里是利用传送函数,在传送过程中我们传送的是一个值,这个值的百、十、个位,我们在子函数中进行分解。再通过数组将段码、位码,传送到相应的I/O。 此外还要注意的一点是:这里是动态扫描,不能忘了原理,是一位一位的显示,只是太快了,看不出来,所以在每一个数码管亮之间一定要有10毫秒的延时!!! 键盘子程序: void keyscan() { P1=0xff; // P1口赋初值, key_code=P1;//将P1口的状态赋予一个变量,便于以后的检测。 if(key_code!=0xff)//如果条件满足说明有按键被按下。 { for(i=0;i<30;i++) display(shu);//这小段子程序有两个

作用:1、不断的扫描显示子程序。这样就会避免一种现象:按键被按下时,所有的数码管会闪烁,加了这小段程序后给人的感觉是各个数码管是独立的,互不影响,它加他的,我前面几位该不变就不变。 2、还起到延时作用。 switch(key_code)//利用switch可以是程序事半功倍,又好读,应该借鉴。 { case 0xfe://注意格式的书写 if(shu<255) shu++; break;//不要忘了 case 0xfd: if(shu>0) shu--; break; case 0xfb: shu=0; } key_code=0xff;//这句程序得格

基于51单片机的LED数码管动态显示

NDM XTW2 potm 畑 PO^.I P0v.l m\ JO.TAI 啊 P2.W 細 iSEiT ALE ER卩2訥 92辄 MJ 儿1辽帽 112w S13阳F m PR #15P35/ MJ 基于51单片机的LED数码管动态显示 LED数码管动态显示就是一位一位地轮流点亮各位数码管,对于每一位LED数码管来说,每隔一段 时间点亮一次,利用人眼的“视觉暂留"效应,采用循环扫描的方式,分时轮流选通各数码管的公共 端,使数码管轮流导通显示。当扫描速度达到一定程度时,人眼就分辨不出来了。尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,认为各数码管是同时发光的。若数码管的位数不大于8位时,只需两个8位I/O 口。 1 硬件设计 利用51单片机的P0 口输出段码,P2 口输出位码,其电路原理图如下所示。 在桌面上双击图标,打开 ISIS 7 Professional窗口(本人使用的是 v7.4 SP3中文版)。单击菜单命令“文件新建设计”,选择DEFAULT模板,保存文件名为“ DT.DSN ”。在器件选择按钮中单击“P”按钮,或执行菜单命令“库”7“拾取元件/符号”,添加如下表所示的元件。 51单片机AT89C51 —片 晶体 CRYSTAL 12MHz —只 瓷片电容CAP 22pF 二只 电解电容CAP-ELEC 10uF —只 电阻RES 10K 一只 电阻RES 4.7K四只 双列电阻网络 Rx8 300R( Q ) 一只

四位七段数码管 7SEG-MPX4-CA —只 三极管PNP 四只 若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U1的31脚,都可以不画,它们都是 默认的。 在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER 和GROUND放置电源和地。放置好元件后,布好线。左键双击各元件,设置相应元件参数,完成电路图的设计。2软件设计 LED数码管动态显示是一位一位地轮流点亮各位数码管的,因此要考虑每一位点亮的保持时间和间隔时间。保持时间太短,则发光太弱而人眼无法看清;时间太长,则间隔时间也将太长(假设N位,则间隔时间=保持时间X( N-1 )),使人眼看到的数字闪烁。在程序中要合理的选择合适的保持时间和间隔时间。而循环次数则正比于显示的变化速度。

基于某51单片机地数码管显示4位密码锁

单片机原理课程设计论文 班级: 电气1136班 学号: 1 姓名: 朱焯华 指导老师: 瑛 目录

一、前言。。。。。。。。。。。。。。。。。。。。。。。。。 3 二、选题要求。。。。。。。。。。。。。。。。。。。。。。。 3 三、硬件电路设计。。。。。。。。。。。。。。。。。。。。。。 4 3.1 主控芯片。。。。。。。。。。。。。。。。。。。。4 3.2 矩阵键盘电路。。。。。。。。。。。。。。。。。。5 3.3 数码管电路。。。。。。。。。。。。。。。。。。。6 3.4 138译码器位选电路。。。。。。。。。。。。。。。6 3.5 晶振和复位电路。。。。。。。。。。。。。。。。。7 3.6 蜂鸣器电路。。。。。。。。。。。。。。。。。。。8 四、软件设计。。。。。。。。。。。。。。。。。。。。。。。。8 五、调试结果。。。。。。。。。。。。。。。。。。。。。。。。10 六、总结。。。。。。。。。。。。。。。。。。。。。。。。。。12

前言 随着人们生活水平的提高,如何实现家庭防盗这一问题也变得尤为突出。在 科学技术不断发展的今天,电子密码防盗锁作为防盗卫士的作用显得日趋重 要。本文从经济实用的角度出发,系统由STC89C51作为主控芯片与数据存储 器单元,结合外围的键盘输入、数码管显示、报警、开锁等电路模块。它能完 成以下功能:正确输入密码前提下,开锁,数码管显示“open”;错误输入密码 情况下,报警,数码管显示“err”;密码可以根据用户需要在程序中更改。用C 语言编写的主控芯片控制程序,并用Keil4软件进行编译,设计了一款可以更改 密码的系统,本密码锁具有设计方法合理,简单易行,成本低,安全实用,性 强,灵活性高等特点,具有一定的推广价值。 关键词:电子密码锁、报警、数码管显示 二、选题要求 本文从经济实用的角度出发,设计采用51单片机为主控芯片,结合外围电路,组成电子密码控制系统,密码锁共4位密码(可增加),每位的取值围为0~9,外加“确认”键和“取消”键。用户可以通过修改程序来修改密码,想要打开锁,必先通过提供的键盘输入正确的密码才可以,密码输入错误有提示并报警。4位密码同时输入正确,锁才能打开。性强、灵活性高。其特点: 1) 性好,编码量多,远远大于弹子锁。随机开锁成功率几乎为零。 2) 密码可变,用户可以更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降。 3) 当输入密码错误时,报警系统自动启动。 4) 无活动零件,不会磨损,寿命长。

51单片机静态数码管显示数字程序

//以下程序都是在VC++6.0 上调试运行过的程序,没有错误,没有警告。 //单片机是STC89C52RC,但是在所有的51 52单片机上都是通用的。51只是一个学习的基础平台,你懂得。 //程序在关键的位置添加了注释。 //用//11111111111111111代表第一个程序。//2222222222222222222222222代表第二个程序,以此类推 //1111111111111111111111111111111111111111111111111111111111111111111 //1111111111111111111111111111111111111111111111111111111111111111111 /****************************************************************************** * * 实验名: 静态数码管实验 * 使用的IO : 数码管使用P0,键盘使用P3.0、P3.1、P3.2、P3.3 * 实验效果: 按下K1键,显示0,按下K2键,显示9,按下K3键,显示减1,按下K4键, *显示加1。 * 注意:由于P3.2口跟红外线共用,所以做按键实验时为了不让红外线影响实验 *效果,最好把红外线先取下来。 ******************************************************************************* / #include #include #define GPIO_DIG P0 sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; sbit K1=P3^1; sbit K2=P3^0; sbit K3=P3^2; sbit K4=P3^3; unsigned char code DIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9的值 void Delay10ms(); //延时10ms /****************************************************************************** * * 函数名: main * 函数功能: 主函数 * 输入: 无

51单片机数码管显示时钟程序

#include<> //#include#include<> #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; sbit key1=P3^4; sbit key2=P3^5; sbit key3=P3^6; sbit beep=P2^3; unsigned code table[]={ 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c, 0x39 , 0x5e , 0x79 , 0x71 }; uchar num1,num2,s,s1,m,m1,f,f1,num,numf,nums,dingshi; uchar ns,ns1,nf,nf1,numns,numnf; void delay(uint z); void keyscan (); void keyscan1 (); void alram(); void display(uchar m,uchar m1,uchar f,ucharf1,uchars,uchars1); void display0(uchar nf,uchar nf1,uchar ns,uchar ns1); void main() { TMOD=0x01;//设定定时器0工作方式1 TH0=(65536-46080)/256 ; T L0=(65536-46080)%256 ; E A=1;//开总中断 E T0=1;//开定时器0中断 T R0=1;//启动定时器0中断 n umns=12; n umnf=0; while(1) { if(dingshi==0) { keyscan (); display(m,m1,f,f1,s,s1); alram(); }

51单片机数码管显示时钟程序

#include //#include#include #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; sbit key1=P3^4; sbit key2=P3^5; sbit key3=P3^6; sbit beep=P2^3; unsigned code table[]={ 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c, 0x39 , 0x5e , 0x79 , 0x71 }; uchar num1,num2,s,s1,m,m1,f,f1,num,numf,nums,dingshi; uchar ns,ns1,nf,nf1,numns,numnf; void delay(uint z); void keyscan (); void keyscan1 (); void alram(); void display(uchar m,uchar m1,uchar f,ucharf1,uchars,uchars1); void display0(uchar nf,uchar nf1,uchar ns,uchar ns1); void main() { TMOD=0x01;//设定定时器0工作方式1 TH0=(65536-46080)/256 ; TL0=(65536-46080)%256 ; EA=1;//开总中断 ET0=1;//开定时器0中断 TR0=1;//启动定时器0中断 numns=12; numnf=0; while(1) { if(dingshi==0) { keyscan (); display(m,m1,f,f1,s,s1); alram(); }

相关主题