用51单片机实现两个单片机红外感应开关后数码管显示加一和减一,感应到一个后加

单片机数码管显示原理
查看: 13268|
摘要:   小灯是一种简单的LED,给我们视觉效果只能通过亮和灭来表达简单信息。而这节课我们要来学习一种表达更加明确的器件,数码管。   1、数码管的基本介绍   先给大家提供一张原理图看一下,如图1所示。
图1数码 ...
  小灯是一种简单的LED,给我们视觉效果只能通过亮和灭来表达简单信息。而这节课我们要来学习一种表达更加明确的器件,数码管。
  1、数码管的基本介绍
  先给大家提供一张原理图看一下,如图1所示。
图1&数码管原理图
  这是比较常见的数码管的原理图,我们板子上一共有6只数码管。前边有了LED小灯的学习,数码管学习就会轻松的多了。从图1能看出来,数码管共有a,b,c,d,e,f,g,dp这8个段,而实际上,这8个段每一段都是一个LED小灯,所以数码管就是由8个LED小灯所组成的。我们看一下数码管内部结构图。
图2&数码管结构图
数码管分为共阳数码管和共阴数码管,所谓的共阴数码管就是8只LED小灯的阴极是接在一起的,也就是阴极是公共端,由阳极来控制小灯是否亮灭。同理,共阳数码管就是阳极是接到一起的,大家可以仔细研究下图1。细心的同学也会发现,数码管上边有2个com,实际上就是我们数码管的公共端。为什么有2个,我个人认为,一方面有2个可以起到对称的效果,刚好是10个引脚,另外一个方面,公共端通过的电流较大,我们初中就学过,并联电路电流之和等于总电流,用2个com可以把公共电流平均到2个引脚上去,降低线路承受的电流。
从我们板子的上能看出来,我们所用的数码管是共阳数码管,如图所示。
图3&共阳数码管电路
  他们的com是接到了正极上,当然了,和LED小灯电路类似,也是由74HC138控制了的导通来控制整个数码管的电流,我们先来看DS1这个数码管。原理图上可以看出来,控制DS1的三极管是Q17,控制Q17的引脚是LEDS0,对应到74HC138上边就是Y0端的输出。
图4&74HC138控制图
  我们现在的目的是让LEDS0这个引脚输出低电平,相信大家现在可以独立根据前边学到的内容把ADDR0,ADDR1,ADDR2,ADDR3,ENLED这4个输入状态写出来,现在大家不要偷懒,都去根据138的手册去写一下,不需要你记住这些结论,但是遇到就写一次,锻炼过几次后,遇到同类芯片自己就知道如何去解决问题了。
  数码管通常是用来显示数字的,我们板子上的6个数码管,习惯上我们称之为6位,那控制位选择的就是74HC138了。而数码管内部的8个LED小灯我们称之为数码管的段,那么数码管的段选择(即该段的亮灭)是通过P0口控制,经过74HC245驱动。
  2、数码管的真值表
  数码管的8个段,我们直接当成8个LED小灯来控制,那就是a、b、c、d、e、f、g、dp一共8个LED小灯。我们通过图1可以轻而易举的看出来,如果我们点亮b和c这两个LED小灯,也就是数码管的b段和c段,其他的所有的段都熄灭的话,就可以让数码管DS1显示一个数字1,那么这个时候实际上P0的值的二进制就是0b,十六进制就是0xF9。那么我们写一个程序进去,看看让数码管显示一下看看。
&&&&#include&&&&&&&&&&&&&&&//包含寄存器的库文件&&&&&&&&&&&&&&&&&&&
&&&&sbit&&ADDR0&=&P1^0;
&&&&sbit&&ADDR1&=&P1^1;
&&&&sbit&&ADDR2&=&P1^2;
&&&&sbit&&ADDR3&=&P1^3;
&&&&sbit&&ENLED&=&P1^4;
&&&&void&&main()
&&&&&&&&unsigned&char&j&=&0;
&&&&&&&&unsigned&int&&i&=&0;
&&&&&&&&ENLED&=&0;
&&&&&&&&ADDR0&=&0;
&&&&&&&&ADDR1&=&0;
& & & & &ADDR2&=&0;
&&&&&&&&ADDR3&=&1;&&&&&&&&&&&//74HC138开启三极管Q17&&&&&&&&&&&
&&&&&&&&while(1)&&&&&&&&&&&&&//程序死循环&&
&&&&&&&&&&&&&P0&=&0xF9;&&&&&&//打开数码管b和c段&&&
  大家把这个程序编译一下,下载到里会发现,最右侧的数码管成功显示1这个数字。
  同样的方法,我们可以把其他的数字都成功的在数码管上显示出来,而数码管显示的数字对应给P0的赋值,我们叫做数码管的真值表。我们来列一下我们这个电路图的数码管真值表,注意,这个真值表里显示的数字都不带小数点。
  表1&数码管真值表
  大家可以把上边那个数码管显示1的那个程序中的P0的赋值随便修改成我们表5-1中的真值表里的数字试试看,把数码管显示的数字显示出来。
  3、数码管的静态显示
  从第三课我们学习74HC138以后,我们了解到74HC138同时一次只能让一个输出口为低电平,也就是在一个时刻内,我们只能让一个数码管显示,始终选通数码管并且可以根据我们的P0总线的信号来改变这个数码管的值,我们可以理解为数码管的静态显示。
  数码管静态显示是对应动态显示而言的,静态显示对于一两个数码管还行,多个数码管,静态显示实现的意义就没有了。这节课我们先用一个数码管的静态显示来实现一个简单的秒表,为下节课的动态显示打下基础。
  先来介绍一个51单片机的关键字code。我们前边课程定义变量的时候,一般用到unsigned&char或者unsigned&int这两个关键字,这样定义的变量都是放在我们的单片机的RAM中,我们在程序中可以随意去改变这个变量的值。但是还有一种常数,我们在程序中要使用,但是却不进行对这个值的改变,这种值我们可以加一个code关键字修饰一下,修饰完毕后,这个值就会存储到我们的程序空间flash中,这样可以大大节省我们单片机的RAM的使用量,毕竟我们的RAM空间比较小,而程序空间是很大的。比如我们现在要使用的数码管真值表,我们来看一下我们下边的这个程序。
#include&&&&&&&&&&&&&&&//包含寄存器的库文件&&&&&&&&&&&&&&&&&&&
sbit&&LED&=&P0^0;
sbit&&ADDR0&=&P1^0;
sbit&&ADDR1&=&P1^1;
sbit&&ADDR2&=&P1^2;
sbit&&ADDR3&=&P1^3;
sbit&&ENLED&=&P1^4;
unsigned&char&code&LedChar[]&=&{
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
&&&&0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8e
};&&&&&&&&&&&&&&&&&&//用数组来存储数码管真值表,下一课详细介绍数组
void&main()
&&&&unsigned&char&counter&=&0;
&&&&unsigned&char&j&=&0;
&&&&ENLED&=&0;&ADDR0&=&0;&ADDR1&=&0;
& & &ADDR2&=&0;&ADDR3&=&1;&P0&=&0XFF;&&//74HC138和P0初始化部分
& & &TMOD&=&0x01;&&& & & & & & & & &&//设置定时器0为模式1
& & &TH0&&=&0xB8;
&&&&TL0&&=&0x00;& & & & & & & & & &//定时值初值
& & &TR0&&=&1;& & & & & & & & & & & //打开定时器0
&&&&while(1)
&&&&&&&&if(1&==&TF0)& & & & & & & & &//判断定时器0是否溢出
&&&&&&&&&&&&TF0&=&0;
&&&&&&&&&&&&TH0&=&0xB8;& & & & & & &&//溢出后,重新赋值
&&&&&&&&&&&&TL0&=&0x00;
&&&&&&&&&&&&counter++;
&&&&&&&&&&&&if(50&==&counter)&&&&&&//判断定时器0溢出是否达到50次
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&counter&=&0;&&&&&&&&//counter清0,重新计数
&&&&&&&&&&&&&&&&P0&=&LedChar[j++];&//把数组里的对应值送给P0
&&&&&&&&&&&&&&&&if(16&==&j)&&&&&&&&&//当显示到F后,归0重新开始
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&j&=&0;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&}
&&&&&&&&&}
上一篇:下一篇:
Powered by &
这里是—这里可以学习 —这里是。
栏目导航:当前位置: &
求翻译:本课题利用AT89C51单片机,采用C语言编程,用六位一体数码管来实现时、分、秒显示和温度显示功能,按键实现时间调节功能,蜂鸣器实现闹钟功能。程序编好以后在Keil uVision2环境中编译,生成hex文件。待软件、硬件都设计好之后,在Proteus环境下打开hex文件实现电子钟的仿真。是什么意思?
本课题利用AT89C51单片机,采用C语言编程,用六位一体数码管来实现时、分、秒显示和温度显示功能,按键实现时间调节功能,蜂鸣器实现闹钟功能。程序编好以后在Keil uVision2环境中编译,生成hex文件。待软件、硬件都设计好之后,在Proteus环境下打开hex文件实现电子钟的仿真。
问题补充:
This topic at89c51 microcontroller using c programming language, one of six digital tube, minutes, seconds display and temperature display function button time adjustment function, the buzzer alarm clock function. Program compiled after a good compiler the keil uvision2 environment, to generate the
Use this topic AT C 89 51 single-chip phone, C language programming, using a 6-bit digital tube product to be realized, minutes, seconds and temperature display function, press the key to achieving Time adjustment feature, buzzer alarm function for. procedural programming in the future Keil uVision2
This topic uses at89C51 monolithic integrated circuit, uses the C language programming, realizes with six body nixietubes when, divides, a second demonstration and the temperature demonstration function, the pressed key realization time adjustment function, the buzzer realization alarm clock functio
This issue with AT89C51 microcontroller, using c language programming, to achieve through a six-in-one digital display and temperature display hours, minutes, seconds, press the time adjustment function, buzzer for alarm clock functionality. Program is good in Keil uVision2 environment to compile, g
正在翻译,请等待...
我来回答:
参考资料:
* 验证码:
登录后回答可以获得积分奖励,并可以查看和管理所有的回答。 |
我要翻译和提问
请输入您需要翻译的文本!51单片机简单计算器用数码管显示
51单片机简单计算器用数码管显示
是用51hei单片机开发板 电路图详见:&&的数码管部分, 用2个74hc573 锁存,p0口作为数据口 ,p3.6和p3.7分别是段和位的锁存端口.
#include&reg51.h&
#define uchar unsigned char
#define uint unsigned int
sbit dula=P3^6;//573段选使能
sbit wela=P3^7;//573位选使能
sbit beep=P3^4;//蜂鸣器
uchar temp,//按键变量
//加,减,乘,除,标志位
long int num1,num2,//num1与num2是2个要运算的变量,res是结果
uchar aa,//aa 2个运算数标志位 dis 2个运算数与结果标志
uchar code table[]={0x00,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管段码
uchar code weixuan[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//数码管位码
void delay(unsigned char i)//延时
uchar j,k;
&&for(j=i;j&0;j--)
& & for(k=125;k&0;k--);
void bee()//蜂鸣器
beep=0;& && &&&
delay(255);
delay(255);
beep=1;& && &&&
key_scan()//按键检测
& &temp=P1;
& &temp=temp&0xf0;
& &if(temp!=0xf0)
& &&&delay(10);
& &&&if(temp!=0xf0)
& && & temp=P1;
& && & switch(temp)
& && && &case 0xee:
& && && && &&&key=0;
& && && && &&&
& && && &case 0xde:
& && && && &&&key=1;
& && && && &&&
& && && &case 0xbe:
& && && && &&&key=2;
& && && && &&&
& && && &case 0x7e:
& && && && &&&key=3;
& && && && &&&
& && &&&while(temp!=0xf0)
& && && & temp=P1;
& && && & temp=temp&0xf0;
& &temp=P1;
& &temp=temp&0xf0;
& &if(temp!=0xf0)
& &&&delay(10);
& &&&if(temp!=0xf0)
& && & temp=P1;
& && & switch(temp)
& && && &case 0xed:
& && && && &&&key=4;
& && && && &&&
& && && &case 0xdd:
& && && && &&&key=5;
& && && && &&&
& && && &case 0xbd:
& && && && &&&key=6;
& && && && &&&
& && && &case 0x7d:
& && && && &&&key=7;
& && && && &&&
& && &&&while(temp!=0xf0)
& && && & temp=P1;
& && && & temp=temp&0xf0;
& &temp=P1;
& &temp=temp&0xf0;
& &if(temp!=0xf0)
& &&&delay(10);
& &&&if(temp!=0xf0)
& && & temp=P1;
& && & switch(temp)
& && && &case 0xeb:
& && && && &&&key=8;
& && && && &&&
& && && &case 0xdb:
& && && && &&&key=9;
& && && && &&&
& && && &case 0xbb:
& && && && &&&key=10;
& && && && &&&
& && && &case 0x7b:
& && && && &&&key=11;
& && && && &&&
& && &&&while(temp!=0xf0)
& && && & temp=P1;
& && && & temp=temp&0xf0;
& &P1=0xf7;
& &temp=P1;
& &temp=temp&0xf0;
& &if(temp!=0xf0)
& &&&delay(10);
& &&&if(temp!=0xf0)
& && & temp=P1;
& && & switch(temp)
& && && &case 0xe7:
& && && && &&&key=12;
& && && && &&&
& && && &case 0xd7:
& && && && &&&key=13;
& && && && &&&
& && && &case 0xb7:
& && && && &&&key=14;
& && && && &&&
& && && &case 0x77:
& && && && &&&key=15;
& && && && &&&
& && &&&while(temp!=0xf0)
& && && & temp=P1;
& && && & temp=temp&0xf0;
void Init()//初始化
P0=table[1];
void dis_play(long int nm)//显示函数
uchar a1,a6;//a1位段选变量,a6为位选变量
if(shu==0)
& &&&dula=1;
P0=table[1];
for(a6=0;a6&6;a6++)
a1=shu%10;//shu%10 shu比10小a1=shu本身
if(shu!=0)
shu=shu/10;//shu/10 shu比10小 shu为0
P0=table[a1];
& && && &&&dula=1;
P0=weixuan[a6];
void display()//显示选择函数,dis 0或1显示运算数,dis为2显示结果
switch (dis)
& &&&case 0:{
dis_play(num1);
& &&&case 1:{
dis_play(num2);
& && && && &&&case 2:{
dis_play(res);
& &}& && &&&
void shanshuo()//数码管闪烁
delay(255);
void check()//运算函数
if(key!=16)
if(key&=10)
switch (key)
& &&&case 10:Init();&&// CE
& &&&case 11:{
& &switch (fun)//加,减,乘,除选择标志位
& &&&case 0:res=num1+num2,dis=2;//加法
& &&&case 1:res=num1-num2,dis=2;//减法
& &&&case 2:res=num1*num2,dis=2;//乘法
& &&&case 3:res=num1/num2,dis=2;//除法
& &&&case 12:fun=0,aa=1,shanshuo();& &// +
& &&&case 13:fun=1,aa=1,shanshuo();& &// -
case 14:fun=2,aa=1,shanshuo();& &// *
& &&&case 15:fun=3,aa=1,shanshuo();& &// /
switch (aa)//运算变量赋值标志位
& &&&case 0:{
num1=num1*10+//把按键检测到的值赋给num1运算变量1& && &&&
& &&&case 1:{
num2=num2*10+//把按键检测到的值赋给num2运算变量2
void main()
key_scan();
display();
发表评论:
TA的最新馆藏[转]&[转]&实现数码管自加的代码:
& &   #include&reg52.h&
& &   #define uchar unsigned char
& &   #define uint unsigned int
& &   uchar code table[16] = {0x3f,0x06,0x5b,0x4f,
& &   0x66,0x6d,0x7d,0x07,0x7f,
& &   0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //显示数字表
& &   uchar flag,bai,shi,
& &   void xunhuan();
& &   void delay(uint z);
& &   void init();
& &   void main()
& &   init();
& &   while(1)
& &   if(flag==20)
& &   flag=0;
& &   temp++;
& &   if(temp==1000)
& &   temp=0;
& &   bai=temp/100;
& &   shi=temp%100/10;
本网站试开通微、小企业商家广告业务;维修点推荐项目。收费实惠有效果!欢迎在QQ或邮箱联系!
试试再找找您想看的资料
资料搜索:
查看相关资料 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
copyright & &广电电器(中国梧州) -all right reserved& 若您有什么意见或建议请mail: & &
地址: 电话:(86)774-2826670&

我要回帖

更多关于 单片机数码管显示0到9 的文章

 

随机推荐