单片机学习笔记————51单片机实现数码管作为仪表盘显示跑马灯的方向,速度和运行状态

一、使用proteus绘制简单的电路图,用于后续仿真

 

二、编写程序

/********************************************************************************************************************
----	@Project:	LED-74HC595
----	@File:	main.c
----	@Edit:	ZHQ
----	@Version:	V1.0
----	@CreationTime:	20200702
----	@ModifiedTime:	20200703
----	@Description:	用S1键作为控制跑马灯的方向按键,S5键作为控制跑马灯
----	方向的加速度按键,S9键作为控制跑马灯方向的减速度按键,S13键作为控制跑马灯方
----	向的启动或者暂停按键。
----	实现功能:
----	跑马灯运行:第1个至第8个LED灯一直不亮。在第9个至第16个LED灯,依次逐个亮灯并
----	且每次只能亮一个灯。每按一次独立按键S13键,原来运行的跑马灯会暂停,原来暂停
----	的跑马灯会运行。用S1来改变方向。用S5和S9来改变速度,每按一次按键的递增或者
----	递减以10为单位。
----	数码管显示:本程序只有1个窗口,这个窗口分成3个局部显示。8,7,6位数码管显示
----	运行状态,启动时显示“on”,停止时显示“oFF”。5位数码管显示数码管方向,正向显
----	示“n”,反向显示“U”。4,3,2,1位数码管显示速度。数值越大速度越慢,最慢的速度是
----	550,最快的速度是50。
----	单片机:AT89C52
********************************************************************************************************************/
#include "reg52.h"
/*——————宏定义——————*/
#define FOSC 11059200L
#define T1MS (65536-FOSC/12/500)   /*0.5ms timer calculation method in 12Tmode*/

#define	const_voice_short	40	/*蜂鸣器短叫的持续时间*/

#define const_key_time1 9	/*按键去抖动延时的时间*/
#define const_key_time2 9	/*按键去抖动延时的时间*/
#define const_key_time3 9	/*按键去抖动延时的时间*/
#define const_key_time4 9	/*按键去抖动延时的时间*/

//#define const_1s  96	/*大概产生一秒钟的时间基准*/

/*——————变量函数定义及声明——————*/
/*定义数码管的74HC595*/
sbit Dig_Hc595_Sh = P2^0;
sbit Dig_Hc595_St = P2^1;
sbit Dig_Hc595_Ds = P2^2;

/*LED灯的74HC595程序*/
sbit Hc595_Sh = P2^3;
sbit Hc595_St = P2^4;
sbit Hc595_Ds = P2^5;

/*定义蜂鸣器*/
sbit Beep = P2^7;

/*作为中途暂停指示灯 亮的时候表示中途暂停*/
sbit LED = P3^5;

/*定义按键*/
sbit Key_S1 = P0^0;	/*第一行输入*/
sbit Key_S2 = P0^1;	/*第二行输入*/
sbit Key_S3 = P0^2;	/*第三行输入*/
sbit Key_S4 = P0^3;	/*第四行输入*/

sbit Key_Gnd = P0^4;

unsigned int uiKeyTimeCnt1 = 0;	/*按键去抖动延时计数器*/
unsigned char ucKeyLock1 = 0;	/*按键触发后自锁的变量标志*/
unsigned int uiKeyTimeCnt2 = 0;	/*按键去抖动延时计数器*/
unsigned char ucKeyLock2 = 0;	/*按键触发后自锁的变量标志*/
unsigned int uiKeyTimeCnt3 = 0;	/*按键去抖动延时计数器*/
unsigned char ucKeyLock3 = 0;	/*按键触发后自锁的变量标志*/
unsigned int uiKeyTimeCnt4 = 0;	/*按键去抖动延时计数器*/
unsigned char ucKeyLock4 = 0;	/*按键触发后自锁的变量标志*/

unsigned char ucKeySec = 0;	/*被触发的按键编号*/

unsigned char ucLED1 = 0;	/*代表16个灯的亮灭状态,0代表灭,1代表亮*/
unsigned char ucLED2 = 0;
unsigned char ucLED3 = 0;
unsigned char ucLED4 = 0;
unsigned char ucLED5 = 0;
unsigned char ucLED6 = 0;
unsigned char ucLED7 = 0;
unsigned char ucLED8 = 0;
unsigned char ucLED9 = 0;
unsigned char ucLED10 = 0;
unsigned char ucLED11 = 0;
unsigned char ucLED12 = 0;
unsigned char ucLED13 = 0;
unsigned char ucLED14 = 0;
unsigned char ucLED15 = 0;
unsigned char ucLED16 = 0;

unsigned char ucLed_update = 0;	/*刷新变量。每次更改LED灯的状态都要更新一次。*/
unsigned char ucLedStep_09_16 = 0;	/*第9个至第16个LED跑马灯的步骤变量*/
unsigned int uiTimeCnt_09_16 = 0;	/*第9个至第16个LED跑马灯的统计定时中断次数的延时计数器*/
unsigned char ucLedStatus16_09 = 0;	/*代表底层74HC595输出状态的中间变量*/
unsigned char ucLedStatus08_01 = 0;	/*代表底层74HC595输出状态的中间变量*/

unsigned char ucLedDirFlag = 0;	/*方向变量,把按键与跑马灯关联起来的核心变量,0代表正方向,1代表反方向*/
unsigned int uiSetTimeLevel_09_16 = 100;	/*速度变量,此数值越大速度越慢,此数值越小速度越快。*/
unsigned char ucLedStartFlag = 1;	/*启动和暂停的变量,0代表暂停,1代表启动*/

unsigned char ucDigShow8;   /*第8位数码管要显示的内容*/
unsigned char ucDigShow7;   /*第7位数码管要显示的内容*/
unsigned char ucDigShow6;   /*第6位数码管要显示的内容*/
unsigned char ucDigShow5;   /*第5位数码管要显示的内容*/
unsigned char ucDigShow4;   /*第4位数码管要显示的内容*/
unsigned char ucDigShow3;   /*第3位数码管要显示的内容*/
unsigned char ucDigShow2;   /*第2位数码管要显示的内容*/
unsigned char ucDigShow1;   /*第1位数码管要显示的内容*/

unsigned char ucDigDot1;
unsigned char ucDigDot2;
unsigned char ucDigDot3;
unsigned char ucDigDot4;
unsigned char ucDigDot5;
unsigned char ucDigDot6;
unsigned char ucDigDot7;
unsigned char ucDigDot8;

unsigned char ucDigShowTemp = 0;	/*临时中间变量*/
unsigned char ucDisplayDriveStep = 1; /*动态扫描数码管的步骤变量*/

unsigned char ucWd1Part1Update = 1;	/*窗口1的局部1更新显示变量*/
unsigned char ucWd1Part2Update = 1;	/*窗口1的局部2更新显示变量*/
unsigned char ucWd1Part3Update = 1;	/*窗口1的局部3更新显示变量*/

unsigned int uiVoiceCnt = 0;	/*蜂鸣器鸣叫的持续时间计数器*/

void Dig_Hc595_Drive(unsigned char, unsigned char);

/*根据原理图得出的共阴数码管字模表*/
code unsigned char Dig_Table[] =
{
0x3f,  /*0       序号0*/
0x06,  /*1       序号1*/
0x5b,  /*2       序号2*/
0x4f,  /*3       序号3*/
0x66,  /*4       序号4*/
0x6d,  /*5       序号5*/
0x7d,
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值