目录
一、熟悉相关模块:
1、独立按键:
(1)原理图:
(2)STC89C51参考代码:
2、动态数码管:
(1)原理图:
(2)STC89C51参考代码:
二、毫秒计时器STC89C51参考代码:
1、整体思路:
2、宏定义:
3、主函数:
3、独立按键:
4、数码管:
5.定时器:
一、熟悉相关模块:
1、独立按键:
(1)原理图:
1、解释动态数码管原理图:
(1)74HC245作用:信号功率放大(由于IO口输出功率太低)
(2)段选:由J6口选择要选择的a-e需要亮的部分
(3)位选:由J1口选择要亮的位,其中为了节省引脚,我们用74HC138译码器控制J1
(4)74HC138译码器:J9输入三位二进制数控制J10八位引脚,如输入010,则让Y2输出低电平
(5)从0-f对应对应的16进制数:
//不含小数点
u8 code transistor_negative[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
//包含小数点
u8 code transistor_negative_point[]=
{
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1
};
(2)STC89C51参考代码:
总体思路:从分析原理图可知,我们只要控制数码管的位选和段选引脚就可以实现我们想要显示的内容
//宏定义
#ifndef VARIABLE_DEFINE_H
#define VARIABLE_DEFINE_H
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
#endif
//主函数
#include "Public.h"
#include "transistor.h"
void main()
{
u8 dat[]={1,2,3,4,5,6,7,8};
while(1)
{
TST_ALL(dat);
}
}
//数码管头文件
#ifndef TRANSISTOR_H
#define TRANSISTOR_H
#include "Public.h"
#define vol_sign 0x3e
#define SGM_Port P1
sbit LSA=P0^0;
sbit LSB=P0^1;
sbit LSC=P0^2;
void TST_ALL(u8 dat[]);
void delay1us(u8 time_out);
#endif
//数码管c文件
#include "transistor.h"
u8 code transistor_positive[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
};
u8 code transistor_positive_point[]=
{
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e
};
u8 code transistor_negative[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
u8 code transistor_negative_point[]=
{
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1
};
void delay1us(u8 n);
void TST_ALL(u8 dat[])
{
u8 i;
for(i=0;i<8;i++)
{
switch(i+1)
{
case 1:LSC=0;LSB=0;LSA=0;break;
case 2:LSC=0;LSB=0;LSA=1;break;
case 3:LSC=0;LSB=1;LSA=0;break;
case 4:LSC=0;LSB=1;LSA=1;break;
case 5:LSC=1;LSB=0;LSA=0;break;
case 6:LSC=1;LSB=0;LSA=1;break;
case 7:LSC=1;LSB=1;LSA=0;break;
case 8:LSC=1;LSB=1;LSA=1;break;
}
SGM_Port = transistor_negative[dat[i]];
delay1us(30);
SGM_Port = 0x00;
}
}
void delay1us(u8 time_out)
{
u8 i;
while(time_out--)
for(i=85;i==0;i--);
}
2、动态数码管:
(1)原理图:
1、解释动态数码管原理图:
(1)74HC245作用:信号功率放大(由于IO口输出功率太低)
(2)段选:由J6口选择要选择的a-e需要亮的部分
(3)位选:由J1口选择要亮的位,其中为了节省引脚,我们用74HC138译码器控制J1
(4)74HC138译码器:J9输入三位二进制数控制J10八位引脚,如输入010,则让Y2输出低电平
(5)从0-f对应对应的16进制数:
//不含小数点
u8 code transistor_negative[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
//包含小数点
u8 code transistor_negative_point[]=
{
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1
};
(2)STC89C51参考代码:
总体思路:从分析原理图可知,我们只要控制数码管的位选和段选引脚就可以实现我们想要显示的内容
//宏定义
#ifndef VARIABLE_DEFINE_H
#define VARIABLE_DEFINE_H
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
#endif
//主函数
#include "Public.h"
#include "transistor.h"
void main()
{
u8 dat[]={1,2,3,4,5,6,7,8};
while(1)
{
TST_ALL(dat);
}
}
//数码管头文件
#ifndef TRANSISTOR_H
#define TRANSISTOR_H
#include "Public.h"
#define vol_sign 0x3e
#define SGM_Port P1
sbit LSA=P0^0;
sbit LSB=P0^1;
sbit LSC=P0^2;
void TST_ALL(u8 dat[]);
void delay1us(u8 time_out);
#endif
//数码管c文件
#include "transistor.h"
u8 code transistor_positive[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
};
u8 code transistor_positive_point[]=
{
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e
};
u8 code transistor_negative[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
u8 code transistor_negative_point[]=
{
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1
};
void delay1us(u8 n);
void TST_ALL(u8 dat[])
{
u8 i;
for(i=0;i<8;i++)
{
switch(i+1)
{
case 1:LSC=0;LSB=0;LSA=0;break;
case 2:LSC=0;LSB=0;LSA=1;break;
case 3:LSC=0;LSB=1;LSA=0;break;
case 4:LSC=0;LSB=1;LSA=1;break;
case 5:LSC=1;LSB=0;LSA=0;break;
case 6:LSC=1;LSB=0;LSA=1;break;
case 7:LSC=1;LSB=1;LSA=0;break;
case 8:LSC=1;LSB=1;LSA=1;break;
}
SGM_Port = transistor_negative[dat[i]];
delay1us(30);
SGM_Port = 0x00;
}
}
void delay1us(u8 time_out)
{
u8 i;
while(time_out--)
for(i=85;i==0;i--);
}
二、毫秒计时器STC89C51参考代码:
1、整体思路:
用定时器计时,按键控制计时开始和停止,动态数码管显示
2、宏定义:
#ifndef _PUBLIC_H
#define _PUBLIC_H
#include <reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
void delay_10us(u16 ten_us);
#endif
#include "Public.h"
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
3、主函数:
#include "Public.h"
#include ".\D_display\D_display.h"
#include ".\Tim\tim.h"
#include ".\Key\key.h"
u8 show_data[7];
extern u8 gmsec,gsec,gmin;
void DV_NUM(u8 gmin,u8 gsec,u8 gmsec);
void main()
{
u8 key=0;
u8 time_flag=0;
time0_init();
while(1)
{
key=key_scan();
if(key==1)
{
time_flag=!time_flag;
}
else if(key==2)
{
time0_stop();
time_flag=0;
gmin=0;
gsec=0;
gmsec=0;
}
if(time_flag)
time0_start();
else
time0_stop();
DV_NUM(gmin,gsec,gmsec);
smg_display(show_data);
}
}
void DV_NUM(u8 gmin,u8 gsec,u8 gmsec)
{
show_data[0]=gmin/10;
show_data[1]=gmin%10;
show_data[2]=gsec/10;
show_data[3]=gsec%10;
show_data[4]=gmsec/10;
show_data[5]=gmsec%10;
}
3、独立按键:
#ifndef _KEY_H
#define _KEY_H
#include "Public.h"
sbit KEY1=P2^7;
sbit KEY2=P2^6;
u8 key_scan();
#endif
#include ".\Key\key.h"
u8 key_scan()
{
if(!KEY1)
{
delay_10us(1000);
if(!KEY1)
{
while(!KEY1);//抬手检测
return 1;
}
}
if(!KEY2)
{
while(!KEY2);
return 2;
}
return 0;
}
4、数码管:
#ifndef _D_DISPLAY_H
#define _D_DISPLAY_H
#include "Public.h"
//定义段选的八个引脚
#define SMG_A_DP_PORT P1
//利用74HC245进行位选
sbit LSA=P0^0;
sbit LSB=P0^1;
sbit LSC=P0^2;
void smg_display(u8 dat[]);
#endif
#include ".\D_display\D_display.h"
//定义数码管段选对应16进制数
u8 code transistor_negative[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
u8 code transistor_negative_point[]=
{
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1
};
void smg_display(u8 dat[])
{
u8 i;
for(i=0;i<6;i++)
{
switch(7-i)
{
case 0:LSC=1;LSB=1;LSA=1;break;
case 1:LSC=1;LSB=1;LSA=0;break;
case 2:LSC=1;LSB=0;LSA=1;break;
case 3:LSC=1;LSB=0;LSA=0;break;
case 4:LSC=0;LSB=1;LSA=1;break;
case 5:LSC=0;LSB=1;LSA=0;break;
case 6:LSC=0;LSB=0;LSA=1;break;
case 7:LSC=0;LSB=0;LSA=0;break;
}
SMG_A_DP_PORT=transistor_negative[dat[i]];
delay_10us(100);
SMG_A_DP_PORT=0x00;
}
}
5.定时器:
#ifndef _KEY_H
#define _KEY_H
#include "Public.h"
void time0_init(void);
void time0_stop(void);
void time0_start(void);
#endif
#include ".\D_display\D_display.h"
//定义数码管段选对应16进制数
u8 code transistor_negative[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
u8 code transistor_negative_point[]=
{
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1
};
void smg_display(u8 dat[])
{
u8 i;
for(i=0;i<6;i++)
{
switch(7-i)
{
case 0:LSC=1;LSB=1;LSA=1;break;
case 1:LSC=1;LSB=1;LSA=0;break;
case 2:LSC=1;LSB=0;LSA=1;break;
case 3:LSC=1;LSB=0;LSA=0;break;
case 4:LSC=0;LSB=1;LSA=1;break;
case 5:LSC=0;LSB=1;LSA=0;break;
case 6:LSC=0;LSB=0;LSA=1;break;
case 7:LSC=0;LSB=0;LSA=0;break;
}
SMG_A_DP_PORT=transistor_negative[dat[i]];
delay_10us(100);
SMG_A_DP_PORT=0x00;
}
}