蓝桥杯CT107D开发板测试兼练习程序;
旨在将蓝桥杯国信长天CT107D开发板各功能模块集中在同一个项目中,便于练习这些基础模块。
功能描述和构建不太严谨,因为这不是重点,重点是能够正常写出并且使用这些模块。
另外,代码指使用IO模式,不涉及MM模式。
/*------------------------------------------------------------------------------
coding by EveRYouNg -- 2022/3/29
--------------------------------------------------------------------------------
测试及练习程序
含EEPROM模块,AD/DA转换,RTC时钟,温度传感器,超声波,频率测量,和基础的按键、中
断、数显于一体的测试程序
<-------------------------以下描述和真实现象有出入----------------------------->
->
按键4: EEPROM功能;标识符:EEP
在该功能界面下,按S16键选择写入数据功能,按S17选择读取功能,
按S18传入地址,按S19写入/读出数据;
在写入/读取时,S8-S15调制要写入的地址,按S18将地址传入EEPROM,随后若是写入模式,
数码管第5位显示0;S8-S15调制要写入的数据,按S19发送。若是读取模式,数码管第5位显
示1;
默认写入数据
->
按键5: AD/DA转换;标识符:ADC
按S16选择DA模式,按S17选择AD模式;
操作方式类似EEPROM,电压值实时显示在数码管末端。
默认DAC
->
按键6: RTC时钟;标识符:RTC
按S16动态显示:按一次S16界面显示为时间,5秒后显示标识符。按S17固定显示:固定显示
为时间界面,再按S16设置为动态显示。动态显示在数码管末尾显示D,固定显示显示S;
默认为动态显示
->
按键7: DS18B20温度传感器;标识符;TEP
显示1位小数
->
长按按键4: 超声波测距;标识符:UTR
数码管后四位显示距离数据
->
长按按键5: 频率测量;标识符:F
后5位显示频率
->
没有说明的情况下LED保持花式流水灯
******** -> * * -> ********
->
已知BUG:由矩阵键盘操作模式进入频率测量(频率测量模式只能使用独立键盘)后,键盘跳
帽的切换会导致频率测量不准确,只有正常测量时的2/3。
PS:开发板使用矩阵键盘时键盘和频率测量会相互影响,当然,这个不算BUG
------------------------------------------------------------------------------*/
/*-----------------------------头文件及宏定义---------------------------------*/
#include <stc15f2k60s2.h>
#include <intrins.h>
#include <iic.h>
#include <onewire.h>
#include <ds1302.h>
#define uchar unsigned char
#define uint unsigned int
#define SOMENOP {_nop_();_nop_();_nop_();_nop_();_nop_();\
_nop_();_nop_();_nop_();_nop_();_nop_();\
_nop_();_nop_();_nop_();_nop_();_nop_();}
sbit ULTR_TX = P1^0;
sbit ULTR_RX = P1^1;
/*--------------------------------变量声明------------------------------------*/
/*时间标志*/
uint G_Time_1ms = 0; //1ms时间计数
bit G_Time_10ms = 0; //时间标志
bit G_Time_20ms = 0;
bit G_Time_50ms = 0;
bit G_Time_100ms = 0;
bit G_Time_200ms = 0;
/*显示刷新*/
// 数码管段选码 0 1 2 3 4 5 6 7 8 9 消隐 -
code uchar DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF,\
0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xc1,0x91,0x7c,0x8F,0xCE,\
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,};
//12A 13B 14C 15D 16E 17F 18P 19U 20Y 21L 22R 23T
//0. 1. 2. -- 9. (+24)
// 设定数码管显示缓冲区
uchar DispBuf[8]={10,10,10,10,10,10,10,10};
uchar KeyValue = 0xFF; //按键值
uint Distance = 0x00; //表示超声波测距的距离值
bit Timer0Use = 0; //Tiemr0用途:0: 超声波测距,1: 频率测量
uint Frequency = 0; //频率测量测量的频率
uchar Mode = 0; //功能模式
//Mode: 0 1 2 3 4 5
//Func: EEP ADC RTC TEP UTR F
bit WaterLampBit = 0; //是否打开流水灯
uchar WaterLED = 0xFF; //流水灯效果的LED
//IIC-EEPROM-AD/DA界面
uint DataToTrans = 0xFF; //调制数据需要写入/读取的数据
uchar ROMAddress = 0x00; //数据地址
bit WriteOrRead = 0; //写入还是读取 0: 写入 1: 读取
bit DAOrAD = 0; //AD还是DA 0: DA 1: AD
bit ADCAddressError = 0; //DA/AD地址错误(地址大于3),1:错误
uchar Data_RX = 0xFF; //读取到的数据
//RTC
uchar TimeDisplayTime = 0; //时间界面显示时间
/*--------------------------------函数声明------------------------------------*/
void ExternDevice(uchar extdev); //控制ULN2003控制的外部设备
void LEDCtrl(uchar ledctrl); //控制LED灯
void Timer0Init(void); //计时器0初始化
void Timer1Init(void); //计时器1初始化
void DigitalTubeDisplay(void); //数码管显示刷新
void KeyScan(void); //键盘扫描函数调配
void BTN_Key(void); //独立按键扫描
void KBD_Key(void); //矩阵键盘扫描
void SendWire(void); //发送8KHz的方波
void UltraMeasure(void); //超声波测量
void FrequencyMeasure(void); //频率测量
void KeyResponse(void); //按键响应
void InterfaceUpdate(void); //界面刷新
void LEDIndicator(void); //LED指示灯
void WaterLamp(void); //花式流水灯效果
/*---------------------------------主函数-------------------------------------*/
void main(void)
{
/*初始化*/
ExternDevice(0x00);
LEDCtrl(0x00);
Timer1Init();
SetRTC();
rd_temperature();
/*主循环*/
while(1)
{
/*服务函数*/
if(G_Time_10ms)
{
G_Time_10ms = 0;
KeyScan();
KeyResponse();
if(G_Time_50ms)
{
G_Time_50ms = 0;
ReadRTC();
LEDIndicator();
if(G_Time_100ms)
{
G_Time_100ms = 0;
InterfaceUpdate();
}
if(G_Time_200ms)
{
G_Time_200ms = 0;
if(Mode==4)UltraMeasure();
rd_temperature();
}
}
}
}
}
/*--------------------------------函数定义------------------------------------*/
//Too long...
完整项目文件 =>Test_code.zip