《C语言入门教程 .docx》由会员分享,可在线阅读,更多相关《C语言入门教程 .docx(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精品名师归纳总结信任许多爱好电子的伴侣,对单片机这个词应当都不会生疏了吧。不过有些伴侣可能只听说他 叫 单 片 机 ,他 的 全 称 是 什 么 也 许 并 不 太 清 楚 , 更不用说他的英文全称和简称了。单片机是一块在集成电路芯片上集成了一台有肯定规模的 微型 计 算 机 。 简 称 为 : 单 片 微 型 计 算 机 或 单 片 机 。单片机的应用处处可见,应用领域广泛,主要应用在智能仪表 、实 时控制 、通 信、家 电等 方面 。不过 这一 切都 没什么关系,由于我 , 即 使你每天捧着本书,把那本书翻烂,也永久学不会单片机的!刚接触单片机的伴侣,看了资料 , 一 定 会 对 以 下
2、几 个 词 见 的 比 较 多 , 但 是 具 体 的 概念 仍 是 比 较 模 糊 , 现 作 如 下 说 明 :1)编程器 编程器是用来烧单片机芯片的,是把 HEX 或者 BIN 文件烧到单片机 ROM 里可编辑资料 - - - 欢迎下载精品名师归纳总结的,供单片机运行的。2)试验板试验板是专为初学者依据某些要求而特做的板,一般上面就有一个单片机的最小系统 ,使用者只需写好程序,烧好芯片,放到上面加以验证的这么一个工具。有了试验板,对与初学者来说,省去了焊个最小系统的麻 烦。 但是对 于电 子开发 人员 来说, 作用 并不 是 很 大 的,可是结果 ,确和我想的正好相反,人家出售的是编程器
3、。等货物寄到后,才知道自己搞错了 !汗 。 嘿嘿 。现在 想想 实在 是又气 又笑 。我 花了 160 大样买了个编程器 很不幸的是,这个编程器更本用不了,一烧芯片,芯片就烧坏了 ) 把 我 给 气 的 , 这 个 编 程 器 , 现 在 仍 躺 在 我 的 抽 屉 里了不过,现在想想,唯独让我觉得欣慰的是,那个老板每次能解答我的问题,连那种超级幼 稚 的 问 题 , 他 也 能 不 嫌 麻 烦 的 尽 量 帮 我 解 答 ! 这 点 让我很感动!第三,想学单片机的必需品-PC 。由于写程序,编译或者是仿真都是通过PC 完成的。如 果 没 有PC, 什 么 也 做 不 了 ! ! ! 有 了P
4、C最 好 仍 要 可以上网,由于假如你没有可以和你沟通单片机的人,遇到自己解决不了的问题,始终都想不 通, 那么估 计你 学习单 片机 的热 情就会 随着 时间 的推移而渐渐耗尽。假如你能上网通过论坛或者QQ 群,问题就很快得到解决。这样的学习效 率一 定 很 高 ! 真 正 的 高 手 是 从 论 坛中 泡 出 来 的 !有了上述 3 个条件后,你就可以开头学你的单片机了。但是,真的做起来并没有我所说的 那么 简 单 。 你 一 定 会 遇 到 很 多 很 多 的 问 题 。 比 如为了让单片机实现某个功能,你可能不知道怎么去写某个程序。或是你看懂了资料上某个相 似的 程序, 你自 己却写
5、不出 来。 遇到类 似的 情况 , 记住:千万不要急噪,就行!二) 说了这么多了,信任你也看了许多资料了,手头应当也有必备的工具了吧!不要忘了上 面讲 过 几 个 条 件 的 哦 ) 。 那 个 单 片机 究 竟 有 什 么功能和作用了?先不要焦急!接下来让我们点亮一个LED 搞电子的应当知道LED是什么吧_)我们在单片机最小系统上接个LED, 看我们能否点亮它 .对了 ,上面也有好几次提到过单片机 最小 系 统 了 , 所 谓 单 片 机 最 小 系 统 就 是 在 单 片 机上接上最少的外围电路元件让单片机工作。一般只须连接晶体、VCC 、GND 、 RST即可,一般情况 下,AT89C5
6、1的31脚须 接高 电平。#include/ 头文件定义。或用 #include 其详细的区分在于:后者定义了更多的的址空间。/ 在 Keil安 装 文 件 夹 中 , 找 到 相 应 的 文 件 , 比 较 一 下 便 知 !sbitP1_0=P10。/定义管脚可编辑资料 - - - 欢迎下载精品名师归纳总结voidmainvoidwhile1P1_0=0 。 / 低 电 平 有 效 , 如 果 把LED反过 来 接 那么 就 是 高 电 平 有 效就那么简洁,我们就把接在单片机P1_0 上的 LED 点亮了,当然 LED 是低电平,才能点 亮 。 因 为 我们 把LED的 正 通 过 电阻
7、 接 至VCC。P1_0 = 0 。 类似与 C 语言中的赋值语句,即把0 赋给单片机的 P1_0 引脚 ,让它输出相应的 电平 。 那 么 这 样 就 能 达 到 了 我 们 预 先 的 要 求 了 。while1 语句只是让单片机工作在死循环状态,即始终输出低电平。假如我们要试着点亮其 他 的LED, 也 类 似 上 述 语 句 。 这 里 就 不 再 讲 了 。点亮了几个 LED后,是不是让我们联想到了繁华的街区上流淌的彩灯。我们是不是也可 以 让几 个LED依次 按顺 序 亮 了 ?答 案是 肯 定 的 ! 其实显示的原理很简洁,就是让一个LED灭后,另一个立刻亮,依次轮番下去。假设我
8、们有8个LED分 别 接 在P1口 的8个 引 脚 上 。 硬 件 连 接 , 在P1_1-P1_7上再接7个LED即可。例程如下: #includesbitP1_0=P10。sbitP1_1=P11。sbitP1_2=P12。sbitP1_3=P13。sbitP1_4=P14。sbitP1_5=P15。sbitP1_6=P16。sbitP1_7=P17。voidDelayunsignedcharaunsignedchari。while-a.=0fori=0 。i 。/ 一 个。表 示 空 语 句 ,CPU空 转 。/i从0加 到125, CPU大 概 就 耗 时1毫 秒voidmainvoi
9、dwhile1P1_0=0。可编辑资料 - - - 欢迎下载精品名师归纳总结Delay250。P1_0=1。P1_1=0Delay250。P1_1=1。P1_2=0。Delay250。P1_2=1。P1_3=0。Delay250。P1_3=1。P1_4=0。Delay250。P1_4=1。P1_5=0。Delay250。P1_5=1。P1_6=0Delay250。P1_6=1。P1_7=0。Delay250。P1_7=1。sbit 定义位变量,unsigned chara 定义无符字符型变量a,以节约单片机内部资源,其有效值为0255。main函数调用Delay函数。Delay 函数使单片机空
10、转, LED 连续点亮后,再灭,下一个LED 亮。 while1 产生循环。可以使变量a循环左移n位,如果我们先给P1口赋00000001那 么 当n为1时 , 便 会 产 生 和 上 面 一 样 的 效 果 !#include #includevoidDelayunsignedcharaunsignedwhilechar-a.=i。0fori=0。i。voidmainvoidunsignedwhile1charb,i。bfori=0=。iP1=_crol_b,1。b=Delay250P1。INTRINS.H函数中的 unsigned char _cror_unsigned char a, u
11、nsigned char n右移也可以实现同样的效果!这里就不再累述。流水灯的花样许多,我仍写过那种拉幕式的流淌等,程序很简洁,有爱好的伴侣,可以自己试着写写! 对了,讲了那么多,有些伴侣肯定仍不知道编译软件怎么用?这里给大家介绍几个吧?WAVENewProject- 输入文件名 - 挑选我们所以使用的芯片New- 输入我们编写的程序,储存为 .C 文件。 右击 Source Group 1 -Add Files to Group Source Group 1-挑选刚才保存的.C文件点击ADD后,关闭对话 框 。 这 样 .C文 件就 被 加 到 了SourceGroup1下。5.右击Targ
12、et 1-Options forTarget1-Target中填写晶体的大小,Output中,在Create定HEXFiles前打上钩,点确。6.点Project-RebuildAllTragetFiles creatinghex,如file提from示XXX.XXX-0Errors,0Warings.表示编译和生成HEX文件胜利!接下来的就是把HEX文件烧到单片机中,或是仿真器上,看是否达到预先的目的! 嘿嘿!现在是否自己好有成就感了,假如让你去做个流水彩灯,开发一个简洁的产品,只要加上 驱动 电路,就可以做出漂亮的流动彩灯了!到现在为止,你应当知道单片机的功能有多强大了吧,假如单纯的用数字
13、电路或模拟电 路的 知 识 去 设 计 一 个 流 动 彩 灯 ,可 能 要 花 点 工 夫和时间才行,有了单片机,那就不一样了,你只要写程序掌握他就行!有人说过这样一句话 ,也 并不无 道理 的,学 单片 机, 程序思 想很 重要 !四) 呵呵,伴侣!信任你的流水灯也做的不错了吧,现在能玩出几种花样了?你可能会说,只 要你 想 得 到 , 想 怎 么 流 就 怎 么 流 ! 呵 呵 , 是 的 。但是工程师们设计这么一个单片机,并不是只为了让它做流水灯的,那样也太铺张点了吧._学过数字电路的伴侣,肯定动手做过8 路或者 6 路的抢答器。用纯粹的数字电路学问来做 ,自 己设计 电路 ,感到 比
14、较 困难 !抢答 器上 用的 显示器多为7 段数码管,这里我们来讲讲,如何用单片机让数码管显示0-9 。抢答器的实现 , 我 们 放 到 后 面 再 来 探 讨 , 因 为 抢 答 器 仍 涉 及 了 键 盘 的内容。 8 段数码管分为共阴和共阳两种。8 段数码管是由8 个 LED 组成 a012345678900111111,0000 0110,01001111,0101 1011f|b|g|c e|.dp d一般情形下,为了运算或取码的便利,我们把a-dp 依次接到单片机某个口上的Px.0-可编辑资料 - - - 欢迎下载精品名师归纳总结Px.7上 。 x表 示0, 1, 2, 3其 中
15、的 一 个 。 这 样 我 们 只要给某个口,赋一个值,就相应的LED段就被点亮,但是在硬件连接上要留意了:单片机 可 能 不 能 直 接 驱 动LED, 所 以 我 们 可 以 通 过 控 制 三 级 管的导通或截止,来控制LED的亮与灭!假如我们把共阴的数码管的a-dp 依次接到单片机的P0.0-P0.7 上,留意: P0 口需接上拉 电阻 。 何 为 上 拉 电 阻 , 简 单 的 说 , 就 是 把 电 平 拉高,以提高驱动才能。那么比如:P0 = 0X3F 。就显示为数字 0 。由于 0X3F 即为 2 进制的00111111我们低位往高位数,依次为11111100, 其 I/O 的
16、电平分别为高、高、高、高、高、高、低、低,即对应的a-dp 为亮、亮、亮、亮 、 亮 、 亮 、 灭 、 灭 , 由 上 图 我 们 可 以 看 出g和dp段 不亮其他段均亮,即为我们所看到的数字0 字样。其他的数字或字符,也同理可以得到。但是 有些 朋 友 就 会 问 , 那 我 们 每 取 一 个 字 模 , 岂 不 是很麻烦?仍有自己考虑高低电平什么的?- 呵呵,其实网上有许多LED 取模软件,假如有 一定 计算机 编程 语言的 朋友 ,也 可以试 着自 己写 个取 模 的 程 序 , 让 计 算 机 为 我 们 计 算 , 诸 如 上 述0X3F的 数 值 。#includevoidD
17、elayunsignedcharaunsignedchari。while-a.=0fori=0。i。voidmainvoidP0=0X3F。/显示0Delay250。/延时P0=0X00 。 / 短 暂 的 关 闭 显 示 , 如 不 关 闭 , 可 能 会 造 成 显 示 模 糊 不 清 。P0=0X06。/显示1Delay250。P0=0X00。./以下显示数字2-F,略。看到这里,想必大家肯定可以把0-F 显示出来了吧!但是假如要你显示两位数,三位数了 ? 或 许 , 有 的 朋 友 会 这 么 想 : 在P0口 上 接 一 个数码管,再在 P1 口上接个数码管!但是,假如要显示4 位、
18、 5 位的数字了?那岂不是一块AT8951都 接 不 过 来 ! 难 到 就 不 能 接4位 或5位 以 上 的 吗 ?肯定不是的!可编辑资料 - - - 欢迎下载精品名师归纳总结说到这里,我们来讲讲数码管的显示方式,可分为两种:动态扫描和静态显示。上面我们 所说 的 即 为 静 态 显 示 。 但 是 如 果 我 们 采 用 动 态 扫描显示,那么就可以解决上面的问题,即可以显示多个数码管了。上面我们所说的静态显示 把 数 码 管 的COM脚 接 至VCC或GND端 , 其 他 的 接 至PX口上,这样只要PX 口上输出相应的高低电平,就可以显示对应的数字或字符。但是假如我 们 采 用 动
19、态 扫 描 的 方 法 , 比 如 显 示6个 数 码 管 , 硬 件连接可以这样解决:a-dp 仍是接至 P0.0-P0.7 上,仍有 6 个 COM脚再接至另外口的P2.0-P2.5。 P0口 作 段 选 控 制 数 字 字 符 ) P2口 作 位 选 选通哪个数码管导通)这样我们掌握P0 和 P2 口就可以掌握 6 个数码管了。但是,细心的伴侣 , 会 问 这 样 的 问 题 : P2位 选 , 是 让 数 码 管 一 个 一 个 亮的,那仍是不能掌握6 个一起亮或灭嘛!?_ 想想好象是对的哦?怎么办.莫非错了?嘿嘿,问你个问题?黑夜里,拿着一支烟,在你面前快速的晃动,你会发觉什么样的现
20、象 ? 是 不 是 原本 不 连 续 的 点 变 成 了 一 条 看 上 去 连续的曲线或者直线!再回过头来,认真想想我们的数码管!原理是一样的,你可别忘了,我 们的 单 片 机 可 是 一 个 计 算 机 哦 , 计 算 机 的 运 算 速度,大家可想而知吧!这里再说说 51 单片机的机器周期和时钟周期等概念。所谓机器周期就是拜访一次储备器 的 时 间 。 而 1 个 机 器 周 期 包 括 12 个 时 钟 周 期 。 如 果单片机工作在 12M 晶体下,那么一个时钟周期为: 1/12 微妙。一个机器周期 12*1/12 = 1 微 妙 。 如 果 晶 体 为 6M , 时 钟 周 期 和
21、 机 器 周 期 各 是 多 少 了?在汇编中,我们仍要关怀,指令执行的机器周期长短不一,有 1 个周期、 2 个周期和 4个周期等。说着说着,跑了这么远了.仍是回到原先的话题,假如我们把位选的P2 也看作上面的“ 烟” 一划而过 , 那 么我们看 到 的是不是6个一起 亮或一起灭了! _ 哈哈,原先如此 .记住,在任何某一时刻,有且只有一个数码管能发光。如果你能把这句话理解了,你是真明白我的意思了!伴侣,现在给你个任务,让6 个数码管分别显示1、 2、3、4、5、 6。看你自己可以搞定不?你自己先试着 写 写 看 咯 .#includevoidDelayunsignedcharaunsign
22、edwhilechar-a.=i。0fori=0。i。voidmainvoidwhile1可编辑资料 - - - 欢迎下载精品名师归纳总结P0=0x06。/1的码段P2=0x01。/选通一位,或者P2_0=1。Delay20。/延时约20P0=0X00。/关闭毫秒显示P0P2=0x02。0x5b/选Delay20P0=P0=0x4fP2=0x04。/选Delay20 P0=P0=0x66P2=0x08。/选Delay20P0=或0X00者的P2_1码=1。段或者P2_2=1。0X00。的码段或者P2_3=1。0X00。/2的码段通一位,。/3通一位,。/4通一位,P0=0x6d。/5的码段P2
23、=0x10。/选通一位,或者P2_4=1。Delay20。P0=0X00。P0=0x7d。/6的码段P2=0x20。/选通一位,或者P2_5=1。Delay20 P0=0X00。五)信任大家肯定见过数字时钟,教案楼大厅肯定有吧。每次路过,基本上只是任凭瞟上一眼 , 根 本 没 去想 过 他 的 工 作 原 理 什 么 。 但 是 今 天你 也 可 以 把 他 做 出 来 了 , 是 不 是 觉 得 自 己 很 有 成 就 感 了 ! 呵 呵 !_接上面所讲的,我们先来做个简洁的试验:在一个数码管上轮番显示 0-9 这 10 个数字 。 仍 楞 着 干 什 么 , 快 动 手 写 程 序 吖 !
24、 好 象 有 点 难 哦 , 要 不 先 不 要 往 下 看 了 , 嘿 嘿 , 关 机 吧 , 自 己 先 去 想 想 , 怎 么 样 ?#include可编辑资料 - - - 欢迎下载精品名师归纳总结unsigned char code SEG_TAB =0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f。/0-9数字void Delayunsigned inta/unsigned int定 义 为 无 符 整 形 , 取 值 范 围 为 0-32768unsignedchari。while-a.=0fori=0。i。voidmainvoid
25、unsignedchari。while1fori=0。iP0=SEG_TABiP2。/取=SEG_TAB数0X01组中的值。Delay1000。是不是显示从 0-9 ,跳动显示,你的心是不是也跟着一起跳吖,离我们的目标又迈进了一步!不错,继续努力! 上面只显示了一个数码管的数字0-9 ,但是怎么样要让他显示6 个数字了?这样我们就可以做个时钟出来玩玩了!仍记不记得我们前面讲过的P2口 的位选作用!嘿嘿,没忘记就好!#includeunsignedcharhour=12,min=0,sec=0。unsigned charcode SEG_TAB =0x3f,0x06,0x5b,0x4f,0x66
26、,0x6d,0x7d,0x07,0x7f,0x6f。/0-9数字voidDelayunsignedcharaunsignedchari。while-a.=0fori=0。i。可编辑资料 - - - 欢迎下载精品名师归纳总结voiddispvoidP0=SEG_TABsec%10。/显示秒的个位P2=0X01。Delay15。P2=0。P0=SEG_TABsec/10。/显示秒的十位P2=0X02。Delay15。P2=0。P0=SEG_TABmin%10。/显示分的个位P2=0X04。Delay15。P2=0。P0=SEG_TABmin/10。/显示分的十位P2=0X08。Delay15P2=
27、0。P0=SEG_TABhour%10。/显示时的个位P2=0X10。Delay15。P2=0。P0=SEG_TABhour/10。/显示时的十位P2Delay15 P2=0X200。voidmainvoidwhile1disp。编译烧录芯片后,观看运行现象。矣.怎么始终显示12: 00: 00,莫非是时钟没有启可编辑资料 - - - 欢迎下载精品名师归纳总结动 ? 仍 是 , 另 外 的 原 因 了 ?哦 , 原 来 是3个 变 量sec,min,hour 初始化后,其值始终没有转变!那我们怎么样才能让他转变数值了?有的朋友一 定 会 这 么认 为: 让秒 个位 延 时1秒, 后加1, 而秒十位延时10 秒后,再加1,始终加到6,分个位加1,依次类推 .这样的想法是不错