赞
踩
使用大赛组委会提供的国信长天单片机竞赛实训平台,完成本试题的程序设计与调试。程序编写、调试完成后,选手需通过考试系统提交以准考证号命名的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°C)
使用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°C”或“Voltage:1.35V”
注意: 注意区分字母大小写。
3.6 LED指示灯功能
当前界面处于温度显示界面时,L1指示灯点亮,否则熄灭。
当前界面处于电压显示界面时,L2指示灯点亮,否则熄灭。
当前界面处于锁定状态时,L3指示灯以0.1s的时间间隔亮、灭,否则熄灭。
其余指示灯均处于熄灭状态。
3.7 继电器控制功能
继电器状态受温度控制,将采集的温度数据记为T,若当前采集的温度满足下列条件时,继电器吸合,否则,继电器断开。
温度≥28°C
3.8 蜂鸣器控制功能
蜂鸣器状态受电压控制,将采集的电压数据记为V,若当前采集的电压满足下列条件时,蜂鸣器发声,否则蜂鸣器静音。
V>3.6V
3.9 初始化
上电数码管默认处于温度显示界面。
界面切换处于解锁状态。
指示灯全部熄灭。
代码如下
- #include <STC15F2K60S2.H>
- #include "onewire.h"
- #include "iic.h"
- #include "intrins.h"
- #include "stdio.h"
- sbit h1 = P3^2;
- sbit h2 = P3^3;
- sbit s1 = P4^4;
- sbit s3 = P3^5;
- void DisplaySMG_Info();
- 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};
- unsigned char stat_LM = 0;
- unsigned char stat_U9 = 0x00;
- unsigned char num_01s = 0;
- unsigned char stat_led = 0xff;
- unsigned char stat_shan = 0;
- unsigned char stat_UI0 = 0;
- unsigned char stat_UI1 = 0;
- unsigned char stat_send = 0;
- unsigned char receive_data = 0;
- unsigned char adc_value = 0;
- float adc_volt = 0;
- unsigned int adc_smg = 0;
- float temp_value = 0;
- unsigned int temp_smg = 0;
- unsigned char UI = 0; // 0-温度界面 1-电压界面
- unsigned char send_data[100];
- void Delay20ms() //@11.0592MHz
- {
- unsigned char i, j, k;
-
- _nop_();
- _nop_();
- i = 1;
- j = 216;
- k = 35;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void Init_timer0()
- {
- TMOD = TMOD & 0xf0;
- TMOD = TMOD | 0x01;
- TH0 = (65535 - 10000) / 256;
- TL0 = (65535 - 10000) % 256;
- ET0 = 1;
- EA = 1;
- TR0 = 1;
- PT0 = 0;
- }
- void seveice_timer0() interrupt 1
- {
- TH0 = (65535 - 10000) / 256;
- TL0 = (65535 - 10000) % 256;
- if(stat_shan == 1)
- {
- num_01s++;
- if(num_01s == 10)
- {
- num_01s = 0;
- if(stat_LM == 0)
- {
- stat_LM = 1;
- }
- else
- {
- stat_LM = 0;
- }
-
- }
- }
- }
- void UartInit(void) //9600bps@12.000MHz
- {
- PCON &= 0x7F; //波特率不倍速
- SCON = 0x50; //8位数据,可变波特率
- AUXR |= 0x40; //定时器1时钟为Fosc,即1T
- AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
- TMOD &= 0x0F; //清除定时器1模式位
- TMOD |= 0x20; //设定定时器1为8位自动重装方式
- TL1 = 0xD9; //设定定时初值
- TH1 = 0xD9; //设定定时器重装值
- ET1 = 0; //禁止定时器1中断
- TR1 = 1; //启动定时器1
- EA = 1;
- ES = 1;
- PS = 1;
- }
- void Sevice_Uart() interrupt 4
- {
- if(RI == 1)
- {
- receive_data = SBUF;
- RI = 0;
- }
- if(receive_data == 'A')
- {
- if(stat_UI0 == 0)
- {
- UI = 0;
- }
- }
- if(receive_data == 'B')
- {
- if(stat_UI1 == 0)
- {
- UI = 1;
- }
- }
- }
- void sendByte_Uart(unsigned char senddata)
- {
- SBUF = senddata;
- while(TI == 0);
- TI = 0;
- }
- void sendstring_Uart(unsigned char *dat)
- {
- while(*dat != '\0')
- {
- sendByte_Uart(*dat++);
- }
- }
- 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 DisplaySMG_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 Init_DS18B20_temp()
- {
- unsigned char MSB,LSB;
- 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_DS18B20_temp()
- {
- unsigned char MSB,LSB;
- unsigned int temp;
- init_ds18b20();
- Write_DS18B20(0xcc);
- Write_DS18B20(0x44);
- DisplaySMG_Info();
- init_ds18b20();
- Write_DS18B20(0xcc);
- Write_DS18B20(0xbe);
- DisplaySMG_Info();
- 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;
- if(temp_value >= 23)
- {
- stat_U9 = stat_U9 | 0x10;
- SelectHC573(5,stat_U9);
- }
- else
- {
- stat_U9 = stat_U9 & 0xef;
- SelectHC573(5,stat_U9);
- }
- }
- }
- void read_adc_AIN3()
- {
- IIC_Start();
- IIC_SendByte(0x90);
- IIC_WaitAck();
- IIC_SendByte(0x03);
- IIC_WaitAck();
- IIC_Stop();
-
- IIC_Start();
- IIC_SendByte(0x91);
- IIC_WaitAck();
- adc_value = IIC_RecByte();
- IIC_SendAck(1);
- IIC_Stop();
- adc_volt = adc_value * (5.0 / 255);
- adc_smg = adc_volt * 100;
- if(adc_volt > 3.6)
- {
- stat_U9 = stat_U9 | 0x40;
- SelectHC573(5,stat_U9);
- }
- else
- {
- stat_U9 = stat_U9 & 0xbf;
- SelectHC573(5,stat_U9);
- }
- }
- void DisplaySMG_Info()
- {
- if(UI == 0)
- {
- DisplaySMG_Bit(0,0xc1);
- DisplaySMG_Bit(1,SMG_NoDot[1]);
- DisplaySMG_Bit(5,SMG_NoDot[temp_smg / 100]);
- DisplaySMG_Bit(6,SMG_Dot[temp_smg / 10 % 10]);
- DisplaySMG_Bit(7,SMG_NoDot[temp_smg % 10]);
- }
- else if(UI == 1)
- {
- DisplaySMG_Bit(0,0xc1);
- DisplaySMG_Bit(1,SMG_NoDot[2]);
- DisplaySMG_Bit(5,SMG_Dot[adc_smg / 100]);
- DisplaySMG_Bit(6,SMG_NoDot[adc_smg / 10 % 10]);
- DisplaySMG_Bit(7,SMG_NoDot[adc_smg % 10]);
- }
- }
- void scan_key()
- {
- s1 = 0;
- s3 = h1 = h2 = 1;
- if(h1 == 0) //S5
- {
- Delay20ms();
- if(h1 == 0)
- {
- stat_UI0 = 0;
- stat_UI1 = 0;
- while(h1 == 0)
- {
- DisplaySMG_Info();
- }
- }
- }
- else if(h2 == 0) // S4
- {
- Delay20ms();
- if(h2 == 0)
- {
- stat_UI0 = 1;
- stat_UI1 = 1;
- while(h2 == 0)
- {
- DisplaySMG_Info();
- }
- }
- }
- s3 = 0;
- s1 = h1 = h2 = 1;
- if(h2 == 0)
- {
- Delay20ms();
- if(h2 == 0)
- {
- if(UI == 0)
- {
- sprintf(send_data,"TEMP:%.1f'C\r\n",temp_value);
- sendstring_Uart(send_data);
- }
- else if(UI == 1)
- {
- sprintf(send_data,"Voltage:%.2fV\r\n",adc_volt);
- sendstring_Uart(send_data);
- }
- while(h2 == 0)
- {
- DisplaySMG_Info();
- }
- }
- }
- }
- void led_jdq_fmq_control()
- {
- if(UI == 0)
- {
- stat_led = 0xfe;
- SelectHC573(4,stat_led);
- }
- else if(UI == 1)
- {
- stat_led = 0xfd;
- SelectHC573(4,stat_led);
- }
- if(stat_UI0 == 1)
- {
- stat_shan = 1;
- if(stat_LM == 0)
- {
- stat_led = stat_led & 0xfb;
- SelectHC573(4,stat_led);
- }
- else
- {
- stat_led = stat_led | 0x04;
- SelectHC573(4,stat_led);
- }
- }
- }
- void main()
- {
- Init_timer0();
- UartInit();
- DisplaySMG_All(0xff);
- SelectHC573(4,0xff);
- SelectHC573(5,0x00);
- Init_DS18B20_temp();
- while(1)
- {
- led_jdq_fmq_control();
- read_adc_AIN3();
- read_DS18B20_temp();
- DisplaySMG_Info();
- scan_key();
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。