c语言编程入门入门一个小问题

单片机C语言入门教程 - 电子技术基础知识 - 21IC中国电子网
您当前的位置:&>&&>&&>&
单片机C语言入门教程
学习一种编程语言,最重要的是建立一个练习环境,边学边练才能学好。Keil软件是目前最流行开发80C51系列的软件,Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(?Vision)将这些部份组合在一起。
学习之前请先安装KEILC51软件,在学会使用汇编语言后,学习C语言编程是一件比较容易的事,我们将通过一系列的实例介绍C语言编程的方法。图1-1所示电路图使用89c51单片机作为主芯片,这种单片机性属于80C51系列,其内部有8K的FLASH ROM,可以反复擦写,非常适于做实验。89c51的P1引脚上接8个发光二极管,P3.2~P3.4引脚上接4个按钮开关,我们的任务是让接在P1引脚上的发光二极管按要求发光。
1 简单的C程序介绍
例1-1: 让接在P1.0引脚上的LED发光。
/************************************************
单灯闪烁程序
*************************************************/
#include &reg51.h&//这一句是将51的常用端口,内部寄存器等的定义文件包含进这段程序
sbit P1_0=P1^0;
void main()
{  P1_1=0;
这个程序的作用是让接在P1.0引脚上的LED点亮。下面来分析一下这个C语言程序包含了哪些信息。
1)&文件包含&处理。
程序的第一行是一个&文件包含&处理。
所谓&文件包含&是指一个文件将另外一个文件的内容全部包含进来,所以这里的程序虽然只有4行,但C编译器在处理的时候却要处理几十或几百行。这里程序中包含REG51.h文件的目的是为了要使用P1这个符号,即通知C编译器,程序中所写的P1是指80C51单片机的P1端口而不是其它变量。这是如何做到的呢?
打开reg51.h可以看到这样的一些内容:
/*--------------------------------------------------------------------REG51.H
Header file for generic 80C51 and 80C31 microcontroller.
Copyright (c)
Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
/* BYTE Register */
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr IE = 0xA8;
sfr IP = 0xB8;
sfr SCON = 0x98;
sfr SBUF = 0x99;
/* BIT Register */
sbit CY = 0xD7;
sbit AC = 0xD6;
sbit F0 = 0xD5;
sbit RS1 = 0xD4;
sbit RS0 = 0xD3;
sbit OV = 0xD2;
sbit P = 0xD0;
/* TCON */
sbit TF1 = 0x8F;
sbit TR1 = 0x8E;
sbit TF0 = 0x8D;
sbit TR0 = 0x8C;
sbit IE1 = 0x8B;
sbit IT1 = 0x8A;
sbit IE0 = 0x89;
sbit IT0 = 0x88;
sbit EA = 0xAF;
sbit ES = 0xAC;
sbit ET1 = 0xAB;
sbit EX1 = 0xAA;
sbit ET0 = 0xA9;
sbit EX0 = 0xA8;
sbit PS = 0xBC;
sbit PT1 = 0xBB;
sbit PX1 = 0xBA;
sbit PT0 = 0xB9;
sbit PX0 = 0xB8;
sbit RD = 0xB7;
sbit WR = 0xB6;
sbit T1 = 0xB5;
sbit T0 = 0xB4;
sbit INT1 = 0xB3;
sbit INT0 = 0xB2;
sbit TXD = 0xB1;
sbit RXD = 0xB0;
/* SCON */
sbit SM0 = 0x9F;
sbit SM1 = 0x9E;
sbit SM2 = 0x9D;
sbit REN = 0x9C;
sbit TB8 = 0x9B;
sbit RB8 = 0x9A;
sbit TI = 0x99;
sbit RI = 0x98;
熟悉80C51内部结构的读者不难看出,这里都是一些符号的定义,即规定符号名与地址的对应关系。注意其中有
sfr P1 = 0x90;
这样的一行(上文中用黑体表示),即定义P1与地址0x90对应,P1口的地址就是0x90(0x90是C语言中十六进制数的写法,相当于汇编语言中写90H)。
从这里还可以看到一个频繁出现的词:sfr
sfr并标准C语言的关键字,而是Keil为能直接访问80C51中的SFR而提供了一个新的关键词,其用法是:
sfrt 变量名=地址值。
2)符号P1_0来表示P1.0引脚。
在C语言里,如果直接写P1.0,C编译器并不能识别,而且P1.0也不是一个合法的C语言变量名,所以得给它另起一个名字,这里起的名为P1_0,可是P1_0是不是就是P1.0呢?你这么认为,C编译器可不这么认为,所以必须给它们建立联系,这里使用了Keil C的关键字sbit来定义,sbit的用法有三种:
第一种方法:sbit 位变量名=地址值
第二种方法:sbit 位变量名=SFR名称^变量位地址值
第三种方法:sbit 位变量名=SFR地址值^变量位地址值
如定义PSW中的OV可以用以下三种方法:
sbit OV=0xd2 (1)说明:0xd2是OV的位地址值
sbit OV=PSW^2 (2)说明:其中PSW必须先用sfr定义好
sbit OV=0xD0^2 (3)说明:0xD0就是PSW的地址值
因此这里用sfr P1_0=P1^0;就是定义用符号P1_0来表示P1.0引脚,如果你愿意也可以起P10一类的名字,只要下面程序中也随之更改就行了。
3)main称为&主函数&。
每一个C语言程序有且只有一个主函数,切必须有一个主函数,其放置的位置不要求,可以放在程序最后(推荐),函数后面一定有一对大括号&{}&,在大括号里面书写其它程序。
从上面的分析我们了解了部分C语言的特性,下面再看一个稍复杂一点的例子。
例1-2 让接在P1.0引脚上的LED闪烁发光
/*************************************************
单灯闪烁程序
*************************************************/
#include &reg51.h&
#define uchar unsigned char
#define uint unsigned int
sbit P10=P1^0;
/*延时程序
由Delay参数确定延迟时间
void mDelay(unsigned int Delay)
for(;Delay&0;Delay--)
{ for(i=0;i&124;i++)
void main()
{ P10=!P10; //取反P1.0引脚
mDelay(1000);
程序分析:主程序main中的第一行暂且不看,第二行是&P1_0=!P1_0;&,在P1_0前有一个符号&!&,符号&!&是C语言的一个运算符,就像数学中的&+&、&-&一样,是一种运算任号,意义是&取反&,即将该符号后面的那个变量的值取反。
注意:取反运算只是对变量的值而言的,并不会自动改变变量本身。可以认为C编译器在处理&!P1_0&时,将P1_0的值给了一个临时变量,然后对这个临时变量取反,而不是直接对P1_0取反,因此取反完毕后还要使用赋值符号(&=&)将取反后的值再赋给P1_0,这样,如果原来P1.0是低电平(LED亮),那么取反后,P1.0就是高电平(LED灭),反之,如果P1.0是高电平,取反后,P1.0就是低电平,这条指令被反复地执行,接在P1.0上灯就会不断&亮&、&灭&。
该条指令会被反复执行的关键就在于main中的第一行程序:for(;;),这里不对此作详细的介绍,读者暂时只要知道,这行程序连同其后的一对大括号&{}&构成了一个无限循环语句,该大括号内的语句会被反复执行。
第三行程序是:&mDelay(1000);&,这行程序的用途是延时1s时间,由于单片机执行指令的速度很快,如果不进行延时,灯亮之后马上就灭,灭了之后马上就亮,速度太快,人眼根本无法分辨。
这里mDelay(1000)并不是由Keil C提供的库函数,即你不能在任何情况下写这样一行程序以实现延时。如果在编写其它程序时写上这么一行,会发现编译通不过。那么这里为什么又是正确的呢?注意观察,可以发现这个程序中有void mDelay(&)这样一行,可见,mDelay这个词是我们自己起的名字,并且为此编写了一些程序行,如果你的程序中没有这么一段程序行,那就不能使用mDelay(1000)了。有人脑子快,可能马上想到,我可不可以把这段程序也复制到我其它程序中,然后就可以用mDelay(1000)了呢?回答是,那当然就可以了。还有一点需要说明,mDelay这个名称是由编程者自己命名的,可自行更改,但一旦更改了名称,main()函数中的名字也要作相应的更改。
mDelay后面有一个小括号,小括号里有数据(1000),这个1000被称之&参数&,用它可以在一定范围内调整延时时间的长短,这里用1000来要求延时时间为1000毫秒,要做到这一点,必须由我们自己编写的mDelay那段程序决定的,详细情况在后面循环程序中再作分析,这里就不介绍了。c语言入门的一个数据类型的小小问题 | 问答 | 问答 | 果壳网 科技有意思
c语言入门的一个数据类型的小小问题
请问有符号短整型最小值的补码(存储码)为什么是 00 0000 啊?那么他的原码呢?不应该是-111 11吗?但是转换了以后不是00 0000 啊,为什么呢?
信息安全专业,物理爱好者
补码的转换规则是“符号位不变,数据转为反码再加1”由此与原码还有反码的一个重要区别就是只有一个“0”的编码那两种编码都有两个零,一个正零,一个负零多出来的编码就是原来的负零,作为了最小整数,于是负数就比正数多一个数据的范围,16位补码负数是从 1 000 00 ~ 11 1111
(-32768 ~ -1) 0 是 0 000
0000然后正数 是 0 000 01 ~ 0 111 11
(1 ~ 32767)
(C)2015果壳网&京ICP备号-2&京公网安备关注我们:
C语言入门1.2.3:一个老鸟的C语言学习心得(附DVD光盘1张)
1号店客户端下单更方便
本商品由1号店入驻商家提供
手机购买仅需?,立即扫码购买
咨&&&&询:
店铺动态评分同行业相比
描述相符:
服务态度:
发货速度:
书名:C语言入门1.2.3:一个老鸟的C语言学习心得(附DVD光盘1张)
原价:55.00元
作者:周凌霄
出版社:清华大学出版社
出版日期:
开本:16开
商品标识:jd
10小时配套教学视频 + 40小时进阶实例教学视频 140个配套实例 + 535个拓展实例 + 100个趣味编程实例 + 65个程序流程图 C语言编程老鸟潜心写作,奉献高效率的C语言学习心得 讲解最简单的C语言程序设计,提供最实用的C语法应用案例 完全站在没有编程经验读者的角度,手把手教会读者学习C语言 一一击破C语言学习过程中可能会遇到的各种问题和难点 推荐阅读(请点丛书链接查看) 《C语言入门很简单》 (热销!趣味解读,DVD光盘含大量视频和实例代码) 《C语言趣味编程100例》 (C语言实战练习的好帮手,快速提高水平) 《Java入门1·2·3:一个老鸟的Java学习心得》(获得大量读者好评的Java入门图书) 入门很简单丛书 (精品畅销丛书,有口皆碑,新手必读) 零点起飞学编程 (新手学编程好帮手,编程其实并不难) “Linux典藏大系”(丛书畅销10万册,全面、详细、深入、实用,Linux爱好者必读经典)
《C语言入门1.2.3:一个老鸟的C语言学习心得(附DVD光盘1张)》是一本与众不同的C语言入门好书。作者以独特的视角,向初学者讲述了如何才能真正理解和掌握C语言。本书充分考虑了初学者学习C语言时的种种困难,讲解细致入微,抽丝剥茧,层层推进。本书除了讲述C语言之外,还对编程思想、编程风格、算法设计和操作系统等做了必要讲解,以培养读者良好的编程习惯。另外,作者专门为本书录制了配套教学视频,以帮助读者高效、直观地学习。这些教学视频和本书涉及的源程序一起收录于本书的配书光盘中。 《C语言入门1.2.3:一个老鸟的C语言学习心得(附DVD光盘1张)》共15章。主要内容包括程序设计原理、C语言基本语法(数据类型、运算符和表达式)、输入与输出、程序控制结构、数组、指针、函数、其他数据类型与预编译、文件操作、C语言动态内存分配、数据结构、Visual C++ 6.0测试与调试、编程风格、Linux环境C程序设计、算法入门等。最后一章介绍了一个综合案例——学生成绩管理系统的实现过程。附录结合实例详细介绍了C语言标准库函数的使用。 《C语言入门1.2.3:一个老鸟的C语言学习心得(附DVD光盘1张)》内容内容丰富,讲解由浅入深,实例简单易学,实用性强。适合刚接触程序设计语言的初学者和C语言初学者阅读,尤其是大中专院校的学生和自学编程的人员。另外,本书也适合作为大中专院校相关专业的教材使用。
超值DVD光盘内容 10小时配套教学视频 《C语言入门1.2.3:一个老鸟的C语言学习心得(附DVD光盘1张)》实例源文件 100个C语言趣味编程实例教学视频(9.2小时) 31小时C语言经典实例教学视频 535个C语言经典实例源文件 《C/C++程序员面试宝典》电子书
第1章进入程序设计世界(教学视频:20分钟)1.1计算机程序设计1.1.1计算机语言1.1.2机器语言1.1.3汇编语言1.1.4高级语言1.2什么是C语言?1.2.1C语言的发展1.2.2C语言的特点1.3环境搭建,初识VisualC++1.3.1安装VisualC++1.3.2认识VisualC++1.4编制第一个C语言程序1.4.1简单的HelloWorld程序1.4.2程序开发步骤1.4.3C语言的代码1.5本章小结1.6本章习题第2章C语言数据类型、运算符和表达式(教学视频:62分钟)2.1基本数据类型2.1.1简单学习存储原理2.1.2整数类型2.1.3浮点数类型2.1.4字符类型2.1.5常用基本数据类型2.2标识符与关键字2.2.1标识符2.2.2关键字2.3常量与变量2.3.1常量2.3.2变量2.3.3字符串常量2.4运算符和表达式2.4.1C语言的运算符以及表达式2.4.2算术运算符和算术表达式2.4.3关系运算符和关系表达式2.4.4逻辑运算符和逻辑表达式2.4.5位运算符和位表达式2.4.6自增、自减运算符和表达式2.4.7赋值运算符和赋值表达式2.4.8逗号运算符和逗号表达式2.4.9sizeof()运算符2.4.10条件运算符和条件表达式2.5数据类型之间的转换2.5.1自动类型转换2.5.2强制类型转换2.6本章小结2.7本章习题第3章输入与输出(教学视频:28分钟)3.1输入输出——让人与机器交流的窗口3.2格式化的输入输出3.2.1格式化输出函数printf()3.2.2格式化输入函数scanf()3.3常用字符输入输出函数3.3.1putchar()函数3.3.2getchar()函数3.4本章小结3.5本章习题第4章程序控制结构(教学视频:60分钟)4.1复合语句4.2条件控制语句4.2.1if语句的简单形式4.2.2if-else条件判断形式4.2.3else-if多条件判断形式4.2.4switch多条件判断语句4.2.5条件运算符4.2.6条件控制语句的嵌套使用4.3循环控制语句4.3.1while语句4.3.2do-while语句4.3.3for语句 4.3.4 循环语句的嵌套使用4.4 其他控制语句4.4.1 goto语句4.4.2 break语句4.4.3 continue语句4.5 控制语句的应用举例4.5.1 穷举——著名的爱因斯坦阶梯问题4.5.2 迭代4.5.3 死循环4.6 本章小结4.7 本章习题 77 第5章 数组(教学视频:60分钟)5.1 一维数组5.1.1 一维数组的定义5.1.2 数组的存储原理5.2 数组的赋值5.2.1 初始化赋值5.2.2 初始化部分元素5.2.3 不定长度数组赋值5.2.4 静态数组赋值5.2.5 遍历数组5.3 一维数组的应用5.3.1 冒泡排序5.3.2 简单选择排序5.4 多维数组5.4.1 多维数组的定义5.4.2 多维数组的存储原理5.5 多维数组的赋值5.5.1 顺序初始化5.5.2 部分数组元素初始化5.6 字符数组和字符串5.6.1 字符数组与字符串5.6.2 字符串的初始化5.6.3 字符串的输入输出5.7 常用的字符串函数5.7.1 字符串输入函数gets()5.7.2 字符串输出函数puts()5.7.3 字符串连接函数strcat()5.7.4 字符串拷贝函数strcpy()5.7.5 字符串比较函数strcmp()5.7.6 求字符串长度函数strlen()5.8 中文字符的处理5.9 本章小结5.10 本章习题 第6章 指针(教学视频:41分钟)6.1 神奇的指针6.1.1 指针的概念6.1.2 指针变量的定义6.1.3 指针的赋值和取值6.1.4 指向指针的指针6.1.5 指针的用处6.2 指针数组6.2.1 指向一维数组的指针6.2.2 指向多维数组的指针6.2.3 指针与字符串6.3 易混淆的指针概念6.3.1 指针常量6.3.2 常量指针 1266.4 本章小结 1276.5 本章习题 128 第7章 函数(教学视频:50分钟)7.1 函数的概念7.1.1 C语言程序结构7.1.2 函数的分类7.2 函数7.2.1 函数的定义7.2.2 函数的参数7.2.3 函数的声明7.2.4 函数的返回7.3 函数的调用7.3.1 传值调用7.3.2 传址调用7.3.3 嵌套调用7.3.4 递归调用7.4 变量的存储属性7.4.1 存储位置、作用域和生存期 1417.4.2 存储类别7.4.3 动态变量7.4.4 静态变量7.5 指针与函数7.5.1 指针作为函数的参数 1487.5.2 实参和形参均为数组名 1487.5.3 实参和形参均为指针 1507.5.4 实参和形参混合使用数组名与指针 1517.5.5 指向函数的指针 1517.5.6 返回指针的函数 1527.6 其他函数 1537.6.1 main()函数 1537.6.2 库函数 1547.7 本章小结 1547.8 本章习题 154 第8章 其他数据类型与预编译(教学视频:41分钟)8.1 结构体类型变量 1578.1.1 定义结构体类型 1578.1.2 定义结构体变量 1588.1.3 结构体变量的访问 1608.1.4 结构体变量的赋值 1618.1.5 结构体数组 1628.1.6 结构体指针 1638.2 共用体 1648.2.1 定义共用体 1648.2.2 使用共用体的注意事项 1658.3 枚举类型 1668.3.1 枚举类型的定义 1668.3.2 枚举类型变量的使用 1668.4 自定义数据类型 1678.5 void类型 1688.6 预编译 1688.6.1 文件包含 1688.6.2 条件编译 1708.7 宏 1728.7.1 不带参数的宏 1728.7.2 带参数的宏 1748.8 本章小结 1758.9 本章习题 175 第9章 文件操作(教学视频:45分钟)9.1 文件的概念和分类 1789.1.1 文件分类 1789.1.2 文件标识 1799.1.3 流 1809.2 文件的读写过程 1809.2.1 文件的工作原理 1819.2.2 文件类型指针 1819.2.3 打开和关闭文件 1829.3 对文件的操作 1849.3.1 面向字符的I/O 1849.3.2 面向行的I/O 1859.3.3 格式化的I/O 1879.3.4 面向记录的I/O 1889.4 文件定位与随机读写 1909.4.1 文件读写位置的定位 1909.4.2 文件的随机读写 1909.5 文件出错检测 1919.6 本章小结 1929.7 本章习题 192 第10章 C语言高级应用(教学视频:41分钟)10.1 内存分配策略 19310.2 C语言动态内存分配函数 19410.2.1 申请内存 19410.2.2 释放内存 19510.3 线性表 19510.3.1 线性表的定义 19610.3.2 线性表的表示 19610.3.3 线性表的接口 19710.3.4 新建线性表 19710.3.5 插入结点 19810.3.6 删除结点 19910.3.7 删除某个线性表 19910.4 栈和队列 20010.4.1 栈 20010.4.2 队列 20310.5 栈的应用实例 20710.5.1 进制转换 20810.5.2 括号匹配检测 21010.6 本章小结 21610.7 本章习题 216 第11章 Visual C++ 6.0测试与调试(教学视频:20分钟)11.1 Visual C++ 6.0的调试技巧 21711.1.1 程序测试 21711.1.2 断点设置 21811.1.3 跟踪调试 21911.1.4 调试实践 22011.2 常见的程序错误 22611.2.1 编译时常见错误 22611.2.2 连接时常见错误 22711.2.3 运行时常见错误 22711.3 本章小结 22811.4 本章习题 228 第12章 编程风格(教学视频:24分钟)12.1 编写风格良好的代码 22912.1.1 为什么编写风格良好的代码? 22912.1.2 编写风格良好代码的原则 23012.2 命名规则 23012.2.1 标识符命名规则 23012.2.2 函数命名规则 23112.2.3 类型的命名 23212.2.4 宏与常量的命名 23212.3 注释规则 23312.3.1 注释的原则 23312.3.2 注释的写法 23312.4 表达式和语句 23412.4.1 表达式的书写 23412.4.2 代码的排版 23512.4.3 语句的书写 23612.5 本章小结 23812.6 本章习题 238 第13章 Linux基础知识(教学视频:16分钟)13.1 Linux操作系统 23913.1.1 操作系统与UNIX 23913.1.2 Linux的发展历史 24013.1.3 开源的概念 24113.1.4 Linux内核版本 24213.1.5 Linux的特色 24213.2 Linux的安装 24313.2.1 安装前准备 24313.2.2 虚拟机VMware安装与配置 24413.2.3 Linux系统的安装 24613.2.4 Ubuntu系统界面 25213.3 如何学习Linux 25413.3.1 文件系统 25413.3.2 常用Shell指令 25613.3.3 在线求助 25713.3.4 权限控制 25913.4 Linux环境的C语言开发 26013.4.1 在终端中开发 26113.4.2 在IDE中开发 26313.5 本章小结 26513.6 本章习题 265 第14章 算法初步入门(教学视频:37分钟)生成绩管理系统(教学视频:32分钟)附录A ASCII详解附录B C语言标准库函数
周凌霄,喜欢研究新技术和方法,目前主要研究方向为认知与智能计算。从事C语言开发7年有余,对C语言有深入的理解,并在开发中积累了丰富的编程经验和项目开发经验。另外还熟悉C++、MFC和Java等开发技术。近年来参与过多个省级科技项目。
如发现商品介绍信息有误,您可以点击【 】反馈给我们,谢谢。
您暂时不能对商品进行评价
抱歉,您暂时不能对该商品进行评价,可能有以下原因:
1、 您可能没有在1号店购买过该商品。
2、 您购买了该商品,但还没确认收货,或订单还未完成。3、 您已经评价过该商品。
因厂家更改商品包装、场地、附配件等不做提前通知,以下内容仅供参考!给您带来的不变还请谅解。谢谢
*问题类型:
提问小贴士:
因厂家更改商品包装、产地、附配件等不做提前通知,且每位咨询者购买情况、提问时间等不同。为此,客服给到的回复仅对提问者3天内有效,其他网友仅供参考!给您带来的不便还请谅解,谢谢!
您的问题已经收到,我们将尽快回复(9-18点)
感谢您为其他会员做出的帮助,请在此填写您的回答,字数请限定在20~100之间!
回复小贴士
1、1号店鼓励您对已有的产品问题做出解答,一个问题只能回答一次。
2、问答字数限制:10~100个字以内。
3、若您提交信息出现与产品无关的冗余信息或涉及广告、比价、重复反馈、不实 评论、恶意评论、粗口、危害国家安全等不当言论时,或经1号店查实您存在自问 自答等作弊行为,1号店有权予以删除其内容。
选择手机号码
入网地区中国
未找到匹配的手机号码,请重新搜索
加入购物车
由于商品在各地的价格和库存不同请选择您的收货地

我要回帖

更多关于 c语言编程入门 的文章

 

随机推荐