当前位置:文档之家› 单片机实例之数码管

单片机实例之数码管


#include <reg51.h> unsigned char code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char code tablewe[]={0x1f,0x3f,0x5f,0x7f,0x9f,0xbf,0xdf,0xff}; void delay02s(void) { unsigned char i,j,k; for(i=10;i>0;i--) for(j=200;j>0;j--) for(k=248;k>0;k--); } void main(void) { unsigned char i; unsigned char x[8]={0}; while(1){ //2.对x加1 for(i=0;i<8;i++){ x[i]++; if(x[i]>=10){ x[i]=0; } else break; } //3.将x送显,先送x[i]的段码,再送x[i]的位码 for(i=0;i<8;i++){ P1=tabledu[x[i]]; P0=tablewe[i]; //4.延时 delay02s(); } } }
图4-6 数码管原理图
三、74LS138译码器:
74LS138 为3 线-8 线译码器,其工作原理如下: 当一个选通端(G1)为高电平,另两个选通 端(/(G2A)和/(G2B))为低电平时,可将地址端 (A、B、C)的二进制编码在一个对应的输出端 以低电平译出。
图4-4 74LS138引脚图

unsigned char dispcount; void delaynms(unsigned char n) { unsigned char i,j; for(i=n;i>0;i--) for(j=250;j>0;j--); } void main(void) { while(1) { for(dispcount=0;dispcount<8;dispcount++) { P1=tabledu[dispcount]; P0=tablewe[dispcount]; delaynms(20); //10ms,12MHz } } }
0 1 1 1 0 0
0 1 0 1 1 1
0 1 0 0 1 0
0 0 1 0 0 0
0 0 0 0 0 1
0 1 0 0 1 0
C0H F9H A4H B0H 99H 92H 82H F8H
1
1
0
1
0
1
0
1
0
1
0
0
1
0
0
0
数字8
数字9
1
1
0
0
0
0
0
1
0
0
0
0
0
0
0
080H90H四、程序设计要实现0~9的显示,设 计方法与前面彩灯花样显示 类似,首先写出0~9的显示 数据(表4-1中的字型码数 据,注意电路中选用的是共 阴或共阳数码管一致),这 些数据在程序中作数组元素。 程序中将数组元素依次读出 送到端口,使数码管显示出 对应的数字。程序的设计框 图4-5 图见图4-5。
任务二 LED数码管的动态显示
本任务就是当单片机与数码管接成动态 显示方式,编程实现数码管的0-7数字显示。
一、电路原理
动态显示的电路有很多,本课题中所选用的 电路如图4-6所示。图中用的是两只四位数码管。 每只已将所有数码管的a~h分别连接在一起,再 将两只四位数码管的a~h连接在一起,即将八只 数码管八段显示的段码控制线连接在一起,作为 整个数码管的段码控制。单片机端口驱动能力不 足,在段码上使用74LS373提高数码管亮度。对 每只数码管的公共端进行控制,使每只数码管可 以单独显示。电路中,将每个数码管的COM端接 位选信号dig,该引脚为低电平即接通显示,实现 数码管的位控制。
二、程序分析
下面,以在数码管上从左到右依次显示出8个 数字(0~7)为例,编写动态显示程序。程序中 将要显示的八个数字放在一个数组中(该数组取 名为display_data)。如果从段码输出端口来看, 动态显示程序的显示段码输出的过程,其实质和 静态显示八个数字是一样的,依次输出各个段码; 从位码端口看,要哪只数码管显示,就在那只数 码对应位输出1,显示一个数字后,则下一位输出 高电平,这与跑马灯的控制是一样的。将这两个 程序结合起来,就是动态显示程序,流程图如图 4-7所示。
1、C语言程序: #include <reg51.h> #define uchar unsigned char unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char dispcount;
如图4-6所示电路,在电路连接上将所有要显 示的数码管的八个端并接在单片机同一个端口的 八位上,而用单片机的另一个端口的各个位分别 控制各数码管的公共端,控制数码管是否点亮。 在程序的控制下,快速地依次输出要显示各个数, 并同时控制对应数码管工作,这就是数码管的动 态显示方式。
宏观看同时点亮,微观看依次点亮
变量赋初值化
No
i<8
Yes
将数组display_data中第i个 元素送段码端口 输出位码控制数据 等待一段时间 变量指向下一个数据
图4-7 动态显示流程图
1、C语言程序: #include <reg51.h> #define uchar unsigned char uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; uchar code tablewe[]={0x1f,0x3f,0x5f,0x7f,0x9f, 0xbf,0xdf,0xff};
任务四 24进制计数器
本任务实现24进制计数器,计数范围为0~23。
程序设计分析
1. 24进制计数和前面的十进制计数不同的是,当计数到 24时,个位数要变为0,同时十位数也要变为0。需要 定义一个变量,记录加1后的结果,该变量初值为0, 问该变量定义为何种类型? unsigned char x=0;
void main(void) { while(1) { for(dispcount=0;dispcount<10;dispcount++) { a=0; b=0; c=0; P1=table[dispcount]; delay02s(); } } }
2、汇编语言程序: org 00h aa:mov r0,#00h mov dptr,#tab clr p0.5 clr p0.6 clr p0.7 sd:mov a,r0 movc a,@a+dptr lcall delay mov p1,a inc r0
void delay02s() { unsigned char i,j,k; for(i=10;i>0;i--) for(j=200;j>0;j--) for(k=248;k>0;k--); }
void main(void) { while(1) { for(dispcount=0;dispcount<10;dispcount++) { P1=table[dispcount]; delay02s(); } } }
真值表:
表4-2 74LS138功能表
图4-6 数码管原理图
1、C语言程序: #include <reg51.h> #define uchar unsigned char sbit a=P0^5; sbit b=P0^6; sbit c=P0^7; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; uchar dispcount; void delay02s(void) { unsigned char i,j,k; for(i=10;i>0;i--) for(j=200;j>0;j--) for(k=248;k>0;k--); }
数字9
0
1
1
0
1
1
1
1
6FH
数码管段码
表4-2 共阳数码管显示数字的段码表
段名称 dp G F E D C B A 对应段码
对应引脚
数字0 数字1 数字2 数字3 数字4 数字5 数字6 数字7
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0
1 1 1 1 1 1
1 1 0 0 0 0
2.对x加1,若x==24,则x=0; 3.将x送显,个位a=x%10, b=x/10; 4.延时 5.跳转到2.
#include <reg51.h> unsigned char code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char code tablewe[]={0x1f,0x3f,0x5f,0x7f,0x9f,0xbf,0xdf,0xff}; void delay02s(void) { unsigned char i,j,k; for(i=10;i>0;i--) for(j=200;j>0;j--) for(k=248;k>0;k--); } void main(void) { unsigned char dispcount,i; unsigned char x=0,a,b; while(1){ //2.对x加1 x++; if(x==24) x=0; //3.将x送显,求个位a,十位b, a=x%10; P1=tabledu[a]; P0=tablewe[0]; //4.延时 delay02s(); b=x%10; P1=tabledu[b]; P0=tablewe[1]; //4.延时 delay02s(); } }
相关主题