1.传统方式编程和模块化编程的区别:
传统编程方式:所有的函数均放在main.c文件中,如果使用的模块比较多,则一个文件中会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路。
模块化编程方式:把各个模块的代码放在不同的.c文件里,在.h(head----头文件)文件里提供外部可调用函数的声明,其中.c文件想使用其中的代码时,只需要#include即可; 使用模块化编程可极大提高代码的可阅读性。
对于比较复杂、大型的程序;可以分开成.c文件和.h文件----例如:Delay.c和Delay.h文件,Delay.h文件中只要需要放置Delay函数的声明即可;
#ifndef__DELAY_H__
#define__DELAY_H__
#endif (还有其他的预编译代码) 称为预编译,防止重复的引用、包含。
<> 和 " " 的区别在于:<>引用的是安装目录下的文件,是安装的时候实实在在存在的文件,而 " " 是我们自定义的.h头文件;
2.制作LED灯闪烁的模块化编程:
其他复杂的模块化编程都如此;
main.c 文件
#include <REGX52.H>
#include "Delay.h"
void main()
{
while(1)
{
P2_0=1;
Delay(200);
P2_0=0;
Delay(200);
}
}
Delay.c 文件
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i,j;
while(xms)
{
i=2;
j=239;
do
{
while(--j);
}
while(--i);
xms--;
}
}
Delay.h 文件
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int xms);
#endif
3.LCD1602调试
LCD1602对应到51单片机上;对应右上角的排针插入的LCD屏幕;
使用之间需要进行初始化一次;
4.矩阵键盘
原理图和51单片机的实物图如图所示:
在LED屏上打印出HelloWorld;需要注意采用模块化编程,编写头文件Delay.h和LCD1605.h;
#include <REGX52.H>
#include "Delay.h"
#include "LCD1605.h"
void main()
{
LCD_Init();//LED屏初始化
LCD_ShowString(1,1,'HelloWorld');
while(1)//在LED屏上打印出HelloWorld
{
}
}
5. 通过矩阵按键在LED1602上显示按键对应的数字:
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i,j;
while(xms)
{
i=2;
i=239;
do
{
while(--j);
}
while(--i);
xms--;
}
}
unsigned char MatrixKey()
{
unsigned char KeyNumber=0;
P1=0xFF;
P1_3=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}
P1=0xFF;
P1_2=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
P1=0xFF;
P1_1=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
P1=0xFF;
P1_0=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
}
P1=0XFF;全部高电位;单独让每一列低电位0,然后 if 判断语句,while查看按键状态,KeyNumber按照原理图的标号进行选择;
6. 定时器:
定时器用于计时系统,可以实现软件计时,使程序每隔一固定时间完成一项操作;
定时器可以代替长时间的Delay,提高CPU的运行效率和处理速度;
系统时钟也就是晶振周期,本开发板上的晶振为12MHZ;
中断系统是为了使CPU具有对外界紧急情况的实时处理能力而设置的;
寄存器是连接软硬件的媒介;寄存器是一段特殊的RAM存储器,可以存储和读取数据,也可以控制电路的连接方式;
符号:TCON-----定时器控制寄存器;地址:88H;复位值:0000 0000B;
符号:TMOD-----定时器模式寄存器;地址:89H;复位值:0000 0000B;
符号:TL0(定时器0)-----Timer Low 0;地址:8AH;复位值:0000 0000B;
符号:TL1(定时器1)-----Timer Low 1;地址:8BH;复位值:0000 0000B;
符号:TH0(定时器0)-----Timer High 0;地址:8CH;复位值:0000 0000B;
符号:TH1(定时器1)-----Timer High 1;地址:8DH;复位值:0000 0000B;
7. 定时器实现流水灯左右移;
main.c
KeyNum是独立按键;LEDMODE是流水灯模式;在此定义流水灯模式为 0 1 0 1 循环,也就是说一个模式左移,另一个模式实现流水灯右移;
#include <REGX52.H>
#include <Timer0.h>
#include <Key.h>
#include <INTRINS.H>
unsigned char KeyNum,LEDMODE;
void main()
{
P2=0xFE;
Timer0_Init();
while(1)
{
KeyNum=Key();
if(KeyNum)
{
if(KeyNum==1)
{
LEDMODE++;
if(LEDMODE>=2)
LEDMODE=0;
}
}
}
}
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;
TH0=64535/256;
TL0=64535%256;
T0Count++;
if(T0Count>=500)
{
T0Count=0;
if(LEDMODE==0)
P2=_crol_(P2,1);//左移
if(LEDMODE==1)
P2=_cror_(P2,1);//右移
}
}
Delay.c
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i,j;
while(xms)
{
i=2;
j=239;
do
{
while(--j);
}
while(--i);
xms--;
}
}
Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int xms);
#endif
Timer0.c
#include <REGX52.H>
void Timer0_Init(void)
{
TMOD=0x01;
// TMOD=TMOD&0xF0;//把TMOD的低四位清零,高四位保持不变;
// TMOD=TMOD|0x01;//把MOD的低四位置1,高四位保持不变;
TF0=0;//清除TF0标志
TR0=1;//定时器0开始计时
TH0=64535/256;//设置定时初值
TL0=64535%256;//设置定时初值
ET0=1;//允许中断
EA=1;
PT0=0;//中断优先级
}
Timer.h
#ifndef __TIMER0_H__
#define __TIMER0_H__
void Timer0_Init(void);
#endif
Key.c
#include <REGX52.H>
#include <Delay.h>
unsigned char Key()
{
unsigned char KeyNumber=0;
if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);KeyNumber=1;}
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);KeyNumber=2;}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);KeyNumber=3;}
if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);KeyNumber=4;}
return KeyNumber;
}
Key.h
#ifndef __KEY_H__
#define __KEY_H__
unsigned char Key();
#endif