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++;
}
版权声明:本文为Robartson原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。