目录
1-1 点亮一个LED
*******************1-1 点亮一个LED*********************
**** *****
#include "reg52.h"
sbit D1=P0^0;
void main()
{
D1=0;
while(1)
{
}
}
1-2 流水灯LED
*******************1-2 流水灯LED *********************
**** *****
#include "reg52. h"
#include<intrins.h>
typedef unsigned int ul6;
typedef unsigned char u8;
#include <REGX51.H>
#define led P0
//延时函数,i=1大概延时10us
void delay(ul6 i)
{
while(i--) ;
}
//NO1
//void main()
//{
// u8 i;
// led=~0x01;//0x01 取反 0xFF
// delay(50000); // 450ms
// while (1)
// {
// for(i=0;i<8;i++)
// {
// P0=~(0x01<<i) ;
// delay(50000); //延时 450ms
// }
// }
//}
//NO2
void main ( )
{
u8 i;
led=~0x01;
delay(50000) ; // 450ms
while (1)
{
for(i=0;i<7;i++) //? led ????
{
led=_crol_(led, 1) ;
delay(50000) ; //450ms
}
for(i=0;i<7;i++) // ? led you???
{
led=_cror_(led,1) ;
delay(50000) ; // 450ms
}
}
}
1-3蜂鸣器
******************* 1-3蜂鸣器 *********************
//**** *****
#include <REGX51.H>
#include "reg52. h"
#include<intrins.h>
typedef unsigned int ul6;
typedef unsigned char u8;
sbit beep=P1^5;//P1.5
//延时函数,i=1大概延时10us
void delay(ul6 i)
{
while(i--) ;
}
void main()
{
while(1)
{
beep=~beep;
delay(100) ;
}
}
1-4 继电器
*******************1-4 继电器 *********************
**** *****
#include <REGX51.H>
#include "reg52. h"
#include<intrins.h>
typedef unsigned int ul6;
typedef unsigned char u8;
sbit relay=P1^4;//P1.4
void main()
{
relay=0;
while(1);
}
1-5 静态数码管
*******************1-5 静态数码管 *********************
//**** *****
#include <REGX51.H>
#include "reg52. h"
typedef unsigned int ul6;
typedef unsigned char u8;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极0~F
u8 code smgduan1[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极0~F
延时函数,i=1大概延时10us
void delay(ul6 i)
{
while(i--) ;
}
void main()
{
u8 j;
for(j=0;j<16;j++)
{
P0=~smgduan[j];
delay(50000) ;//2s
}
for(j=16;j>0;j--)
{
P0=smgduan1[j];
delay(50000) ;//2s
}
}
1-6 动态数码管
*******************1-6 动态数码管 *********************
**** *****
J22-->J6 P22-->J9(A) P23-->J9(B) P24-->J9(C)
#include "reg52. h"
#include <REGX51.H>
typedef unsigned int ul6;
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极0~F
//延时函数,i=1大概延时10us
void delay(ul6 i)
{
while(i--);
}
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i)//位选
{
case(0):
LSA=0;LSB=0;LSC=0; break;// 0 位
case(1):
LSA=1;LSB=0;LSC=0; break;//T 1
case(2):
LSA=0;LSB=1;LSC=0; break;//T 2
case(3):
LSA=1;LSB=1;LSC=0; break;//T 3
case(4):
LSA=0;LSB=0;LSC=1; break;//T 4
case(5):
LSA=1;LSB=0;LSC=1; break;//T 5
case(6):
LSA=0;LSB=1;LSC=1; break;//T 6
case(7):
LSA=1;LSB=1;LSC=1; break;// 7
}
P0=smgduan[i];//发送段码
delay(100);//
//P0=0x00;//消隐
}
}
void main()
{
while(1)
{
DigDisplay();
}
}
1-7 独立按键
*******************1-7 独立按键*********************
**** *****
#include <REGX51.H>
typedef unsigned int ul6;
typedef unsigned char u8;
sbit k1=P1^0;//P1.0
sbit led=P0^0;//P0.0
//延时函数,i=1大概延时10us
void delay(ul6 i)
{
while(i--);
}
void keypros()
{
if(k1==0)
{
delay(1000);//消抖10ms
if(k1==0)//2次检测
{
led=~led;//执行按键后程?
//led=0;
}
}
}
void main()
{
led=1;
while(1)
{
keypros();
}
}
1-8 矩阵按键
*******************1-8 矩阵按键************************
**** *****
S1-S4: 0-3 S5-S8: 4-7 S9-S12: 8-B S13-S16: C-F
typedef unsigned int ul6;
typedef unsigned char u8;
#include <REGX51.H>
#define GPIO_DIG P0
#define GPIO_KEY P1
u8 KeyValue;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极0~F
//延时函数,i=1大概延时10us
void delay(ul6 i)
{
while(i--);
}
void KeyDown(void)
{
char a=0;
GPIO_KEY=0x0f; //1111 1111
if(GPIO_KEY!=0x0f)
{
delay(1000);
if(GPIO_KEY!=0x0f)
{
//测试列
GPIO_KEY = 0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
//测试行
GPIO_KEY = 0XF0;
switch (GPIO_KEY)
{
case(0X70):KeyValue = KeyValue ; break;
case(0Xb0):KeyValue = KeyValue + 4; break;
case(0Xd0):KeyValue = KeyValue + 8; break;
case(0Xe0):KeyValue = KeyValue + 12; break;
}
}
}
while((a<50)&&(GPIO_KEY!=0xf0))
{
delay(100);
a++;
}
}
void main()
{
while(1)
{
KeyDown();
GPIO_DIG=~smgduan[KeyValue];
}
}
1-9 74HC165-单片机io口的扩展并转串
*******************1-9 74HC165-单片机io口的扩展并转串***********************
**** *****
typedef unsigned int ul6;
typedef unsigned char u8;
#include <REGX51.H>
#include "intrins.h"
//IO
#define GPIO_LED P0
sbit IN_PL=P1^6;//P1.6
sbit IN_Data=P1^7;//1.7
sbit SCK=P3^6;
u8 Read74HC165(void)
{
u8 i;
u8 indata;
IN_PL = 0;
_nop_();
IN_PL = 1;
_nop_();
indata=0;
for(i=0; i<8; i++)
{
indata = indata<<1;
SCK=0;
_nop_();
indata |=IN_Data;
SCK=1;
}
return(indata);
}
void main()
{
u8 h165Value;
GPIO_LED = 0xff;
while(1)
{
h165Value = Read74HC165();
if(h165Value != 0xFF)
{
GPIO_LED = h165Value;
}
}
}
1-10 74HC595-单片机io口的扩展串转并
*******************1-10 74HC595-单片机io口的扩展串转并***********************
**** *****
typedef unsigned int ul6;
typedef unsigned char u8;
#include <REGX51.H>
#include "intrins.h"
IO
sbit SER=P3^4;
sbit RCLK=P3^5;
sbit SRCLK=P3^6;
延时函数,i=1大概延时10us
void delay(ul6 i)
{
while(i--);
}
向595发送一个字节数据
void Hc595SendByte(u8 dat)
{
u8 a;
SRCLK = 1;
RCLK = 1;
for(a=0;a<8;a++)
{
SER = dat >> 7;
dat <<= 1 ;
SRCLK = 0;
_nop_() ;
_nop_() ;
SRCLK = 1;
}
RCLK = 0;
_nop_() ;
_nop_() ;
RCLK = 1;
}
void main()
{
u8 ledNum;
ledNum=~0x01;//1111 1110
while(1)
{
Hc595SendByte(ledNum);
ledNum = _crol_(ledNum,1);
delay(50000);
}
}
1-10 74HC595-静态数码管显示0-f
*******************1-10 74HC595-静态数码管显示0-f***********************
**** *****
typedef unsigned int ul6;
typedef unsigned char u8;
#include <REGX51.H>
#include "intrins.h"
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极0~F
//IO
sbit SER=P3^4;
sbit RCLK=P3^5;
sbit SRCLK=P3^6;
//延时函数,i=1大概延时10us
void delay(ul6 i)
{
while(i--);
}
//向595发送一个字节数据
void Hc595SendByte(u8 dat)
{
u8 a;
SRCLK = 1;
RCLK = 1;
for(a=0;a<8;a++)
{
SER = dat >> 7;
dat <<= 1 ;
SRCLK = 0;
_nop_() ;
_nop_() ;
SRCLK = 1;
}
RCLK = 0;
_nop_() ;
_nop_() ;
RCLK = 1;
}
void main()
{
u8 i;
while(1)
{
for(i=0;i<16;i++)
{
Hc595SendByte(~smgduan[i]);//硬件是共阳极则取反
delay(50000);
}
}
}
1-11 74HC595-动态数码管显示0-f
*******************1-11 74HC595-动态数码管显示0-f***********************
**** *****
J27-->J6 P22-->J9(A) P23-->J9(B) P24-->J9(C)
P34-->SE P35-->RC P36-->SC
typedef unsigned int ul6;
typedef unsigned char u8;
#include <REGX51.H>
#include "intrins.h"
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极0~F
//IO
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit SER=P3^4;
sbit RCLK=P3^5;
sbit SRCLK=P3^6;
//延时函数,i=1大概延时10us
void delay(ul6 i)
{
while(i--);
}
//动态数码管显示函数,只进行位选,由595确定段码数字
void DigDisplay(u8 i)
{
switch(i)//位选
{
case(0):
LSA=0;LSB=0;LSC=0; break;// 0 位
case(1):
LSA=1;LSB=0;LSC=0; break;//T 1
case(2):
LSA=0;LSB=1;LSC=0; break;//T 2
case(3):
LSA=1;LSB=1;LSC=0; break;//T 3
case(4):
LSA=0;LSB=0;LSC=1; break;//T 4
case(5):
LSA=1;LSB=0;LSC=1; break;//T 5
case(6):
LSA=0;LSB=1;LSC=1; break;//T 6
case(7):
LSA=1;LSB=1;LSC=1; break;// 7
}
}
//向595发送一个字节数据
void Hc595SendByte(u8 dat)
{
u8 a;
SRCLK = 1;
RCLK = 1;
for(a=0;a<8;a++)
{
SER = dat >> 7;
dat <<= 1 ;
SRCLK = 0;
_nop_() ;
_nop_() ;
SRCLK = 1;
}
RCLK = 0;
_nop_() ;
_nop_() ;
RCLK = 1;
}
void main()
{
u8 i;
while(1)
{
for(i=0;i<8;i++)
{
DigDisplay(i);//位选
Hc595SendByte(smgduan[i]);//段码,共阴极不取反
delay(50000);
}
}
}
1-12 74HC595-LED点阵点亮一个点
//*******************1-12 74HC595-LED点阵点亮一个点***********************
//**** *****
//P34-->SE P35-->RC P36-->SC 单片机到 74HC595
//74HC595(A)-->led J27-->J28,74HC595(b)-->led J32-->J34
#include <REGX51.H>
#include "intrins.h"
typedef unsigned int ul6;
typedef unsigned char u8;
sbit SER=P3^4;
sbit RCLK=P3^5;
sbit SRCLK=P3^6;
//发送数据至595
//datl: 第4个 595输出值
//dat2: 3 595
//dat3: 2 595
//dat4: 1 595
void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
u8 a;
SRCLK = 1;
RCLK = 1;
for (a=0;a<8; a++)
{
SER = dat1 >> 7;
dat1 <<= 1;
SRCLK = 0;
_nop_();
_nop_();
SRCLK = 1;
}
for (a=0;a<8; a++)
{
SER = dat2 >> 7;
dat2 <<= 1;
SRCLK = 0;
_nop_();
_nop_();
SRCLK = 1;
}
for (a=0;a<8; a++)
{
SER = dat3 >> 7;
dat3 <<= 1;
SRCLK = 0;
_nop_();
_nop_();
SRCLK = 1;
}
for (a=0;a<8; a++)
{
SER = dat4 >> 7;
dat4 <<= 1;
SRCLK = 0;
_nop_();
_nop_();
SRCLK = 1;
}
RCLK = 0;
_nop_();
_nop_();
RCLK = 1;
}
void main()
{
while(1)
{
Hc595SendByte(0xff,0xfe ,0x00,0x01);
}
}
1-13 74HC595-LED点阵点亮一个汉字
*******************1-13 74HC595-LED点阵点亮一个汉字**********************
**** *****
//P34-->SE P35-->RC P36-->SC 单片机到 74HC595
//74HC595(A)-->led J27-->J28,74HC595(b)-->led J32-->J34
#include <REGX51.H>
#include "intrins.h"
typedef unsigned int ul6;
typedef unsigned char u8;
sbit SER=P3^4;
sbit RCLK=P3^5;
sbit SRCLK=P3^6;
sbit k1=P1^0;//P1.0
u8 t;
u8 code ledduan1[]=
{
/*-- ??: 好 --*/
/*-- ??12; ??????????:?x?=16x16 --*/
0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,
0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,
};
u8 code ledduan2[]={
/*-- ??: 的 --*/
/*-- ??12; ??????????:?x?=16x16 --*/
0x00,0xF8,0x0C,0x0B,0x08,0x08,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0xF8,0x00,0x00,
0x00,0x7F,0x21,0x21,0x21,0x21,0x7F,0x00,0x00,0x00,0x43,0x80,0x40,0x3F,0x00,0x00,
};
u8 code ledwei[]={
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
};
//延时函数,i=1大概延时10us
void delay(ul6 i)
{
while(i--);
}
//发送数据至595
//datl: 第4个 595输出值
//dat2: 3 595
//dat3: 2 595
//dat4: 1 595
void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
u8 a;
SRCLK = 1;
RCLK = 1;
for(a=0;a<8;a++)
{
SER = dat1 >> 7;
dat1 <<= 1;
SRCLK = 0;
_nop_();
_nop_();
SRCLK = 1;
}
for (a=0;a<8; a++)
{
SER = dat2 >> 7;
dat2 <<= 1;
SRCLK = 0;
_nop_();
_nop_();
SRCLK = 1;
}
for (a=0;a<8; a++)
{
SER = dat3 >> 7;
dat3 <<= 1;
SRCLK = 0;
_nop_();
_nop_();
SRCLK = 1;
}
for (a=0;a<8; a++)
{
SER = dat4 >> 7;
dat4 <<= 1;
SRCLK = 0;
_nop_();
_nop_();
SRCLK = 1;
}
RCLK = 0;
_nop_();
_nop_();
RCLK = 1;
}
//显示"好"
void de_1()
{
u8 i;
for(i=0;i<16;i++)
{
Hc595SendByte(~ledwei[i+16],~ledwei[i],ledduan2[16+i],ledduan2[i]);
delay(100);
}
}
//显示"的"
void hao_1()
{
u8 i;
for(i=0;i<16;i++)
{
Hc595SendByte(~ledwei[i+16],~ledwei[i],ledduan1[16+i],ledduan1[i]);
delay(100);
}
}
//换字
void turn(u8 i)
{
if(i==0x00)
{
hao_1();
}
else de_1();
}
//按键控制t的值
void keypros()
{
if(k1==0)
{
delay(1000);//消抖10ms
if(k1==0)//2次检测
{
t=~t;//执行按键后程?
//led=0;
}
}
}
void main()
{
u8 i;
t=0x00;
while(1)
{
keypros();//检查t有无变化,按键是否按下
turn(t);//根据t来选择显示哪个字
}
}
1-14 74HC595-LED点阵显示图像
*******************1-14 74HC595-LED点阵显示图像***********************
**** *****
*******************1-15 ULN2003D 直流电机 **********************
**** *****
#include <REGX51.H>
#include "intrins.h"
typedef unsigned int ul6;
typedef unsigned char u8;
sbit moto=P1^0;//P1.0
//延时函数,i=1大概延时10us
void delay(ul6 i)
{
while(i--);
}
void main()
{
u8 i;
moto=0;
for(i=0;i<100;i++)//100ci
{
moto=1;
delay (5000);//50ms
}
moto=0;//off
while(1)
{
}
}
1-15 ULN2003D 直流电机独立按键控制
*******************1-15 ULN2003D 直流电机独立按键控制 **********************
**** *****
#include <REGX51.H>
#include "intrins.h"
typedef unsigned int ul6;
typedef unsigned char u8;
sbit moto=P1^0;//P1.0
sbit k1=P0^0;//P0.0
u8 t;
延时函数,i=1大概延时10us
void delay(ul6 i)
{
while(i--);
}
电机状态函数
void moto_1(u8 i)
{
if(i==0x00)
{
moto=0;
}
else moto=1;
}
按键控制
void keypros()
{
if(k1==0)
{
delay(1000);//消抖10ms
if(k1==0)//2次检测
{
t=~t;
//moto=~moto;//执行按键后程?
//moto_1(t);
//led=0;
}
}
}
void main()
{
t=0x00;
while(1)
{
keypros();//检查t有无变化,按键是否按下
moto_1(t);//根据t来选择on or off
}
}
1-16 步进电机
//*******************1-16 步进电机**********************
//**** *****
//P10-->IA P11-->IB P12-->IC P13-->ID
//OA-->A+ OB-->A- OC-->B+ OD-->B-
#include <REGX51.H>
#include "intrins.h"
typedef unsigned int ul6;
typedef unsigned char u8;
sbit MOTOA=P1^0;//P1.0
sbit MOTOB=P1^1;//P1.0
sbit MOTOC=P1^2;//P1.0
sbit MOTOD=P1^3;//P1.0
#define SPEED 100//转速70不转
void delay(ul6 i)
{
while(i--);
}
void main()
{
P1=0X00;
while(1)
{
MOTOA = 1;
MOTOB = 0;//前进
MOTOC = 1;
MOTOD = 1;//刹车
delay(SPEED) ;
MOTOA = 1;
MOTOB = 1;//刹车
MOTOC = 1;
MOTOD = 0;//前进
delay(SPEED) ;
MOTOA = 0;
MOTOB = 1;//后退
MOTOC = 1;
MOTOD = 1;//刹车
delay(SPEED) ;
MOTOA = 1;
MOTOB = 1;//刹车
MOTOC = 0;
MOTOD = 1;//后退
delay(SPEED);
}
}
1-17 独立按键控制 步进电机
//*******************1-17 独立按键控制 步进电机**********************
//**** *****
//P10-->IA P11-->IB P12-->IC P13-->ID
//OA-->A+ OB-->A- OC-->B+ OD-->B-
//P0.0--K1
#include <REGX51.H>
#include "intrins.h"
typedef unsigned int ul6;
typedef unsigned char u8;
sbit MOTOA=P1^0;//P1.0
sbit MOTOB=P1^1;//P1.0
sbit MOTOC=P1^2;//P1.0
sbit MOTOD=P1^3;//P1.0
sbit k1=P0^0;//P0.0
u8 t;
#define SPEED 100//转速70不转
void delay(ul6 i)
{
while(i--);
}
//电机正反转
void turn(u8 i)
{
if(i==0x00)
{
MOTOA = 1;
MOTOB = 0;//前进
MOTOC = 1;
MOTOD = 1;//刹车
delay(SPEED) ;
MOTOA = 1;
MOTOB = 1;//刹车
MOTOC = 1;
MOTOD = 0;//前进
delay(SPEED) ;
MOTOA = 0;
MOTOB = 1;//后退
MOTOC = 1;
MOTOD = 1;//刹车
delay(SPEED) ;
MOTOA = 1;
MOTOB = 1;//刹车
MOTOC = 0;
MOTOD = 1;//后退
delay(SPEED);
}
else
{
MOTOA = 1;
MOTOB = 1;//刹车
MOTOC = 0;
MOTOD = 1;//后退
delay(SPEED);
MOTOA = 0;
MOTOB = 1;//后退
MOTOC = 1;
MOTOD = 1;//刹车
delay(SPEED) ;
MOTOA = 1;
MOTOB = 1;//刹车
MOTOC = 1;
MOTOD = 0;//前进
delay(SPEED) ;
MOTOA = 1;
MOTOB = 0;//前进
MOTOC = 1;
MOTOD = 1;//刹车
delay(SPEED) ;
}
}
//按键控制
void keypros()
{
if(k1==0)
{
delay(1000);//消抖10ms
if(k1==0)//2次检测
{
t=~t;
//moto=~moto;//执行按键后程?
//moto_1(t);
//led=0;
}
}
}
void main()
{
P1=0X00;
t=0x00;
while(1)
{
keypros();
turn(t);
}
}