微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机学习总结实例

51单片机学习总结实例

时间:11-19 来源:互联网 点击:
马上大四了,即将找工作。所以便把我学过的东西总结一下,系统一下。

接下来,就把我总结的结果跟大家分享下。

这一章是51单片机,主要是程序实例。代码参考郭天祥的单片机教材。

是总括性的,适合于有一定单片机基础的同学,也可以给初学者做一个系统的学习主线。

这个博客里的涉及的源代码大家可以在这里下载http://download.csdn.net/detail/zhaole20094463/4427745

1.流水灯

/流水灯/
#include
#include//包含_crol_函数所在的头文件
#define uint unsigned int //宏定义 定义uint 在大项目中更加的方便
#define uchar unsigned char
void delayms(uint);
uchar aa;
void main()
{
aa=0xfe;
while(1)
{
P1=aa;
delayms(500);
aa=_crol_(aa,1);//aa左移一位
}
}
void delayms(uint xms)//延时时间约为1ms通过程序单步执行,看运行时间可得到
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}

通过调用系统函数的方式使流水灯实现循环左移。

2.数码管显示程序

/*锁存器用的是74HC573高电平通,低电平锁存*/
/*作用:高阻态 ,数据锁存 ,数据缓冲 (加强驱动能力)*/
/*循环显示1-A的数据*/
#include
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
uchar num;
uchar code table[]={数码管段码表};
void main()
{
wela=1;//打开锁存器
P0=0xc0;//送入锁存信号
wela=0;//关闭锁存器
while(1)
{
for(num=0;num<16;num++)
dula=1;
P0=table[num];
delayms(500);
}
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}

3.独立键盘检测

/*通过按键控制led亮灭*/
#include
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^4;
sbit led=P1^0;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
P3=0xff;//在对51单片机进行按键检测时,先要将引脚置1;
while(1)
{
if(key1==0)
{
delay(5);
if(key1==0)//按键消抖
{
led=0;
num++;
if(num==2)
num=0;
led=1;
}
}

4.矩阵键盘检测

/*检测矩阵键盘数码管显示0-F/
矩阵键盘的四列与P3.4~P3.7相连
4行与P3.0~P3.3
#include
#define uchar unsinged char
#define uint unsigned int
sbit dula=P2^6;
sbint wela=P2^7;
uchar code table[]={段码表};
void delayms(uint xms);
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar num)显示函数
{
P0=table[num];
dula=1;
dula=0;
}
void matrixkeyscan()//矩阵键盘的检测
{
uchar temp,key;
P3=0xfe;//打开P3.7,P3.7置0.检测高四位
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//是否有键被按下
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//按键消抖
{
temp=P3;
switch(temp)
{
case 0xee:key=0;break;
case 0xde:key=1;break;
case 0xbe:key=2;break
case 0x7e:key=3:break;
}
while(temp!=0xf0)//检测按键是否弹起,如果没有弹起循环停在这里。
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
。。。。。。。。。。。。。。。。。。。
如下程序依次增加
令P3=0xfd,打开P3.6,P3.6置低,检测高四位 依次为 4,5,6,7
然后令P3= 0xfb 0xf7
}
void main()
{
P0=0;//关闭所有数码管的段选
dula=1;
dula=0;
P0=0xc0;
wela=1;
wela=0;
while(1)
{
matrixkeyscan();//不停调用键盘扫描程序
此程序关键在于这个函数,矩阵键盘的扫描算法
}
}

5.1602液晶屏显示子函数

//
这个程序主要是有这样几个子函数,关于lcd写命令和写数据的
#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="zhaole20094463";
uchar code table1[]="love Embedded systems";
sbit lcden=P3^4;//lcd使能端
sbit lcdrs=P3^5;//lcd数据命令选择端
uchar num;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)//lcd写命令函数
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lceen=0;
}

void write_data(uchar date)//lcd写数据
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

void init()
{
lcden=0;
write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c);//设置开显示,不显示光标
write_com(0x06);//写第一个字符后地址指针加1
write_com(0x01);//显示清0,数据指针清0
}
void main()
{
init();
write_com(0x80);//数据指针定位在第一行的第一个字处
for(num=0;num<14;num++)
{
write_data(table[num]);
delay(5);
}
write_com(0x80+0x40);//数据指针定位在第二行的第一个字处
for(num=0;num<21;num++)
{
write_data(table1[num]);
delay(5);
}
while(1);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top