历史上的今天
今天是:2025年03月05日(星期三)
2020年03月05日 | 51单片机-指针方法-串口实例
2020-03-05 来源:eefocus
1. 指针
变量a的指针=变量a的地址
再定义一个变量p,来存放a的地址(指针),p就是指针变量,简称指针
1.1 指针声明的两种方式
//直接初始化赋值
unsigned char a;
unsigned char *p = &a;
//定义后再进行赋值
unsigned char a;
unsigned char *p;
P = &a;
1.2 两个重要区别(P194)
第指针变量p与普通变量a的区别:
a可直接赋值,p要赋地址
定义指针变量*p和取值运算*p的区别
*的三种用法:
num = a * b; //乘号
unsigned char *p; //定义指针变量
num = *p; //取值运算,取p指向的值,赋值给num
1.3 指针流水灯
写流水灯的方法汇总:
软件延时,定时器
算法移位,移位函数,指针
#include unsigned char T0RH,T0RL; void ConfigTimer0(unsigned char ms); void main(void) { ConfigTimer0(1); while(1){} } void ConfigTimer0(unsigned char ms) { unsigned long tmp; tmp = 11059200 / 12; tmp = tmp * ms / 1000; tmp = 65536 - tmp; tmp += 6; T0RH = (unsigned char)(tmp>>8); T0RL = (unsigned char)tmp; TH0 = T0RH; TL0 = T0RL; TMOD &= 0xF0; TMOD |= 0x01; EA = 1; ET0 = 1; TF0 = 0; TR0 = 1; } void LedFlow(void) { static unsigned char buff = 0x01; static unsigned char *p = &buff; P1 = ~buff; *p <<= 1; if(0==buff) { buff = 0x01; } } void InterruptTimer0(void) interrupt 1 { static unsigned int tmr1s = 0; TH0 = T0RH; TL0 = T0RL; tmr1s++; if(tmr1s>=1000) { tmr1s = 0; LedFlow(); } } 2. 数组的指针 2.1 数组指针的声明 unsigned char num[10] = { 0,1,2,3,4,5,6,7,8,9 }; unsigned char *p = &num[0]; 2.2 指针本身的运算(P197) 比较运算 两个指针需要指向,有同种数据类型的对象。 指针和整数的加减 两个指针相减 2.3 数组指针和sizeof()的用法实例 上位机发送命令,下位机回发对应数组值 #include unsigned char table1[1] = {1}; unsigned char table2[2] = {1,2}; unsigned char table3[4] = {1,2,3,4}; unsigned char table4[8] = {1,2,3,4,5,6,7,8}; bit UARTArrived = 0; unsigned char UARTNum; unsigned char *UARTTable; unsigned char TableCnt; void ConfigUART(unsigned long baud); void main(void) { ConfigUART(9600); while(1) { if(UARTArrived) { UARTArrived = 0; switch(UARTNum) { case 1 : UARTTable = &table1; TableCnt = sizeof(table1); TI = 1; break; case 2 : UARTTable = &table2; TableCnt = sizeof(table2); TI = 1; break; case 3 : UARTTable = &table3; TableCnt = sizeof(table3); TI = 1; break; case 4 : UARTTable = &table4; TableCnt = sizeof(table4); TI = 1; break; default : break; } } } } void ConfigUART(unsigned long baud) { TH1 = 256 - (11059200/12/32) / baud; TL1 = TH1; SCON = 0x50; TMOD &= 0x0F; TMOD |= 0x20; EA = 1; ET1 = 0; ES = 1; TF1 = 0; TR1 = 1; } void InterruptUART(void) interrupt 4 { if(RI) { RI = 0; UARTNum = SBUF; UARTArrived = 1; } if(TI) { TI = 0; if(TableCnt>0) { SBUF = *UARTTable++; TableCnt--; } } } 3.字符数组&字符指针 3.1 常量 常量:整形常量,浮点型常量,字符型常量,字符串常量 3.2 直接常量 就是一个值 3.3 符号常量 符号常量声明: const声明 const 类型 符号常量名字 = 常量值; const unsigned long BAUD = 9600; 预处理命令#define #define 符号常量名字 常量值 #define BAUD 9600 3.4 区别实例 区别字符串,字符数组,常量数组 上位机发送命令,下位机回发对应数组值 #include const unsigned long BAUD = 9600; unsigned char table1[] = {"1-Hello!rn"}; unsigned char table2[] = {'2','-','H','e','l','l','o','!','r','n'}; unsigned char table3[] = {51,45,72,101,108,108,111,33,13,10}; unsigned char table4[] = {"4-Hello!rn"}; bit arrived = 0; unsigned char index; unsigned char cnt; unsigned char *p; void ConfigUART(void); void main(void) { ConfigUART(); while(1) { if(arrived) { arrived = 0; switch(index) { case 1 : p = &table1; cnt = sizeof(table1); TI = 1; break; case 2 : p = &table2; cnt = sizeof(table2); TI = 1; break; case 3 : p = &table3; cnt = sizeof(table3); TI = 1; break; case 4 : p = &table4; cnt = sizeof(table4)-1; TI = 1; break; default : break; } } } } void ConfigUART(void) { TH1 = 256 - (11059200/12/32) / BAUD; TL1 = TH1; SCON = 0x50; TMOD &= 0x0F; TMOD |= 0x20; EA = 1; ET1 = 0; ES = 1; TF1 = 0; TR1 = 1; } void InterruptUART(void) interrupt 4 { if(RI) { RI = 0; index = SBUF; arrived = 1; } if(TI) { TI = 0; if(cnt>0) { SBUF = *p++; cnt--; } } }
下一篇:51单片机-串口-串口发送显示
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 09:48 编辑 活动介绍 恩智浦半导体(NXP Semiconductors)是一家新近独立的半导体公司,由飞利浦公司创立,已拥有五十年的悠久历史,主要提供工程师与设计人员各种半导体产品与软件,为消费电子、安全应用、 ...… 查看全部问答> |
|
6集成电路运算放大器 6 .1.1集成电路运算放大器的特点 6.1.2集成运算放大电路中的电流源 6.1.3基本型差动放大器 6.1.4双电源长尾式差放 6.1.5差动电路的几种接法 6.1.6恒流源式差放… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:18 编辑 衰减器的功能是能处理大功率信号且不会影响信号性能,所以在对大功率信号处理和测试时需要用到高频衰减器。尤其是一些特殊的信号,例如在商业广播和军用雷达系统中常见的超过1kW的信号来讲,在任何测 ...… 查看全部问答> |
|
2440 ARM 的ADC驱动是和touch screen共用的吗? 2440 ARM 的ADC驱动是和touch screen共用的吗? 2440的ADC端口和touch screen端口公用一个端口,那windowsce里面是不是也可以用touch 驱动程序来读出ADC的值? 目前我在开发板的软件包里面,找不到ADC驱动,我发现触摸屏的驱动里面有ADC的代码, ...… 查看全部问答> |
|
中嵌学院的嵌入式培训怎么样?保证就业是真的吗?就业怎么样?有在中嵌培训过的大哥大姐能回答下吗?学费太贵,农村的我想把来之不易的钱用到实处, 有知道的说下… 查看全部问答> |
|
比如我U8 firmware_data[128];firmware赋值{0,22,1e,4d,。。。。。。。e3} U32 *ptr=(U32 *)&firmware_data[0]; 我用的arm9,读出来ptr内的数据是4d1e220格式,怎么变成02214d即大端模式?用htonl吗,怎么用? 谢谢啊… 查看全部问答> |
|
大家都知道,LED灯采用半导体原理,其光源的寿命是很长的,可达50000h以上,然而最近和节能灯行业一位前辈交流,他却称,这种说法是不实之言,他是这样给我分析的: LED发光原理普通节能一样,都是利用稀土三基色荧光粉发光,只是激发方式不同。 ...… 查看全部问答> |
|
我最近在做AD转换,具体是这样的:我用电位器的电压做给定,通过AD转换,转换结果作为和定时器比较寄存器比较的依据. 可是怎样看AD转换后的结果?是不是真的电位器给定的值变化,AD结果寄存器的值就是变化的? 各位大侠帮帮我,我都困住三天了,不知道怎 ...… 查看全部问答> |




