硬件:(BST-M51)
51最小系统
流水灯
CH340烧录模块
USB供电
数码管、WIFI、红外发送模块
红外接收、蜂鸣器、4位按键
温度传感器
复位电路
供电
软件(不是完整的,只是关键代码)
/***************************
1、51单片机点灯(IO口控制)
****************************/
#include "reg52.h" //<reg52.h>在当前工程文件夹下搜索;“reg52.h"先在当前工程文件夹下搜索,没有则到软件安装目录找
sbit led1 = P1^0; //P1口最低位;sfr P0 = 0X80;(寄存器重命名);sbit CY = PSW^7 (PSW最高位重命名)
void main()
{
led1 = 0; //3~20mA
}
/***************************
2、51单片机点灯(总线操作法)
****************************/
#include "reg52.h"
void main()
{
P1 = 0; //0xaa = 10101010 = 170
}
/***************************
3、延时语句精确计算
****************************/
#include "reg52.h"
#define uint unsigned int //#define 宏定义(#define 新名称 原内容)只能定义一次
sbit led1 = P1^0;
uint i,j;
void main()
{
while(1)
{
led1 = 0;
for(i=1000;i>0;i--)
for(j=110;j>0;j--);
led1 = 1;
for(i=1000;i>0;i--)
for(j=110;j>0;j--);
}
}
/****************************
4、带参数函数写法及调用
*****************************/
void delayms(unsigned int xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--); //i=xms即延时xms毫秒
}
/*****************************
5、利用C51库函数实现流水灯(leil\C51\HIP\C51Lib)
*******************************/
#include<intrins.h>
_cro_(aa,1); //将aa循环左移1位
/*******************************
6、数码管静态显示,BST51第一个数码管显示字符“b”(共阴数码管)
********************************/
#include "reg52.h"
#define duan P0
sbit wei1 = P2^4; //定义第一位数码管
sbit wei2 = P2^5; //定义第二位数码管
sbit wei3 = P2^6; //定义第三位数码管
sbit wei4 = P2^7; //定义第四位数码管
void main()
{
wei1 = 1;
wei2 = 0;
wei3 = 0;
wei4 = 0;
duan = 0x7c;
//0111 1100 "b" 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d ,0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c ,
//0x39 , 0x5e , 0x79 , 0x71 , 0x00(0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,不显示)
while(1);
}
/***********补充************************
unsigned char code table[]={
0x3f , 0x06 , 0x5b , 0x4f ,
0x66 , 0x6d ,0x7d , 0x07 ,
0x7f , 0x6f , 0x77 , 0x7c ,
0x39 , 0x5e , 0x79 , 0x71 , 0x00}
*/
//table[0] = 0x3f
/**************************************
7、74HC573锁存器 段选、位选(数码管静态显示)(共阴数码管)第一个数码管显示字符“8”
74H573锁存器:20引脚,-OE脚:三态允许控制端(低电平有效)(即输出使能端)
INPUTS OUTPUT 1D~8D:数据输入端;1Q~8Q;数据输出端
-OE LE D Q LE:锁存允许端(锁存控制端)
L H H H
L H L L
L L X Q0(上一次的数据状态)
H X X Z(高阻态)
(真值表)
***************************************/
#include "reg52.h"
sbit duan = P2^6; //申明U1锁存器的锁存端
sbit wela = P2^7; //申明U2锁存器的锁存端
void main()
{
wela = 1; //打开U2锁存器
P0 = 0xFE; //送入位选信号11111110
wela = 0; //关闭U2锁存端(Q0)
duan = 1; //打开U1锁存器
P0 = 0x7F; //送入段选信号01111111
duan = 0; //关闭U1锁存器(Q0)
while(1); //程序停在这里
}
/*************补充***************************
6个数码管同时点亮,依次显示0~F,时间间隔为0.5s,循环下去
void main()
{
wela = 1; //打开U2锁存器
P0 = 0xc0; //送入位选信号11000000
wela = 0; //关闭U2锁存端(Q0)
while(1)
{
for(num=0;num<16;num++)
{
duan = 1; //打开U1锁存器
P0 = table[num]; //送入段选信号
duan = 0; //关闭U1锁存端
delayms(500); //延时0.5秒
}
}
}*/
/********************************************
8、数码管动态显示(逐渐缩短延时时长,则同时显示)(实际上是轮流显示的)
*********************************************/
void main()
{
while(1)
{
duan = 1;
P0 = table[1]; //送段选信号
duan = 0;
P0 = 0xff; //11111111送位选数据前关闭所有显示,防止打开位选锁存时(消影)
//原来段选数据通过位选锁存器造成混乱
wela = 1; //11111110送位选数据
P0 = 0xfe;
wela = 0;
delayms(500);
duan = 1;
P0 = table[2];
duan = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfd; //11111101送位选数据
wela = 0;
delayms(500);
duan = 1;
P0 = table[3];
duan = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfb; //11111011送位选数据
wela = 0;
delayms(500);
duan = 1;
P0 = table[4];
duan = 0;
P0 = 0xff;
wela = 1;
P0 = 0xff; //11110111送位选数据
wela = 0;
delayms(500);
duan = 1;
P0 = table[5];
duan = 0;
P0 = 0xff;
wela = 1;
P0 = 0xef; //11101111送位选数据
wela = 0;
delayms(500);
duan = 1;
P0 = table[6];
duan = 0;
P0 = 0xff;
wela = 1;
P0 = 0xdf; //11011111送位选数据
wela = 0;
delayms(500);
}
}
/**************************************************
*实验名:数码管动态显示(逐渐缩短延时时长,则同时显示)(实际上是轮流显示的)
***************************************************/
#include<reg52.h>
#define duan P0
#define uchar unsigned char
sbit wei1 = P2^4; //定义第一位数码管
sbit wei2 = P2^5; //定义第二位数码管
sbit wei3 = P2^6; //定义第三位数码管
sbit wei4 = P2^7; //定义第四位数码管
uchar code sz[]={0x3f , 0x06 , 0x5b ,0x4f , 0x66 , 0x6d ,0x7d ,
0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71 , 0x00};
void delay(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=112;j>0;j--);
}
void main()
{
while(1)
{
duan = sz[4];
wei1 = 0;
wei2 = 0;
wei3 = 0;
wei4 = 1;
delay(1000);
duan = sz[3];
wei1 = 0;
wei2 = 0;
wei3 = 1;
wei4 = 0;
delay(1000);
duan = sz[2];
wei1 = 0;
wei2 = 1;
wei3 = 0;
wei4 = 0;
delay(1000);
duan = sz[1];
wei1 = 1;
wei2 = 0;
wei3 = 0;
wei4 = 0;
delay(1000);
}
}