第一篇:基于单片机的数字PID控制直流电机PWM调压调速器系统
题目: 基于单片机的数字PID控制直流电机PWM 调压调速器系统
目录
一、PID简介··································(6)
二、设计原理··································(7)
三、设计方案··································(8)
四、心得体会
·······························(16)
五、参考文献 ·······························(16)
二、设计原理
基本的设计核心是运用PID调节器,从而实现直流电机的在带动负载的情况下也能稳定的运行。运用A/D转换芯片将滑动变阻器的模拟电压转换为数字量作为控制直流电机速度的给定值;用压控振荡器模拟直流电机的运行(电压高-转速高-脉冲多),单片机在单位时间内对脉冲计数作为电机速度的检测值;应用数字PID模型作单片机控制编程,其中P、I、D参数可按键输入并用LED数码显示;单片机PWM调宽输出作为输出值,开关驱动、电子滤波控制模拟电机(压控振荡器)实现对直流电机的PID调压调速功能。
基于以上的核心思想,我们把这次设计看成五个环节组成,其具体的原理如下见原理图2.0
图2.0 PID调速设计原理图
如图可以知道,这是一个闭环系统,我们借助单片机来控制,我们现运用AD芯片,运用单片机来控制AD芯片来转换模拟电压到数字电压,AD给定的电压越大,则产生的数字量越大,单片机再控制这个数字量来产生一个PWM,PWM占空比越大,就驱动晶体管导通的时间越长,这样加到压频转换器的电压也就越大,电压越大,则压频转换器输出的计数脉冲再单位时间也就越多,这样就相当于电机的电压越大,其转速也就会越快,我们再用单片机对压频转换器的输出脉冲计数,PID调节器就把这个计数脉冲和预先设定的 值进行比较,比设定值小,这样就会得到一个偏差,再把这个偏差加到AD的给定电压,这样就相当于加大了PWM的占空比,要是比设定值大,这样也会得到一个偏差,就把这个变差与给定的电压向减,这样就可以减少PWM的占空比,通过改变占空比来改变晶体管的导通时间,就可以改变压频转换器的输入电压,也就改变压频转换器的单位计数脉冲,达到调电动机速度的目的。
三、设计方案
3.1 PWM的调制
AD芯片给定一定的电压,应用单片机来控制来产生一个PWM,给定的电压不同,就会的得到不同的PWM波形。在产生PWM波形我们采用ADC0808芯片和AT89C51两个核心器件。
ADC0808芯片是要外加电压和时钟,当输入不同的电压的时候,就可以把不同的电压模拟量转化为数字值,输入的电压越大,其转换的相应的数字也就会越大,ADC0808芯片有8个通道输入和8个通道输出。其具体的管脚图见3.01
图3.01 ADC0808芯片管脚图
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。外形及引脚排列如图3.02所示
图3.02 AT89C51芯片管脚图
3.2基于单片机的数字PID控制直流电机PWM调压调速器系统 3.21调速原理
当基于以上产生一个PWM后,就可以借助PWM脉冲来控制晶体管的导通和关断,来给压频转换器来提供一定的电压,在PROTUES中仿真中,给定一个+12V的电压,就通过晶体管的导通和关断来给压频转换器供电,压频转换器就会输出很多的脉冲,借助单片机P3.5来计数,其计数送给P0来显示,通过给定不同的ADC的输入电压,就可以的得到不同的计数显示,电压越大,其计数显示也就越大,通过改变计数脉冲的周期和硬件压频转换器(LM331)的电阻和电容,就可以得到与输入电压接近的数值显示,可能由于干扰的原因,其显示值和实际值有一点偏差,这是在没有什么负载的情况下,或者说是在空载的情况下,这样就可以得到一个很理想的开环系统,也为闭环PWM调节做好准备。
当开环系统稳定后,加上一个扰动,或者说是加上负载,这样就使的压频转换器的电压减少,在给定一定电压的时候,当负载分压的时候,也就相当于直流电机的电压就会减少,这样直流电机的转速就会下降,或者说当有负载的时候,压频转换器的输入电压就会减少,这样输入的脉冲在单位时间就会减少,这样PID调节器,通过改变PID的参数,PID控制器由比例单元(P)、积分单元(I)和微分单元(D)组成。其输入e(t)与输出u(t)的关系为 u(t)=kp(e((t)+1/TI∫e(t)dt+TD*de(t)/dt)式中积分的上下限分别是0和t 因此它的传递函数为:G(s)=U(s)/E(s)=kp(1+1/(TI*s)+TD*s)其中kp为比例系数; TI为积分时间常数; TD为微分时间常数这样就会得到一个偏差,通过这个偏差来改变原来的PWM的占空比,使得晶体管的导通时间加长或减少,这样就改变了直流电机的输入电压,也就是该变了在PROTUES压频转换器的输入电压,使得输出的计数脉冲在单位时间发生改变,也就是模拟了直流电机的转速的改变,我们希望通过PID的调节,使得输出的计数脉冲的显示值和预先设定的值接近,由于偏差的存在,使得PID调节器不断的去修正,使得显示值近可能的接近我们所预期的设定值。
3.22基于单片机的数字PID控制直流电机PWM调压调速器系统原理图
图3.07 PID调速原理图 3.23波形仿真
在不同的给定电压下开换系统会有不同的PWM波形和计数脉冲个数。在不同的波形中从上之下以此为pwm波形,经过驱动后的波形,LM331的输入电压,LM331的输出脉冲。
当给定电压为较高(E8H)其波形见如下图3.08、图3.09 中电压给定对应的波形
PID波形
图3.10 低电压给定对应的波形
;
图3.11 PID 控制LM331的输入电压波形
3.24 PID调速程序 PWM 输出驱动程序
ADC
EQU
35H
CLK
BIT
P2.4
ST
BIT
P2.5
EOC
BIT
P2.6
OE
BIT
P2.7
PWM
BIT
P3.7
;
PID 调节设置
EK0
EQU
40H
EK1
EQU
41H
EK2
EQU
42H
PP
EQU
43H
II
EQU
44H
DD
EQU
45H
UK0
EQU
70H
UK1
EQU
71H
ORG
00H
SJMP
START
ORG
0BH
LJMP
INT_TO
START:
MOV
TMOD, #62H
MOV
TH0, #00H
MOV
TL0, #00H
MOV
IE, #86H
SETB
TR0
;SETB
TR1
MOV
R0, #00
MOV
R1, #00
MOV
R2, #00
MOV
R3, #00
MOV
R4, #00
MOV
R5, #00
MOV
R6, #00
MOV
R7, #00
;PID 赋值
MOV
PP, #05
MOV
II, #03
MOV
DD, #02
MOV
EK0,#00H
MOV
EK1,#00H
MOV
EK2,#00H
MOV
UK0,#00H
MOV
UK1,#00H WAIT:
CLR
OE
INC
R7
CLR
ST
SETB
ST
CLR
ST
JNB
EOC, $
SETB
OE
MOV
ADC, P1
MOV
R0,ADC
MOV
A,70H
ADDC
A,ADC
MOV
ADC ,A
;CLR
OE
SETB
PWM
SETB TR1
MOV
A, ADC
LCALL
DELAY
CLR
PWM
;等待转换完成;高电平延时 8
MOV
A, #255
SUBB
A, ADC
LCALL
DELAY
;低电平延时
CJNE
R7, #20, WA2 WA1:
CLR
TR1
MOV
R7, #00
MOV
A, TL1
MOV 50H,A
mov P0,50H
;PID求偏差
MOV A,EK1
MOV EK2,A
MOV A,EK0
MOV EK1,A
MOV A,R0
SUBB A,50H
MOV EK0,A
;PP的计算
MOV
A,EK0
SUBB A,EK1
MOV B,PP
MUL AB
MOV R1,A
MOV R2,B
AJMP X
WAIT1:AJMP WAIT
;II的计算
X: MOV A,EK0
MOV B,II
MUL AB
MOV R3,A
MOV R4,B
;DD的计算
MOV A,EK1
RL A
MOV EK1,A
MOV A,EK0
SUBB A,EK1
ADDC A,EK2
MOV B,DD
MUL AB
MOV R5,A
MOV R6,B
;PID总的计算
MOV A,R1
ADDC A,R3
ADDC A,R5
MOV 60H,A
MOV A,R2
ADDC A,R4
ADDC A,R6
MOV 61H,A
MOV A,60H
ADDC A,70H
MOV
70H,A
MOV A,61H
ADDC A,71H
MOV
71H,A
MOV TL0,#00H
MOV
TL1,#00H
;SETB TR1
WA2:
SJMP
WAIT1
INT_TO:
CPL
CLK
RETI
DELAY:
MOV
R6, #1 D1:
DJNZ
R6, D1
DJNZ
ACC, D1
RET
END 10
四、心得体会
我们进行了为期一周的计算机控制技术课程设计。通过这两周的课程设计,我拓宽了知识面,锻炼了能力,综合素质得到了提高。
刚刚拿到课题,我感到有些茫然,对于以前没有做过的人来说要全部做完的确有一定的难度。由于我对计算机控制不是很熟悉,在设计的过程中走了不少弯路。
通过亲身体验做课程设计,我觉得安排课程设计的基本目的,在于通过理论与实际的结合,进一步提高观察、分析和解决问题的实际工作能力,以便培养成为能够主动适应社会主义现代化建设需要的高素质的复合型人才。运用学习成果,把课堂上学到的系统化的理论知识,尝试性地应用于实际设计工作,并从理论的高度对设计工作的现代化提出一些有针对性的建议和设想。检验学习成果,看一看课堂学习与实际工作到底有多大距离,并通过综合分析,找出学习中存在的不足,以便为完善学习计划,改变学习内容与方法提供实践依据。我的收获有一下几点:
第一,我对所学专业有了一些了解,增强了自己的兴趣和对以后可能从事的职业的热爱。第二,通过课程设计我明白到了理论到实践有一段很远的路程。设计过程中的每一步都是一门学问,我终于知道了每一个实现的过程,每一个认识的过程都存有人类无数的的汗水与对待事物一丝不苟得,缜密的思考以及不懈的努力,只有这样才会有一个新生事物的诞生。而以上种种的过程必须要你亲自去体会去认识去发现,那才是属于你的“收获”,只有这时才会对自己的作品无比的骄傲。
第三,通过这次设计加强了我们的设计创新能力。使我们的理论知识与实践充分地结合。第四,通过两周的课程设计,我学到了很多书本上学习不到的知识。两周的时间很短,但是我学到比两年的还多,在以后的学习生活中,我需要更努力地读书和实践。
对我们电气专业的学生来说,实际能力的培养至关重要,而这种实际能力的培养单靠课堂教学是远远不够的,必须从课堂走向实践。通过课程设计,让我们找出自身状况与实际需要的差距,并在以后的学习期间及时补充相关知识,为求职与正式工作做好充分的知识、能力准备,从而缩短从校园走向社会的心理转型期。
在设计过程中,体会到了设计一项课题的不易,也体会到了设计成功之后的小小成就感和同学之间相互合作的默契。更重要的是,通过课程设计,我发现了自身存在的更多不足之处和实际应用能力方面的欠缺,这些不足之处在今后的学习之中要有意识的弥补和改变。
最后,感谢在课程设计过程中关心帮助我的老师同学。
五、参考文献
许翏、王淑英主编.计算机技术.北京:机械工业出版社2005 2 王炳实主编.单片机技术.第3版.北京:机械工业出版社2004 3 易泓可主编,基于数字PID设计.北京:机械工业出版社 2004
第二篇:基于FPGA的直流电机PWM调速系统设计与实现
FPGA课程设计
题目:基于FPGA的直流电机PWM调速系统设计与实现 班级:微电子学1202班 姓名:杜英 学号:1206080201 日期:2016年3月24日
基于FPGA的直流电机PWM调速系统设计与实现
1设计任务与要求
1.1设计任务
完成基于FPGA的直流电机PWM调速系统设计与实现,实现对直流电机的闭环调速,速度值采用LCD或数码管显示。
1.2设计要求
1.2.1了解PWM控制方法及应用;掌握PWM直流电机调速控制原理;掌握直流电机调速及驱动控制原理;完成基于FPGA的直流电机PWM调速系统设计。采用PWM(脉冲宽度调制)技术,速度值采用LCD或数码管显示。
1.2.2通过课程设计的实践,进一步了解和掌握硬件描述语言(VHDL或Verilog)和TOP-DOWN的设计流程,提高对实际项目的分析和设计能力,体会FPGA项目开发的过程,熟悉实验报告的编写规范。
2设计原理分析
2.1直流电机结构如下图1.1所示
图2.1 直流电机的构造
将直流电源通过电刷接通线组线圈,使线组线圈导体(电枢导体)有电流通过,在电磁的作用下,线组线圈将会产生磁场,同时产生的磁场与主磁极的磁场产生电磁力,这个电磁力作用于转子,使转子以一定的速度开始旋转,电机就开始工作。
在电机的外部电路加入开关型的霍尔元件,同时在电子转子的转盘上加入一个使霍尔元件产生输出的带有磁场的磁钢片。当直流电机旋转时转盘与磁钢片一起旋转,当磁钢片转到霍尔元件上方时,可以使霍尔元件的输出端高电平变为低电平。当磁钢片离开霍尔元件上方后,霍尔元件输出端又恢复高电平。如此,点击每旋转一周,会使霍尔元件的输出端产生一个低脉冲,可以通过检测单位时间内霍尔元件输出端低脉冲的个数推算出直流电机的转速。
本次设计中,调节PWM占空比进而控制直流电机转速,在本次设计中,为了保护霍尔元件,故设定程序每6秒刷新一次数据,所以在数码管显示的数据乘以10就是在该占空比时的直流电机每分钟转速。在这次的实验中数码管采用的8位共阴极数码管,通过锁存器输入数据使得数码管的8个段码数字显示,再通过选择输出数据对所需数码管进行选择。
2.2电路原理图
图2.2 电路原理图 3 设计方案
上述原理图中包含PWM模块、测速模块、计数模块、电机模块、滤波模块。电机的外部电路加入开关型的霍尔元件,同时在电子转子的转盘上加入一个使霍尔元件产生输出的带有磁场的磁钢片。当直流电机旋转时转盘与磁钢片一起旋转,当磁钢片转到霍尔元件上方时,可以使霍尔元件的输出端高电平变为低电平。当磁钢片离开霍尔元件上方后,霍尔元件输出端又恢复高电平。如此,点击每旋转一周,会使霍尔元件的输出端产生一个低脉冲,可以通过检测单位时间内霍尔元件输出端低脉冲的个数推算出直流电机的转速。本次设计为六秒记一次数,乘十就是每分钟转速值。再通过驱动模块显示数码管数据。
4设计步骤
(1)首先确定整体设计方案,确定设计需要使用的软件;(2)设计电路模块,编写各模块程序代码并进行仿真编译;(3)完成整体电路图设计后,使用QuartusⅡ软件对整体电路进行仿真调试;
(4)连接硬件,使用示波器观察产生的波形,对不足之处进行改进调试。
5调试结果说明
连接好试验箱,把硬件与实验箱接通,将程序下载到实验箱中。进行实验,示波器观察PWM脉冲波形(占空比),看实验结果与预期效果是否相同,若相同,则实验无误。其波形如下: 占空比为50%时
占空比为90%时
将程序下载到实验箱中后,其实际操作过程如下: K12为使能键,使K12=‘1’;输入时钟信号为1MHZ;(1)K4=1时,示波器和LED的显示如下:
示波器显示的是霍尔元件单位时间内计数的个数为31.011 显示器是每六秒电机转的圈数为186转
结论:31.011*6=186.066于186近似,所以结论符合要求。(2)K4=1,k3=1时,示波器和LED的显示如下:
结论:68.6338*6=411.8028于412近似,所以结论符合要求。(3)K4=1,k3=1,K2=1时,示波器和LED的显示如下:
结论:85.516*6=513.096于513近似,所以结论符合要求。(4)K4=1,k3=1,K2=1,K1=1时,示波器和LED的显示如下:
结论:90.0339*6=540.2034于541近似,所以结论符合要求。通过以上的比较,发现示波器中的结果与数码管上数据大概一致,即实验结果基本达到要求。
6心得体会
本次课程设计,用FPGA控制直流电机,完成直流电机PWM调速系统设计,实现对直流电机的闭环调速,速度值采用LCD或数码管显示。是一次很好的学习和实践的机会。通过课程设计,我明白了电机工作的原理,以及用FPGA控制电机的原理。最重要的是,对如何设计一个系统有了更进一步的了解,积累了很多经验。
从下载测试的结果来看,设计的要求基本上都实现了。但是仍存在不少问题。每个模块生成基本电路后,把各个模块的进行连接,仿真结果是正确的。但是当连接到试验箱后,电机正常转动,LED却无法显示。检查电路和程序还有电路图,并发现什么问题。无意中发现LED偶尔会出现数字,但也只是闪一下。最后才发现是因为电机转动太快了,LED无法及时显示或者是一直在闪,人眼无法识别。在程序中加入了滤波模块,才解决了问题。
在设计的过程中,开始照着EDA课本上的原理设计,后来才发现所设计的电路有很多地方都满足不了设计要求,使设计一度遭遇了很大困难。通过与同学讨论请教,逐步改进了设计,终于使设计的电路和设计要求相吻合。在这中间,通过不断提出问题,解决问题,我对这次设计的原理有了更深的了解,也给我分析问题,解决问题提供了很多好的方法,好的思路。同时,我也发现了自己存在的很多不足。发现自己在设计一个系统的时候不能够统筹兼顾,不能够从总体上把握设计的思路,也不能看清问题的核心与关键所在。这些都需要在下面不断学习实践,理论毕竟只是理论,要多参加实践,这样才能提高自己的能力,积累经验。
附录一
PWM模块程序 Library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity PWM is port(clock:in std_logic;
duty_cycle:in std_logic_vector(3 downto 0);
pwm_en:in std_logic;
pwm_out:out std_logic);end entity;architecture art of PWM is
signal pwm_out_io:std_logic;
signal count:std_logic_vector(3 downto 0);begin
pwm_out<=pwm_out_io;
process(clock)
begin
if rising_edge(clock)then
if pwm_en='1' then
count<=count+1;
end if;
end if;
end process;
process(clock)
begin
if rising_edge(clock)then
if pwm_en='1' and count pwm_out_io<='1'; else pwm_out_io<='0'; end if; end if; end process;end; 测速模块程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity cesu is port(clk : in std_logic; --时钟输入1Mhz ena : out std_logic; --允许计数 clr : out std_logic; --计数器清零信号产生 load : out std_logic);--锁存、显示输出允许高有效 end cesu;architecture behav of cesu is signal clkk :std_logic; --1HZ时钟信号 signal count :integer range 0 to 7;--6秒计数 signal clr1 :std_logic; --清零信号 signal ena1 :std_logic; --允许计数信号 signal load1 :std_logic; --允许计数信号 --signal cq1,cq2,cq3,cq4 : INTEGER RANGE 0 TO 15;--计数数据 begin process(clk) variable c:std_logic; variable cnt:integer range 0 to 500000; begin if clk'event and clk='1' then cnt:=cnt+1; if cnt=500000 then cnt:=0;c:=not c; end if; end if; clkk<=c; end process; process(clkk) --6秒计数 begin if clkk'event and clkk='1' then count<=count+1; if count<6 then ena1<='1';load1<='0';clr1<='0'; elsif count=6 then ena1<='0';load1<='1';clr1<='0'; elsif count=7 then ena1<='0';load1<='1';clr1<='1'; end if; end if; ena<=ena1; load<=load1; clr<=clr1; end process;end behav; 计数模块程序 library ieee;use ieee.std_logic_1164.all; entity cnt10 is port(clk:in std_logic; --计数时钟信号 clr:in std_logic; --清零信号 ena:in std_logic; --计数使能信号 cq :out integer range 0 to 15;--4位计数结果输出 carry_out:out std_logic); --计数进位 end cnt10;architecture behav of cnt10 is signal cq1:integer range 0 to 15;begin process(clk,ena)begin if clr= '1' then cq1<= 0; ----计数器异步清零 elsif clk'event and clk= '1' then if ena= '1' then if cq1=10 then cq1<=1; else cq1<=cq1+1; end if; ----等于9,则计数器清零 end if; end if;end process;process(cq1) begin if cq1=10 then carry_out<= '1'; ----进位输出 else carry_out<= '0'; end if;end process; cq<=cq1;end behav; 驱动模块程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity qudong_8 is port(clk:in std_logic; --动态显示刷新速度时钟 QQ1,QQ2,QQ3:in std_logic_vector(3 downto 0);--32位BCD码输入,最0~3低位,28~31最高位 qudong1:out std_logic_vector(7 downto 0);--驱动信号输出,0~7分别为abcdefgp contrl:buffer std_logic_vector(2 downto 0));--数码管位选输出,000最低位数码管有效,111最高位数码管有效 end qudong_8;architecture behavior of qudong_8 is signal disp:std_logic_vector(3 downto 0);signal temp:std_logic_vector(2 downto 0);begin process(clk)begin if clk'event and clk='1' then temp<=temp+1; end if; contrl<=temp;end process; process(contrl) --位选信号产生进程 begin case contrl is --when“000”=>disp<=QQ7; --when“001”=>disp<=QQ6; --when“010”=>disp<=QQ5; --when“011”=>disp<=QQ4; when“100”=>disp<=QQ3; when“101”=>disp<=QQ2; when“110”=>disp<=QQ1; --when“111”=>disp<=“0000”; when others=>disp<=“0000”; end case;end process;process(disp) --译码进程 begin case disp is when“0000”=>qudong1<=“00111111”; when“0001”=>qudong1<=“00000110”; when“0010”=>qudong1<=“01011011”; when“0011”=>qudong1<=“01001111”; when“0100”=>qudong1<=“01100110”; when“0101”=>qudong1<=“01101101”; when“0110”=>qudong1<=“01111101”; when“0111”=>qudong1<=“00000111”; when“1000”=>qudong1<=“01111111”; when“1001”=>qudong1<=“01101111”; when others=>qudong1<=“00000110”; end case;end process;end behavior; 消抖模块程序 library ieee;use ieee.std_logic_1164.all; entity xiaodou is port(clk,input: in std_logic;output: out std_logic);end xiaodou; architecture behav of xiaodou is signal cp:std_logic;signal count:integer range 0 to 3;begin process(clk)begin if(clk'event and clk='1')then--检测上升沿 if(input='1')then--如果有输入信号 if(count=3)then count<=count;--当计数达到3时,保持计数值不变 else count<=count+1;--当其小于3时,进行加1处理 end if;if(count=2)then cp<='1';--如果计数达到2,cp置1 else cp<='0';--其余情况全部为0 end if;else count<=0;--如果计数出现非法状况,进行清零复位 end if;end if;output<=cp;--信号输出 end process;end behav; 基于单片机控制的交通灯设计系统 班级: 姓名: 学号: 第一章 概述 1.设计内容 本系统需要采用AT89C51单片机AT89C5中心器件来设计交通灯控制器,实现以下功能: 1.1初始东西绿灯亮,南北红灯亮,东西方向通车。1.2黄灯闪烁后,东西路口红灯亮同时南北路口绿灯亮,南北方向开始通车。1.3延时27s,南北方向绿灯灭,黄灯闪烁3次,然后又切换成东西方向通车,如此重复。 设计交通灯控制系统硬件电路与软件控制程序,对硬件电路与软件程序分别进行调试,并进行软硬件联调,要求获得调试成功的仿真图。2.设计目的 2.1 了解交通灯管理的基本工作原理。2.2 熟悉AT89C51工作原理和应用编程。 2.3 熟悉AT89C51行接口的各种工作方式和应用。 2.4 熟悉AT89C51数器/定时器的工作方式和应用编程外部中断的方法。2.5 掌握多位LED显示问题的解决。3.设计原理 AT89C51片机具有控制二连体共阴极数码管和发光二极管的输出显示以及检测按键输入的功能。利用AT89C51片机模仿制作室外十字路口多功能交通灯,实现室内控制与室外显示的功能。合理控制交通繁忙,交通特殊情况和恢复交通正常的三种情况。 本设计用4个共阳极LED数码管的分别表示东、西、南、北四个方向路口,以数码管的上、中、下3个横段分别代表红、黄、绿3盏灯,用P0、P1口分别输出控制模拟交通灯的状态显示的数码管和倒计时显示数码管的状态码,P3^ 1、P3^ 2、P3^4-P3^7控制数码管的位选,P2^0-P2^4接收中断信号并反馈给INT0接口进行中断处理。 第二章 硬件设计 1.设计框图 如图2-1所示 此处要有文字说明 图2-1设计框图 2.元器件选择及其功能介绍 AT89C51是一种带4K字节LASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。AT89C51片引脚图如下图2-2所示。 图2-2 AT89C51片引脚图 主要特性: ·与MCS-51 兼容 ·4K字节可编程闪烁存储器 ·寿命:1000写/擦循环 ·数据保留时间:10年 ·全静态工作:0Hz-24MHz ·三级程序存储器锁定 ·128×8位内部RAM ·32可编程I/O线 ·两个16位定时器/计数器,5个中断源 ·可编程串行通道 ·低功耗的闲置和掉电模式 ·片内振荡器和时钟电路 3.设计原理图 硬件电路图通过Proteus 仿真之后如图2-3所示,其中: 按钮K0连接P2^0端口实现红灯全亮,处理交通意外 按钮K1连接P2^1端口实现南北方向亮灯时间+1s 按钮K2连接P2^2端口实现南北方向亮灯时间-1s 按钮K3连接P2^3端口实现东西方向亮灯时间+1s 按钮K4连接P2^4端口实现东西方向亮灯时间-1s 图2-3整体连接电路原理图 第三章 软件设计 1.各个程序段介绍 1.1数码管显示 void Display(uchar j)//j控制显示table中连续位的起始点 { char h,l;if(j<11)//根据状态判定时间 { h=Time_EW/10;//EW通行时间十位 l=Time_EW%10;//EW通行时间个位 } else if(j<23){ h=Time_SN/10;//SN通行时间十位 l=Time_SN%10;//SN通行时间个位 } for(i=0;i<4;)//按位显示通行状况及时间 { P0=table1[j];//通行状况显示 P3=tab[i];//位选显示 i++; j++; if(i%2)//两位计时显示 { P1=table[l]; Delay(400); } else { P1=table[h]; Delay(400); } } Delay(5);} 1.2 INT0外部中断服务程序 void EXINT0(void)interrupt 0//INT0外部中断 { EX0=0;//关中断 if(Busy_Button==0){ P0=0xFE;//意外按钮按下全显示红灯 for(;Busy_Button!=1;)//意外按钮弹起时恢复之前状态 Display(24);} /*四个时间控制按钮分别控制SN、EW方向初始通行时间加减,最长不超过s,最少不低于s*/ if(SN_Add==0)//SN+1 { SN1+=1; if(SN1>99) SN1=99;} if(SN_Red==0)//SN-1 { SN1-=1; if(SN1<20) SN1=20;} if(EW_Add==0)//EW+1 { EW1+=1; if(EW1>99) EW1=99;} if(EW_Red==0)//EW-1 { EW1-=1; if(EW1<20) EW1=20;} EX0=1;//开中断 } 1.3延时子程序 void Delay(uchar a)//循环a次 { uchar x;x=a;while(x--){;} } 2.程序 #define uchar unsigned char #include uchar x;x=a;while(x--){;} } void Display(uchar j){ char h,l;if(j<11){ h=Time_EW/10; l=Time_EW%10;} else if(j<23){ h=Time_SN/10; l=Time_SN%10;} for(i=0;i<4;){ P0=table1[j]; P3=tab[i]; i++; j++; if(i%2) { P1=table[l]; Delay(400); } else { P1=table[h]; Delay(400); } } Delay(5);} void EXINT0(void)interrupt 0 { EX0=0;if(Busy_Button==0){ P0=0xFE; for(;Busy_Button!=1;)Display(24);} if(SN_Add==0){ SN1+=1; if(SN1>99) SN1=99;} if(SN_Red==0){ SN1-=1; if(SN1<20) SN1=20;} if(EW_Add==0){ EW1+=1; if(EW1>99) EW1=99;} if(EW_Red==0){ EW1-=1; if(EW1<20) EW1=20;} EX0=1; } void timer0(void)interrupt 1 using 1 { TH0=0x3C;TL0=0xB0;count++;if(count==20){ Time_EW--; Time_SN--; count=0;} } 第四章 仿真结果及其总结 1.仿真结果图 1.1正常状态的仿真结果如图4-1所示 图4-1正常状态 1.2黄灯状态的仿真结果如图4-2所示 图4-2黄灯状态 1.3紧急状态的仿真结果如图4-3所示 图4-3 紧急状态 1.4延长通行时间的仿真结果如图4-4所示 图4-4延长通行时间 2.总结 通过这次交通灯的课程设计,使我得到了一次用专业知识、专业技能分析和解决现实问题的能力。使我在单片机的基本原理、单片机应用学习过程中,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步,为日后成为一名合格的应用型人才打下良好的基础。综合课程设计让我把以前学习到的知识得到巩固和进一步的提高认识,对已有知识有了更深层次的理解和认识。在此,由于自身能力有限,在课程设计中碰到了很多的问题,我通过查阅相关书籍、资料以及和周围同学交流得到解决。 通过这次交通灯的课程设计,使我了解了写毕业设计的流程和方法。为自己以后的毕业论文的设计做一次练习,具有积极的意义。还有交通灯是我们生活中非常常见的一种东西,对于我们学以致用的这种能力得到了很好锻炼,能够为我们以后的工作于学习打下基础。 由于本人的水平有限,设计中难免会有一些不合理的部分,系统的稳定性还有待提高,望批评更正。第三篇:基于单片机控制的交通灯设计系统