微机原理-06-单片机c语言设计

举报
孙中明 发表于 2022/01/23 00:13:28 2022/01/23
【摘要】 单片机的C语言程序设计 单片机应用系统的程序设计,除了可采用汇编语言完成外,还可以采用C语言实现。目前已有多种可以对51系列单片机硬件进行操作的C语言,它们通常统称为C51。 C51在标准C(ANSI ...

单片机的C语言程序设计

单片机应用系统的程序设计,除了可采用汇编语言完成外,还可以采用C语言实现。目前已有多种可以对51系列单片机硬件进行操作的C语言,它们通常统称为C51。
C51在标准C(ANSI C)的基础上,针对单片机的硬件资源,扩展了相应的数据类型和变量,而C51在语法规定、程序结构与设计方法上都与标准C相同。本章重点介绍 C51对标准C所扩展的部分,并结合几个简单实例讲解单片机C51的程序设计方法。

为什么使用C51

  • C语言是一种通用的程序设计语言,其代码率高,数据类型及运算符丰富,并具有良好的程 序结构,适用于各种应用的程序设计,是目前使用最广的单片机编程语言,使用 C51编译器。
  • 由C51产生的目标代码其运行速度高,所需存储空间小,符合C语言的ANSI标准,生成的代码遵循Intel目标文件格式,而且可与A51汇编语言或PL/M51语言目标代码混和使用

程序结构

全局变量说明        /*可被各函数引用*/  
main(  )                 /*主函数*/  
 { 
    局部变量说明	   /* 只在本函数引用 */
    执行语句  (包括函数调用语句); 
 }  
Fun1(形式参数表)   /*函数1*/  
形式参数说明  
 {  
    局部变量说明  
    执行语句(包括调用其他函数语句);  
 } 
  … 
Funn(形式参数表)        /*函数n*/  
形式参数说明  
{  
    局部变量说明  
    执行语句  (包括调用其他函数语句) 
 } 


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

数据类型

存储器模式

data char var;                         //字符变量var定位在片内RAM区
char code MSG[]=″ENTER PARAMETER:″     //字符数组定位在程序存储区
unsigned long xdata array[100];       /* 无符号长型数组定位在片外RAM区,每元素占4bytes*/ 
float idata x,y,z;                     /*实型变量x,y,z,定位在片内用 间址访问的内部RAM区*/   
bit  lock;                            /*位变量Lock定位在片内RAM可位寻址区*/
unsigned int pdata dimension;         /* 无符号整型变量 dimension定位
                                                               在分页的外部RAM区 */  
 unsigned char xdata vector [10][4][4];  /* 无符号字符型三维数组,定位在片外RAM区*/ 
sfr P0=0x80;                            /*定义P0口,地址为80H*/
char bdata flags;                      /*字符变量flags定位在可位寻址内部RAM区*/  
sbit flag0=flags^0;                    /*定义flag0为flags.0



  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

指针变量

指针就是存储单元地址,存储这个地址的变量称为指针变量。



习题

2. C51与汇编语言的特点各有哪些?怎样实现两者的优势互补?

答:采用C51进行程序设计,对系统硬件资源的分配比用汇编语言简单,且程序的阅读和修改比较容易,适于编写较大一点的程序。

汇编语言生成的目标程序占存储空间少、运行速度快,具有效率高、实时性强的优点,适于编写短小高效的程序。

7.中断函数是如何定义的?各种选项的意义如何?

答:interrupt n 用于定义中断函数,n为中断号,可以为0~31,通过中断号可以决定中断服务程序的入口地址。

常用的中断源对应的中断号

中断源 外中断0 定时器0 外中断1 定时器1 串行口
中断号 0 1 2 3 4

9.一般指针与基于存储器的指针有何区别?

答:定义时未指定它所指向的对象的存储器类型时,该指针变量就被认为是一般指针。

一般指针占用3个字节:第一个字节存放该指针的存储器类型编码(由编译模式的默认值确定),第二和第三个字节分别存放该指针的**高位和低位地址偏移量。**定义时就指定了它所指向的对象的存储类型时,该指针变量就属于基于存储器的指针。

基于存储器的指针可以高效访问对象,类型由C51源代码中存储器类型决定,且在编译时确定。

12.改正下列程序的错误。

#include<reg51.h>
main ()
{a = c;
 int a = 7,c;
 delay (10)
void delay( );
{
 char i;
 for (i = 0;i< = 255;i++);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

答:本程序有如下错误:

变量必须先定义后引用。

第5句调用函数后面应该加分号。

Main()函数结束处漏写了反大括号。

被调用函数delay()在main()后面,必须在前面先声明。

第6句函数说明语句后的分号应该去掉。

13.试说明为什么xdata型的指针长度要用2个字节。

答:因为xdata是外部数据存储器,最大可有64KB 的存储单元,xdata指针是表示外部数据存储单元的地址,要表示64KB个单元地址,所以必须用2字节共16位表示。

64KB=65536B=2^16B

文章来源: hiszm.blog.csdn.net,作者:孙中明,版权归原作者所有,如需转载,请联系作者。

原文链接:hiszm.blog.csdn.net/article/details/105402750

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。