C51单片机Day03-数码管静态显示

C51单片机Day03

89c51引脚介绍(见课件)
数码管显示的原理(位选和段选)
  • 街上的大屏幕就是由发光二极管紧凑拼接组合在一起的
  • TX实验板用共阴LED显示器,根据16进制显示数字
  • 显示方法:静态显示方法、动态显示方法
    一行复制的方法:第一步:一行代码写完之后(注意光标在这一行的最后)shify+home(shift一直不要松手)、第二步:delete、第三步:点击insert、回车后再点insert,复制完成。
  • 点亮第一个数码管并显示“1”
#include<reg52.h>
sbit dula=P2^6;
sbit wela=P2^7; 

void main()
{
	wela=1;//送位选
	P0=0xfe;
	wela=0;
	dula=1;//送段选
	P0=0x06;
	dula=0;
	while(1);
}
编码表code

-随机存储器中每定义一个变量都会占用一个字节如uchar,而int占两个字节,而随机存储器共128字节,故要合理使用;
code是存储在程序存储器中;
若只是写unchar table[]={},则table中的每一个数据都会在随机存储器中占一个字节,故放入在code中

uchar code table[]={};//数组定义成编码的格式

六个数码管一起从000000到ffffff显示(静态显示)

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
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()
{
	wela=1;//让位选先都打开
	P0=0xc0;
	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--); 
}
中断
见可见

电脑当中的中断设备如图所示:
在这里插入图片描述
外部中断,电平触发方式如下:(以数码管和发光二极管为例)

#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
	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//中断服务子程序
{
	d1=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
	IT0=1;//或者TCON=0x01;//跳变沿触发方式 
	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//中断服务子程序
{
	d1=0;//第一个发光二极管亮
}
定时器
定时器是和中断连在一起的,定时器内部是由两个八位的寄存器构成的,刚开始装入一些数,之后启动定时器。每来一个机器周期,这个数自动加1,一直到加满为止,两个字节加满之后,它会出发一次中断。即也会进入到中断函数。
定时器应用举例(依旧以数码管为例)
  • 两个16位定时器最大只能定时65ms(65535us),如果要定时1s,可采办法:让定时器进入20次中断,并且每次中断进入的时间是50ms,那么20次刚好就是1秒钟。在中断中对一个变量加1(自加1),一直加到20(每进一次中断加1、每进一次中断加1),加1之后我们不做处理,只是在子程序中判断该变量何时加到20,每加到一次20我们就让数码管变换一次。
定时器初始化程序应完成如下工作:
1.对TMOD赋值,以确定T0和T1的工作方式
2.计算初值,并将其写入TH0、TL0或TH1、TL1
3.中断方式时,则对IE赋值,开放中断
4.使TR0或TR1置位,启动定时器定时
#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 tt;
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()
{
	num=0;
	tt=0;
	TMOD=0x01;//T0定时器,设置定时器0为工作方式1
	TH0=(65536-50000)/256;//计时器T0的高八位
	TL0=(65536-50000)%256;//计时器T0的低八位
	EA=1;//打开总中断
	ET0=1;//开定时器0中断
	TR0=1;//启动定时器0 
	wela=1;//让位选先都打开11101010
	P0=0xea;
	wela=0;
	dula=1;
	P0=0x3f;
	dula=0;
	while(1)
	{
		if(tt==20)					  
			{
				tt=0;
				num++;
				if(num==16)
				num=0;
				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 1//定时器0的中断服务程序
{
	TH0=(65536-50000)/256;//装初值
	TL0=(65536-50000)%256;
	tt++;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值