0
点赞
收藏
分享

微信扫一扫

51单片机-案例程序源码-笔记

最近整了块单片机,这里分享一下源码,供师兄弟们一起学习研究。

如果会c语言的话,可能觉得这些代码实在是太简单了,而且不够优雅😄

但是单片机的难点不在程序,而在电路逻辑,所以要重点理解电路逻辑,代码相对来说就不重要了。

适用单片机

这里的源码仅适用于此单片机。

51单片机-案例程序源码-笔记_51单片机

案例1:点亮LED

#include<reg52.h>

//sfr P1 = 0X90; //定义P1寄存器地址

sbit led0=P1^0; //led0 第一个发光二极管
sbit led7=P1^7; //led0 第八个发光二极管

sbit ceship3=P3^7; //定义P3.7io口
sbit ceship2=P2^0; //定义P3.7io口

void main()
{
/*
led0=0; //led0 给点电平 点亮led
while(1); //while死循环,让程序停在这里
*/
while(1)
{
led0=0; //led0 给低电平 点亮第一个led
led7=0; //led0 第八个发光二极管
ceship3=0;
ceship2=0;
}

}

案例2:流水灯

#include<reg52.h>
#include<intrins.h>
//unsigned int i; //定义延时程序变量
//unsigned char x;
//unsigned int y,z=0xff,u;
unsigned char code LED[8]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F}; //LDE灯 点亮数组
void main()
{
unsigned int i; //定义延时程序变量
unsigned char X; //定义左移位数变量
unsigned char temp;//定义数组自加变量
//i=40000; //初始化延时程序变量值
X=0;
temp=0;
//P1=0XFE;
while(1)
{/*
//**************方法一:简单粗暴法*********************
P1=0XFE; //点亮第1个led
i=65535; //初始化延时程序变量值
while(i--);//while延时程序
P1=0XFD; //点亮第2个led
i=65535; //初始化延时程序变量值
while(i--);//while延时程序
P1=0XFB; //点亮第3个led
i=65535; //初始化延时程序变量值
while(i--);//while延时程序
P1=0XF7; //点亮第4个led
i=65535; //初始化延时程序变量值
while(i--);//while延时程序
P1=0XEF; //点亮第5个led
i=65535; //初始化延时程序变量值
while(i--);//while延时程序
P1=0XDF; //点亮第6个led
i=65535; //初始化延时程序变量值
while(i--);//while延时程序
P1=0XBF; //点亮第7个led
i=65535; //初始化延时程序变量值
while(i--);//while延时程序
P1=0X7F; //点亮第8个led
i=65535; //初始化延时程序变量值
while(i--);//while延时程序

//**************方法一:简单粗暴法*********************
*/
/*
//**************方法二:运用左移简化我们程序***********
P1= ~(0X01<<X);
X++;
if(X>=8)
{
X=0;
}
i=65535; //初始化延时程序变量值
while(i--);//while延时程序

//**************方法二:运用左移简化我们程序***********
*/
/*
//**************方法三:利用库函数更简单实现***********
i=65535; //初始化延时程序变量值
while(i--);//while延时程序
P1=_crol_(P1,1);
//**************方法三:利用库函数更简单实现***********
*/
//**************方法四:利用数组灵活操控***************
P1=LED[temp++];//数组的第一个数编号是0,第二个数是1,后面依次类推
if(temp>=8)
temp=0;
i=1000; //初始化延时程序变量值
while(i--);//while延时程序


//**************方法四:利用数组灵活操控***************
}
}

案例3:继电器

#include<reg52.h>
//*******************数据类型定义************************
typedef signed char int8; //8位有符号字符型
typedef signed int int16; //16位有符号整型
typedef signed long int32; //32位有符号长整型
typedef unsigned char uint8; //8位无符号字符型
typedef unsigned int uint16; //16位无符号整型
typedef unsigned long uint32; //32位无符号长整型
//*******************数据类型定义************************
sbit JDQ = P2^0;//继电器 IO口
sbit DATA_A_595 = P1^0; //74HC595 串行数据输入引脚
sbit SHIFT_CLOCK_595 = P1^4; //74HC595 移位寄存器时钟信号输入引脚
sbit LATCH_CLOCK_595 = P2^3; //74HC595 锁存器时钟信号输入引脚
void delay(uint16 x_ms); //延迟 x_ms*1 毫秒
void write_byte_74hc595(uint8 dat); //给595芯片写一字节数据函数
void main()
{
while(1)
{
//*******************************************************
/*
//方法一:跳过595芯片 直接io口驱动
JDQ = 1;//继电器 IO口
delay(1000); //延迟 x_ms*1 毫秒
JDQ = 0;//继电器 IO口
delay(1000); //延迟 x_ms*1 毫秒
*/
//*******************************************************
//*******************************************************
//方法二:通过74hc595芯片驱动继电器
//write_byte_74hc595(0X08); //继电器输入高电平 ,继电器工作
write_byte_74hc595(0X0C); //继电器输入高电平 ,继电器工作 同时 蜂鸣器发声
delay(1000); //延迟 x_ms*1 毫秒
write_byte_74hc595(0x00); //继电器输入低电平,继电器断开
delay(1000); //延迟 x_ms*1 毫秒
//*******************************************************
}

}

void write_byte_74hc595(uint8 dat) //给595芯片写一字节数据函数
{
uint8 i;
for(i=0;i<8;i++)
{
DATA_A_595 =(dat<<i)&0x80; //74HC595 串行数据输入引脚
SHIFT_CLOCK_595 = 0; //74HC595 移位寄存器时钟信号输入引脚
SHIFT_CLOCK_595 = 1; //74HC595 移位寄存器时钟信号输入引脚

}
LATCH_CLOCK_595 = 0; //74HC595 锁存器时钟信号输入引脚
LATCH_CLOCK_595 = 1; //74HC595 锁存器时钟信号输入引脚
}

void delay(uint16 x_ms) //延迟 x_ms*1 毫秒
{
uint16 i,j;
for(i=x_ms;i>0;i--)
for(j=114;j>0;j--);


}

案例4:数码管静态显示

/*********************************************************************
《夏老师十天玩转单片机》系列单片机教程源代码
爱电子网出品 网站:www.loveele.com
**********************************************************************
程序名称:第八课:IO口输出之数码管静态显示
程序版本:V1.0
作 者: 夏坤(夏老师)
编写时间:2019年07月10日
硬件支持:74HC573 驱动数码管
接口说明:
修改日志:
N0.1:
**********************************************************************/
/*
**********************************************************************
* 头文件包含/SFR定义
**********************************************************************
*/
#include<reg52.h>

/*
**********************************************************************
* 本地数据类型/宏定义
**********************************************************************
*/
typedef signed char int8; //8位有符号字符型
typedef signed int int16; //16位有符号整型
typedef signed long int32; //32位有符号长整型
typedef unsigned char uint8; //8位无符号字符型
typedef unsigned int uint16; //16位无符号整型
typedef unsigned long uint32; //32位无符号长整型

/*
**********************************************************************
* 单片机IO口位定义
**********************************************************************
*/
sbit DATA_A_595 = P1^0; //74HC595 串行数据输入引脚
sbit SHIFT_CLOCK_595 = P1^4; //74HC595 移位寄存器时钟信号输入引脚
sbit LATCH_CLOCK_595 = P2^3; //74HC595 锁存器时钟信号输入引脚

sbit duanxuan = P2^5; //数码管驱动芯片74HC573 段选
sbit weixuan = P2^6; //数码管驱动芯片74HC573 位选
/*
**********************************************************************
* 本地全局变量/数组定义
**********************************************************************
*/
uint8 zifu_test; //自加变量 测试我们编码表
uint8 code zifu[19]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x7f,0xbf}; //共阳数码管编码表

/*
**********************************************************************
* 函数原型声明
**********************************************************************
*/
void delay(uint16 x_ms); //延迟 x_ms*1 毫秒
void write_byte_74hc595(uint8 dat); //给595芯片写一字节数据函数

/*********************************************************************
*函数名称:main
*函数功能:主函数
*函数调用:
*参数列表:无
*返 回 值:无
*结 果:
*备 注:
*********************************************************************/
void main(void)
{
P1=0XFF;
write_byte_74hc595(0X40); //给595芯片写一字节数据函数
write_byte_74hc595(0X00); //给595芯片写一字节数据函数 关掉595被控制的所有功能
zifu_test = 0; //自加变量 测试我们编码表
while(1)
{
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[zifu_test++]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选

duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0Xff; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
delay(500); //延迟 x_ms*1 毫秒

//zifu_test++; //自加变量 测试我们编码表
if(zifu_test>=19)
zifu_test=0; //自加变量 测试我们编码表
}
}

/*********************************************************************
*函数名称:write_byte_74hc595
*函数功能:74HC595芯片数据输入
*函数调用:write_byte_74hc595(uint8 dat);
*参数列表:dat
*返 回 值:无
*结 果:把一个字节数 dat 写到 74HC595芯片的八个输出引脚上
*备 注:dat 数据对应的功能
蜂鸣器 0X04 继电器 0X80
时钟芯片片选 0X10 流水灯 0X40
*********************************************************************/
void write_byte_74hc595(uint8 dat) //给595芯片写一字节数据函数
{
uint8 i;
for(i=0;i<8;i++)
{
DATA_A_595 =(dat<<i)&0x80; //74HC595 串行数据输入引脚
SHIFT_CLOCK_595 = 0; //74HC595 移位寄存器时钟信号输入引脚
SHIFT_CLOCK_595 = 1; //74HC595 移位寄存器时钟信号输入引脚

}
LATCH_CLOCK_595 = 0; //74HC595 锁存器时钟信号输入引脚
LATCH_CLOCK_595 = 1; //74HC595 锁存器时钟信号输入引脚
}
/*********************************************************************
*函数名称:delay
*函数功能:延时函数
*函数调用:delay(uint16 x_ms);
*参数列表:x_ms
*返 回 值:无
*结 果:延迟时间=1* x_ms(毫秒)
*备 注:
*********************************************************************/
void delay(uint16 x_ms) //延迟 x_ms*1 毫秒
{
uint16 i,j;
for(i=x_ms;i>0;i--)
for(j=114;j>0;j--);


}

案例5:数码管动态显示

/*********************************************************************
《夏老师十天玩转单片机》系列单片机教程源代码
爱电子网出品 网站:www.loveele.com
**********************************************************************
程序名称:第九课:IO口输出之数码管动态显示
程序版本:V1.0
作 者: 夏坤(夏老师)
编写时间:2019年010月01日
硬件支持:74HC573 驱动数码管
接口说明:
修改日志:
N0.1:
**********************************************************************/
/*
**********************************************************************
* 头文件包含/SFR定义
**********************************************************************
*/
#include<reg52.h>

/*
**********************************************************************
* 本地数据类型/宏定义
**********************************************************************
*/
typedef signed char int8; //8位有符号字符型
typedef signed int int16; //16位有符号整型
typedef signed long int32; //32位有符号长整型
typedef unsigned char uint8; //8位无符号字符型
typedef unsigned int uint16; //16位无符号整型
typedef unsigned long uint32; //32位无符号长整型

/*
**********************************************************************
* 单片机IO口位定义
**********************************************************************
*/
sbit DATA_A_595 = P1^0; //74HC595 串行数据输入引脚
sbit SHIFT_CLOCK_595 = P1^4; //74HC595 移位寄存器时钟信号输入引脚
sbit LATCH_CLOCK_595 = P2^3; //74HC595 锁存器时钟信号输入引脚

sbit duanxuan = P2^5; //数码管驱动芯片74HC573 段选
sbit weixuan = P2^6; //数码管驱动芯片74HC573 位选
/*
**********************************************************************
* 本地全局变量/数组定义
**********************************************************************
*/
uint8 zifu_test; //自加变量 测试我们编码表
uint8 code zifu[19]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x7f,0xbf}; //共阳数码管编码表

/*
**********************************************************************
* 函数原型声明
**********************************************************************
*/
void delay(uint16 x_ms); //延迟 x_ms*1 毫秒
void write_byte_74hc595(uint8 dat); //给595芯片写一字节数据函数
void delay_100us(uint16 x_100us); //延迟 x_100*100 微秒
void Disp_smg_number(uint8 x_smg,uint8 count_smg,uint32 number,uint16 time);//把一个任意的八位数以内的十进制数,通过动态扫描显示在数码管上,可以指定扫描时间
/*********************************************************************
*函数名称:main
*函数功能:主函数
*函数调用:
*参数列表:无
*返 回 值:无
*结 果:
*备 注:
*********************************************************************/
void main(void)
{
P1=0XFF;
write_byte_74hc595(0X40); //给595芯片写一字节数据函数
write_byte_74hc595(0X00); //给595芯片写一字节数据函数 关掉595被控制的所有功能
zifu_test = 0; //自加变量 测试我们编码表
while(1)
{
/***************************************************************************************************
//数码管消斗试验
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[1]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选

duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X01; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
delay(1000); //延迟 x_ms*1 毫秒

duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[2]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选

duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X02; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
delay(1000); //延迟 x_ms*1 毫秒

duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[3]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选

duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X04; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
delay(1000); //延迟 x_ms*1 毫秒

duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[4]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选

duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X08; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
delay(1000); //延迟 x_ms*1 毫秒
/********************************************************************************************/
/****************************************************************************************
//验证影子产生的原因
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[1]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
// delay(1); //延迟 x_ms*1 毫秒 放大影子显现,验证我们的理论
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X01; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//delay(4); //延迟 x_ms*1 毫秒
delay_100us(1); //延迟 x_100*100 微秒
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[2]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
// delay(1); //延迟 x_ms*1 毫秒 放大影子显现,验证我们的理论
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X02; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//delay(4); //延迟 x_ms*1 毫秒
delay_100us(1); //延迟 x_100*100 微秒
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[3]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
// delay(1); //延迟 x_ms*1 毫秒 放大影子显现,验证我们的理论
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X04; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//delay(4); //延迟 x_ms*1 毫秒
delay_100us(1); //延迟 x_100*100 微秒
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[4]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
// delay(1); //延迟 x_ms*1 毫秒 放大影子显现,验证我们的理论
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X08; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//delay(4); //延迟 x_ms*1 毫秒
delay_100us(1); //延迟 x_100*100 微秒
//****************************************************************************************/
//数码管消影
/* duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[1]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
// delay(1); //延迟 x_ms*1 毫秒 放大影子显现,验证我们的理论
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X01; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//delay(4); //延迟 x_ms*1 毫秒
delay_100us(1); //延迟 x_100*100 微秒
//******************************************************************************************
//消影
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X00; //数码管位选清零
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//******************************************************************************************
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[2]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
// delay(1); //延迟 x_ms*1 毫秒 放大影子显现,验证我们的理论
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X02; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//delay(4); //延迟 x_ms*1 毫秒
delay_100us(1); //延迟 x_100*100 微秒
//******************************************************************************************
//消影
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X00; //数码管位选清零
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//******************************************************************************************
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[3]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
// delay(1); //延迟 x_ms*1 毫秒 放大影子显现,验证我们的理论
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X04; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//delay(4); //延迟 x_ms*1 毫秒
delay_100us(1); //延迟 x_100*100 微秒
//******************************************************************************************
//消影
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X00; //数码管位选清零
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//******************************************************************************************
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[4]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
// delay(1); //延迟 x_ms*1 毫秒 放大影子显现,验证我们的理论
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X08; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//delay(4); //延迟 x_ms*1 毫秒
delay_100us(1); //延迟 x_100*100 微秒
//******************************************************************************************
//消影
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X00; //数码管位选清零
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//******************************************************************************************
*/
// Disp_smg_number(1,8,12345678,15);//数码管显示12375678 把任意一个八位以内的十进制数,在数码管上x坐标任意位置,任意扫描时间,通过动态扫描显示
Disp_smg_number(3,6,198866,15);//数码管显示198866
}
}

/*********************************************************************
*函数名称:write_byte_74hc595
*函数功能:74HC595芯片数据输入
*函数调用:write_byte_74hc595(uint8 dat);
*参数列表:dat
*返 回 值:无
*结 果:把一个字节数 dat 写到 74HC595芯片的八个输出引脚上
*备 注:dat 数据对应的功能
蜂鸣器 0X04 继电器 0X80
时钟芯片片选 0X10 流水灯 0X40
*********************************************************************/
void write_byte_74hc595(uint8 dat) //给595芯片写一字节数据函数
{
uint8 i;
for(i=0;i<8;i++)
{
DATA_A_595 =(dat<<i)&0x80; //74HC595 串行数据输入引脚
SHIFT_CLOCK_595 = 0; //74HC595 移位寄存器时钟信号输入引脚
SHIFT_CLOCK_595 = 1; //74HC595 移位寄存器时钟信号输入引脚

}
LATCH_CLOCK_595 = 0; //74HC595 锁存器时钟信号输入引脚
LATCH_CLOCK_595 = 1; //74HC595 锁存器时钟信号输入引脚
}
/*********************************************************************
*函数名称:delay
*函数功能:延时函数
*函数调用:delay(uint16 x_ms);
*参数列表:x_ms
*返 回 值:无
*结 果:延迟时间=1* x_ms(毫秒)
*备 注:
*********************************************************************/
void delay(uint16 x_ms) //延迟 x_ms*1 毫秒
{
uint16 i,j;
for(i=x_ms;i>0;i--)
for(j=114;j>0;j--);


}

/*********************************************************************
*函数名称:delay_100us
*函数功能:延时函数
*函数调用:delay(uint16 x_100us);
*参数列表:x_100us
*返 回 值:无
*结 果:延迟时间=100* x_100us(微秒)
*备 注:
*********************************************************************/
void delay_100us(uint16 x_100us) //延迟 x_100*100 微秒
{
uint16 i,j;
for(i=x_100us;i>0;i--)
for(j=11;j>0;j--);


}

/*********************************************************************
*函数名称: Disp_smg_number
*函数功能: 把任意一个八位以内的十进制数,在数码管上x坐标任意位置,任意扫描时间,通过动态扫描显示
*函数调用: void Disp_smg_number(uint8 x_smg,uint8 count_smg,uint32 number,uint16 time);
*参数列表:
uint8 x_smg 数码管写入位置X坐标 取值范围1-8
uint8 count_smg 写入几位十进制数 取值范围1-8
uint32 number 写入的十进制数值 取值范围0-99999999
uint16 time 动态扫描时间 延迟时间 = time*100us

*返 回 值:无
*结 果: 在八位数码管任意位置通动态扫描写一个八位以内的任意数
*备 注:
共阳数码管编码表
十六进制:0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x7f,0xbf
显示字符: 0 1 2 3 4 5 6 7 8 9 A b C D E F H . -

共阳数码管从左至右,依次位选编码数据
十六进制 : 0X01 0X02 0X04 0X08 0X10 0X20 0X40 0X80
数码管编号: 1 2 3 4 5 6 7 8
*********************************************************************/
void Disp_smg_number(uint8 x_smg,uint8 count_smg,uint32 number,uint16 time)
{
uint8 i;
uint8 number1[8]; //定义一个存储八位数的每一位的数字用的数组
uint8 code zifu[19]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x7f,0xbf};
uint8 code wei_dat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //定义八位数码管位选数据数组

number1[0] = number % 10; //个
number1[1] = number % 100 / 10; //十
number1[2] = number % 1000 / 100; //百
number1[3] = number % 10000 / 1000; //千
number1[4] = number % 100000 / 10000; //万
number1[5] = number % 1000000 / 100000; //十万
number1[6] = number % 10000000 / 1000000; //百万
number1[7] = number % 100000000 / 10000000; //千万
for(i=0;i < count_smg;i++)
{/*
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[number1[count_smg-i-1]]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
// delay(1); //延迟 x_ms*1 毫秒 放大影子显现,验证我们的理论
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =wei_dat[x_smg+i-1]; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//delay(4); //延迟 x_ms*1 毫秒
delay_100us(time); //延迟 x_100*100 微秒
//******************************************************************************************
//消影
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X00; //数码管位选清零
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//****************************************************************************************** */
//********************************************************************
//数码管段选写入
duanxuan = 0; //数码管驱动芯片74hc573 段选
weixuan = 0; //数码管驱动芯片74hc573 位选
P0=zifu[number1[count_smg-i-1]]; //数码管段选显示0 段码数据
duanxuan = 1; //数码管驱动芯片74hc573 段选
duanxuan = 0; //数码管驱动芯片74hc573 段选
//********************************************************************

//数码管位选写入
duanxuan = 0; //数码管驱动芯片74hc573 段选
weixuan = 0; //数码管驱动芯片74hc573 位选
P0=wei_dat[x_smg+i-1]; //数码管段选显示0 段码数据
weixuan = 1; //数码管驱动芯片74hc573 位选
weixuan = 0; //数码管驱动芯片74hc573 位选
//********************************************************************
delay_100us(time);
//delay(smg_time); //延迟 x_ms*1 毫秒
//********************************************************************

//消影
duanxuan = 0; //数码管驱动芯片74hc573 段选
weixuan = 0; //数码管驱动芯片74hc573 位选
P0=0x00; //数码管段选显示0 段码数据
weixuan = 1; //数码管驱动芯片74hc573 段选
weixuan = 0; //数码管驱动芯片74hc573 段选
//********************************************************************
}

}

案例6:独立键盘

/*********************************************************************
《夏老师十天玩转单片机》系列单片机教程源代码
爱电子网出品 网站:www.loveele.com
**********************************************************************
程序名称:
程序版本:V1.0
作 者: 夏坤(夏老师)
编写时间:2020年03月29日
硬件支持:
接口说明:
修改日志:
N0.1:
**********************************************************************/
/*
**********************************************************************
* 头文件包含/SFR定义
**********************************************************************
*/
#include<reg52.h>

/*
**********************************************************************
* 本地数据类型/宏定义
**********************************************************************
*/
typedef signed char int8; //8位有符号字符型
typedef signed int int16; //16位有符号整型
typedef signed long int32; //32位有符号长整型
typedef unsigned char uint8; //8位无符号字符型
typedef unsigned int uint16; //16位无符号整型
typedef unsigned long uint32; //32位无符号长整型

/*
**********************************************************************
* 单片机IO口位定义
**********************************************************************
*/
sbit key1 = P3^7;
sbit key2 = P3^6;
sbit key3 = P3^5;
sbit key4 = P3^4;

sbit DATA_A_595 = P1^0; //74HC595 串行数据输入引脚
sbit SHIFT_CLOCK_595 = P1^4; //74HC595 移位寄存器时钟信号输入引脚
sbit LATCH_CLOCK_595 = P2^3; //74HC595 锁存器时钟信号输入引脚

sbit duanxuan = P2^5; //数码管驱动芯片74HC573 段选
sbit weixuan = P2^6; //数码管驱动芯片74HC573 位选
/*
**********************************************************************
* 本地全局变量/数组定义
**********************************************************************
*/
uint16 test_num = 0 ; //键盘测试数字变量
/*
**********************************************************************
* 函数原型声明
**********************************************************************
*/
void delay(uint16 x_ms); //延迟 x_ms*1 毫秒
void write_byte_74hc595(uint8 dat); //给595芯片写一字节数据函数
void delay_100us(uint16 x_100us); //延迟 x_100*100 微秒
void Disp_smg_number(uint8 x_smg,uint8 count_smg,uint32 number,uint16 time);//把一个任意的八位数以内的十进制数,通过动态扫描显示在数码管上,可以指定扫描时间


/*********************************************************************
*函数名称:main
*函数功能:主函数
*函数调用:
*参数列表:无
*返 回 值:无
*结 果:
*备 注:
*********************************************************************/
void main(void)
{
write_byte_74hc595(0X00); //给595芯片写一字节数据函数 关掉595被控制的所有功能
key1 = 1; //键盘初始化
test_num = 0 ; //键盘测试数字变量
while(1)
{
if(key1==0)
{
delay(10); //延迟 x_ms*1 毫秒
if(key1==0)
{
while(!key1);
//while(key1!=1);
//while(key1==0);
}
test_num++;
}

Disp_smg_number(1,8,test_num,10);//把一个任意的八位数以内的十进制数,通过动态扫描显示在数码管上,可以指定扫描时间

}
}


/*********************************************************************
*函数名称:write_byte_74hc595
*函数功能:74HC595芯片数据输入
*函数调用:write_byte_74hc595(uint8 dat);
*参数列表:dat
*返 回 值:无
*结 果:把一个字节数 dat 写到 74HC595芯片的八个输出引脚上
*备 注:dat 数据对应的功能
蜂鸣器 0X04 继电器 0X80
时钟芯片片选 0X10 流水灯 0X40
*********************************************************************/
void write_byte_74hc595(uint8 dat) //给595芯片写一字节数据函数
{
uint8 i;
for(i=0;i<8;i++)
{
DATA_A_595 =(dat<<i)&0x80; //74HC595 串行数据输入引脚
SHIFT_CLOCK_595 = 0; //74HC595 移位寄存器时钟信号输入引脚
SHIFT_CLOCK_595 = 1; //74HC595 移位寄存器时钟信号输入引脚

}
LATCH_CLOCK_595 = 0; //74HC595 锁存器时钟信号输入引脚
LATCH_CLOCK_595 = 1; //74HC595 锁存器时钟信号输入引脚
}
/*********************************************************************
*函数名称:delay
*函数功能:延时函数
*函数调用:delay(uint16 x_ms);
*参数列表:x_ms
*返 回 值:无
*结 果:延迟时间=1* x_ms(毫秒)
*备 注:
*********************************************************************/
void delay(uint16 x_ms) //延迟 x_ms*1 毫秒
{
uint16 i,j;
for(i=x_ms;i>0;i--)
for(j=114;j>0;j--);


}

/*********************************************************************
*函数名称:delay_100us
*函数功能:延时函数
*函数调用:delay(uint16 x_100us);
*参数列表:x_100us
*返 回 值:无
*结 果:延迟时间=100* x_100us(微秒)
*备 注:
*********************************************************************/
void delay_100us(uint16 x_100us) //延迟 x_100*100 微秒
{
uint16 i,j;
for(i=x_100us;i>0;i--)
for(j=11;j>0;j--);


}

/*********************************************************************
*函数名称: Disp_smg_number
*函数功能: 把任意一个八位以内的十进制数,在数码管上x坐标任意位置,任意扫描时间,通过动态扫描显示
*函数调用: void Disp_smg_number(uint8 x_smg,uint8 count_smg,uint32 number,uint16 time);
*参数列表:
uint8 x_smg 数码管写入位置X坐标 取值范围1-8
uint8 count_smg 写入几位十进制数 取值范围1-8
uint32 number 写入的十进制数值 取值范围0-99999999
uint16 time 动态扫描时间 延迟时间 = time*100us

*返 回 值:无
*结 果: 在八位数码管任意位置通动态扫描写一个八位以内的任意数
*备 注:
共阳数码管编码表
十六进制:0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x7f,0xbf
显示字符: 0 1 2 3 4 5 6 7 8 9 A b C D E F H . -

共阳数码管从左至右,依次位选编码数据
十六进制 : 0X01 0X02 0X04 0X08 0X10 0X20 0X40 0X80
数码管编号: 1 2 3 4 5 6 7 8
*********************************************************************/
void Disp_smg_number(uint8 x_smg,uint8 count_smg,uint32 number,uint16 time)
{
uint8 i;
uint8 number1[8]; //定义一个存储八位数的每一位的数字用的数组
uint8 code zifu[19]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x7f,0xbf};
uint8 code wei_dat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //定义八位数码管位选数据数组

number1[0] = number % 10; //个
number1[1] = number % 100 / 10; //十
number1[2] = number % 1000 / 100; //百
number1[3] = number % 10000 / 1000; //千
number1[4] = number % 100000 / 10000; //万
number1[5] = number % 1000000 / 100000; //十万
number1[6] = number % 10000000 / 1000000; //百万
number1[7] = number % 100000000 / 10000000; //千万
for(i=0;i < count_smg;i++)
{/*
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[number1[count_smg-i-1]]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
// delay(1); //延迟 x_ms*1 毫秒 放大影子显现,验证我们的理论
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =wei_dat[x_smg+i-1]; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//delay(4); //延迟 x_ms*1 毫秒
delay_100us(time); //延迟 x_100*100 微秒
//******************************************************************************************
//消影
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X00; //数码管位选清零
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//****************************************************************************************** */
//********************************************************************
//数码管段选写入
duanxuan = 0; //数码管驱动芯片74hc573 段选
weixuan = 0; //数码管驱动芯片74hc573 位选
P0=zifu[number1[count_smg-i-1]]; //数码管段选显示0 段码数据
duanxuan = 1; //数码管驱动芯片74hc573 段选
duanxuan = 0; //数码管驱动芯片74hc573 段选
//********************************************************************

//数码管位选写入
duanxuan = 0; //数码管驱动芯片74hc573 段选
weixuan = 0; //数码管驱动芯片74hc573 位选
P0=wei_dat[x_smg+i-1]; //数码管段选显示0 段码数据
weixuan = 1; //数码管驱动芯片74hc573 位选
weixuan = 0; //数码管驱动芯片74hc573 位选
//********************************************************************
delay_100us(time);
//delay(smg_time); //延迟 x_ms*1 毫秒
//********************************************************************

//消影
duanxuan = 0; //数码管驱动芯片74hc573 段选
weixuan = 0; //数码管驱动芯片74hc573 位选
P0=0x00; //数码管段选显示0 段码数据
weixuan = 1; //数码管驱动芯片74hc573 段选
weixuan = 0; //数码管驱动芯片74hc573 段选
//********************************************************************
}

}

举报

相关推荐

0 条评论