⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 ARM7(LPC2131) + FreeRTOS, 基于 Codesourcery gcc, 共10个任务, 仅占 2k RAM
💻 C
字号:
/*
*==================================================================================================
* 描述:        HexOk + FreeRTOS, 10 个任务, 基本功能测试
* Version:     v2008.02
* MCU & IC:    LPC2131 ( + )
* Frequency:   Fosc=20.000M,  Fcclk=3*Fosc,  Fpclk=0.75*Fosc
* Compiler:    CodeSourcery gcc
* 版权信息:    W&T Co, Ltd(2005-2008), flyyyying@126.com, 2008-02-17
*==================================================================================================
*/

#include <stdio.h>
#include "..\bsp\bsp.h"
#include "..\bsp\i2c.h"
#include "..\bsp\lpc213_4x.h"
#include "..\rtos\source\task.h"

unsigned int   msg_uart0_rcv_data=0;       //串口0接收中断之消息
unsigned int   msg_read_I2C=0;             //读取I2C参数之消息
unsigned short flag_BELL=0;                //是否响铃之信号量
unsigned short xxx=1973;                   //4个8段管显示的数据
unsigned short grade=1;                    //铃响、DS3灯闪的速度级别, 由可调电阻调节
unsigned short ds2_ivl=10;
unsigned char  ee_buf[8]={'L','P','C',};

void Task1_XXXX(void *pdata);
void Task2_LED2(void *pdata);
void Task3_LED3(void *pdata);
void Task4_KEYS(void *pdata);
void Task5_8SEG(void *pdata);
void Task6_BELL(void *pdata);
void Task7_TRN0(void *pdata);
void Task8_REC0(void *pdata);
void Task9_ADC0(void *pdata);
void TaskA_I2C0(void *pdata);

/*
*--------------------------------------------------------------------------------------------------
*--------------------------------------------------------------------------------------------------
*/
int main (void)
{
	BSP_Init();
	xTaskCreate(Task1_XXXX, (signed char *)"1", 32, NULL, 2, NULL);
	xTaskCreate(Task2_LED2, (signed char *)"2", 32, NULL, 3, NULL);
	xTaskCreate(Task3_LED3, (signed char *)"3", 32, NULL, 3, NULL);
	xTaskCreate(Task4_KEYS, (signed char *)"4", 32, NULL, 4, NULL);
	xTaskCreate(Task5_8SEG, (signed char *)"5", 32, NULL, 8, NULL);
	xTaskCreate(Task6_BELL, (signed char *)"6", 32, NULL, 5, NULL);
	xTaskCreate(Task7_TRN0, (signed char *)"7", 32, NULL, 6, NULL);
	xTaskCreate(Task8_REC0, (signed char *)"8", 32, NULL, 7, NULL);
	xTaskCreate(Task9_ADC0, (signed char *)"9", 32, NULL, 2, NULL);
	xTaskCreate(TaskA_I2C0, (signed char *)"A", 32, NULL, 1, NULL);
	vTaskStartScheduler();
	return (0);
}

/*
*--------------------------------------------------------------------------------------------------
* 每 5 秒令4位8段管上的数字加 1
*--------------------------------------------------------------------------------------------------
*/
void Task1_XXXX(void *pdata)
{
	(void)pdata;
	while (1) {
		xxx ++;
		vTaskDelay(_5s);
	}
}

/*
*--------------------------------------------------------------------------------------------------
* 每秒闪1次DS2
*--------------------------------------------------------------------------------------------------
*/
void Task2_LED2(void *pdata)
{
	(void)pdata;
	while (1) {
		TurnOnnDS2();
		vTaskDelay(_50ms*ds2_ivl);
		TurnOffDS2();
		vTaskDelay(_50ms*ds2_ivl);
	}
}

/*
*--------------------------------------------------------------------------------------------------
* 依一定间隔闪DS3, 间隔与 ADC 采样的电压值等级平方成正比
*--------------------------------------------------------------------------------------------------
*/
void Task3_LED3(void *pdata)
{
	unsigned short tmp;
	(void)pdata;
	while (1) {
		tmp = grade*grade;
		TurnOffDS3();
		vTaskDelay(_2ms*tmp);
		TurnOnnDS3();
		vTaskDelay(_2ms*tmp);
	}
}

/*
*--------------------------------------------------------------------------------------------------
* 处理按键, 'F' 键开/关响铃, 0-9 键输入数字, A,E 保存设置值到EEROM
*--------------------------------------------------------------------------------------------------
*/
void Task4_KEYS(void *pdata)
{
	unsigned long key;
	(void)pdata;
	while (1) {
		key = key_scan();
		if (key<10) {                         //0-9, 输入数字
			xxx %=1000; xxx*=10;
			xxx += (unsigned short)(key);
		} 
		if (key==10) {                        //A, ds2闪烁间隔50ms
			ee_buf[0] = 1;
			I2C_WriteNByte(AT24C16, _1BYTE_SUBA, 0x05, ee_buf, 1);
		}
		/*if (key==11) {                        //B, ds2闪烁间隔250ms
			ee_buf[0] = 5;
			I2C_WriteNByte(AT24C16, _1BYTE_SUBA, 0x05, ee_buf, 1);
		}*/
		if (key==14) {                        //E, ds2闪烁间隔500ms
			ee_buf[0] = 10;
			I2C_WriteNByte(AT24C16, _1BYTE_SUBA, 0x05, ee_buf, 1);
		}
		if (key==15) {                        //F, 开/关铃响 
			flag_BELL = (flag_BELL)?0 :1;
		}
		vTaskDelay(_50ms);
	}
}

/*
*--------------------------------------------------------------------------------------------------
* 动态刷新4个8段数码管的显示
*--------------------------------------------------------------------------------------------------
*/
void Task5_8SEG(void *pdata)
{
	(void)pdata;
	while (1) {
		DispNumber(xxx);
		vTaskDelay(_2ms);
	}
}

/*
*--------------------------------------------------------------------------------------------------
* 依一定间隔响铃, 间隔与 ADC 采样的电压值等级平方成正比
*--------------------------------------------------------------------------------------------------
*/
void Task6_BELL(void *pdata)
{
	unsigned short tmp;
	(void)pdata;
	while (1) {
		if (flag_BELL) {
			tmp = grade*grade;
			TurnOnnBELL();
			vTaskDelay(_2ms*tmp);
			TurnOffBELL();
			vTaskDelay(_2ms*tmp);
		} else
		vTaskDelay(_10ms);
	}
}

/*
*--------------------------------------------------------------------------------------------------
* 串口 0 每秒发送 xxx 值串
*--------------------------------------------------------------------------------------------------
*/
void Task7_TRN0(void *pdata)
{
	unsigned char str[11]={0x35,0x36,0x37,0x0D,0x0A,0x00,};
	unsigned short tmp;
	(void)pdata;
	str[4] = str[5] = ' ';
	str[6] = str[7] = '.';
	str[8] = str[9] = '.';
	str[10] = 0;
	while (1) {
		tmp  = xxx;  str[0] = tmp/1000 + 0x30;
		tmp %= 1000; str[1] = tmp/100  + 0x30;
		tmp %= 100;  str[2] = tmp/10   + 0x30;
		tmp %= 10;   str[3] = tmp      + 0x30;
		UART0_putstr(str);
		vTaskDelay(_1000ms);
	}
}

/*
*--------------------------------------------------------------------------------------------------
* 串口 0 有数据接收到时, 后台须及时处理
*--------------------------------------------------------------------------------------------------
*/
void Task8_REC0(void *pdata)
{
	unsigned char len, type, fifo3;
	(void)pdata;
	while (1) {
		if (msg_uart0_rcv_data) {
			msg_uart0_rcv_data = 0;
			fifo3 = 0x00;
			if (UART0RBUF[0]==0x0F) {
				len = UART0RBUF[1];
				type = UART0RBUF[2];
				fifo3 = UART0RBUF[3];
				//.....
			}
			if (fifo3==0x01) {flag_BELL=0; xxx=0;}
			if (fifo3==0x02) {flag_BELL=1; xxx=2005;}
			if (fifo3==0x03) {msg_read_I2C=1;}
		}
		vTaskDelay(_2ms);
	}
}

/*
*--------------------------------------------------------------------------------------------------
* 每 50ms 读取一次 ADC
*--------------------------------------------------------------------------------------------------
*/
void Task9_ADC0(void *pdata)
{
	unsigned long tmp;
	(void)pdata;
	while (1) {
		ADC0_read(&tmp);
		grade = tmp/10 + 1;
		vTaskDelay(_50ms);
	}
}

/*
*--------------------------------------------------------------------------------------------------
* 若需读取 EEROM 中的设置值, 则读之
*--------------------------------------------------------------------------------------------------
*/
void TaskA_I2C0(void *pdata)
{
	(void)pdata;
	while (1) {
		if (msg_read_I2C) {
			msg_read_I2C = 0;
			I2C_ReadNByte(AT24C16, _1BYTE_SUBA, 0x05, ee_buf, 1);
			ds2_ivl = ee_buf[0];
		}
		vTaskDelay(_100ms);
	}
}

/*=============================================<EOF>=============================================*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -