十字路口红绿灯单片机课程设计
单片机十字路口红绿灯课程设计

单片机十字路口红绿灯课程设计课程设计题目:单片机十字路口红绿灯控制系统背景:在城市交通中,十字路口是交通流量较大且交通管理较为复杂的地方。
为了保证交通的顺畅和安全,需要对十字路口进行灯光信号控制。
本课程设计旨在通过单片机控制红绿灯的变换,模拟实现十字路口的交通信号控制。
要求:设计一个基于单片机的十字路口红绿灯控制系统,实现以下功能:1. 通过输入按钮模拟不同道路上车辆的存在,当某个道路上有车辆时,红灯延长时间,保证其安全通行。
2. 考虑到交通流量的不均匀性,设计红绿灯的时间分配策略,使得交通信号控制更加合理和高效。
3. 利用数码管显示红绿灯的时间倒计时,提高交通参与者的可视性和时效性。
4. 通过LED灯和蜂鸣器等输出设备模拟红绿灯的状态和声音提示。
步骤:1. 设计红绿灯控制程序框架,并确定使用的单片机型号和编程语言。
2. 通过按钮和传感器模拟车辆的存在与否,设计车辆检测模块。
3. 设计红绿灯时间分配策略,考虑道路交通流量和车辆检测结果。
4. 使用数码管显示红绿灯的时间倒计时,设计倒计时模块。
5. 编写程序代码,将各个模块进行逻辑连接和功能实现。
6. 验证代码的正确性和可靠性,进行调试和修改。
7. 使用LED灯和蜂鸣器等输出设备模拟红绿灯的状态和声音提示,设计输出模块。
8. 进行系统整体测试,保证各个模块的协调运行和功能完善。
9. 编写上机实验报告,包括系统设计原理、电路图、代码、测试结果和总结等内容。
注意事项:1. 在设计红绿灯时间分配策略时,需要考虑交通流量和车辆检测结果,并保证交通信号控制的合理性和高效性。
2. 在设计倒计时模块时,需要确保数码管能够正确显示红绿灯的时间倒计时,并保证可视性和时效性。
3. 在设计输出模块时,需要确保LED灯和蜂鸣器能够正确模拟红绿灯的状态和声音提示,提高交通参与者的可感知度和警示性。
4. 在进行系统整体测试时,需要保证各个模块间的协调运行和功能完善,保证系统能够正常运行并满足要求。
单片机课程设计(十字路口交通灯)

一、题目及要求题目:设计一个十字路口交通灯控制系统。
要求:1、观察一个装有交通灯的十字路口,根据东西南北方向红黄绿灯的变化规律画出运行时序图;2、设置开关S1、S2,分别开启和关闭整个系统;3、红黄绿灯用LED小灯表示,同时伴有数码管显示倒数;4、黄灯倒数时,伴随有提示音(用蜂鸣器);二、任务及目的首先根据课程设计所要求完成的功能确定系统的总体设计方案,接着进行相应的软件程序编制和硬件系统设计,然后在硬件电路和软件程序的相互配合下完成系统的仿真与调试,通过调试发现系统硬件与软件存在的问题,解决问题直至完全调试成功。
通过本次单片机课程设计掌握课堂学习的理论知识,掌握基本实践技能,并能进行一定的综合应用和探索。
通过课程设计,掌握分析问题、解决问题的方法,培养较强的动手能力和一定的单片机应用系统的设计和调试能力。
通过本次课程设计,学习与掌握单片机的定时、中断、键盘接口、动态显示数码管等电路的原理与使用方法。
同时培养团队合作能力,并能根据自己的实际情况取长补短。
三、思路及原理1、设计思路:假设十字路口东西方向的车流量大于南北方向的车流量,两个方向的通行时间不同,即东西方向通行时,东西方向绿灯亮15s,然后黄灯亮5s ——南北方向红灯亮20s;之后南北方向绿灯亮10s,黄灯亮5s ——东西方向红灯亮15s 。
然后依此循环。
黄灯倒数时,发出警告音,用以提示行人注意安全。
用两个开关分别开启和关闭系统。
各灯亮灭时序图如下:2、工作原理:此为单片机的模拟交通灯设计,系统以A T89C51芯片为核心,在硬件方面,除了CPU外,使用四个七段LED数码管显示,数码管采用的是动态扫描显示。
通过调试能够较准确显示倒数秒数。
两个简单的按键实现系统的开启与关闭。
软件方面采用C51单片机汇编语言编程。
晶振频率选12MHz。
关于本次设计的数字钟中的动态显示驱动电路:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的位选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
十字路口交通灯控制设计_十字路口交通灯控制设计(PLC设计课件)

接通, 当T1定时器ET值大于1s时,
接通,Q0.0得电,
A灯亮; 当T1定时器ET值大于2s时,
断开,Q0.0失电,A灯灭。
三、举例
任务3 十字路口交通灯控制设计
M0.0
T#4S
T1
TON
Time
IN
Q
PT
ET
T1.ET
T1.ET
Q0.1
B灯
T#2S
T#3S
M0.0启动后,T1定时器开始定时,ET值开始发生变化;此时ET值小于3s,
任务3 十字路口交通灯控制设计
一、比较指令符号
可以使用“等于”操作确定第一个 比较值是否等于第二个比较值。 要比 较的两个值必须为相同的数据类型。
该 LAD 触点比较结果为 TRUE 时, 则该触点会被激活。 在程序编辑器中 单击该指令后,可以从下拉菜单中选择 比较类型和数据类型。
任务3 十字路口交通灯控制设计
输出继电器 Q0.0 Q0.1 Q0.2 Q0.3 Q0.4 Q0.5
输出
输出元件 东西方向绿灯HL1 东西方向黄灯HL2 东西方向红灯HL3 南北方向绿灯HL4 南北方向黄灯HL5 南北方向红灯HL6
任务3 十字路口交通灯控制设计
二、硬件电路-PLC外部电路接线
24V
输出
电源
L N PE
QF
FU 1
三、梯形图设计
比较指令
按下启动按钮,当定时时间到达3S时,灯亮,定时时间到达5S时,灯灭。
一个定时器,完成3S,5S控制
循环
T0
M0.0 T0.Q
TON
Time
IN
Q
T#5s PT
ET
3S灯亮,5S灯灭
单片机课程设计单片机设计十字路口交通灯设计

单片机课程设计题目:十字路口交通灯设计班级:姓名:学号:指导教师:设计时间:评语:成绩目录摘要 ....................................................... - 1 - 1.引言 ....................................................... - 2 - 1.1课程设计背景. (2)1.2本文设计任务 (2)1.3本课程设计目的 (2)2.系统方案设计与原理 ........................................... - 2 - 2.1设计思路.. (2)2.2设计系统的运行过程 (3)3.硬件设计 ..................................................... - 4 - 3.1十字路口交通灯控制系统的硬件电路设计图.. (4)3.2硬件的功能分析 (5)4.软件设计 ..................................................... - 6 - 4.1主流程图..................................... 错误!未定义书签。
4.2倒计时显示流程图............................. 错误!未定义书签。
4.3状态地址分配................................. 错误!未定义书签。
4.4LED的字形代码表 ............................. 错误!未定义书签。
4.5程序清单..................................... 错误!未定义书签。
5.运行与调试 ...................................... 错误!未定义书签。
6.心得体会 ........................................ 错误!未定义书签。
交通红绿灯单片机控制课程设计

交通红绿灯课程设计要求:任务目标:某十字路口,南北向为主干道,东西向为支道,每个道口安装一组交通灯:红、黄、绿。
设计十字路口的交通灯控制器,使交通灯按状态1 状态2 状态3 状态4 的规律变化,循环不止。
状态1:东西向绿灯亮,南北向红灯亮,其他灯全灭,保持25 秒;状态2:东西向黄灯亮,南北向红灯亮,其他灯全灭,保持5 秒;状态3:东西向红灯亮,南北向绿灯亮,其他灯全灭,保持25秒;状态4:东西向红灯亮,南北向黄灯亮,其他灯全灭,保持5 秒。
原理图:调试效果图:C语言运行程序:#include<reg52.h>sbit gre1=P2^0; sbit yel1=P2^1; sbit red1=P2^2; sbit gre3=P3^0; sbit yel3=P3^1; sbit red3=P3^2; sbit bi1=P3^6; sbit bi2=P3^7;void dx();void yan(int cs); void display2(); void display3(); void display31(); void display32(); void display33(); void display34(); void display35();int a,b=0;unsigned char table1[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0x f8,0x80,0x90} ;void main(){P1=0X00;P0=0X00;EA=1;EX1=1;// IT0=0;while(1){dx();}}void dx(){red1=0; gre3=0; display3(); gre3=1; yel3=0; display31(); yel3=1; display32(); yel3=0; display33(); yel3=1; display34(); yel3=0; display35(); red1=1; yel3=1; gre1=0; red3=0;display2();gre1=1;yel1=0;display31();yel1=1;display32();yel1=0;display33();yel1=1;display34();yel1=0;display35();yel1=1;red3=1;}void display2(){int i;for(i=0;i<50;i++){bi1=0;bi2=1;P1=table1[0];P0=table1[5];yan(10);bi2=0;bi1=1;P1=table1[2];P0=table1[2];yan(10);}for(i=0;i<50;i++){bi1=0;P1=table1[9];P0=table1[4];yan(10);bi2=0;bi1=1;P1=table1[1];P0=table1[2];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[8];P0=table1[3];yan(10);bi2=0;P1=table1[1];P0=table1[2];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[7];P0=table1[2];yan(10);bi2=0;bi1=1;P1=table1[1];P0=table1[2];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[6];P0=table1[1];yan(10);bi2=0;bi1=1;P1=table1[1];P0=table1[2];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[5];yan(10);bi2=0;bi1=1;P1=table1[1];P0=table1[2];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[4];P0=table1[9];yan(10);bi2=0;bi1=1;P1=table1[1];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[3];P0=table1[8];yan(10);bi2=0;bi1=1;P1=table1[1];P0=table1[1];yan(10);}for(i=0;i<50;i++) {bi2=1;P1=table1[2];P0=table1[7];yan(10);bi2=0;bi1=1;P1=table1[1];P0=table1[1];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[1];P0=table1[6];yan(10);bi1=1;P1=table1[1];P0=table1[1];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[0];P0=table1[5];yan(10);bi2=0;bi1=1;P1=table1[1];P0=table1[1];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[9];P0=table1[4];yan(10);bi2=0;bi1=1;P1=table1[0];P0=table1[1];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P0=table1[3];yan(10);bi2=0;bi1=1;P1=table1[0];P0=table1[1];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[7];P0=table1[2];yan(10);bi2=0;bi1=1;P0=table1[1];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[6];P0=table1[1];yan(10);bi2=0;bi1=1;P1=table1[0];P0=table1[1];yan(10);}for(i=0;i<50;i++){bi1=0;bi2=1;P1=table1[5];P0=table1[0];yan(10);bi2=0;bi1=1;P1=table1[0];P0=table1[1];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[4];P0=table1[9];yan(10);bi2=0;bi1=1;P1=table1[0];P0=table1[0];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[3];P0=table1[8];yan(10);bi2=0;bi1=1;P1=table1[0];P0=table1[0];}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[2];P0=table1[7];yan(10);bi2=0;bi1=1;P1=table1[0];P0=table1[0];yan(10);}for(i=0;i<50;i++) {bi1=0;P1=table1[1];P0=table1[6];yan(10);bi2=0;bi1=1;P1=table1[0];P0=table1[0];yan(10);}}void display3(){int i;for(i=0;i<50;i++){bi1=0;P1=table1[5];P0=table1[0];yan(10);// bi1=1;bi2=0;bi1=1;P1=table1[2];P0=table1[2];yan(10);}for(i=0;i<50;i++){bi1=0;bi2=1;P1=table1[4];P0=table1[9];yan(10);bi1=1;P1=table1[2];P0=table1[1];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[3];P0=table1[8];yan(10);bi2=0;bi1=1;P1=table1[2];P0=table1[1];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[2];P0=table1[7];yan(10);bi2=0;bi1=1;P1=table1[2];P0=table1[1];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P0=table1[6];yan(10);bi2=0;bi1=1;P1=table1[2];P0=table1[1];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[0];P0=table1[5];yan(10);bi2=0;bi1=1;P0=table1[1];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[9];P0=table1[4];yan(10);bi2=0;bi1=1;P1=table1[1];P0=table1[1];yan(10);}for(i=0;i<50;i++){bi1=0;bi2=1;P1=table1[8];P0=table1[3];yan(10);bi2=0;bi1=1;P1=table1[1];P0=table1[1];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[7];P0=table1[2];bi2=0;bi1=1;P1=table1[1];P0=table1[1];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[6];P0=table1[1];yan(10);bi2=0;bi1=1;P1=table1[1];P0=table1[1];}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[5];P0=table1[0];yan(10);bi2=0;bi1=1;P1=table1[1];P0=table1[1];yan(10);}for(i=0;i<50;i++) {bi1=0;P1=table1[4];P0=table1[9];yan(10);bi2=0;bi1=1;P1=table1[1];P0=table1[0];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[3];P0=table1[8];yan(10);bi2=0;P1=table1[1];P0=table1[0];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[2];P0=table1[7];yan(10);bi2=0;bi1=1;P1=table1[1];P0=table1[0];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[1];P0=table1[6];yan(10);bi2=0;bi1=1;P1=table1[1];P0=table1[0];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[0];yan(10);bi2=0;bi1=1;P1=table1[1];P0=table1[0];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[9];P0=table1[4];yan(10);bi2=0;bi1=1;P1=table1[0];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[8];P0=table1[3];yan(10);bi2=0;bi1=1;P1=table1[0];P0=table1[0];yan(10);}for(i=0;i<50;i++) {bi2=1;P1=table1[7];P0=table1[2];yan(10);bi2=0;bi1=1;P1=table1[0];P0=table1[0];yan(10);}for(i=0;i<50;i++) {bi1=0;bi2=1;P1=table1[6];P0=table1[1];yan(10);bi1=1;P1=table1[0];P0=table1[0];yan(10);}}void display31(){int i;for(i=0;i<50;i++){bi1=0;bi2=1;P1=table1[5];P0=table1[5];yan(10);bi1=1;P1=table1[0];P0=table1[0];yan(10);}}void display32(){int i;for(i=0;i<50;i++){bi1=0;bi2=1;P1=table1[4];P0=table1[4];yan(10);bi2=0;P1=table1[0];P0=table1[0];yan(10);}}void display33(){int i;for(i=0;i<50;i++){bi1=0;bi2=1;P1=table1[3];P0=table1[3];yan(10);bi2=0;bi1=1;P1=table1[0];P0=table1[0];yan(10);}}void display34(){int i;for(i=0;i<50;i++){bi1=0;bi2=1;P1=table1[2];P0=table1[2];yan(10);bi2=0;bi1=1;P1=table1[0];P0=table1[0];yan(10);}}void display35(){int i;for(i=0;i<50;i++){bi1=0;bi2=1;P1=table1[1];P0=table1[1];yan(10);bi2=0;bi1=1;P1=table1[0];P0=table1[0];yan(10);}}void int1() interrupt 2 {P1=0Xff;P0=0Xff;gre1=1;yel1=1;red1=1;gre3=1;yel3=1;red3=1;while(1){}}void yan(int cs){int i,j;for(i=0;i<cs;i++){for(j=0;j<125;j++){};}}。
单片机十字路口交通灯课程设计

单片机十字路口交通灯课程设计一、选题背景在城市化发展的进程中,车辆数量不断增加,而道路的通行能力和安全性则成为了重要的问题。
为了更好地维护道路秩序和人员安全,十字路口交通灯的控制系统变得更加重要。
单片机十字路口交通灯控制系统被广泛应用,方便了我们的出行和提高了道路安全性能。
二、实践目的本实践目的是通过课程设计的方式,让学生了解单片机控制系统的基本工作原理,熟悉单片机的硬件和软件编程,掌握单片机交通灯控制的基本原理和编程思路。
三、课程设计内容1.单片机硬件环境的搭建学生需要根据自己的实际情况,选购配备单片机控制系统必须的硬件设备,如主控板、LED灯、按钮、电源等,并完成硬件的配置和连接。
在这一过程中,学生需要仔细查阅相关资料和参考样例,了解硬件配置和引脚连接的基本规则,同时要保证连接的正确性和固定性。
2.交通灯控制系统的演示程序设计学生通过编写程序实现交通灯的控制,该程序要能够模拟交通信号的灯光交替变换。
学生需要了解程序基础知识,如编程语言、常用命令等,并要熟悉调试程序的过程和方法。
学生还需要在编写程序时,关注程序的可移植性和可扩展性。
3.硬件和软件协作调试学生通过调试程序控制挂在硬件上的LED灯,调整交通灯的时间段和信号交替顺序,实现单片机交通灯控制系统的基本功能。
在调试过程中,学生要注意硬件和软件相互协作的关系,遇到问题需要逐一排除和解决。
4.系统性能评估学生通过运行程序和控制实验,分析单片机交通灯控制系统的性能表现和优缺点,并提出改进措施。
学生需要考虑系统的稳定性、控制精度、反应速度及扩展性等指标,评估系统的性能表现,同时提出改进措施和意见。
四、实践结果分析通过该课程设计项目的实践活动,学生得到了以下的收获:1.学习了单片机交通灯控制系统的硬件和软件知识,掌握了实际应用中的基本原理和编程思路。
2.了解了单片机控制系统的工作环境,利用实践的过程熟悉了硬件连接和调试的常用方法和技巧。
3.熟练掌握了编程语言,能够灵活地组织程序实现交通灯的控制,进一步完善和提高了自己的编程技能。
单片机红绿灯课程设计

单片机红绿灯课程设计一、课程目标知识目标:1. 让学生理解单片机的基本原理,掌握红绿灯控制流程;2. 使学生掌握单片机编程的基本语法和逻辑结构;3. 让学生了解红绿灯在实际交通中的应用和意义。
技能目标:1. 培养学生运用单片机进行红绿灯控制程序编写的能力;2. 培养学生动手实践、调试程序的能力;3. 培养学生团队协作、沟通表达的能力。
情感态度价值观目标:1. 培养学生对单片机及编程的兴趣,激发学习热情;2. 培养学生严谨、细心的学习态度,提高问题解决能力;3. 培养学生遵守交通规则,关爱生命,关注社会发展的意识。
课程性质:本课程为实践性较强的课程,注重理论知识与实践操作的结合。
学生特点:学生具备一定的电子技术基础,对单片机有一定了解,喜欢动手实践。
教学要求:结合课本内容,注重理论与实践相结合,培养学生实际操作能力和团队协作能力。
将课程目标分解为具体的学习成果,便于教学设计和评估。
二、教学内容1. 理论知识:(1)单片机基本原理及结构;(2)编程语言基础,如C语言;(3)红绿灯控制流程及逻辑设计;(4)交通规则及红绿灯的实际应用。
2. 实践操作:(1)单片机编程环境搭建;(2)编写红绿灯控制程序;(3)电路连接与调试;(4)团队协作,完成红绿灯控制系统设计。
教学大纲安排:1. 第一周:介绍单片机基本原理、结构及编程语言基础;2. 第二周:学习红绿灯控制流程及逻辑设计;3. 第三周:实践操作,搭建编程环境,编写控制程序;4. 第四周:电路连接与调试,优化程序;5. 第五周:团队协作,完成红绿灯控制系统设计,总结与展示。
教材章节及内容:1. 课本第1章:单片机原理及结构;2. 课本第2章:C语言编程基础;3. 课本第3章:单片机控制流程及逻辑设计;4. 课本第4章:实践操作及项目案例。
教学内容确保科学性和系统性,注重理论与实践相结合,使学生能够全面掌握单片机红绿灯控制技术。
三、教学方法1. 讲授法:针对单片机基本原理、编程语言基础等理论知识,采用讲授法进行教学。
单片机课程设计红绿灯

单片机课程设计红绿灯一、教学目标本章节的教学目标是让学生了解和掌握单片机在交通信号灯控制系统中的应用。
通过本章节的学习,学生应能理解交通信号灯的工作原理,掌握单片机的基本编程和电路连接,培养学生的实际操作能力和创新思维。
具体来说,知识目标包括:1.了解交通信号灯的工作原理和作用。
2.掌握单片机的基本编程和电路连接。
3.了解如何利用单片机实现交通信号灯的控制。
技能目标包括:1.能够独立设计和连接单片机电路。
2.能够编写简单的单片机程序。
3.能够对交通信号灯控制系统进行调试和优化。
情感态度价值观目标包括:1.培养学生的团队合作意识和沟通能力。
2.培养学生对科技创新的兴趣和热情。
3.培养学生对交通安全的重视和责任感。
二、教学内容本章节的教学内容主要包括交通信号灯的工作原理、单片机的基本编程和电路连接,以及如何利用单片机实现交通信号灯的控制。
具体来说,教学大纲如下:1.交通信号灯的工作原理和作用:介绍交通信号灯的基本工作原理和其在交通管理中的作用。
2.单片机的基本编程:学习单片机的基本编程语言和编程技巧,包括数据的输入输出、逻辑运算和控制语句等。
3.单片机电路连接:学习单片机的基本电路连接方法,包括电源电路、输入输出电路和传感器电路等。
4.交通信号灯控制系统的实现:学习如何利用单片机实现交通信号灯的控制,包括编程设计、电路连接和系统调试等。
三、教学方法为了达到本章节的教学目标,将采用多种教学方法相结合的方式进行教学。
包括讲授法、讨论法、案例分析法和实验法等。
通过讲授法,向学生传授交通信号灯的工作原理和单片机的基本编程知识。
通过讨论法,引导学生进行思考和交流,培养学生的团队合作意识和沟通能力。
通过案例分析法,让学生通过分析实际案例,深入理解交通信号灯控制系统的实现方法。
通过实验法,让学生亲自动手进行电路连接和编程设计,提高学生的实际操作能力和创新思维。
四、教学资源为了支持本章节的教学内容和教学方法的实施,将选择和准备适当的教学资源。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
黄河科技学院课程设计任务书工学院机械系机械设计制造及其自动化专业10 级班学号姓名指导教师题目: 彩灯控制器的设计课程:单片机课程设计课程设计时间 2013年10月28日至2013年11 月10 日共2 周一、设计要求:利用AT89C51单片机的4位数字加法计算器,能进行加减运算。
创新要求:功能键能清零、超出位数光报警提示、违规操作声报警二、设计方案分析:采用4×4键盘,键盘定义十个数字键,六个功能键,使用串行动态显示显示运算结果。
主程序进行初始化,采用行列扫描进行查表得出键值,每次按键后调用显示子程序。
主要单元电路的设计复位电路复位电路采用上电复位与手动复位相结合的方案。
上电复位时,上电瞬间RST 端的电位与VCC相同,即为高电平,随着充电电流的减小,RST端的电位逐渐下降。
只要高电平保持时间足够长,就可以使AT89C52有效地复位。
手动复位时,按下复位按钮,电容C1通过R2电阻迅速放电,使RST端迅速变为高电平,复位按钮松开后,电容通过R和内部下拉电阻放电,逐渐使RST端恢复为低电平。
电路如图所示晶振电路晶振电路是单片机的心脏,它用于产生单片机工作所需要的时钟信号,晶振电路给数字钟提供一个频率稳定准确的方波信号,可保证数字钟的走时准确及稳定,晶振电路如图键盘电路的设计键盘可分为两类:编码键盘和非编码键盘。
编码键盘是较多按键(20个以上)和专用驱动芯片的组合,当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。
通用计算机使用的标准键盘就是编码键盘。
当系统功能比较复杂,按键数量很多时,采用编码键盘可以简化软件设计。
但大多数智能仪器和电子产品的按键数目都不太多(20个以内),为了降低成本和简化电路通常采用非编码键盘。
非编码键盘的接口电路有设计者根据需要自行决定,按键信息通过接口软件来获取。
本课题需要的是16个按键,故选择用非编码键盘。
计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。
矩阵键盘采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为4×4个。
这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。
建立键码值,建立键值码表TABLE如下:0CH 08H 04H 00H0DH 09H 05H 01H0EH 0AH 06H 02H0FH 0BH 07H 03H对应的键盘按键为:×8 4 0÷9 5 1= + 6 2功能-7 3报警电路当超出位数时,调用喇叭程序,信号通过三极管放大后驱动扬声器,发出相应的声音。
如图所示三、硬件电路设计图用P1.0~P1.3作为行扫描输出,P1.4~P1.7作为列扫描输入,P0.0~P0.3作为键值码输出送出译码器7447,7447是美国仙童公司生产的BCD码到7段数码管的译码器驱动芯片。
它负责将4位BCD码十进制数转换成对应的7段数码管信号,送到数码管的7位段选输入端。
译出的显示码送入数码管的段驱,P0.4~P0.6控制译码器74LS138,74LS138译码器负责数码管显示扫描时依次通过译码选中数码管中,译码输出控制数码管的位驱。
电路图如下图所示:四、软件部分设计程序工作过程如下:(1)首先赋予显示缓冲初始值‘00’,并把数据存储单元清零。
(2)主程序调用键盘扫描子程序,判断键值,是数字第一次直接赋予34H单元,如是第二次输入数字,则把第一次值乘十后与第二次值相加,结果存储到33H单元,如是第三次输入数字,则把前两次值乘十后与第三次值相加,结果存储到32H单元,在等待运算符号的按下,按下等于号就直接计算并显示,如加减乘除就运算后把按键次数清零,表示可以输入下一操作数,与第一次相同,并等待等于键按下。
清零键则不管在任何情况下都清零,相当于软复位。
(3)在扫描完键盘后,调用数据显示转换子程序把值转换为七段码。
(4)调用数码管动态显示子程序,显示数值,重新循环。
系统总流程图主程序主要是用来进行初始化的,调用其他子程序,清空各个标志位,清空缓存区,读取键码,判断功能,在LED 上作出回应。
(1)数字送显示缓冲程序设计简易计算器所显示的数值最大位四位。
要显示数值,先判断数值大小和位数,如果是超过四位,将不显示数字,并调用喇叭程序提示错误。
可重新输入数字,再次计算。
(2)运算程序的设计首先初始化参数,送LED 三位显示“0”,其它位不显示。
然后扫描键盘看是否有键输入,若有,读取键码。
判断键码是数字键、清零键还是功能键,是数值键则送LED 显示并保存数值,是清零键则做清零处理,是功能键则又判断是“=”还是运算键,若是“=”则计算最后结果并送LED 显示,若是运算键则保存相对运算程序的首地址。
流程图判断按键存入内存单元Y将第一次输入的数字×10 +第二次输入的数字YN是否是数字键扫描键盘 有输入则计算键值计算结果并送内存单元是否是清零YN等待输入等号 开始是否第一次输入数字N五、调试与仿真下面用KEIL uVision3与proteus仿真软件介绍十进制加法计算器的仿真与调试。
Keil C51单片机软件开发系统(一)系统的整体结构C51工具包的整体结构中,其中uVision是C51 for Windows的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。
开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。
然后分别由C51编译器编译生成目标文件(.OBJ)。
目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。
ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。
(二)采用KEIL 开发的89c51单片机应用程序步骤:1. 在uVision 集成开发环境中创建新项目(Project),扩展文件名为.UV2,并为该项目选定合适的单片机CPU器件(本设计采用ATMEL 公司下的AT89C51)2. 用uVision 的文本编辑器编写源文件,可以是汇编文件(.ASM),也可以使C语言文件(扩展名.C),并将该文件添加到项目中去。
一个项目文件可以包含多个文件,除了源程序文件外,还可以是库文件、头文件或文本说明文件。
3. 通过uVision 3 的相关选择项,配置编译环境、连接定位器以及Debug调试器的功能。
4. 对项目中的源文件进行编译连接,生成绝对目标代码和可选的HEX文件,如果出现编译连接错误则返回到第2步,修改源文件中的错误后重构整个项目。
5. 对没有语法错误的程序进行仿真调试,调试成功后将HEX文件写入到单片机应用系统的ROM中。
proteus的操作(一)硬件电路图的接法操作1.放置选择(删除)元器件2.移动元器件3.缩放视图4.连接导线5.仿真,调试(二)单片机系统PROTEUS设计与仿真过程Proteus强大的单片机系统设计与仿真功能,使它可成为单片机系统应用开发和改进手段之一。
全部过程都是在计算机上通过Proteus来完成的。
其过程一般也可分为三步:1.在ISIS平台上进行单片机系统电路设计、选择元器件、接插件、连接电路和电气检测等,简称Proteus电路设计。
2.在Keil平台上进行单片机系统程序设计、编辑、汇编编译、代码级调试,最后生成目标代码文件(*.hex)。
简称Proteus源程序设计和生成目标代码文件。
3.在ISIS平台上将目标代码文件加载到单片机系统中,并实现单片机系统的实时交互、协同仿真。
它在相当程度上反映了实际单片机系统的运行情况。
简称Proteus仿真。
(三)Proteus中课程设计的仿真结果在Proteus中将硬件电路全部接好以后,将Keil中生成的.hex文件导入到单片机中,点击开始仿真按钮,电路开始仿真。
可以观察到:数码管显示“000”;分别依次按下按键“5”、“+”、“6”和“=”,可以看到数码管显示“11”;也可以分别调试其它功能键,结果发现调试结果与预期的理论值相吻合,即本次课设已成功。
(四)程序清单:JG EQU 50H ;结果存放JG1 EQU 51H ;中间结果存放GONG EQU 52H ;功能键存放ORG 0000HSTART: MOV R4,#06HMOV GONG,#0MOV R0,#31HCLEAR: MOV @R0,#00HINC R0DJNZ R4,CLEAR ;清除31H~34H地址单元的内容MLOOP: CALL DISP ;调显示子程序WAIT: CALL TESTKEY ;判断有无按键JZ WAITCALL GETKEY ;读键INC R3 ;按键个数CJNE A,#0,NEXT1 ;判断是否数字键LJMP E1 ;转数字键处理NEXT1: CJNE A,#1,NEXT2LJMP E1NEXT2: CJNE A,#2,NEXT3LJMP E1NEXT3: CJNE A,#3,NEXT4LJMP E1NEXT4: CJNE A,#4,NEXT5LJMP E1NEXT5: CJNE A,#5,NEXT6LJMP E1NEXT6: CJNE A,#6,NEXT7LJMP E1NEXT7: CJNE A,#7,NEXT8LJMP E1NEXT8: CJNE A,#8,NEXT9LJMP E1NEXT9: CJNE A,#9,NEXT10LJMP E1NEXT10: CJNE A,#0AH,NEXT11 ;判断是否功能键LJMP E2 ;转功能键处理NEXT11: CJNE A,#0BH,NEXT12LJMP E2NEXT12: CJNE A,#0CH, NEXT13LJMP E2NEXT13: CJNE A,#0DH,NEXT14LJMP E2NEXT14: CJNE A,#0EH,NEXT16LJMP E2NEXT15: LJMP E3 ;判断是否清除键E1: CJNE R3,#1,N1 ;判断第几次按键LJMP E11 ;为第一个数字N1: CJNE R3,#2,N2LJMP E12 ;为第二个数字N2: CJNE R3,#3,N3LJMP E13 ;为第三个数字N3: CJNE R3,#4,N4LJMP E13 ;为第四个数字N4: LCALL ERROR ;调用错误警示喇叭程序LJMP E3 ;第五个数字转溢出E11: MOV R4,A ;输入值暂存R4MOV 34H,A ;输入值送显示缓存MOV 33H,#00HMOV 32H,#00HLJMP M LOOP ;等待再次输入E12: MOV R7,A ;个位数暂存R7MOV B,#10MOV A,R4MUL AB ;十位数ADD A,R7MOV R4,A ;输入值存R4MOV 32H,#00H ;输入值送显示缓存MOV 33H,34HMOV 34H,R7LJMP MLOOPE13: MOV R7,AMOV B,#10MOV A,R4MUL ABJB OV,E3 ;输入溢出ADD A,R7JB CY,E3 ;输入溢出MOV R4,AMOV 32H,33H ;输入值送显示缓存MOV 33H,34HMOV 34H,R7LJMP MLOOPE3: MOV R3,#0 ;按键次数清零MOV R4,#0 ;输入值清零MOV JG,#0 ;计算结果清零MOV GONG,#0 ;功能键设为零MOV 32H,#00H ;显示清空MOV 33H,#00HMOV 34H,#00HLJMP MLOOPE2: MOV 34H,#00HMOV 33H,#00HMOV 32H,#00HMOV R0,GONG ;与上次功能键交换MOV GONG,AMOV A,R0CJNE A,#10,N21 ;判断功能键LJMP JIA ;"+"N21: CJNE A,#11,N22LJMP JIAN ;"-"N22: CJNE A,#12,N23LJMP C HENG ;"*"N23: CJNE A,#13,N24LJMP CHU ;"/"N24: CJNE A,#0,N25LJMP FIRST ;首次按功能键N25: LJMP DEN ;"="N4: LJMP E3FIRST: MOV JG,R4 ;输入值送结果MOV R3,#0 ;按键次数清零LJMP DISP1 ;结果处理JIA: MOV A,JG ;上次结果送累加器 ADD A,R4 ;上次结果加输入值JB CY,N4 ;溢出MOV JG,A ;存本次结果MOV R3,#0 ;按键次数清零LJMP DISP1JIAN: MOV A,JGSUBB A,R4 ;上次结果减输入值JB CY,N4 ;负数溢出MOV JG,AMOV R3,#0LJMP DISP1CHENG: MOV A,JGMOV B,AMOV A,R4MUL AB ;上次结果乘输入值JB OV,N4 ;溢出MOV JG,ALJMP DISP1CHU: MOV A,R4MOV B,AMOV A,JGDIV AB ;上次结果除输入值MOV JG,AMOV R3,#0LJMP DISP1DEN: MOV R3,#0LJMP DISP1DISP1: MOV B,#10MOV A,JG ;结果送累加器DIV AB ;结果除10MOV JG1,A ;暂存"商"MOV A,B ;取个位数MOV 34H,A ;个位数送显示缓存MOV A,JG1JZ DISP11 ;结果是否为一位数MOV B,#10MOV A,JG1DIV ABMOV JG1,AMOV A,BMOV 33H,A ;十位送显示缓存MOV A,JG1JZ DISP11 ;结果是否为二位数MOV B,#10MOV A,JG1DIV ABMOV JG1,AMOV A,BMOV 32H,A ;十位送显示缓存MOV A,JG1MOV 31H,A ;百位数送显示缓存DISP11: LJMP MLOOPDISP: MOV R0,#34HDIR1: MOV DPTR,#SEGTABMOV A,@R0MOVC A,@A+DPTRMOV P0,ACJNE R0,#34H,DIR2SETB P2.0CALL D1MSCLR P2.0DEC R0SJMP DIR1ERROR:X1: LCALL BZ ;调用喇叭响应程序CLR 26H.0 ;调用喇叭响应程序结束LCALL DELAYCLR 26H.0BZ: MOV C,26H.1CPL P2.4MOV R7,#0FH ;喇叭响应时间T2: MOV R6,#0FHT3: DJNZ R6,T3DJNZ R7,T2SETB P2.3RETTESTKEY:ACALL DISPMOV P1,#0FH ;读入键状态MOV A,P1CPL AANL A,#0FH ;高四位不用RETTABLE:DB 0CH,08H,04H,00H ;键码定义DB 0DH,09H,05H,01HDB 0EH,0AH,06H,02HDB 0FH,0BH,07H,03HGETKEY: MOV R6,#10 ;读键子程序ACALL DELAYMOV P1,#0FHMOV A,P1CJNE A,0FH,K12LJMP MLOOPK12: MOV B,AMOV P1,#0EFHMOV A,P1CJNE A,#0EFH,K13MOV P1,#0DFHMOV A,P1CJNE A,#0DFH,K13MOV P1,#0BFHMOV A,P1CJNE A,#0BFH,K13MOV P1,#07FHMOV A,P1CJNE A,#07FH,K13LJMP MLOOPK13: ANL A,#0F0HORL A,BMOV B,AMOV R1,#16MOV R2,#0MOV DPTR,#TABLEK14: MOV A,R2MOVC A,@A+DPTRCJNE A,B,K16MOV P1,#0FHK15: MOV A,P1CJNE A,#0FH,K15MOV R6,#10ACALL DELAYMOV A,R2RETK16: INC R2DJNZ R1,K14AJMP MLOOP;10ms延时子程序DELAY: MOV R7,#10TS1: MOV R6,#0FFHTS2: NOPNOPDJNZ R6,TS2DJNZ R7,TS1RETEND六、心得体会刚开始的时候还真的不知道从哪里设计好,一点头绪都没有,就开始在上网查资料,还去图书馆查资料,解之后自己尝试编写程序,在此过程中,其中键盘扫描和动态扫描显示扫描程序困扰了我很久,经过三四天的辛苦工作,终于初步把所需要的程序编好了,于是就用Keil uversion3进行仿真,在仿真期间也发现了许多错误,基本上都是平日容易犯的错误,比如忘记了子程序标号、死循环程序、标点符号的漏写等。