#include "reg52.H"
#include "stdio.h"
#include "intrins.h"
unsigned char led_dis_tim[3];
#define DIG_SEG P0//数码管段选
#define DIG_PLA P1//数码管段选
unsigned char code dig_tab[18] =//共阴数码管码表
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x00,0x39,0x5e,0x79,0x71,
0x40,0x00
};
//0、1、2、3、4、5、6、7、
//8、9、A、B、C、D、E、F、
//-
unsigned char dig_show_fir;//数码管第一位显示值
unsigned char dig_show_two;//数码管第二位显示值
unsigned char dig_show_thr;//数码管第三位显示值
unsigned char dig_show_fou;//数码管第四位显示值
unsigned char dig_show_tmp = 0;//显示临时变量
#define FLIOPE 150//数码管闪烁时间常量
#define FLICLO 300//数码管闪烁时间常量
unsigned char part;//数码管闪烁标志设置的时候
unsigned int sci_count = 0;//数码管闪烁时间
unsigned char now_window;//当前显示窗口
unsigned char now_win_sta;//当前显示状态
unsigned char win_sta_tmp;//显示状态临时变量
unsigned char set_sta_temp;//设置状态临时变量
unsigned char tim_flg;//倒计时标志1S一次
unsigned char tim_temp[5] = {0};//倒计时时间临时变量
unsigned char yel_cav;//黄灯闪烁警告标志
unsigned char alm_tim_cnt;//报警时间计数
unsigned char alm_flag;//报警标志
unsigned char dist_yel_alm;//东西南北黄灯闪烁区分变量
sbit EAS_RED = P2^0;//东西红
sbit EAS_GRE = P2^1;//东西绿
sbit EAS_YEL = P2^2;//东西黄
sbit NOR_RED = P2^3;//南北红
sbit NOR_GRE = P2^4;//南北绿
sbit NOR_YEL = P2^5;//南北黄
void init_all_hardware(void);//初始化硬件
void time_init(void);//定时器初始化
void delay_ms(unsigned int cnt);//延时函数
void dis_dri(void);//动态数码管扫描
void display_service(void);//数码显示处理
void timing_service(void);//倒计时函数
void yel_alm(void);//黄灯闪处理函数
void main(void)
{
init_all_hardware();//初始化硬件,IO和定时器
while(1)
{
display_service();//数码显示处理
timing_service();//倒计时函数
yel_alm();//黄灯闪处理函数
}
}
/******************************************************
** 函数名:init_all_hardware
** 描述 :初始化所有硬件,及其变量参数。
** 输入 :无
** 输出 :无
** 调用 :主程序
******************************************************/
void init_all_hardware(void)
{
delay_ms(100);
time_init();//定时器初始化
set_sta_temp = 0;
led_dis_tim[0] = 40;//东西绿
led_dis_tim[1] = 40;//南北绿
led_dis_tim[2] = 5;//黄灯闪烁时间
dig_show_fir = 15;//开机不显示
dig_show_two = 15;//开机不显示
dig_show_thr = 15;//开机不显示
dig_show_fou = 15;//开机不显示
tim_temp[0] = led_dis_tim[0];
tim_temp[1] = led_dis_tim[1];
tim_temp[2] = led_dis_tim[2];
tim_temp[3] = 5;
tim_temp[4] = 8;
now_window = 1;
now_win_sta = 1;
part = 0;
}
/*******************************************************************************
* 函 数 名 : delay_ms
* 函数功能 : 延时函数,延时1ms
* 输 入 : cnt
* 输 出 : 无
* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/
void delay_ms(unsigned int cnt) //
{
unsigned int x;
for( ; cnt>0; cnt--)
{
for(x=110; x>0; x--);//软件延时为1MS
}
}
/******************************************************
** 函数名:time_init
** 描述 :定时器初始化
** 输入 :无
** 输出 :无
******************************************************/
void time_init(void)
{
TMOD |= 0x01;//time0 工作方式为1
TH0 = 0xf8;//装载初值
TL0 = 0x2f;//装载初值,为2ms(65535-63535)
TR0 = 1;//开启定时器
ET0 = 1;//打开中断
EX0 = 1;
IT0 =1;
ES=1;
EA=1;
}
/*******************************************************************************
* 函 数 名 : dis_dri
* 函数功能 : 数码管扫描函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void dis_dri(void)
{
static unsigned char u8DisStep = 1;
DIG_SEG = 0x00;
switch(u8DisStep)
{
case 1: //显示第1位
{
dig_show_tmp=dig_tab[dig_show_fir];
DIG_SEG = dig_show_tmp;
DIG_PLA = 0xfe;
}
break;
case 2: //显示第2位
{
dig_show_tmp=dig_tab[dig_show_two];
DIG_SEG = dig_show_tmp;
DIG_PLA = 0xfd;
}
break;
case 3: //显示第3位
{
dig_show_tmp=dig_tab[dig_show_thr];
DIG_SEG = dig_show_tmp;
DIG_PLA = 0xfb;
}
break;
case 4: //显示第4位
{
dig_show_tmp=dig_tab[dig_show_fou];
DIG_SEG = dig_show_tmp;
DIG_PLA = 0xf7;
}
break;
}
u8DisStep++;
if(u8DisStep>4) //扫描完4个数码管后,重新从第一个开始扫描
{
u8DisStep=1;
}
}
/*******************************************************************************
* 函 数 名 : display_service()
* 函数功能 : 显示服务函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void display_service(void)
{
unsigned char data_temp[9] = {0,0,0,0,0,0,0,0,0}; //定义数组
switch(now_window)
{
case 1:
{
if (now_win_sta == 1)//东西绿
{
win_sta_tmp = 1;
now_win_sta = 0;
dig_show_fir = tim_temp[0] / 10;
dig_show_two = tim_temp[0] % 10;
dig_show_thr = (tim_temp[0]+tim_temp[2]) / 10;
dig_show_fou = (tim_temp[0]+tim_temp[2]) % 10;
NOR_RED = 0;
NOR_GRE = 1;
NOR_YEL = 1;
EAS_RED = 1;
EAS_GRE = 0;
EAS_YEL = 1;
}
else if (now_win_sta == 2)//黄灯闪
{
win_sta_tmp = 2;
now_win_sta = 0;
dig_show_fir = tim_temp[2] / 10;
dig_show_two = tim_temp[2] % 10;
dig_show_thr = tim_temp[2] / 10;
dig_show_fou = tim_temp[2] % 10;
NOR_RED = 0;
NOR_GRE = 1;
EAS_RED = 1;
EAS_GRE = 1;
}
else if (now_win_sta == 3)//南北绿
{
win_sta_tmp = 3;
now_win_sta = 0;
dig_show_fir = (tim_temp[1]+tim_temp[2]) / 10;
dig_show_two = (tim_temp[1]+tim_temp[2]) % 10;
dig_show_thr = tim_temp[1] / 10;
dig_show_fou = tim_temp[1] % 10;
NOR_RED = 1;
NOR_GRE = 0;
NOR_YEL = 1;
EAS_RED = 0;
EAS_GRE = 1;
EAS_YEL = 1;
}
else if (now_win_sta == 4)//黄灯闪
{
win_sta_tmp = 4;
now_win_sta = 0;
dig_show_fir = tim_temp[2] / 10;
dig_show_two = tim_temp[2] % 10;
dig_show_thr = tim_temp[2] / 10;
dig_show_fou = tim_temp[2] % 10;
NOR_RED = 1;
NOR_GRE = 1;
EAS_RED = 0;
EAS_GRE = 1;
}
}
break;
case 2:
{
if (now_win_sta == 1)//东西绿
{
now_win_sta = 0;
dig_show_fir = tim_temp[4] / 10;
dig_show_two = tim_temp[4] % 10;
dig_show_thr = (tim_temp[4]) / 10;
dig_show_fou = (tim_temp[4]) % 10;
NOR_RED = 0;
NOR_GRE = 1;
NOR_YEL = 1;
EAS_RED = 0;
EAS_GRE = 1;
EAS_YEL = 1;
}
}
break;
}
}
void timing_service(void)
{
if (tim_flg == 1)
{
tim_flg = 0;
if (n
周楷雯
- 粉丝: 97
- 资源: 1万+
最新资源
- NSDocumentError如何解决.md
- ModuleNotFoundError解决办法.md
- InterruptedIOException(解决方案).md
- NSFileManagerOperationError如何解决.md
- LazyLoadError解决办法.md
- ConnectionAbortedError.md
- ConnectionRefusedError.md
- HarmonyException如何解决.md
- ClosedChannelException(解决方案).md
- PerformanceWarning解决办法.md
- ConnectionResetError.md
- RuntimeException如何解决.md
- 二手车价格预测,代码核心任务是通过机器学习模型(如线性回归、随机森林和KNN回归)预测车辆的价格(current price),并使用评估指标(如 R² 和 MSE)来衡量不同模型的预测效果
- 在线式缠绕膜机自动覆膜缠绕机sw16全套技术资料100%好用.zip
- 基于Arduino单片机的自动售票系统设计与实现
- 一次性纸杯塑料杯叠杯套膜包装机sw16可编辑全套技术资料100%好用.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈