前面我们用两篇文章分别介绍了设计要求和原理图内容,我们已经对交通灯设计有了初步了解,这里,我们继续学习程序的编写。

这一篇我们用到的工具软件有:

思维导图制作软件

流程图制作软件

Keil4 c51编译软件

Proteus7 仿真软件

按照我们之前在第一篇文章里绘制的“基本功能和设计思路的图表”内容,在“设计思路”里面列出了两个方法,我们选择第一种,先制作仿真后制作实物。

01.分析程序中用到的内容

可能一开始让人觉得无从下手,这个程序到底怎么写,写什么内容?

不着急,我们回顾最开始的内容,那时候我们画了一个“基本功能和设计思路的图表”,现在就根据这个图表,给它添砖加瓦,增加程序的内容,有了内容,就能做出控制流程,有了控制流程,就会有程序……

看下图:

程序设计思路整理--思维导图

交通灯设计——从功能产生程序内容

从图中可以看出,有两大部分:

一是“功能”,这是我们第一篇文章里面的内容;

二是“程序内容”,这是根据“功能”的需求,制定出的程序要编写的内容。

后面,我们就根据程序内容来完成每个小定义、小函数的编写,直到给程序准备好所有的“材料”,那么搭建一个完整的程序结构也就水到渠成了。

02.确定程序控制流程

有了内容,把它们合理安排,就可以做出我们原先设计的功能。

程序的流程用图来表达会比语言描述更加形象和直观,虽然在实际程序编写过程中不一定会完全按照这个结构完成任务,但是,事先有一个清晰的思想脉络,是非常必要的。

下面是一个简单的主程序流程图:

交通灯控制主程序流程图

03. 绘制proteus仿真图

这里贴一张程序完成后的正常运行截图:

04. 选择编写和编译程序的工具

对于51单片机,编译器不二的选择当然是Keil C51,但是编写程序的编辑器可以有很多选择。

常见的代码编辑工具软件有:Sublime Text3、Atom、Visual Studio Code 等等。

要注意的一点是,用编辑软件编写源码时,编译软件Keil不要点保存文件(当然工程可以保存),只编译,这样就不容易出现乱码。

git也是必要的工具,对于单片机新手来说暂时不用也不影响。

05. 编写完整程序

函数较多,首先是编写头文件,定义端口;其次编写单个程序,逐一测试。最后整合起来,用主函数来控制执行顺序。

为了思路清晰,这里采用了状态切换的方式,也加入了模式切换。实际简单程序可以只用状态来切换,调理会更清晰。

主要的子函数有:定时中断、按键检测、数码管显示、倒计时计算、信号灯控制等。

下面是主函数:// 主函数

void main(void) {

Delay_ms(200);

PortInit();      // 初始化IO端口

Timer0Init();    // 初始化定时器0

TimeValueInit(); // 初始化倒计时时间值

StatusInit();    // 初始化状态

while (1) {

//判断模式

switch (uc_Mode) {

// 如果为正常模式

case kMode_Normal: {

if (g_flag1s == isYes) {    // 如果中断计数1S时间到

testTimeChangeState();    // 检测倒计时时间,时间到则改变状态

g_flag1s = isNo;          // 重置1S标记

if (uc_State == i_EWY) {

ioLed_EW_Yellow = isLedON;

} else if (uc_State == i_SNY) {

ioLed_SN_Yellow = isLedON;

}

} else if (g_flag05s == isYes) {  // 如果中断计数0.5S时间到

g_flag05s = isNo;               // 重置1S标记

if (uc_State == i_EWY) {

ioLed_EW_Yellow = isLedOFF;

} else if (uc_State == i_SNY) {

ioLed_SN_Yellow = isLedOFF;

}

}

mainDisplay();        // 主显示子程序(包含按键检测和执行子程序)

} break;

// 如果为设置时间模式

case kMode_SetTime: {

mainDisplay();        // 主显示子程序(包含按键检测和执行子程序)

g_flag1s = isNo;

} break;

//如果为深夜模式

case kMode_LateNight: {

//如果中断计数1S时间到

if (g_flag1s == isYes) {

g_flag1s = isNo;

ioLed_EW_Yellow = isLedON;

ioLed_SN_Yellow = isLedON;

} else if (g_flag05s == isYes) {

g_flag05s = isNo;

ioLed_EW_Yellow = isLedOFF;

ioLed_SN_Yellow = isLedOFF;

}

key_Monitor();  //监控键

} break;

//如果为其它模式

default: {

key_Monitor();  //监控键

} break;

}

}

}

上面给出编写主函数的例子。

一边编写程序,一边编译成代码,用仿真加载运行调试,不断修改完善。

06.总结与积累

同样的控制功能,程序有各种各样的写法,通常采用一种自己习惯的方式,但是也应该不断学习别人的优点,改变自己的的不好习惯。

当然,笔者更趋向于用实际电路调试,毕竟仿真和实际硬件往往存在不可预知的差异,有时候会出现很多奇怪的问题,而真实板子就没有哪些问题,前提是硬件要正常。

c51单片机c语言交通灯的程序设计,基于51单片机的交通灯设计(三)-编写c51程序相关推荐

  1. c51单片机时钟c语言程序设计,基于51单片机的电子时钟设计..doc

    -- I -- - - I -- 设计题目: 基于 51 单片机的电子时钟设计 摘要 单片机,是集 CPU ,RAM ,ROM ,定时器,计数器和多种接口于一体的微控制器.自 20 世纪 70 年代问 ...

  2. c语言爱心灯制作步骤,基于51单片机设计的心形花样灯(PCB+Proteus仿真+源程序+设计报告)...

    设计了一个基于51单片机的心形花样灯电路,该电路可以实现32个LED灯循环闪亮.依次熄灭.对角闪亮.对角熄灭.间隔闪亮.间隔熄灭等多种功能,可以显示42种不同形式的变化效果.该电路主要由单片机芯片ST ...

  3. 基于51单片机的公交车安全智能检测系统、基于51单片机的金属探测仪控制设计、基于单片机的智能电子密码锁系统设计、基于51单片机酒精浓度检测仪设计【资料转发分享】

    630基于51单片机的公交车安全智能检测系统-设计资料 本资料是基于单片机的公交车安全监测系统 具有如下功能: 1.监测环境的温度,超标报警.可以设置上下限 2.监测是否有火灾以及有毒气体,超标报警, ...

  4. 单片机c语言电梯程序设计,基于51单片机的模拟电梯控制系统设计.doc

    摘要:本文介绍了一种电梯模拟控制系统,包括怎样利用对STC89C52进行编程从而对电梯实现自由控制的方式.该系统采用了STC89C52芯片进行控制,用单片机进行编程,能实现的功能非常多而且方便设计,并 ...

  5. 51单片机c语言宏定义是什么意思,51单片机的C语言宏定义应用.doc

    1.预编译处理是单片机C语言程序设计中经常用到的一种方法.通过一些预处理命令可以为C语言本身提供许多功能和符号的扩充,增强C语言程序的灵活性和方便性. 常用的预处理命令有:宏定义.文件包含.条件编译等 ...

  6. 51单片机c语言数字输入输出,第五章 51单片机C语言程序--输入输出接口.pdf

    四川师范大学成都学院 51单片机原理及应用 单片机输入/输出口(I/O口) 主讲教师:刘强 四川师范大学成都学院电子竞赛培训实验中心(刘强) 明德.博学.求实.创新 复习1.单片机的外观 AT89C5 ...

  7. 单片机c语言编程30倒计时,急求51单片机倒计时三十秒程序

    急求51单片机倒计时三十秒程序 关注:117  答案:2  手机版 解决时间 2021-01-31 06:56 提问者青春统帅 2021-01-30 16:36 第二位同志请补充一下注释 谢谢 最佳答 ...

  8. 单片机c语言99秒的定时器,通过51单片机定时器1实现99秒倒计时

    今天刚刚完成了一个新的单片机实验,犯了一个小小的错误,导致不能够倒计时,弄了几个小时, 结果发现是变量的取值范围出错了 任何一个实验都应该自己动手去实践,没有实践是不知道自己少了什么的.只有实践才能够 ...

  9. 单片机6路抢答器c语言程序设计,基于51单片机六路抢答器DIY电子设计(原理图、源程序、PCB等)...

    主要功能: 1.采用4位数码管设计. 2.下排按键一一对应六位选手. 3.上排三个按键,从左到右依次为:开始.暂停.复位. 4.操作流程:上电后数码管显示"----"当主持人按下& ...

  10. c语言 修改密码源码,基于51单片机串口密码修改设计-(源码+电路图)

    名称:多功能电子密码锁(使用STM32平台 使用 keiluvision软件,用C语言写代码) 系统由STM32单片机核心板电路.7位按键电路.串口电路.电源电路.液晶1602电路.继电器模块电路和L ...

最新文章

  1. 跟小博老师一起学习数据库 ——SELECT
  2. 背单词:3年,34150分钟!
  3. 一些真诚的学习经验和生活感悟
  4. mysql 5.7.20 安装_MySql 5.7.20安装
  5. 听说你想从事中间件开发?
  6. 定义进项税代码缺省值
  7. 生成网站缩略图代码(C#)
  8. 做游戏,学编程(C语言) 9 贪吃蛇
  9. http get post java_Java发送http的get、post请求 - 穿梭于偶然
  10. SQLite 使用(针对Android)
  11. Array Vlink的应用
  12. Mac下安装与使用Medis
  13. Win11系统鼠标右键无法打开一直转圈解决方法
  14. PMP就是个垃圾证书,YES or NO
  15. nodejs+vue+mysql的高校二手跳蚤市场交易网站express
  16. uni-app - 随机数生成器,随机生成指定区间的整数或小数(支持指定小数点的位数)
  17. smbus协议的command_SMBus读取从设备数据总结
  18. 大学计算机(软件类)专业推荐竞赛 / 证书 官网及赛事相关信息整理
  19. 面试谈薪的四个关键点
  20. 苹果IOS内置应用介绍

热门文章

  1. 大数据应用及其解决方案(完整版)
  2. Windows XP 系统优化-百度转载
  3. 如何下载矢量道路路网电子地图
  4. 安卓rom制作教程_MIUI官方ROM(卡刷包、线刷包)合集
  5. matlab在数学教学,Matlab在数学函数教学中的应用
  6. 交叉火力dsp手机调音软件_万能dsp调音软件
  7. winform画图 抗锯齿
  8. 华为OLT(MA5680T)查看光猫光衰
  9. MindFusion教程:如何构建Java Swing中的区域图
  10. mysql 数据库基础教程(一)