Exynos4412裸机开发综合练习

下面是一个案例需求:

1、编写一段程序,该程序的主要功能是监控电路板上的电压值,若电压值超过当前的电压限制则通过蜂鸣器报警,通过按键解除报警;

2、其具体要求如下; 

a) 程序下载20s后,进入电压采集状态(使用RTC ALARM功能完成), 要求1s采集1次电路板电压值;(采用RTC TIME TICK完成)

b) 每次电压采集完成后,通过COM2将采集到的电压值发送到PC,在PC端可通过串口调试助手查看当前的电压值;

c) 每次电压采集完成后,比较当前的电压值是否正常正常的电压值为(1V~2V),若当前采集的电压值异常,则通过蜂鸣器发出报警信号;

d) 报警信号的解除通过电路板上的KEY2控制( 通过按下KEY2使蜂鸣器停止鸣叫);

 

下面是具体实现:

1、头文件定义

0) -- exynos_4412.h

内容过多,这里不予以展示了,在前面的文章中均可找到相关寄存器定义

1) -- adc.h

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #ifndef __ADC_H_  
  2. #define __ADC_H_  
  3.   
  4. void adc_init(int temp);  
  5. void adc_collect(void);  
  6.   
  7. #endif  

2) -- key.h

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #ifndef _KEY_H_  
  2. #define _KEY_H_  
  3.   
  4. void key2_init(void);  
  5.   
  6. #endif  

3) -- pwm.h

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #ifndef __PWM_H__  
  2. #define __PWM_H__  
  3.   
  4. void pwm_init(void);  
  5. void beep_on(void);  
  6. void beep_off(void);  
  7. #define SYS_SET_FREQUENCE 25000  
  8. void beep_set_frequence( unsigned int fre );  
  9.   
  10. #endif  

4) -- rtc.h

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #ifndef _RTC_H_  
  2. #define _RTC_H_  
  3.   
  4. void rtc_init(void);  
  5. void rtc_tic(void);  
  6. void rtc_alarm(void);  
  7.   
  8. #endif  

5) -- uart.h 

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #ifndef _UART_H  
  2. #define _UART_H  
  3.   
  4. void putc(const char data);  
  5. void puts(const  char  *pstr);  
  6. void uart_init(void);  
  7.   
  8. extern void putc(const char data);  
  9. extern void puts(const  char  *pstr);  
  10. extern void uart_init(void);  
  11.   
  12. #endif  

 

2、具体函数实现:

1) -- adc.c

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. /* 
  2.  * adc.c 
  3.  * 
  4.  *  Created on: 2016-2-29 
  5.  *      Author: Administrator 
  6.  */  
  7. #include "exynos_4412.h"  
  8.   
  9. //ADC初始化函数  
  10. adc_init(int temp)  
  11. {  
  12.     // 初始化A/D控制寄存器  
  13.     // ADCCON [16]位置1,12bit输出;[14]位置1,允许预分频; [13:6] = 99,预分频值为99;  
  14.     // [1]位置1,采用读启动方式启动ADC;  
  15.     // A/D转换时间计算: PCLK = 100 MHZ,PRESCALER = 99,则 12 位转换时间为 100MHz/(99+1) = 1 MHZ  
  16.     ADCCON = (1 << 16 | 1 << 14 | 99 <<6 | 1 << 1);  
  17.     ADCMUX = 3; //电压输入通道选择,查看原理图,ADC连接 XadcAIN3,这里将ADCMUX = 3;  
  18.     temp = ADCDAT & 0xfff; // temp用于存放转换的数据值,由于是读启动方式启动ADC,第一次读是读不到正确值的,  
  19.                            // 所以这里先读取依次进行初始化。  
  20. }  
  21.   
  22. //ADC 采集函数  
  23. adc_collect()  
  24. {  
  25.     unsigned int temp;  
  26.     adc_init(temp);  
  27.   
  28.     while(!(ADCCON & (1 << 15))); //读取ADCCON [15]位,当其为1时,A/D转换结束  
  29.     temp = ADCDAT & 0xfff; // 读取ADCDAT低12位,获取电压值  
  30.     temp = 18 * 100 * temp/0xfff; // 电压转换公式,电压最大值为1.8V,temp 范围为 0 ~ 4096  
  31.                                   // 由于没有浮点型头文件,这里不识别浮点型,这里将其转换成mv,  
  32.                                   // 其实应该是 1.8*1000*temp/0xfff,但1.8不被识别,这里用18*100 。  
  33.     printf("电压值 = %d mV\n",temp);  
  34.     if((temp > 2000)||(temp < 1000)) // 这里设正常值为 1000mv ~ 2000mV。  
  35.     {  
  36.         printf("电压异常!\n");  
  37.         beep_on(); //电压值异常时,蜂鸣器报警  
  38.     }  
  39.     else  
  40.     {  
  41.         beep_off(); // 如果调整到正常值,关闭蜂鸣器。  
  42.     }  
  43. }  

2) -- key.c

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. /* 
  2.  * key.c 
  3.  * 
  4.  *  Created on: 2016-2-29 
  5.  *      Author: Administrator 
  6.  */  
  7.   
  8. #include "exynos_4412.h"  
  9.   
  10. //按键中断 初始化函数  
  11. key2_init()  
  12. {  
  13.     //1、 外设级寄存器设置  
  14.     GPX1.CON =GPX1.CON & (~(0xf << 4)) |(0xf << 4); //配置引脚功能为外部中断,这里key2所连引脚为CPX1_1  
  15.     GPX1.PUD = GPX1.PUD & (~(0x3 << 2));  //关闭上下拉电阻  
  16.   
  17.     EXT_INT41_CON = EXT_INT41_CON &(~(0xf << 4))|(0x2 << 4); //外部中断触发方式  
  18.     EXT_INT41_MASK = EXT_INT41_MASK & (~(0x1 << 1));  //使能中断  
  19.   
  20.     // 2、GIC级寄存器设置  
  21.     // 使能分配器  
  22.     ICDDCR = 1;  
  23.     // 使能相应中断到分配器,ICDISER每1bit控制一中断源;  
  24.     // EINT[9]中断号为57,在ICDISER1 第[25]位置1;  
  25.     ICDISER.ICDISER1 = ICDISER.ICDISER1 | (0x1 << 25);  
  26.     // ICDIPTR每8位表示一中断源对应的CPU接口,所以一个ICDIPTR控制4个中断源  
  27.     // 这里中断号57在ICDPTR14 第[15:8]设置  
  28.     ICDIPTR.ICDIPTR14 = ICDIPTR.ICDIPTR14 & (~(0xff << 8))|(0x1 << 8); //选择CPU接口  
  29.   
  30.     //3、CPU0级寄存器设置  
  31.     CPU0.ICCPMR = 255; //中断屏蔽优先级  
  32.     CPU0.ICCICR = 1;   //使能中断到CPU  
  33. }  

3) -- pwm.c

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #include "exynos_4412.h"  
  2. #include "pwm.h"  
  3.   
  4. // 蜂鸣器函数配置,这里蜂鸣器是无源的,由PWM定时器控制,管脚为GPD0_0  
  5. void pwm_init(void)  
  6. {  
  7.     GPD0.CON = GPD0.CON & (~(0xf))| (0x2 << 0); //GPD0_0 由 GPD0.CON [3:0]控制,置2为TOUT_0  
  8.     GPD0.PUD = GPD0.PUD & (~(0xf)) ; //禁用上拉/下拉电阻  
  9.   
  10.     //定时器配置,这里使用定时器0  
  11.     // 1、设置预分频值,范围为0~255,这里设为249  
  12.     PWM.TCFG0 = PWM.TCFG0 & (~(0xff))|0xf9;  
  13.     // 2、设置分频器分频值,有1、1/2、1/4、1/8、1/16 五种因子选择  
  14.     // TCFG1 [3:0]用于配置Time0,这里置2,选择分频值为1/4  
  15.     PWM.TCFG1 = PWM.TCFG1 & (~(0xf)) | 0x2; // 分频后, f = 100MHz/(250)/4 = 100kHz  
  16.     //3、TCMPB0 TCNTB0 配合进行占空比设置,  
  17.     // 定时器计数缓冲寄存器(TCNTBn)把计数器初始值下载到递减计数器中。  
  18.     // 定时器比较缓冲寄存器(TCMPBn)把其初始值下载到比较寄存器中,  
  19.     // 并将该值与递减计数器的值进行比较。当递减计数器和比较寄存器值相同时,输出电平翻转。  
  20.     // 递减计数器减至0后,输出电平再次翻转,完成一个输出周期。  
  21.     // 这里将 TCMPB0设置为50,TCNTB0设为100,占空比为50%。  
  22.     PWM.TCMPB0 = 50;  
  23.     PWM.TCNTB0 = 100;  
  24.     // 4、启动Time0,且第一次要手动更新,将TCMPB0和TCNTB0的值加载进递减计数器  
  25.     PWM.TCON = PWM.TCON & (~(0xff)) | (1 << 0) | (1 << 1) ;  
  26. }  
  27.   
  28. // 开启蜂鸣器  
  29. void beep_on(void)  
  30. {  
  31.     PWM.TCON = PWM.TCON & (~(0xff)) | (1 << 0) | (1 << 3) ; //自动加载TCMPB0和TCNTB0的值  
  32. }  
  33.   
  34. //关闭蜂鸣器  
  35. void beep_off(void)  
  36. {  
  37.     PWM.TCON = PWM.TCON & (~(1 << 0)) ; //[0]位置0,关闭定时器0  
  38. }  
  39.   
  40. //#define SYS_SET_FREQUENCE 25000  
  41. void beep_set_frequence( unsigned int fre )  
  42. {  
  43.     //若蜂鸣器的发声频率为0则返回  
  44.     if( 0==fre )  
  45.         return ;  
  46.   
  47.     PWM.TCMPB0 =  SYS_SET_FREQUENCE/(fre+fre);   //根据设定频率重新设定计数器比较的值  
  48.     PWM.TCNTB0 =  SYS_SET_FREQUENCE/fre;            //根据频率重新调整计数值  
  49.   
  50. }  

4) -- rtc.c

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. /* 
  2.  * rtc.c 
  3.  * 
  4.  *  Created on: 2016-2-29 
  5.  *      Author: Administrator 
  6.  */  
  7. #include "exynos_4412.h"  
  8.   
  9. //RTC初始化函数  
  10. void rtc_init(void)  
  11. {  
  12.     RTCCON = 1; // RTC控制使能  
  13.     // 通过设置 BCD系列寄存器的值,对年月日时分秒进行配置  
  14.     RTC.BCDYEAR = 0x16;  
  15.     RTC.BCDMON = 0x2;  
  16.     RTC.BCDDAY = 0x29;  
  17.     RTC.BCDHOUR = 0x18;  
  18.     RTC.BCDMIN = 0x24;  
  19.     RTC.BCDSEC = 0x00;  
  20.     RTCCON = 0; //RTC控制禁止  
  21. }  
  22.   
  23. // 滴答计时器配置  
  24. void rtc_tic(void)  
  25. {  
  26.     // RTCCON [7:4]用于设置滴答计时器子时钟源选择,这里设为 0000,即32768Hz  
  27.     // RTCCON [8] 置1,滴答计时器使能  
  28.     RTCCON = RTCCON & (~(0xf << 4)) | (1 << 8);  
  29.     // 配置TICCNT寄存器,这里设置为32768,时钟源为32768Hz, 1s发生一次中断。  
  30.     TICCNT = 32768;  
  31.   
  32.     ICDDCR = 1;  //使能分配器  
  33.     ICDISER.ICDISER2 = ICDISER.ICDISER2 | (0x1 << 13); //使能相应中断到分配器  
  34.     ICDIPTR.ICDIPTR19 = ICDIPTR.ICDIPTR19 & (~(0xff << 8))|(0x1 << 8); //选择CPU接口  
  35.     CPU0.ICCPMR = 255; //中断屏蔽优先级  
  36.     CPU0.ICCICR = 1;   //使能中断到CPU  
  37. }  
  38.   
  39. // RTC 闹钟设置  
  40. void rtc_alarm(void)  
  41. {  
  42.     int i = 20;  
  43.     // 配置RTCALM.ALM寄存器,第[6]位置1,闹钟使能;第[0]位置1,秒时钟使能  
  44.     RTCALM.ALM = (1 << 6)|(1 << 0);  
  45.     RTCALM.SEC = 0x20; // SEC设为20,每到20秒时,闹钟到时,发生一次中断  
  46.     printf("请等待20s....\n");  
  47.     ICDDCR = 1;  //使能分配器  
  48.     ICDISER.ICDISER2 = ICDISER.ICDISER2 | (0x1 << 12); //使能相应中断到分配器  
  49.     ICDIPTR.ICDIPTR19 = ICDIPTR.ICDIPTR19 & (~(0xff << 0))|(0x1 << 0); //选择CPU接口  
  50.     CPU0.ICCPMR = 255; //中断屏蔽优先级  
  51.     CPU0.ICCICR = 1;   //使能中断到CPU  
  52.     while(i != 1)  
  53.     {  
  54.         printf("还剩 %-2d s\r", --i);  
  55.         mydelay_ms(1000);  
  56.     }  
  57.     printf("\n");  
  58. }  

5) -- uart.c

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #include "exynos_4412.h"  
  2.   
  3. // UART初始化函数  
  4. void uart_init()  
  5. {  
  6.     // COM2口 Rx Tx分别连接GPA1_0 GPA1_1  
  7.     // GPA1 [3:0]位 置2,设为UART_2_RXD,[7:4]位置2,设为UART_2_TXD;  
  8.     GPA1.CON = (GPA1.CON & ~0xFF ) | (0x22); //GPA1_0:RX;GPA1_1:TX  
  9.   
  10.     // 设置传输格式:ULCONn寄存器[1:0]用于设置数据位bit数,这里设为8  
  11.     UART2.ULCON2 = 0x3;  
  12.     // 设置UART工作模式:UCONn寄存器  [3:2] [1:0] 均置为1 ,Tx Rx 均设为中断或轮询模式  
  13.     UART2.UCON2 = 0x5;  
  14.   
  15.     /* 
  16.      * 波特率设置 
  17.         根据给定的波特率、所选择时钟源频率, 
  18.         可以通过以下公式计算 UBRDIVn 寄存器 (n 为 0~4,对应 5个 UART 通道 )的值。 
  19.         UBRDIVn = (int)( UART clock / ( buad rate x 16) ) – 1 
  20.         上式计算出来的 UBRDIVn 寄存器值不一定是整数, 
  21.         UBRDIVn 寄存器取其整数部分,小部分由 UFRACVALn 寄存器设置, 
  22.         例如,当UART clock为100MHz时,要求波特率为115200 bps,则: 
  23.         100000000/(115200 x 16) – 1 = 54.25 – 1 = 53.25 
  24.         UBRDIVn = 整数部分 = 53 
  25.         UFRACVALn/16 = 小数部分 = 0.25 
  26.         UFRACVALn = 4 
  27.      */  
  28.     UART2.UBRDIV2 = 0x35;  
  29.     UART2.UFRACVAL2 = 0x4;  
  30. }  
  31.   
  32. void putc(const char data)  
  33. {  
  34.     while(!(UART2.UTRSTAT2 & 0X2));  
  35.     UART2.UTXH2 = data;  
  36.     if (data == '\n')  
  37.             putc('\r');  
  38. }  
  39. char getc(void)  
  40. {  
  41.     char data;  
  42.     while(!(UART2.UTRSTAT2 & 0x1));  
  43.     data = UART2.URXH2;  
  44.     if ((data == '\n')||(data == '\r'))  
  45.         {  
  46.             putc('\n');  
  47.             putc('\r');  
  48.         }else  
  49.             putc(data);  
  50.     return data;  
  51. }  
  52. void puts(const  char  *pstr)  
  53. {  
  54.     while(*pstr != '\0')  
  55.         putc(*pstr++);  
  56. }  
  57. void gets(char *p)  
  58. {  
  59.     char data;  
  60.     while((data = getc())!= '\r')  
  61.     {  
  62.         if(data == '\b')  
  63.         {  
  64.             p--;  
  65.         }  
  66.         *p++ = data;  
  67.     }  
  68.     if(data == '\r')  
  69.     *p++ = '\n';  
  70.     *p = '\0';  
  71. }  


3、main函数

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #include "exynos_4412.h"  
  2. #include "adc.h"  
  3. #include "key.h"  
  4. #include "pwm.h"  
  5. #include "rtc.h"  
  6. #include "uart.h"  
  7.   
  8. void mydelay_ms(int time)  
  9. {  
  10.     int i, j;  
  11.     while(time--)  
  12.     {  
  13.         for (i = 0; i < 5; i++)  
  14.             for (j = 0; j < 514; j++);  
  15.     }  
  16. }  
  17.   
  18. void do_irq(void)  
  19. {  
  20.     static int a = 1;  
  21.     int irq_num;  
  22.     irq_num = CPU0.ICCIAR&0x3ff;  //获取中断号  
  23.     switch(irq_num)  
  24.     {  
  25.         case 57:    //按键中断  
  26.             beep_off();  
  27.             printf("请将电压调到正常值!!\n");  
  28.             mydelay_ms(1000); //延时1s,等待电压调整  
  29.             EXT_INT41_PEND = EXT_INT41_PEND |((0x1 << 1)); //清GPIO中断标志位  
  30.             ICDICPR.ICDICPR1 = ICDICPR.ICDICPR1 | (0x1 << 25); //清GIC中断标志位  
  31.         break;  
  32.   
  33.         case 76:    // RTC 闹钟中断  
  34.             printf("20s已到,开始采集电压值:\n");  
  35.             rtc_tic(); // 20s 到后,调用滴答计时器  
  36.   
  37.             RTCALM.ALM = RTCALM.ALM & (~(1 << 6));//关掉闹钟,防止下一个20s中断再次发生  
  38.             RTCINTP  = RTCINTP | (1 << 1); //清RTC中断标志位  
  39.             ICDICPR.ICDICPR2 = ICDICPR.ICDICPR2 | (0x1 << 12); //清GIC中断标志位  
  40.             break;  
  41.   
  42.         case 77:    //滴答计时器中断  
  43.             adc_collect();  //调用ad采样函数  
  44.             RTCINTP  = RTCINTP | (1 << 0);    //清RTC中断标志位  
  45.             ICDICPR.ICDICPR2 = ICDICPR.ICDICPR2 | (0x1 << 13); //清GIC中断标志位  
  46.             break;  
  47.     }  
  48.     CPU0.ICCEOIR = CPU0.ICCEOIR&(~(0x3ff))|irq_num; //清cpu中断标志位  
  49. }  
  50. /* 
  51.  *  裸机代码,不同于LINUX 应用层, 一定加循环控制 
  52.  */  
  53. int main (void)  
  54. {  
  55.     printf("\n");  
  56.     printf("------------------practice--------------------\n");  
  57.   
  58.     uart_init();  
  59.     pwm_init();  
  60.     rtc_init();  
  61.     key2_init();  
  62.   
  63.     rtc_alarm();    //调用alarm函数,开始定时  
  64.   
  65.     while(1)    //什么都不做,等待中断发生  
  66.     {  
  67.   
  68.     }  
  69.    return 0;  
  70. }  


将程序下载到开发板中,执行结果如下:

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. ------------------practice--------------------  
  2. 请等待20s....  
  3. 20s已到,开始采集电压值:  
  4.   
  5. 电压值 = 1219 mV  
  6. 电压值 = 1218 mV  
  7. 电压值 = 1219 mV  
  8. 电压值 = 1219 mV  
  9. 电压值 = 1222 mV  
  10. 电压值 = 1333 mV  
  11. 电压值 = 1391 mV  
  12. 电压值 = 1390 mV  
  13. 电压值 = 1403 mV  
  14. 电压值 = 1496 mV  
  15. 电压值 = 1800 mV  
  16. 电压值 = 1560 mV  
  17. 电压值 = 873 mV  
  18. 电压异常!  
  19. 电压值 = 825 mV  
  20. 电压异常!  
  21. 电压值 = 825 mV  
  22. 电压异常!  
  23. 电压值 = 826 mV  
  24. 电压异常!  
  25. 电压值 = 826 mV  
  26. 电压异常!  
  27. 请将电压调到正常值!!  
  28. 电压值 = 825 mV  
  29. 电压值 = 825 mV  
  30. 电压值 = 826 mV  
  31. 电压异常!  
  32. 请将电压调到正常值!!  
  33. 电压值 = 827 mV  
  34. 电压异常!  
  35. 电压值 = 825 mV  
  36. 电压异常!  
  37. 电压值 = 825 mV  
  38. 电压异常!  
  39. 电压值 = 684 mV  
  40. 电压异常!  
  41. 电压值 = 143 mV  
  42. 电压异常!  
  43. 电压值 = 364 mV  
  44. 电压异常!  
  45. 电压值 = 1114 mV  
  46. 电压值 = 1121 mV  
  47. 电压值 = 1120 mV  
  48. 电压值 = 1120 mV  
  49. 电压值 = 1121 mV  
  50. 电压值 = 1121 mV  
  51. 电压值 = 1120 mV  
  52. 电压值 = 1121 mV  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Exynos4412 裸机开发 —— IIC总线

前言&#xff1a; I2C(Inter-Integrated Circuit)总线(也称 IIC 或 I2C) 是有PHILIPS公司开发的两线式串行总线&#xff0c;用于连接微控制器及外围设备&#xff0c;是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式&#xff0c;具有接口线少、控制方式…

Exynos4412裸机开发 —— A/D转换器

一、Exynos4412 A/D转换器概述 1、简述 10位或12位CMOS再循环式模拟数字转换器&#xff0c;它具有10通道输入&#xff0c;并可将模拟量转换至10位或12位二进制数。5Mhz A/D 转换时钟时&#xff0c;最大1Msps的转换速度。A/D转换具备片上采样保持功能&#xff0c;同时也支持待机…

Exynos4412裸机开发 —— UART

一、Exynos4412 UART 的特性 Exynos4412 中UART&#xff0c;有4 个独立的通道&#xff0c;每个通道都可以工作于中断模式或DMA 模式&#xff0c;即 UART 可以发出中断或 DMA 请求以便在UART 、CPU 间传输数据。UART 由波特率发生器、发送器、接收器和控制逻辑组成。 使用系统时…

Exynos4412裸机开发 —— 看门狗定时器

一、看门狗定时器概述 看门狗&#xff08;WatchDog Timer) 定时器和PWM的定时功能目的不一样。它的特点是&#xff0c;需要不同的接收信号&#xff08;一些外置看门狗芯片&#xff09;或重新设置计数器&#xff0c;保持计数值不为0。一旦一些时间接收不到信号&#xff0c;或计数…

Exynos4412裸机开发 —— RTC 实时时钟单元

RTC(Real-Time Clock) 实时时钟。RTC是集成电路&#xff0c;通常称为时钟芯片。在一个嵌入式系统中&#xff0c;通常采用RTC来提供可靠的系统时间&#xff0c;包括时分秒和年月日等&#xff0c;而且要求在系统处于关机状态下它也能正常工作&#xff08;通常采用后备电池供电&am…

Exynos4412裸机开发——中断处理

以KEY2控制LED3亮灭为例&#xff1a; 一、轮询方式 【0】检测按键k2&#xff0c;按键k2按下一次&#xff0c;灯LED2闪一次。 【1】查看原理图&#xff0c;连接引脚和控制逻辑 &#xff08;1&#xff09;按键k2 连接在GPX1_1引脚 &#xff08;2&#xff09;控制逻辑 k2 按…

远程WEB控制MP3播放器设计(基于mini2440)

网上有很多 基于mini2440的MP3播放器设计的资料&#xff0c;多是按键控制&#xff0c;这里博主做了些轻微改动&#xff0c;利用远程WEB来控制MP3播放&#xff0c;具体怎么实现&#xff0c;下面会给出&#xff0c;大家先看看效果&#xff1a; WEB界面&#xff1a; 后台运行&…

嵌入式数据库 SQLite 浅析

SQLite是一个非常轻量级自包含(lightweight and self-contained)的DBMS&#xff0c;它可移植性好&#xff0c;很容易使用&#xff0c;很小&#xff0c;高效而且可靠。SQLite嵌入到使用它的应用程序中&#xff0c;它们共用相同的进程空间&#xff0c;而不是单独的一个进程。从外…

socket 请求Web服务器过程

HTTP协议只是一个应用层协议&#xff0c;它底层是通过TCP进行传输数据的。因此&#xff0c;浏览器访问Web服务器的过程必须先有“连接建立”的发生。 而有人或许会问&#xff1a;众所周知&#xff0c;HTTP协议有两大特性&#xff0c;一个是“无连接”性&#xff0c;一个是“无状…

有些事情现在不做一辈子就都不会做了

这句话最近一直印在我的脑海里。这句话最早是在Casperkid的百度空间里面看见的&#xff0c;那时他生日。作为师傅的刺&#xff08;道哥&#xff09;送了他自己写的一本《白帽子讲WEB安全》给他&#xff0c;并在扉页上写着这句话。那时一看到这句话&#xff0c;仿佛有种触电的感…

HTTP 数据包头解析

一、连接至Web服务器 一个客户端应用&#xff08;如Web浏览器&#xff09;打开到Web服务器的HTTP端口的一个套接字&#xff08;缺省为80&#xff09;。 例如&#xff1a;http://www.myweb.com:8080/index.html 在Java中&#xff0c;这将等同于代码&#xff1a; [java] view pla…

Shell 脚本中如何使用make命令

最近开发的项目中需要编写Shell脚本对整个工程进行自动化编译&#xff0c;即在Shell脚本中使用make命令来进行编译&#xff0c;下面回顾一下Shell脚本中如何使用make命令&#xff09; 在开发一个系统时&#xff0c;一般是将一个系统分成几个模块&#xff0c;这样做提高了系统的…

Shell 脚本知识回顾 (六) —— Shell 函数

一、Shell函数&#xff1a;Shell函数返回值、删除函数、在终端调用函数 函数可以让我们将一个复杂功能划分成若干模块&#xff0c;让程序结构更加清晰&#xff0c;代码重复利用率更高。像其他编程语言一样&#xff0c;Shell 也支持函数。Shell 函数必须先定义后使用。 Shell 函…

Shell 脚本知识回顾 (五) —— Shell 循环

一、Shell for循环 与其他编程语言类似&#xff0c;Shell支持for循环。 for循环一般格式为&#xff1a;for 变量 in 列表 docommand1command2...commandN done 列表是一组值&#xff08;数字、字符串等&#xff09;组成的序列&#xff0c;每个值通过空格分隔。每循环一次&…

Shell 脚本知识回顾 (四) —— Shell 命令及Shell 相关语句

一、Shell echo命令 echo是Shell的一个内部指令&#xff0c;用于在屏幕上打印出指定的字符串。命令格式&#xff1a;echo arg您可以使用echo实现更复杂的输出格式控制。 显示转义字符 echo "\"It is a test\""结果将是&#xff1a;"It is a test"…

Shell 脚本知识回顾 (三) —— 替换、运算符、字符串、数组

一、Shell替换&#xff1a;Shell变量替换&#xff0c;命令替换&#xff0c;转义字符 如果表达式中包含特殊字符&#xff0c;Shell 将会进行替换。例如&#xff0c;在双引号中使用变量就是一种替换&#xff0c;转义字符也是一种替换。 举个例子&#xff1a; [cpp] view plaincop…

Shell 脚本知识回顾 (二) —— Shell变量

一、Shell变量&#xff1a;Shell变量的定义、删除变量、只读变量、变量类型 Shell支持自定义变量。定义变量 定义变量时&#xff0c;变量名不加美元符号&#xff08;$&#xff09;&#xff0c;如&#xff1a; [cpp] view plaincopy variableName"value" 注意&…

Shell 脚本知识回顾 (一) —— 基础篇

一、Shell简介&#xff1a;什么是Shell&#xff0c;Shell命令的两种执行方式 Shell本身是一个用C语言编写的程序&#xff0c;它是用户使用Unix/Linux的桥梁&#xff0c;用户的大部分工作都是通过Shell完成的。Shell既是一种命令语言&#xff0c;又是一种程序设计语言。作为命令…

红帽集群RHCS

1、简介&#xff1a;RHCS是RedHatClusterSuite的缩写&#xff0c;也就是红帽子集群套件&#xff0c;RHCS是一个能够提供高可用性、高可靠性、负载均衡、存储共享且经济廉价的集群工具集合&#xff0c;它将集群系统中三大集群架构融合一体&#xff0c;可以给web应用、数据库应用…

Java 基础——数组解析

数组对于每一门编辑应语言来说都是重要的数据结构之一&#xff0c;当然不同语言对数组的实现及处理也不尽相同。 Java语言中提供的数组是用来存储固定大小的同类型元素。 可以声明一个数组变量&#xff0c;如numbers[100]来代替直接声明100个独立变量number0&#xff0c;number…