1.点亮Led灯的方式-低电平亮
sbit led1=P1^0;led1=0;//P1口单独赋值
P1=0xfe;//P1口整体赋值
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
sbit led5=P1^4;
sbit led6=P1^5;
sbit led7=P1^6;
sbit led8=P1^7;
2.延迟函数书写
void delay(int xms)
{
unsigned int i,j;
for(i=0;i<xms;i++)
for(j=112;j>0;j--)
{
3.手动定义on/off代表0,1
#define ON 0;//低电平点亮
#define OFF 1;//高电平熄灭
4.流水灯项目代码-位输出移位
while(1)
{
LED0=ON;
delay(200);
LED0=OFF;
LED1=ON;
delay(200);
LED1=OFF;
LED2=ON;
delay(200);
LED2=OFF;
LED3=ON;
delay(200);
LED3=OFF;
LED4=ON;
delay(200);
LED4=OFF;
LED5=ON;
delay(200);
LED5=OFF;
LED6=ON;
delay(200);
LED6=OFF;
LED7=ON;
delay(200);
LED7=OFF;
}
5.流水灯项目代码-循环移位输出
#include<reg52.h>
#include<intrins.h>
#include"delay.h"
void main()
{
P1=0Xfe;//1111 1110
while(1)
{
delay(200);
P1=_crol_(P1,1); //循环移位函数,把p1寄存器内的数向左移一位
}
}
与运算
实例:
p1=0xfe;//1111 1110
p1=p1|0x01;// 1111 1110与0000 0001所有数与0与还是它本身,与1与都为1
//现在p1就变成了1111 1111
左移右移
p1=0xfe;//1111 1110
p1<<=1;//左移一位 <=> p1=p1<<1
//p1变成了1 1111 1100
p1=0xfe;//1111 1110第一个灯亮
while(1)
{
delay(200)
p1<<=1;
p1=p1|0x01;
}
7.蜂鸣器的使用
#include<reg52.h>
#define ON 0;
#define OFF 1;
sbit FM=P2^3;
void delay(unsigned int xms);
void main()
{
unsigned char i;//ÎÞ·ûºÅ×Ö·ûÐÍ·¶Î§0-255
while(1)
{
P1=0xfe;//1111 1110 ʹµÚÒ»¸öLEDµÆµãÁÁ
for(i=0;i<8;i++)
{
delay(100);
P1<<=1;//P1=P1<<1
P1=P1|0X01;//0000 0001
FM=ON;
delay(100);
FM=OFF;
}
}
}
8.数码管的显示
/*********************************************************************************
*ʵÑéÃû £ºÊýÂë¹Ü¾²Ì¬ÏÔʾ
*ʵÑéЧ¹û £ºµÚÒ»¸öÊýÂë¹ÜÏÔʾ×Ö·û¡°b¡±
*
*********************************************************************************/
#include<reg52.h>
#include "bstv51.h"
sbit duan=P2^6;//定义段选
sbit wei=P2^7;//定义位选
void main()
{
bstv51_init();//单片机初始化程序
P0=0x7c;//对应的是b
duan=1;//锁存IC使能
duan=0;
P0=0xfe;//对应的是第八个数码管
wei=1;//锁存IC使能
wei=0;
while(1);
}
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DU=P2^6;
sbit WE=P2^7;
uchar code sz[17]={0x3f , 0x06 , 0x5b ,0x4f , 0x66 , 0x6d ,0x7d ,
0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 ,
0x5e , 0x79 , 0x71 , 0x00};
void delay(uint xms)
{
for(uint i=0;i<xms;i++)
for(uint j=112;i>0;j--)
}
void main()
{
while(1)
{
P0=sz[8];//8
DU=1;
DU=0;
P0=0x7f;//第八个
WE=1;
WE=0;
delay(2);//当你的延时小于3ms的时候人的肉眼无法观察到变化,也就是说会看到8位数码管全亮
//delay是必要的在全亮的时候,原因:去掉delay之后显示器不一定有这么快的显示频率,不一定能够响应这么快的时序
//数码管在进行这么快没有延迟的时序变化,这就说明数码管不能有任何的错误显示,任何错误显示都会被放大。
//解决方法有二:加delay(2)
//或者 重置
/*
P0=0xff;//什么都不显示重置
WE=1;
WE=0;
*/
P0=sz[7];//7
DU=1;
DU=0;
P0=0x7e;//第7个
WE=1;
WE=0;
delay(2);
P0=sz[6];//6
DU=1;
DU=0;
P0=0x7d;//第6个
WE=1;
WE=0;
delay(2);
P0=sz[5];//5
DU=1;
DU=0;
P0=0x7c;//第5个
WE=1;
WE=0;
delay(2);
P0=sz[4];//4
DU=1;
DU=0;
P0=0x7b;//第4个
WE=1;
WE=0;
delay(2);
P0=sz[3];//3
DU=1;
DU=0;
P0=0x7a;
WE=1;
WE=0;
delay(2);
P0=sz[2];//2
DU=1;
DU=0;
P0=0xfd;
WE=1;
WE=0;
delay(2);
P0=sz[1]; //1
DU=1;
DU=0;
P0=0xfe;
WE=1;
WE=0;
delay(2);
}
}
9.独立按键
//把前面的定义都写在头文件里面去
/*********************************************************************
*
* bstv51.c
*
*********************************************************************
* 描 述: BST-V51开发板初始化
* 开发平台: BST-V51开发板+KEIL C51
********************************************************************/
#include <reg52.h>/*包含51系统头文件*/
#include "bstv51.h"/*包含BST-V51开发板头文件*/
/*BST-V51主板初始化函数*/
void bstv51_init(void)
{
/* 引脚方向、输出初值定义 */
FM=1;/*蜂鸣器*/
EN=0;/*让LCD1602数据口处于输入状态,相当于LCD1602使不能,让其释放数据总线*/
CS=1;/*TF卡使不能*/
RST=0;/*ds1302使不能*/
}
void bstv51_init(void)
{
//引脚方向、输出初值定义
FM=1;//蜂鸣器
EN=0;//让LCD1602数据口处于输入状态,相当于LCD1602使不能让其释放数据总线
CS=1;//TF卡使不能
RST=0;//ds1302使不能
}
独立按键I/O口按下为0,未按下为1
void main()
{
bstv41_init();
P1=0xff;//熄灭所有LED
while(1)
{
L0=K1;//和下面的等效
//if(K1==0) L0=0;
//else L0=1;
L1=K1;
L2=K2;
L3=K2;
L4=K3;
L5=K3;
L6=K4;
L7=K4;
}
}
非运算
非运算即取反运算,在二进制中1变0,0变1
110101进非运算后为001010
/*********************************************************************************
*实验名 :矩阵键盘扫描 数码管显示
*实验效果 :按S1-S16矩阵按键,数码管8位依次显示0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
*
*********************************************************************************/
#include<reg52.h>
#include"bstv51.h"
uchar code table[17]={0x3f , 0x06 , 0x5b ,0x4f , 0x66 , 0x6d ,0x7d ,
0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 ,
0x5e , 0x79 , 0x71 , 0x00}; //0-9&A-F&“不显示” 字型码
void delay(uint xms) //延迟xms
{
uint i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
void display(uchar num) //数码管显示函数
{
P0=table[num]; //段选
DU=1;
DU=0;
}
void keyscan4x4()
{
uchar temp,key;
///第一行扫描///
P3=0xfe;//1111 1110 让P3.0口输出低
temp=P3;
temp=temp&0xf0;//1111 0000 位与操作 屏蔽后四位
if(temp!=0xf0)
{
delay(10);
temp=P3;//延迟后再判断一次判断是否松开按键
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee: //1110 1110 S1被按下
key=0;
break;
case 0xde: //1101 1110 S2被按下
key=1;
break;
case 0xbe: //1011 1110 S3被按下
key=2;
break;
case 0x7e: //0111 1110 S4被按下
key=3;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
///第二行扫描///
P3=0xfd;//1111 1101 让P3.1口输出低
temp=P3;
temp=temp&0xf0;//1111 0000 位与操作 屏蔽后四位
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed: //1110 1101 S5被按下
key=4;
break;
case 0xdd: //1101 1101 S6被按下
key=5;
break;
case 0xbd: //1011 1101 S7被按下
key=6;
break;
case 0x7d: //0111 1101 S8被按下
key=7;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
///第三行扫描///
P3=0xfb;//1111 1011 让P3.2口输出低
temp=P3;
temp=temp&0xf0;//1111 0000 位与操作 屏蔽后四位
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb: //1110 1011 S9被按下
key=8;
break;
case 0xdb: //1101 1011 S10被按下
key=9;
break;
case 0xbb: //1011 1011 S11被按下
key=10;
break;
case 0x7b: //0111 1011 S12被按下
key=11;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
///第四行扫描///
P3=0xf7;//1111 0111 让P3.0口输出低
temp=P3;
temp=temp&0xf0;//1111 0000 位与操作 屏蔽后四位
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7: //1110 0111 S13被按下
key=12;
break;
case 0xd7: //1101 0111 S14被按下
key=13;
break;
case 0xb7: //1011 0111 S15被按下
key=14;
break;
case 0x77: //0111 0111 S16被按下
key=15;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
}
void main()
{
bstv51_init(); //学习板初始化
P0=0; //位选 锁存为8位同时显示
WE=1;
WE=0;
while(1)
{
keyscan4x4();
}
}
10.中断系统
下降沿触发
独立按键部分默认先输入0X0F就是高电平,那么按下他就会实现高电平到低电平的下降沿从而触发中断
低电平触发
当按下独立按键的时候电平高转低,不松手的时候一直处于低电平,那么中断函数内的P2就会一直翻转,
而由于反转速度过快,人眼无法识别,所以呈现的是全亮状态。
低电平触发
/*********************************************************************************
*实验名 :外部中断实验(低电平触发)
*实验效果 :按住学习板上第三排任意按键 LED灯8位全亮
松开按键后 随机上4个或下4个灯亮
*
*********************************************************************************/
#include<reg52.h>
//按下独立按键的时候电平高转低,不松手的时候一直处于低电平,那么中断函数内的P2就会一直翻转,
而由于反转速度过快,人眼无法识别,所以呈现的是全亮状态。
void main()
{
P1=0X0F;//0000 1111 前四个灯灭 后四个灯亮
P3=0X0F;//独立按键部分默认先输入0X0F就是高电平,那么按下他就会实现高电平到低电平的下降沿从而触发中断
EA=1;//全局中断打开
EX0=1;//INT0中断开启
IT0=0;//低电平触发
while(1)
{
;
}
}
void ISR_KEY()interrupt 0 //中断服务函数
{
P1=~P1;
}
下降沿触发
/*********************************************************************************
*实验名 :外部中断实验(下降沿触发)
*实验效果 :按下学习板上第三排任意按键,LED灯前后四位状态调换
*
*********************************************************************************/
#include<reg52.h>
//按一次就跳变,也就是说开始前四个灯不亮后四个亮,按下之后就反过来
void main()
{
P1=0X0F;//0000 1111 前四个灯灭 后四个灯亮
P3=0X0F;
EA=1;//全局中断打开
EX0=1;//INT0中断允许
IT0=1;//触发方式为下降沿触发
while(1)
{
;
}
}
void ISR_KEY()interrupt 0
{
P1=~P1;
}