当前位置:首页 » 编程语言 » 单片机c语言指针

单片机c语言指针

发布时间: 2023-04-19 08:59:58

1. 单片机c语言char和int什么区别啊

在单片机C语言中,char和int都是数据类型,但它们的数据范围和作用有很大的区别。
char类型通常被用来表示字符型数据,比如字母、数字、符号等。在单片机中,char类型通常占用1个字节(8位),其数据范围一般是-128到127或0到255。char类型的变量通常用于存储单个搭态首字符或字符串。
int类型通常被用来表示整型数据,比如整数。在单片机中,int类型的大小通常是2个字节(16位),其数据范围一般是-32768到32767或0到65535。int类型的变量通常用于存储整数型闭歼数据。
因此,char和int的区别主要在于数据范围和作用。在单片机C语言中,char类型通常用于存储字符型数据,而int类型则用于存储整型数据。需要注意的是,char类型的变量可知数以通过强制类型转换(如(int)ch)转换为int类型的变量,但可能会导致数据精度的损失。

2. 51单片机中C语言int能转换为unsigned char 指针类型吗怎么转换

1、可以转换,强制转换就行。例如:
int a=100;
unsigned char * c = (unsigned char *)a;
2、强制类型转换
当操作数的类型不同,而且不属于基本数据类型时,经常需要强制类型转换,将操作数转化为所需要的类型。强制类型转换具有两种形式,称轿悉乎为显式强制转换和隐式强制类型转换。
显式强制类型转换
显式强制类型转换需要使用强制类型转换运算符,格式如下:
type(<expression>)

(type)<expression>
其中,type为类型描述符,如int,float等。<expression>为表达式。经强制类型转换运算符运算后,返回一个具有type类型的数值,这种强制类型转换操作并不改变操作数本身,闭悉运算后操作数本身未改变,例如:
int nVar=0xab65;
char cChar=char (nVar);
上述强制类型转换的结果是将整型值0xab65的高端两个字节删掉,将低端两个字节的内容作为char型数值赋值给变陆缺量cChar,而经过类型转换后nVar的值并未改变。

3. 单片机C语言中 指针问题

getbit是接收一位的子函数携胡渗吧。
send+2+length是运算当前接收的1byte的存储地址的。
接收的数据是小端在前的,每接收一位后,通过<<j左移到当前应存储的位,然后与之前接收的数据辩脊进行或运算,就把这一位存到指定内存做芹里去了。

4. 单片机C语言中是否可把指针和数组为位类型为什么

不可以的.标准c语言中没有位类型的关键字.位类型只是针对keil c进行的扩展.这是为了适应51单片机因ram空间小而特殊扩展出来的. c语言不是专为51这种或颂单片机服务的.所以它没有这种功能.特殊编译器(如keil c)可以造出这样的位类型.是因为51单衫悉郑片机有位空间,为了能让用户使用这个空间,keil c进行的特殊的处理. 而且根据基础知识,数陆迅据的最小单元就是字节了.也就是说c语言针对的最小数据类型就是字节.一个字节是8位.说明位比字节还要小.所以c语言里的数组和指针不能处理这样的单元. 不过把只是扩展出来,c语言为了解决这样的问题,可以使用位域.

5. C语言,单片机主要运用到那些

在单片机的开发应用中,已逐渐开始引入高级语言,

C语言就是其中的一种。对用惯了汇编的人来说,总觉得高级语言’可控性’不好,不如汇编那样随心所欲。

但是只要我们掌握了一定的C语言知识,有些东西还是容易做出来的,以下是笔者实际工作中遇到的几个问题,希望对初学C51者有所帮助。

一、C51热启动代码的编制

对于工业控制计算机,往往设有有看门狗电路,当看门狗动作,使计算机复位,这就是热启春悔动。

热启动时,一般不允许从头开始,这将导致现有的已测量到或计算到的值复位,导致系统工作异常。

因而在程序必须判断是热启动还是冷启动,常用的方法是:确定某内存单位为标志位(如0x7f位和0x7e位),

启动时首先读该内存单元的内容,如果它等于一个特定的值(例如两个内存单元的都是0xaa),就认为是热启动,

否则就是冷扒亏正启动,程序执行初始化部份,并将0xaa赋与这两个内存单元。

根据以上的设计思路,编程时,设置一个指针,让其指向特定的内存单元如0x7f,然后在程序中判断,程序如下:

voidmain()

{chardata*HotPoint=(char*)0x7f;

if((*HotPoint==0xaa)&&(*(--HotPoint)==0xaa))

{/*热启动的处理*/

}

else

{HotPoint=0x7e;/*冷启动的处进

*HotPoint=0xaa;

*(++HotPoint)=0xaa;

}

/*正常工作代码*/

}

然而实际调试中发现,无论是热启动还是冷启动,开机后所有内存单元的值都被复位为0,当然也实现不了热启动的要求。这是为什么呢?原来,用C语言编程时,开机时执行的代码并非是从main()函数的第一句语句开始的,在main()函数的第一句语句执行前要先执行一段’起始代码’。正是这段代码执行了清零的工作。C编译程序提供了这段起始代码的源程序,名为CSTARTUP.A51,打开这个文件,可以看到如下代码:

.

IDATALENEQU80H;thelengthofIDATAmemoryinbytes.

.

STARTUP1:

IFIDATALEN<>0

MOVR0,#IDATALEN-1

CLRA

IDATALOOP:MOV@R0,A

DJNZR0,IDATALOOP

ENDIF

.

可见,在执行到判断是否热启动的代码之前,起始代码已将所有内存单元清零。如何解决这个问题呢?好在启动代码是可以更改的,方法是:修改startup.a51源文件,然后用编译程序所附带的a51.exe程序对startup.a51编译,得到startup.obj文件,然后用这段代码代替原来的起始代码。具体步骤是(设C源程序名为HOTSTART.C):

修改startup.a51源文件(这个文件在C51LIB目录下)。

执行如下命令:

A51startup.a51得到startup.obj文件。将此文件拷入HOTSTART.C所在目录。

将编好的C源程序用C51.EXE编译好,得到目标文件HOTS

TART.OBJ。

用L51HOTSTART,STARTUP.OBJ命令连接,得到绝对目标文件HOTSTART。

用OHS51HOTSTART得到HOTSTART.HEX文件,即可。

对于startup.a51的修改,根据自已的需要进行,如将IDATALENEQU80H中的80H改为70H,就可以使6F到7F的16字节内存不被清零。

二、直接调用EPROM中已固化的程序

笔者用的仿真机,由6位数码管显示,在内存DE00H处放显示子程序,只要将要显示的数放入显示缓冲区,然后调用这个子程序就可以使用了,汇编指令为:

LCALL0DEOOH

在用C语言编程时,如何实现这一功能呢?C语言中有指向函数的指针这一概念,可以利空租用这种指针来实现用函数指针调用函数。指向函数的指针变量的定义格式为:

类型标识符(*指针变量名)();

在定义好指针后就可以给指针变量赋值,使其指向某个函数的开始存地址,然后用

(*指针变量名)()即可调用这个函数。如下例:

voidmain(void)

{

void(*DispBuffer)();/*定义指向函数指针*/

DispBuffer=0xde00;/*赋值*/

for(;;)

{Key();

DispBuffer();

}

}

三、将浮点数转化为字符数组

笔者在编制应用程序时有这样的要求:将运算的结果(浮点数)存入EEPROM中。我们知道,浮点数在C语言中是以IEEE格式存储的,一个浮点数占用四个字节,例如浮点数34.526存为(160,26,10,66)这四个数。要将一个浮点数存入EEPROM,实际上就是要存这四个数。那么如何在程序中得到一个浮点数的组成数呢?

浮点数在存储时,是存储连续的字节中的,只要设法找到存储位置,就可以得到这些数了。可以定义一个void的指针,将此指针指向需要存储的浮点数,然后将此指针强制转化为char型,这样,利用指针就可以得到组成该浮点数的各个字节的值了。具体程序如下:

#defineucharunsignedchar#defineuintunsignedintvoidFtoC(void)

{floata;

uchari,*px

ucharx[4];/*定义字符数组,准备存储浮点数的四个字节*、

void*pf;

px=x;/*px指针指向数组x*/

pf=&a;/*void型指针指向浮点数首地址*/

a=34.526;

for(i=0;i<4;i++)

{*(px+i)=*((char*)pf+i);/*强制void型指针转成char型,因为*/

}/*void型指针不能运算*/

}

如果已将数存入EEPROM,要将其取出合并,方法也是一样,可参考下面的程序。

#defineucharunsignedchar#defineuintunsignedint

voidCtoF(void)

{floata;

uchari,*px

ucharx[4]={56,180,150,73};

void*pf;

px=x;

pf=&a;

for(i=0;i<4;i++)

{*((char*)pf+i)=*(px+i);

}

}

以上所用C语言为FRANKLINC51VER3.2。


6. 单片机C51,C语言的一个指针问题

P0 = *((uint8 data*)&ledBuff+i);
ledBuff是缓冲区的起始位置,它的类档敬神型你可以从函数外面看到,因为它是一个全局变量。
&ledBuff是取ledBuff的地址,
(uint8 data*)&ledBuff是把取得的地址强制转换为uint8 data类型的指针。
((uint8 data*)&ledBuff+i是将这个指针位移,偏移量是i
*((uint8 data*)&ledBuff+i)最后加*号是将便宜后行亏的地稿液址中的值取出来,最终赋值给了P0.
这里P0是一个端口。

7. C语言指针问题,单片机控制1602

根据图片所示,写入数据后扮誉启,光标会自动左移或者右移(你的设置是右移)。虚碧所以这就解释了为什么厅如你要写的数组要程序自加,1602的地址却不需自加。希望对你有帮助

8. C语言的指针,在写51单片机程序用得上吗

可以的。
在51单片机的嵌入式C语言中,指针同样是被支持的。
所哪配以在单片机上一样可以使用指针操作,具体使用方法,与标准C语言并没有不同。
不过需要注意的是,使用指针代表着间接寻址,相对变量李谈指的直接寻址,速度要稍慢一些。而单片机运算速度较慢,大量使用指针有可能会降低执行效率,影响效果。所以除非必要,还是少侍悄用指针。

9. 学单片机C语言编程也要学指针吗学了有什么好处不学不行吗

必须要学的,如果你想够用就行,可以不学,但是随着你接触的东西多了,学的东西多了,你就必须要会指针这种东西,轿敬念不然后期发展很困难。就像楼上说的,会闭困指针,你才能成为真正的稿核高手

10. 单片机c语言怎样用指针访问code区数组中的某一元素

void CHcnkDlg::OnButton1()
{
// TOD Add your control notification handler code here
char str[8]; //定颤友义一个字符串数组 ,用来存放列表框1中输入的内容
char *ptr; //定义一个指针,用来处理字符串数组中的元素
char cResult[8]; //定义一个字符串,用来存放列表框1中的数据经过处理后显示在列表框2中带凯的

内容

m_List1.GetLBText(str,; //调用GetLBText()函数,获得列表框1输茄行槐入的内容,存放在字符串

数组str 中
ptr=str+2;
*ptr=0;
m_List2=(LPCTSTR)cResult; //将结果字符串赋给对象m_List2
UPdateData(FALSE); //更新屏幕
}

希望可以帮助到你

热点内容
钉钉密码密码是什么 发布:2024-11-01 20:34:51 浏览:730
老款卡罗拉自动挡有哪些配置 发布:2024-11-01 20:34:06 浏览:570
android图片判断 发布:2024-11-01 20:34:03 浏览:267
怎么给自己手机写一个脚本 发布:2024-11-01 20:23:41 浏览:241
c语言大小写判断 发布:2024-11-01 20:21:53 浏览:130
php的点餐系统源码 发布:2024-11-01 20:13:53 浏览:714
拜占庭算法 发布:2024-11-01 20:10:31 浏览:357
xcode编译参数 发布:2024-11-01 20:00:04 浏览:665
苹果5怎么设置密码锁屏 发布:2024-11-01 19:54:55 浏览:124
宝塔上传文件夹 发布:2024-11-01 19:39:50 浏览:257