找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2122|回复: 11
打印 上一主题 下一主题
收起左侧

初学51单片机之点灯程序详解

  [复制链接]
跳转到指定楼层
楼主
  对于单片机的学习,很多人都是从点灯程序开始的,这里我找到
了一个之前做实验的小板子,MCU是STC8H1K08,P54引脚接了一个
发光管经过电阻到地。由于P54引脚要拉高才能点亮发光管,所以端
口模式要设置成推挽模式,因此最最最简单的C语言点灯程序是下面的
样子:


  看起来是不是很简单?全部加起来包括花括号只有7行代码,其中第一
行是文件包含伪指令,它把STC公司提供的对应“头文件”包含到此程序
中来,下面六行是一个C语言函数的标准写法,只是名为“main”的函
数很特殊,它是必须的,不能被别的函数调用,所以没有返回值,也不
需要参数。“void”是C语言中“无类型”关键字,“main”左边的
“void”代表“main”函数的返回值是“无类型”。“main”右边的
小括号中的“void”是它的参数的类型。紧跟着的一对“花括号”中间
装的是“main”函数的具体内容,它里面有三个分号,C语言语句以分
号结尾,前两句用于设置P54端口为推挽模式,第三句才是拉高P54引脚
真正实现点亮发光管的语句,当然也可以在前两句中把端口设置为准双
向口模式也是可以点亮的,但是没有前两句的话则是不能点亮的。经过编
译,上图中可以看到生成了24字节的代码,没有错误和警告,下载到实验
板上实测能点亮发光管。
  再来看这三句C语言语句,中间都有“等号”,它可不是我们生活中
的“等于”的意思。“等号”右边就是数字,只是它的写法不常见,“等号”
左边是STC8H1K08这个芯片中寄存器的名字,它们都是在“头文件”中定
义的,大家可以用记事本或其它程序打开“头文件”仔细研究研究。什么是
寄存器?我们可以很形象的打个比方,说墙上有很多灯开关,其中一个叫
“P54”,我们在程序中把数字“1”写进“P54”这个开关中,然后灯这亮了,
也可以把数字“0”写进“P54”中,然后灯就灭了,所以这三个语句都是
把“等号”右边的数字写进左边的寄存器中,从而实现我们想要的结果。
  除了头文件外,单片机的制造商还会提供对应单片机的参考手册和数据
手册,STC则很独特的把这两个文件外加例程都写进了一个PDF文件中,目前
这个“STC8H技术参考手册”达到了1640页。想要学好用好这个单片机就要
认真阅读此手册。
  再来看一看“0x10”这个数字,其前缀“0x”代表它是16进制的数字,
翻译成常见的十进制的写法是“16”这个数字,同样的“0x00”就是十进制
的“0”,写成那样有强调它是一个8位数的意思,因为“等号”左边的
“P5M1”寄存器有8个位,语句的结果是要把8个位都写成“0”,而实际上
只需要把它的“4位”写成“0”就行了,其它的7个位最好是“保持原样”,
但是很遗憾,“等号”这种直接赋值的方式不能使其左边寄存器内的其它位
“保持原样”,必须得换一种写法才行,虽然“P54”可以直接赋值而不影响
其它“位”,但为了适应其它不支持“位操作”的单片机,我尽量少用这种
“位操作”的写法。同样的程序我改成了如下的样子:

#include  "STC8Hxx.h"
#define    BIT4    (0x10)//定义“4位”,注意这句没有分号!!
void  main(void)
{
P5M1  &=~(BIT4);//拉低复位
P5M0    |=  BIT4;//拉高置位
P5         |=  BIT4;//P54拉高置位
}
 
  其中“BIT4”对于单片机来说就是数字“0x10”,但是我们在读这个程
序的时候一眼就能看出是要对寄存器的哪一位做怎样的处理而不需要特别注明
语句的具体含义。我们要特别的记住“|=”是拉高某位(或某几位)而其它位保
持原样,“&=~”则是拉低某位(或某几位同时拉低的话要加圆括号括起来)而
其它位保持原样。
  当然,实际的程序不可能只是这么简单,比如“#define”这样的位定义就
有8行(或更多),
#define    BIT0    (0x01)
#define    BIT1    (0x02)
#define    BIT2    (0x04)
#define    BIT3    (0x08)
#define    BIT4    (0x10)
#define    BIT5    (0x20)
#define    BIT6    (0x40)
#define    BIT7    (0x80)
  我们可把这些(或更多的内容)写进我们自己的“Ext.h”这样一个头文件中,
然后包含进程序中,当然还要加上传说中的“大循环”:

#include  "STC8Hxx.h"
#include  "Ext.h"
void  main(void)//程序从主函数开始执行
{
P5M1  &=~(BIT4);//只运行一次的程序
P5M0    |=  BIT4;  //写这这里,
P5         |=  BIT4;  //比如初始化程序
while(1)//大循环
    {
    ;//要循环运行的语句写这里
    }
}//主程序结束
//中断函数可以写在下面

  今天就聊到这里,不足之处,欢迎指正。



评分

参与人数 2黑币 +55 收起 理由
SDDQ + 5 对新人非常友好,赞一个
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶7 踩
回复

使用道具 举报

沙发
ID:192020 发表于 2024-2-23 18:26 | 只看该作者
这种没有while循环的结束main后不知MCU处在什么状态?运行的什么语句呢?
回复

使用道具 举报

板凳
ID:1110945 发表于 2024-2-24 21:50 | 只看该作者
qq475878026 发表于 2024-2-23 18:26
这种没有while循环的结束main后不知MCU处在什么状态?运行的什么语句呢?

为帮助初学习者理解而省略了大循环的一个鲋程而已,
实际情况是它能编译通过并下载到单片机运行,也能成
功点亮发光管。我所知道的没有例外的都有大循环在主
函数中使程序“永远”运行下去。
也许,单片机的生产厂家能回答这样的问题,但这个问
题的答案对于我这样一般的单片机使用者来说好象没有
什么用处。
回复

使用道具 举报

地板
ID:961114 发表于 2024-3-28 09:47 | 只看该作者
初学应该学STC8H8K64U啊   有硬件USB,直接仿真啊
回复

使用道具 举报

5#
ID:1115793 发表于 2024-4-8 19:03 | 只看该作者
请问一下初学单片机应该如何入手?
回复

使用道具 举报

6#
ID:1116590 发表于 2024-4-14 16:28 | 只看该作者
不错降低了很多
回复

使用道具 举报

7#
ID:1117351 发表于 2024-4-19 16:10 | 只看该作者
对新人非常友好
回复

使用道具 举报

8#
ID:1118442 发表于 2024-4-26 17:17 | 只看该作者
如果学单片机直接,案列对着程序学习这样会不会学的快点
回复

使用道具 举报

9#
ID:1100807 发表于 2024-4-27 15:33 | 只看该作者
学习了,感谢分享。
回复

使用道具 举报

10#
ID:876947 发表于 2024-5-7 13:38 | 只看该作者
fan523709338 发表于 2024-4-26 17:17
如果学单片机直接,案列对着程序学习这样会不会学的快点

同感,同样的任务语句却也不同,有些迷糊。
回复

使用道具 举报

11#
ID:60122 发表于 2024-5-14 22:51 | 只看该作者
我能点亮的是单片机本体,算不算单片机点灯大师,
回复

使用道具 举报

12#
ID:61997 发表于 2024-5-19 21:54 | 只看该作者
这是STC最基础的单片机么
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表