蓝桥杯CT107D开发板测试兼练习程序

蓝桥杯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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

川九-EveRYouNg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值