文章归档友情连接照片地图

51单片机学习笔记(led、数码管、定时器、键盘)

分类:电子设计  作者:rming  时间:2011-08-06

Led 二极管 位操作 高低电平

初学单片机,学习了简单的位操作,一个P1口的八位分别控制着八个发光二极管,单片机默认是高电平的,通过简单的赋值运算可以对每个二极管进行高低电平的操作,
例如,点亮第一个二极管(P1^0=0;),但是单个的位操作(P1^0=0)则无法实现与其他位之间的联系,如果要实现八个位同时变化,难道我需要对八位挨个操作?显然不是,对P1口直接赋值即可实现八位的同时操作。
单片机C语言中给P1口赋值时需要使用十六进制,例如 P1=0xfe;0xfe(16)=11111110(2) 这样的赋值,使得P1口的前七位高电平,第八位低电平,就达到了同时对P1口八位进行操作的目的,然后结合库函数中的_crol_();函数,即可实现流水灯的效果。
数码管数字编码

uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

数码管 锁存器 排阻 上拉电阻 数码管

先位选,后段选

wela=1; //位选有效
P0=0xfe; //选择第一位 选择0xfe
wela=0; //关闭位选
dula=1; //段选有效
P0=0x06; //选择 0x06(16)
dula=0; //关闭段选

定时器 中断 中断优先级

TMOD=0x01; //设置工作模式
TH0=(65536-5000)/256; //赋初值
TL0=(65536-5000)%256;//赋初值
EA=1;//计数器总开关
ET0=1;//定时器0使能开关
TR0=1;//定时器0运行开关
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
}

键盘 扫描 去抖动 键识别

简单的非编码一维键盘

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit d1=P1^0;
sbit key1=P3^4;
sbit duan=P2^6;
sbit wei=P2^7;
uchar i;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0};
void delay(uint x);
void main()
{
i=0;
wei=1;
P0=0xfe;
wei=0;
duan=1;
P0=table[i];
duan=0;
while(1)
{
if(key1==0)
{
delay(5);
if(key1==0)
{
d1=0;
i++;
while(!key1);
delay(5);
while(!key1);
if(i>9)
i=0;
}
}
else
{
d1=1;
duan=1;
P0=table[i];
duan=0;
}
}
}
void delay(uint x)
{
uint y;
for(;x>0;0;x--)
for(y=250;y>0;0;y--);
}


提交评论