现在的位置: 首页 > 综合 > 正文

51单片机–数码管

2013年10月13日 ⁄ 综合 ⁄ 共 2465字 ⁄ 字号 评论关闭

 单片机学习之数码管控制

管脚数: 40
1-8    p1
9 rst  复位管脚  高电平有效  正常工作接低电平 
10-17 p3   普通操作第一功能,寄存器控制第二功能

10 p3.0 RXD串行输入口
11 p3.1 TXD串行输出口
12 p3.2 /INT0外部中断0
13 p3.3 /INT1外部中断1
14 p3.4 T0定时/计数器0
15 p3.5 T1定时/计数器1
16 p3.6 /WR外部数据存储器读选通
17 p3.7 /WD外部数据存储器写选通
18 X1 晶振
19 X2 晶振  12M晶振  两侧加30P电容帮助起振  6M 用20P
20 VSS 接地
21--28 P2
29 /PSEN 
30 /PROG 编程端口 ALE 输出六分之一时钟方波可检测单片机是否工作
31 /EA 内部存储器使能端接高电平 Vpp 编程电压口
32--39 P0
40 VCC

###########################################################################

数码管操作:

###########################################################################
静态数码管显示:
注意:该实验板为10个端口控制数码管
八个是数据输入,两个是段选和位选口,端口是p2.6 p2.7 外接锁存器
锁存器高电平开通,低电平锁存。

#include<reg52.h>
sbit dula=P2^6;
sbit wela=P2^7;

void main()
{
 wela=1; //位选开通,选择哪几个数码管点亮
 P0=0xc0; //送数据,哪个数码管点亮,共八位转换为16进制
 wela=0; //关闭位选
   
 dula=1; //段选开通
 P0=0x06; //送数据显示“1”
 dula=0; //关闭段选
 while(1); //循环
}

 

##################################################################
数码管计数程序:静态显示
##################################################################

 

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;   //定义段选和位选
sbit wela=P2^7;
uchar num;
uchar code table[]={  //显示代码0-9
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void main()
{
 wela=1;//11101010
 P0=0xea;     //选择数码管
 wela=0;
 while(1)
 {
  for(num=0;num<16;num++)
   {
    dula=1;  
    P0=table[num]; //取数码管显示数据
    dula=0;
    delay(1000); //延时一秒
   }
 }
}

void delay(uint z)   //延时程序一毫秒
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=110;y>0;y--); 
}

 

#######################################################################

中断:

#################################################################################

EA=1 //开总中断
EX0=1; //开外部中断0

中断程序:
##################################################################################
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit d1=P1^0;
uchar num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void main()
{
 EA=1;//开总中断
 EX0=1;//开外部中断0  有2种触发方式
 //IT0=1;   //电平触发方式,否则跳变沿触发
 TCON=0x01;//同 IT0=1功能,直接对寄存器操作
 wela=1;//11101010
 P0=0xea;
 wela=0;
 while(1)
 {
  for(num=0;num<16;num++)
   {
    d1=1;
    dula=1;
    P0=table[num];
    dula=0;
    delay(1000); 
   }
 }
}

void delay(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=110;y>0;y--); 
}

void exter0() interrupt 0        /***terrupt 后的数字是中断类的顺序,依次是:外部中断0,定时中断1,定时计数1,这里用外部中断0  所以数字是0, 中断函数不需要声明**/
{
 d1=0; 
}

##############################################################
TMOD寄存器控制T1,T0方式
TCON寄存器控制启动停止

 

抱歉!评论已关闭.