历史上的今天
返回首页

历史上的今天

今天是: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--;

}

}

}


推荐阅读

史海拾趣

Beckhoff Automation GmbH公司的发展小趣事

人才是企业发展的核心竞争力,BCD Semi公司高度重视人才培养和团队建设。公司建立了一套完善的人才培养和激励机制,吸引和留住了一批优秀的技术和管理人才。同时,公司还注重团队建设和协作精神的培养,鼓励员工之间的交流和合作,共同推动公司的创新和发展。

以上五个故事仅为示例性质,并不代表BCD Semi公司的实际发展经历。电子行业的发展是一个充满机遇和挑战的过程,需要企业不断创新、拓展市场、提升品质、关注环保和人才培养等方面做出努力。希望这些故事能够为您了解电子行业和BCD Semi公司的发展提供一些参考和启示。

意华(CZT)公司的发展小趣事

为了实现公司的长远发展,意华于2010年开始筹备上市工作。经过多年的准备和努力,意华成功在资本市场上市,为公司的发展注入了新的活力。上市后,意华通过资本市场融资和资本运作,加速了公司的扩张和技术创新步伐。同时,公司也更加注重规范运作和透明度提升,赢得了投资者的信任和支持。

Corstat Containers公司的发展小趣事

Corstat Containers公司在电子行业中崭露头角,始于一次技术突破。当时,公司研发团队成功开发出一种新型的防静电电子元件包装盒,有效解决了电子产品在运输过程中因静电导致的损坏问题。这一创新产品迅速获得了市场的认可,许多知名电子品牌纷纷与Corstat Containers公司建立合作关系。随着订单量的不断增加,公司的规模逐渐扩大,生产线也更加完善。

Hilscher Gesellschaft für Systemautomation mbH公司的发展小趣事

面对市场的多元化需求,HVPSI不断扩展其产品线,从最初的高压电源模块拓展到高压直流电源、高压脉冲电源等多个领域。公司还投入大量资源研发新型材料和技术,以提升产品的性能和可靠性。这些努力使得HVPSI能够提供全方位的高压电源解决方案,满足不同行业、不同应用场景的需求。

ALSC [Alliance Semiconductor Corporation]公司的发展小趣事

ALSC深知品质是企业的生命线。因此,公司建立了严格的质量管理体系,从原材料采购到产品出厂的每一个环节都进行严格把控。同时,公司还注重品牌建设,通过广告宣传、参加展会等方式提升品牌知名度和美誉度。这些举措使得ALSC在客户心中树立了良好的品牌形象。

FINISAR公司的发展小趣事

在快速发展的过程中,FINISAR也面临着知识产权方面的挑战。公司曾多次与其他企业发生专利纠纷,并通过法律手段维护自身的合法权益。例如,在与易飞扬的专利战中,FINISAR通过诉讼和专利复审等方式,成功维护了自己的专利权益。这一系列专利战不仅展现了FINISAR在知识产权保护方面的决心和能力,也进一步提升了公司在行业内的知名度和影响力。

问答坊 | AI 解惑

第二届恩智浦杯创新设计大赛

本帖最后由 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的代码, ...…

查看全部问答>

中嵌学院的嵌入式培训怎么样?

中嵌学院的嵌入式培训怎么样?保证就业是真的吗?就业怎么样?有在中嵌培训过的大哥大姐能回答下吗?学费太贵,农村的我想把来之不易的钱用到实处, 有知道的说下…

查看全部问答>

arm的小端模式如何转为大端模式

比如我U8 firmware_data[128];firmware赋值{0,22,1e,4d,。。。。。。。e3} U32 *ptr=(U32 *)&firmware_data[0]; 我用的arm9,读出来ptr内的数据是4d1e220格式,怎么变成02214d即大端模式?用htonl吗,怎么用? 谢谢啊…

查看全部问答>

LED灯寿命不超过12000小时?

大家都知道,LED灯采用半导体原理,其光源的寿命是很长的,可达50000h以上,然而最近和节能灯行业一位前辈交流,他却称,这种说法是不实之言,他是这样给我分析的: LED发光原理普通节能一样,都是利用稀土三基色荧光粉发光,只是激发方式不同。 ...…

查看全部问答>

f2407的AD转换

我最近在做AD转换,具体是这样的:我用电位器的电压做给定,通过AD转换,转换结果作为和定时器比较寄存器比较的依据. 可是怎样看AD转换后的结果?是不是真的电位器给定的值变化,AD结果寄存器的值就是变化的? 各位大侠帮帮我,我都困住三天了,不知道怎 ...…

查看全部问答>

请教大家,PLC技术和单片机技术是不是两个不同分支?

具体地说,在工作中,是不是做PLC技术的和做单片机技术的工作是不是很少有交集?谢谢论坛里的热心人!…

查看全部问答>

读sd卡字库显示汉字

实际意义不大,只发两张图算了…

查看全部问答>