一、基本要求
使用大赛组委会提供的国信长天单片机竞赛实训平台,完成本试题的程序设计与调试。程序编写、调试完成后,选手需通过考试系统提交以准考证号命名的hex文件。不符合以上文件提交要求的作品将被评为零分或者被酌情扣分。
硬件设置:
将IAP15F2K61S2单片机内部振荡器频率设定为12MHz,串口通信波特率为9600bps。
键盘工作模式跳线J5配置为KBD矩阵按键模式。
扩展方式跳线J13配置为IO模式。
请注意:选手需严格按照以上要求配置竞赛板,编写和调试程序,不符合以上配置要求的作品将被评为零分或者被酌情扣分。
二、硬件框图
图1 系统硬件框图
三、功能描述
3.1 基本功能描述
1)通过串口控制数码管显示界面:“温度显示界面”或“电压显示界面”;也可以返回当前数码管显示的数据。
2)通过读取DS18B20温度传感器,获取环境温度。
3)通过 PCF8591 的 ADC 通道测量电位器 RB2 的输出电压。
4)通过数码管显示获取的温度数据和采集的电压数据,显示界面可以通过串口切换。
5)通过LED指示灯完成题目要求的指示功能。
6)根据题目要求完成继电器和蜂鸣器的控制功能。
3.2 性能要求
1)按键动作响应时间:≤0.2 秒
2)指示灯动作响应时间:≤0.1 秒
3.3 显示功能
温度显示界面
温度显示界面如图2所示,显示内容包括界面提示符(U1)和温度数据,单位为℃。
图2 温度显示界面(27.5℃)
使用3位数码管显示温度数据,温度数据保留小数点后1位有效数字。
电压显示界面
电压显示界面如图3所示,显示内容包括界面提示符(U2)和电压数据,单位为V。
图3 电压显示界面(1.35V)
使用3位数码管显示电压数据,电压数据保留小数点后2位有效数字。
3.4 按键功能
1)按键S4定义为“锁定”按键,按下S4按键,能够锁定当前界面“温度显示界面”或“电压显示界面”,串口切换界面指令失效。
2)按键S5定义为“解锁”按键,在界面锁定时,按下S5按键,可取消界面锁定,串口指令恢复控制。
3)按键S12定义为“发送”按键,每次按下,串口将当前数码管显示的数据发送给PC端的串口调试工具。
注意:
(1)按键S5仅在界面锁定时有效。
(2)判断按键是否按下时,需进行消抖操作,避免单次按键操作,触发多次结果。
3.5 串口功能
1)串口接收到指令字符‘A’,进入温度显示界面。
2)串口接收到指令字符‘B’,进入电压显示界面。
3)串口返回数据格式:
“TEMP:27.5℃”或“Voltage:1.35V”
注意: 注意区分字母大小写。
3.6 LED指示灯功能
当前界面处于温度显示界面时,L1指示灯点亮,否则熄灭。
当前界面处于电压显示界面时,L2指示灯点亮,否则熄灭。
当前界面处于锁定状态时,L3指示灯以0.1s的时间间隔亮、灭,否则熄灭。
其余指示灯均处于熄灭状态。
3.7 继电器控制功能
继电器状态受温度控制,将采集的温度数据记为T,若当前采集的温度满足下列条件时,继电器吸合,否则,继电器断开。
T≥28℃
3.8 蜂鸣器控制功能
蜂鸣器状态受电压控制,将采集的电压数据记为V,若当前采集的电压满足下列条件时,蜂鸣器发声,否则蜂鸣器静音。
V>3.6V
3.9 初始化
上电数码管默认处于温度显示界面。
界面切换处于解锁状态。
指示灯全部熄灭。
代码如下
#include "reg52.h"
#include "onewire.h"
#include "iic.h"
#include "intrins.h"
#include "stdio.h"
#define TSMG 800
sfr AUXR = 0x8e;
sfr P4 = 0xc0;
sfr T2H = 0xd6;
sfr T2L = 0xd7;
sfr IE2 = 0xaf;
sbit h2 = P3^3;
sbit h1 = P3^2;
sbit s1 = P4^4;
sbit s3 = P3^5;
void DiplaySMG_Info();
code unsigned char Seg_Table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82,0xf8,
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86,0x8e };
code unsigned char nodot[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
float temp_value = 0;
unsigned int temp_smg = 0;
float adc_volt = 0;
unsigned int adc_smg = 0;
unsigned char UI = 0;
unsigned char recive_dat = 0;
unsigned char stat_Uart = 0;
unsigned char mystr[50];
unsigned char stat_led = 0xff;
unsigned char count_01s = 0;
unsigned char stat_shan = 0;
unsigned char stat_jf = 0x00;
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 Init_timer2()//10ms
{
AUXR &= 0xfb;
T2L = 0xf0;
T2H = 0xd8;
AUXR |= 0x10;
EA = 1;
IE2 |= 0x04;
}
void Sevice_timer2() interrupt 12
{
DiplaySMG_Info();
if(stat_Uart == 1)
{
count_01s++;
if(count_01s == 10)
{
count_01s = 0;
if(stat_shan == 0)
{
stat_shan = 1;
}
else
{
stat_shan = 0;
}
}
}
}
void Init_mytemp()
{
unsigned char LSB,MSB;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
do{
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB = Read_DS18B20();
MSB = Read_DS18B20();
MSB = (MSB << 4) | (LSB >> 4);
}while(MSB == 85);
}
void read_mytemp()
{
unsigned char LSB,MSB;
unsigned int temp;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB = Read_DS18B20();
MSB = Read_DS18B20();
temp = MSB << 8;
temp = temp | LSB;
if((temp & 0xf800) == 0x0000)
{
temp_value = temp * 0.0625;
temp_smg = temp_value * 10;
}
}
void read_myvolt()
{
unsigned char adc_value = 0;
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);
adc_smg = adc_volt * 100;
}
void Init_myUart()
{
SCON = 0x50;
PCON &= 0x7f;
AUXR |= 0x40;
AUXR &= 0xfe;
TMOD &= 0x0f;
TMOD |= 0x20;
TL1 = 0xd9;
TH1 = 0xd9;
ET1 = 0;
TR1 = 1;
EA = 1;
ES = 1;
}
void Sevice_UART() interrupt 4
{
if(RI == 1)
{
recive_dat = SBUF;
RI = 0;
}
if(stat_Uart == 0)
{
if(recive_dat == 'A')
{
UI = 0;
}
else if(recive_dat == 'B')
{
UI = 1;
}
}
}
void Uart_sendbyt(unsigned char dat)
{
EA = 0;
SBUF = dat;
while(TI == 0);
TI = 0;
EA = 1;
}
void Uart_sendstring(unsigned char *str)
{
EA = 0;
while(*str != '\0')
{
Uart_sendbyt(*str++);
}
EA = 1;
}
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(TSMG);
SelectHC573(6,0x01 << pos);
SelectHC573(7,0xff);
}
void DisplaySMG_All(unsigned char value)
{
SelectHC573(6,0xff);
SelectHC573(7,value);
}
void DiplaySMG_Info()
{
if(UI == 0)
{
DispalySMG_Bit(0,0xc1);
DispalySMG_Bit(1,Seg_Table[1]);
DispalySMG_Bit(5,Seg_Table[temp_smg / 100]);
DispalySMG_Bit(6,nodot[temp_smg / 10 % 10]);
DispalySMG_Bit(7,Seg_Table[temp_smg % 10]);
}
else
{
DispalySMG_Bit(0,0xc1);
DispalySMG_Bit(1,Seg_Table[2]);
DispalySMG_Bit(5,nodot[adc_smg / 100]);
DispalySMG_Bit(6,Seg_Table[adc_smg / 10 % 10]);
DispalySMG_Bit(7,Seg_Table[adc_smg % 10]);
}
}
void scan_key()
{
s1 = 0;
s3 = h1 = h2 = 1;
if(h2 == 0)//s4
{
Delay20ms();
if(h2 == 0)
{
stat_Uart = 1;
while(h2 == 0)
{
DiplaySMG_Info();
}
}
}
else if(h1 == 0)//s5
{
Delay20ms();
if(h1 == 0)
{
stat_Uart = 0;
while(h1 == 0)
{
DiplaySMG_Info();
}
}
}
s3 = 0;
s1 = h1 = h2 = 1;
if(h2 == 0)//s12
{
Delay20ms();
if(h2 == 0)
{
if(UI == 0)
{
sprintf(mystr,"TEMP:%.1f'C",temp_value);
Uart_sendstring(mystr);
}
else if(UI == 1)
{
sprintf(mystr,"Voltage:%.2fV",adc_volt);
Uart_sendstring(mystr);
}
while(h2 == 0)
{
DiplaySMG_Info();
}
}
}
}
void led_jdq_fmq_control()
{
if(UI == 0)
{
stat_led |= 0x02;
stat_led &= 0xfe;
SelectHC573(4,stat_led);
}
else if(UI == 1)
{
stat_led |= 0x01;
stat_led &= 0xfd;
SelectHC573(4,stat_led);
}
if(stat_Uart == 1)
{
if(stat_shan == 0)
{
stat_led &= 0xfb;
SelectHC573(4,stat_led);
}
else
{
stat_led |= 0x04;
SelectHC573(4,stat_led);
}
}
else
{
stat_led |= 0x04;
SelectHC573(4,stat_led);
}
if(temp_value >= 28.0)
{
stat_jf |= 0x10;
SelectHC573(5,stat_jf);
}
else
{
stat_jf &= 0xef;
SelectHC573(5,stat_jf);
}
if(adc_volt > 3.6)
{
stat_jf |= 0x40;
SelectHC573(5,stat_jf);
}
else
{
stat_jf &= 0xbf;
SelectHC573(5,stat_jf);
}
}
void main()
{
Init_myUart();
Init_mytemp();
Init_timer2();
SelectHC573(4,0xff);
SelectHC573(5,0x00);
DisplaySMG_All(0xff);
while(1)
{
read_mytemp();
scan_key();
read_myvolt();
led_jdq_fmq_control();
}
}
题目来源——————4T官网