单片机学习之数码管控制
管脚数: 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寄存器控制启动停止