第九届蓝桥杯单片机彩灯控制器

 “彩灯控制器”的程序设计与调试

一、基本要求

1.1 使用 CT107D 单片机竞赛板,完成“彩灯控制器”功能的程序设计与调 试;

1.2 设计与调试过程中,可参考组委会提供的“资源数据包”;

1.3 Keil 工程文件以准考证号命名,完成设计后,提交完整、可编译的 Keil 工程文件到服务器。 二、硬件框图 三、功能描述

3.1 基本功能描述

1) 通过电位器 RB2 模拟称重传感器输出信号,单片机采集此电压信号, 并计算货物重量。电子秤称重范围 0-10kg。

2) 通过按键选择不同货物对应的单价、并可完成单价设置调整、重量 清零等功能。

3) 通过数码管显示所称货物重量和货物价格。

3.2 设计说明

1)关闭蜂鸣器、继电器等与本试题程序设计无关的外设资源; 单片机 LED 指示灯 3x4 按键 模拟输入 数码管显示 E2PROM 存储器

2)设备上电后默认数码管、LED 指示灯均为熄灭状态;

3)流转间隔可调整范围为 400ms-1200ms;

4)设备固定按照模式 1、模式 2、模式 3、模式 4 的次序循环往复运行。

3.3 LED 指示灯工作模式

1)模式 1:按照 L1、L2…L8 的顺序,从左到右单循环点亮。

2)模式 2:按照 L8、L7…L1 的顺序,从右到左单循环点亮。

3)模式 3: 模式 3 彩灯运行状态说明

4)模式 4: 模式 4 彩灯运行状态说明

3.4 亮度等级控制 检测电位器RB2的输出电压,控制8个LED指示灯的亮度,要求在0V-5V 的可调区间内,实现 4 个均匀分布的 LED 指示灯亮度等级

3.5 按键功能

1)按键 S7 定义为“启动/停止”按键,按下后启动或停止 LED 的流转。

2)按键 S6 定义为“设置”按键,按键按下后数码管进入“流转间隔” 设置界面,如下图所示: - 1 - 8 8 4 0 0 运行模式编号 熄灭 流转间隔:400ms 通过按键 S6 可切换选择“运行模式”和“流转间隔”两个显示单元, 当前被选择的显示单元以 0.8 秒为间隔亮灭。

3)按键 S5 定义为“加”按键,在设置界面下,按下该键,若当前选择 的是运行模式,则运行模式编号加 1,若当前选择的是流转间隔,则 流转间隔增加 100ms。

4)按键 S4 定义为“减”按键,在设置界面下,按下该键,若当前选择 的是运行模式,则运行模式编号减 1,若当前选择的是流转间隔,则 流转间隔减少 100ms。

5)按键功能说明:

a)按键 S4、S5 的“加”、“减”功能只在“设置状态”下有效,数 值的调整应注意边界属性。

b)在非“设置状态”下,按下 S4 按键可显示指示灯当前的亮度等 级,4 个亮度等级从暗到亮,依次用数字 1、2、3、4 表示;松开 S4 按键,数码管显示关闭,亮度等级的显示格式如下图所示:

8 8 8 8 8 8 - 2 熄灭 亮度等

代码参考如下,功能都已经实现

#include "reg52.h"
#include "intrins.h"
#include "iic.h"
sfr T2H = 0xd6;
sfr T2L = 0xd7;
sfr AUXR = 0x8e;
sfr IE2 = 0xaf;
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;
unsigned char run_timer_1 = 0;
unsigned char stat_shan,stat_pwm= 0;
unsigned int numxms,num800ms = 0;
unsigned char led_mode = 0;
unsigned char i,n = 0;
unsigned char leval_led = 0;
unsigned char UI = 0; //1-设置界面 2-亮度等级界面
unsigned char mode_num = 1;
unsigned int run_timer[4] = {400,400,400,400};
unsigned char readaddress[4] = {0x01,0x02,0x03,0x04};
unsigned char stat_run = 0;//0-停止 1-启动
unsigned char set_mode = 0;//0-熄灭 1-模式偏号 2-流转间隔
unsigned char adc_value = 0;
float adc_volt = 0;
unsigned char num_pwm = 0;
unsigned char pwm_h = 0;
unsigned char mode1_led[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char mode2_led[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
unsigned char mode3_led[4] = {0x7e,0xbd,0xdb,0xe7};
unsigned char mode4_led[4] = {0xe7,0xdb,0xbd,0x7e};
unsigned char code SMG_NoDot[18]={0xc0,0xf9,
    0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
    0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};

unsigned char code SMG_Dot[10]={0x40,0x79,
    0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
void led_control();
void DisplaySMG_Info();
void scan_key();
void read_volt();
void SelectHC573(unsigned char channel,unsigned char dat);
void Init_timer0()
{
	TMOD = 0x01;
	TH0 = (65535 - 100) / 256;
	TL0 = (65535 - 100) % 256;
	EA = 1;
	ET0 = 1;
	TR0 = 1;
}
void Sevice_timer0() interrupt 1
{
	TH0 = (65535 - 100) / 256;
	TL0 = (65535 - 100) % 256;
	if(stat_run == 1)
	{
	num_pwm++;
	if(num_pwm <= pwm_h)
	{
		led_control();
	}
	else if(num_pwm <= 100)
	{
		SelectHC573(4,0xff);
	}
	if(num_pwm == 100)
	{
		num_pwm = 0;
	}
}
}
void Init_Timer2()
{
	T2H = (65535 - 10000) / 256;
	T2L = (65535 - 10000) % 256;
	AUXR = AUXR | 0x10;
	IE2 = IE2 | 0x04;
	EA = 1;
}
void Sevice_timer2() interrupt 12
{
	read_volt();
	DisplaySMG_Info();
	if(set_mode != 0)
	{
		num800ms++;
		if(num800ms == 80)
		{
			if(stat_shan == 0)
			{
				stat_shan = 1;
			}
			else
			{
				stat_shan = 0;
			}
			num800ms = 0;
		}
	}
	if(stat_run == 1)
	{
		numxms++;
	}
	if(led_mode == 0)
	{
		if(numxms == (run_timer[led_mode] / 10))
		{
			stat_pwm = 1;
			numxms = 0;
		}
	}
	else if(led_mode == 1)
	{
		if(numxms == (run_timer[led_mode] / 10))
		{
			stat_pwm = 1;
			numxms = 0;
		}
	}
	else if(led_mode == 2)
	{
		if(numxms == (run_timer[led_mode] / 10))
		{
			stat_pwm = 1;
			numxms = 0;
		}
	}
	else if(led_mode == 3)
	{
		if(numxms == (run_timer[led_mode] / 10))
		{
			stat_pwm = 1;
			numxms = 0;
		}
	}
}
void Delay20ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 1;
	j = 234;
	k = 113;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void SelectHC573(unsigned char channel,unsigned char dat)
{
	P2 = (P2 & 0x1f) | 0x00;
	P0 = dat;
	switch(channel)
	{
		case 4:
			P2 = (P2 & 0x1f) | 0x80;
		break;
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;
		break;
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;
		break;
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;
		break;
		case 0:
			P2 = (P2 & 0x1f) | 0x00;
		break;
	}
	P2 = (P2 & 0x1f) | 0x00;
}
void DelaySMG(unsigned int t)
{
	while(t--);
}
void DispalySMG_Bit(unsigned char pos,unsigned char value)
{
	SelectHC573(6,0x01 << pos);
	SelectHC573(7,value);
	DelaySMG(500);
	SelectHC573(6,0x01 << pos);
	SelectHC573(7,0xff);
}
void DisplaySMG_ALL(unsigned char value)
{
	SelectHC573(6,0xff);
	SelectHC573(7,value);
}
void DisplaySMG_Info()
{
	switch(UI)
	{
		case 1:
			if(set_mode == 1)
			{
				DispalySMG_Bit(0,SMG_NoDot[16]);
				if(stat_shan == 0)
				{
					DispalySMG_Bit(1,SMG_NoDot[mode_num]);
				}
				DispalySMG_Bit(2,SMG_NoDot[16]);
			
		    if(run_timer[mode_num - 1] > 999)
			{
				DispalySMG_Bit(4,SMG_NoDot[run_timer[mode_num - 1] / 1000]);
			}
			DispalySMG_Bit(5,SMG_NoDot[run_timer[mode_num - 1] / 100 % 10]);
			DispalySMG_Bit(6,SMG_NoDot[run_timer[mode_num - 1] / 10 % 10]);
			DispalySMG_Bit(7,SMG_NoDot[run_timer[mode_num - 1] % 10]);		
			}
			else if(set_mode == 2)
			{
				DispalySMG_Bit(0,SMG_NoDot[16]);
				DispalySMG_Bit(1,SMG_NoDot[mode_num]);
				DispalySMG_Bit(2,SMG_NoDot[16]);
				if(stat_shan == 0)
				{
					if(run_timer[mode_num - 1] > 999)
					{
						DispalySMG_Bit(4,SMG_NoDot[run_timer[mode_num - 1] / 1000]);
					}
					DispalySMG_Bit(5,SMG_NoDot[run_timer[mode_num - 1] / 100 % 10]);
					DispalySMG_Bit(6,SMG_NoDot[run_timer[mode_num - 1] / 10 % 10]);
					DispalySMG_Bit(7,SMG_NoDot[run_timer[mode_num - 1] % 10]);
				}				
			}
		break;
		case 2:
			DispalySMG_Bit(6,SMG_NoDot[16]);
			DispalySMG_Bit(7,SMG_NoDot[leval_led]);
		break;
	}
	
	
}
void read_volt()
{
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x03);
	I2CWaitAck();
	I2CStop();
	
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	adc_value = I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	adc_volt = adc_value * (5.0 / 255);
	if(adc_volt <= 1.25)
	{
		leval_led = 1;
		pwm_h = 25;
	}
	else if(adc_volt <= 2.5)
	{
		leval_led = 2;
		pwm_h = 50;
	}
	else if(adc_volt <= 3.75)
	{
		leval_led = 3;
		pwm_h = 75;
	}
	else if(adc_volt <= 5)
	{
		leval_led = 4;
		pwm_h = 100;
	}
}
void write_EEPROM(unsigned char address,unsigned char dat)
{
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(address);
	I2CWaitAck();
	I2CSendByte(dat);
	I2CWaitAck();
	I2CStop();
}
unsigned char read_EEPROM(unsigned char address)
{
	unsigned char value;
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(address);
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0xa1);
	I2CWaitAck();
	value = I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	return value;
}
void scan_key()
{
	if(S7 == 0)
	{
		Delay20ms();
		if(S7 == 0)
		{
			if(stat_run == 0)
			{
				stat_run = 1;
				i = 0;
				led_mode = 0;
			}
			else
			{
				stat_run = 0;
				SelectHC573(4,0xff);
			}
			while(S7 == 0);
		}
	}
	if(S6 == 0)
	{
		Delay20ms();
		if(S6 == 0)
		{
			if(set_mode == 0)
			{
				set_mode = 1;
				UI = 1;
			}
			else if(set_mode == 1)
			{
				set_mode = 2;
				UI = 1;
			}
			else
			{
				set_mode = 0;
				run_timer_1 = (run_timer[mode_num - 1] / 10);
				if(mode_num == 1)
				{
					write_EEPROM(0x01,run_timer_1);
				}
				else if(mode_num == 2)
				{
					write_EEPROM(0x02,run_timer_1);
				}
				else if(mode_num == 3)
				{
					write_EEPROM(0x03,run_timer_1);
				}
				else if(mode_num == 4)
				{
					write_EEPROM(0x04,run_timer_1);
				}
				UI = 0;
			}
			while(S6 == 0);
		}
	}
	if(S5 == 0)
	{
		Delay20ms();
		if(S5 == 0)
		{
			if(set_mode == 1)
			{
				if(mode_num == 4)
				{
					mode_num = 1;
				}
				else
				{
					mode_num = mode_num + 1;
				}
			}
			else if(set_mode == 2)
			{
				if(set_mode == 2)
				{
					if(run_timer[mode_num - 1] == 1200)
					{
						run_timer[mode_num - 1] = 400;
					}
					else
					{
						run_timer[mode_num - 1] = run_timer[mode_num - 1] + 100;
					}
				}
			}
			while(S5 == 0);
		}
	}
	if(S4 == 0)
	{
		Delay20ms();
		if(S4 == 0)
		{
			if(set_mode == 1)
			{
				if(mode_num == 1)
				{
					mode_num = 4;
				}
				else
				{
					mode_num = mode_num - 1;
				}
			}
			else if(set_mode == 2)
			{
				if(set_mode == 2)
				{
					if(run_timer[mode_num - 1] == 400)
					{
						run_timer[mode_num - 1] = 1200;
					}
					else
					{
						run_timer[mode_num - 1] = run_timer[mode_num - 1] - 100;
					}
				}
			}
			if(set_mode == 0)
			{
				UI = 2;
			}
			while(S4 == 0);
			if(set_mode == 0)
			{
				UI = 0;
			}
		}
	}
}
void led_control()
{
	if(stat_run == 1)
	{
	switch(led_mode)
	{
		case 0:
			SelectHC573(4,mode1_led[i]);
		    if(stat_pwm == 1)
			{
				i++;
				stat_pwm = 0;
			}
			if(i == 8)
			{
				led_mode = led_mode + 1;
				i = 0;
			}
		break;
		case 1:
			SelectHC573(4,mode2_led[i]);
			 if(stat_pwm == 1)
			{
				i++;
				stat_pwm = 0;
			}
			if(i == 8)
			{
				led_mode = led_mode + 1;
				i = 0;
			}
		break;
		case 2:
			SelectHC573(4,mode3_led[i]);
			 if(stat_pwm == 1)
			{
				i++;
				stat_pwm = 0;
			}
			if(i == 4)
			{
				led_mode = led_mode + 1;
				i = 0;
			}
		break;
		case 3:
			SelectHC573(4,mode4_led[i]);
			 if(stat_pwm == 1)
			{
				i++;
				stat_pwm = 0;
			}
			if(i == 4)
			{
				led_mode = 0;
				i = 0;
			}
		break;
	}
}
}
void Init_System()
{
	DisplaySMG_ALL(0xff);
	SelectHC573(5,0x00);
	SelectHC573(4,0xff);
	run_timer[0] = (int)(read_EEPROM(readaddress[0]) * 10);
	run_timer[1] = (int)(read_EEPROM(readaddress[1]) * 10);
	run_timer[2] = (int)(read_EEPROM(readaddress[2]) * 10);
	run_timer[3] = (int)(read_EEPROM(readaddress[3]) * 10);
	Init_timer0();
	Init_Timer2();
}
void main()
{
	Init_System();
	while(1)
	{
		scan_key();
	}
}

  • 15
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值