第一篇:基于VHDL语言的简易洗衣机控制器_图文.
电子课程设计
——简易洗衣机控制器设计
学院: 班级: 姓名: 学号:
指导老师: 2013年12月 目录
第一部分:设计任务与要求(1 第二部分:总体框图(1 第三部分:选择器件(2 第四部分:功能模块(3 4.1时间预置编码寄存模块(settime(3 4.2减法计数器模块(counter(4 4.3数码管显示模块(showtime(7 4.4时序电路模块(analyse(9 4.5译码器模块(move……………………………………… 1 1 第五部分:总体设计电路图(13 5.1总体(顶层设计电路图(13 5.2顶层文件仿真(13 5.3管脚分配图(14 5.4硬件实验效果图(14 第六部分:课程设计心得体会(15 简易洗衣机控制器设计
一、设计任务与要求
设计一个洗衣机洗涤程序控制器,控制洗衣机的电动机按下图所示的规律运 转: 时间到
用两位数码管预置洗涤时间(分钟数,洗涤过程在送入预置时间后开始运转,洗涤中按倒计时方式对洗涤过程作计时显示,用LED 表示电动机的正、反转,如果定时时间到,则停机并发出音响信号。
二、总体框图 RUN REV PAUSE time_over clk K5 start K6 load K1 K2 K3 K4 各个部分的具体功能描述如下:(一预设时间和编码电路(settime :接受用户通过按钮预置的时间信息,编码 译码驱动模块(move clk out_1 out_2 start 时序电路模块(analyse clk time_over start 十进制减法计数器模块(counter
洗涤预置时间编码寄存电路模块(settime 报警信号
时间显示模块(showtime 定时启动 停止 正转 暂停 反转 暂停
成八位之后转给减法计数器。
(二减法计数器电路(counter:接收编码之后的预置时间信息,向电机运转 控制电路传递运行信号,并将预置时间信息和剩余时间信息发给数码管显示电路进行实时显示。
(三数码管显示电路(showtime:接收减法计数器电路传来的时间信息,进行 实时译码显示。
(四电机运转时序控制电路(analyse:接收运行起止信号,安排电机运行状态 并编码输出。
(五译码器(move:接收电机运行状态信号,译码后实时控制电机的正传、反转 和暂停。
三、选择器件
1、pc机一台。
2、CPLD/FPGA适配器板:标准配置EPF10K10LC84-4接口板,下载接口是数字芯片的下载接口(DIGITAL JTAG,主要用于CPLD/FPGA芯片的数据下载。
3、实验箱:装有七段数码管及蜂鸣器等,七段数码管字形及真值表如下 七段数码管字形如下:
七段数码管真值表如下:
四、功能模块
4.1时间预置编码寄存模块(settime
1、时间预置编码寄存模块settime如图1所示,time_input为通过开发板上拨码开关K1、K
2、K
3、K4输入的信号,load为输入确认信号。本模块将输入的四位时间信号编码成八位二进制数输出到减法计数器电路。
图1 时间预置编码寄存模块settime
2、仿真图
图2 时间预置编码寄存模块仿真图
用K1、K2、K3、K4给time_input输入一个二进制数0111,让load有效,输出time_set为00000111。
3、时间预置编码寄存模块源代码 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity settime is port(load:in std_logic;time_input:in std_logic_vector(3 downto 0;time_set:out std_logic_vector(7 downto 0;end settime;architecture settime of settime is signal p1:std_logic_vector(7 downto 0;begin process(load begin if(load'event and load='1' then case time_input is when “0000”=>p1<=“00000000”;when “0001”=>p1<=“00000001”;when “0010”=>p1<=“00000010”;when “0011”=>p1<=“00000011”;when “0100”=>p1<=“00000100”;when “0101”=>p1<=“00000101”;
when “0110”=>p1<=“00000110”;when “0111”=>p1<=“00000111”;when “1000”=>p1<=“00001000”;when “1001”=>p1<=“00001001”;when others=>p1<=“00000000”;end case;end if;end process;time_set<=p1;end settime;4.2减法计数器模块(counter
1、减法计数模块counter如图3所示,本模块中clk为系统时序脉冲信号, start为系统开始运行的信号,time_set接收编码之后的预置时间信息,向电机运转控制电路传递运行信号,并将预置时间信息和剩余时间信息发给数码管显示电路进行实时显示。time_remain为输出到数码管显示电路的时间信号, time_over为系统运行结束信号,可以用来控制蜂鸣器的通断。
图3 减法计数模块
2、仿真图
图4 减法计数模块仿真图
3、减法计数模块源程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity counter is port(clk,start:in std_logic;
time_set:in std_logic_vector(7 downto 0;time_remain:buffer std_logic_vector(7 downto 0;time_over:buffer std_logic;end counter;architecture counter of counter is begin process(clk variable time_second:integer range 0 to 59 :=59;begin if(clk'event and clk='1' then if(start='0' then if(time_remain(7 downto 0=0 then time_remain<=time_set;else time_remain(7 downto 4<=time_remain(3 downto 0;time_remain(3 downto 0<=time_set(3 downto 0;end if;
time_second:=59;time_over<='1';else if(time_over='1' then if(time_second=0 and time_remain(7 downto 0=0 then time_over<='0';else if(time_second=0 then if(time_remain(3 downto 0=0 then time_remain(7 downto 4<=time_remain(7 downto 4-1;time_remain(3 downto 0<=“1001”;time_second:=59;else time_remain(7 downto 4<=time_remain(7 downto 4;time_remain(3 downto 0<=time_remain(3 downto 0-1;time_second:=59;end if;
else time_second:=time_second-1;end if;end if;end if;end if;end if;end process;end counter;4.3数码管显示模块(showtime
1、数码管显示模块showtime如图5所示,本模块clk为系统时序脉冲信号,time_remain接收减法计数器电路传来的时间信息,进行实时译码显示, a,b,c,d,e,f,g分别对应数码管的七段,minute和second分别位选两个数码管,显示十位和个位。
图5 数码管显示模块
2、仿真图
图6 数码管显示模块仿真图
3、数码管显示模块源程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity showtime is port(time_remain:in std_logic_vector(7 downto 0;clk:in std_logic;
minute,second:out std_logic;a,b,c,d,e,f,g:out std_logic;end showtime;architecture showtime of showtime is signal temp:std_logic_vector(6 downto 0;signal bcd:std_logic_vector(3 downto 0;signal choose:std_logic;begin process(clk begin if(clk'event and clk='1' then choose<=not choose;if(choose='1' then minute<='0';second<='1';bcd<= time_remain(7 downto 4;else minute<='1';second<='0';
bcd<= time_remain(3 downto 0;end if;end if;end process;process(bcd begin case bcd is when “0000”=>temp<=“1111110”;when “0001”=>temp<=“0110000”;when “0010”=>temp<=“1101101”;when “0011”=>temp<=“1111001”;when “0100”=>temp<=“0110011”;when “0101”=>temp<=“1011011”;when “0110”=>temp<=“1011111”;when “0111”=>temp<=“1110000”;when “1000”=>temp<=“1111111”;when “1001”=>temp<=“1111011”;when others=>temp<=“1111011”;end case;a<=temp(6;b<=temp(5;c<=temp(4;d<=temp(3;e<=temp(2;f<=temp(1;g<=temp(0;
end process;end showtime;4.4时序电路模块(analyse
1、时序电路模块analyse如图7所示,本模块由start控制使能控制,通过时钟的输入进行计算当前系统所处的状态,并进行编码输出电机的运转状态, out_1为高位时表示电机正转,out_2为高位时表示电机反转。由于在显示以及输入的时候只有分钟,故在模块内部设计了一个秒的计时变量。
图7 时序电路模块 2、仿真图
3、时序电路模块analyse源程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity analyse is port(clk,start,time_over:in std_logic;out_1,out_2:out std_logic;end analyse;architecture analyse of analyse is
begin process(clk variable state:std_logic;variable wash_time:integer:=0;variable wait_time:integer:=0;begin if(clk'event and clk='1' then if(start='0' then wash_time:=0;wait_time:=0;state:='0';out_1<='0';out_2<='0';else if(time_over='1' then if(wash_time=20 then
if(wait_time=10 then wash_time:=0;state:=not state;else wait_time:=wait_time+1;end if;else wash_time:=wash_time+1;wait_time:=0;end if;end if;if(wash_time=20 then out_1<='0';out_2<='0';else if(state='0' then out_1<='1';out_2<='0';else
out_1<='0';out_2<='1';end if;end if;end if;end if;end process;end analyse;4.5译码器模块(move
1、译码器模块move如图9所示,out_1和out_2接收时序电路模块的信号对信号进行译码,安排电机运行状态即正转(RUN、反转(REV、暂停(PAUSE,并进行输出。此模块较为简单,设计基本没什么难度。
图9 译码器模块
2、仿真图
图10 译码器模块仿真图
3、译码器模块move源程序 library ieee;use ieee.std_logic_1164.all;entity move is port(out_1,out_2:in std_logic;REV,RUN,PAUSE:buffer std_logic;
end move;architecture move of move is signal choose:std_logic_vector(1 downto 0;begin choose(1<=out_1;choose(0<=out_2;process(choose begin case choose is when “00”=>REV<='0';RUN<='0';PAUSE<='1';when “10”=>REV<='0';RUN<='1';PAUSE<='0';when “01”=>REV<='1';RUN<='0';PAUSE<='0';when others=>REV<='0';RUN<='0';PAUSE<='0';end case;REV<=out_2;RUN<=out_1;PAUSE<=not(out_1 or out_2;end process;end move;
五、总体设计电路图 5.1 总体(顶层)设计电路图 图 11 各模块连结后的电路图 系统运行过程如下:在系统进行运行之前,使用 K 按钮预置洗衣机运转时间,此时用 户设定的时间通过数码管时时显示出来,计时设备选取的精度是分钟级,也就是说用户可以 设定洗衣时间是多少分钟,范围为 00-99。然后用户可以给出开始信号,系统开始运转并开 始从预设时间倒计时,重复“正传->暂停->反转->暂停” 的循环过程直至剩余时间变为零,剩余时间为零时,time_over 指示报警信号。数码管在系统的整个运行过程中时时显示剩余 运转时间。本设计在电路中加入了扫描信号,输入到减法模块,时序电路模块,实时显示模块。由 于扫描信号非常高,在我们看来,输出在数码管上的数字都是连续的两位数字,由预置时间 开始以一分钟减一的速度递减。当数码管显示为零时,洗衣停止。5.2 顶层文件仿真 13 由上图可以看出:当预置号时间,启动 start,数码管显示预置时间,电 机开始以正转=>暂停=>反转=>暂停为周期进行循环,一个周期正好费时一分钟,一个周期结束,数码管显示减一,依次循环,直至数码管显示时间为零,洗衣结 束。5.3 管脚分配图 5.4 硬件实验效果图 14
六、课程设计心得体会 二周的课程设计终于做完了,在这二周的课设中我感觉我学到了蛮多东西。首先,我学会了如何对一个大的课题进行分析——将大的整体划分为许多小 的部分,直到各个部分容易设计出来。关于这个洗衣机控制器,就是用模块化层 次化的设计方法进行系统层的设计,这样分解下来,设计会更容易点,思路也比 较简单。洗衣机控制器主要就只有三个状态,要实现几种状态的多次循环的改变,其他的还有计时和数码显示的功能,通过每个模块的设计最后组装即可完成系统 级的设计。在设计的时候,如果特别要注意各个模块之间接口的设计,要是接口 不对,模块之间就没法实现组装。其次,这次课程设计让我感受到了我对所学习的内容是多么的不熟练,在编 程的时候还要老是去翻书。我记忆在深刻的是在编写程序时,看了一遍又一遍书 但在编写的过程中还是出错了,最后只好对着书编写。但我觉的出现问题并不是 很要紧,这些问题能提醒我那些地方没有学好,只要我重视这些地方将其巩固我 想我将能学到许多的知识。通过这次设计,对于 VHDL 的设计方法大致有了一些 技巧性的了解,位以后的硬件设计打下了基础,对 FPGA 的编程、定时器和计数 器的设计都熟悉起来,加深了对时序组合电路的印象。最后,我感觉我对 Quartus I I 软件的使用熟练了许多。我虽然以前在试验 的时候使用过 Quartus I I 这个软件,但用的时间毕竟不长,对其不太熟练,经 过这次做课设我对这个软件运用熟练很多,这对以后的学习一定有很大的帮助。我想在面对一个问题时不能存在侥幸心理,只要我们认真
对待它,我们就能学到 东西。通过在网上进行各种资料的查询,也发现了其实 FPGA 的设计具有较好的 前景,其功能的强大和设计方法的简单可靠。具有较强的适应能力和可移植性。15
第二篇:电子技术课程设计智能洗衣机控制器
电子技术基础课程设计 ——智能洗衣机控制器 目录 一、课程设计的目的 二、课程设计的课题与要求 1.课程设计的课题 2.课程设计的要求 三、设计思路与过程 1.设计前提概述 2.ASM图 3.状态图 4.输入输出设计 四、程序内容 五、仿真波形图 1.模式一的仿真 2.模式二的仿真 3.模式三的仿真 4.模式四的仿真 5.模式五的仿真 六、课设感想与收获 一、课程设计的目的 1.了解数字系统的组成,学习数字系统的设计方法。
2.学习数字系统由上向下设计法的工具-ASM图 3.熟悉现代数字系统的实现方法:用PLD器件取代传统的中规模集成器件实现数字电路与系统。
4.学习分层次化实现数字电路与系统的方法。
5.学习使用硬件描述语言(Hardware Description Language)对数字电路与系统进行建模、仿真与实现的方法。
二、课程设计的课题与要求 1.课程设计的课题 设计一个智能洗衣机(全自动洗衣机)控制器,能够实现洗衣,漂洗和脱水的功能。
2.课程设计的要求 能够使用按键模拟对洗衣机的控制,能够设置工作模式,为了便于观察,将洗衣机的工作模式和所剩的工作时间用数码管显示出来,能够将洗衣机当前所处的状态用发光管或者数码管显示出来。
【模式1】:洗特别脏的衣服(洗衣30秒钟)【模式2】 :洗脏的衣服(洗衣20秒钟)【模式3】 :洗一般的衣服(洗衣10秒钟)【模式4】 :漂洗(每次漂洗5秒钟)【模式5】 :脱水(每次脱水3秒钟)【洗衣全过程】:洗衣+脱水+漂洗+脱水+漂洗+脱水,注水完成使用外部传感器S=1表示。
【漂洗模式】:漂洗+脱水+漂洗+脱水,注水完成使用外部传感器S=1表示。
【脱水模式】:脱水。
【注】:操作完毕使用蜂鸣器鸣叫两秒提示。
三、设计思路与过程 1.设计前提概述 本设计任务主要是实现各个模式之间的切换以及各个状态之间的转变。
课题已经要求有模式一到五这五个模式,故按照这五个模式来思考。
另外,课题也明确要求了三个状态:洗衣,漂洗与脱水。但是,注水是洗衣机必须进行的操作,也占有整个模式中的部分时间,所以也将注水当作一种状态,而且洗衣和漂洗之前都必须注水。
综上,设计的模式有五个:模式一,模式二,模式三,模式四和模式五。设计的状态有四个:注水,洗衣,漂洗与脱水,分别对应s1,s2,s3,s4。
2.ASM图 每个状态都有规定的具体时间,时间到了,发生转换。图中T1,T2,T3,T4,T5,T6,TT表示用时间来控制状态的转换。在程序中,有具体的T1,T2,T3,T4,T5,T6,TT的表示,为作图简便,图中不作具体说明。
3.状态图 图中S1,S2,S3,S4分别对应状态注水,洗衣,漂洗,脱水。而图中的T1,T2,T3,T4,T5,T6,TT同ASM图中的符号,在ASM图中已说明,详情见程序,这里不重复说明。
4.输入输出设计 本程序共有5个模式:模式一,模式二,模式三,模式四,模式五。4个状态:注水,洗衣,漂洗,脱水。
设计6个输入按键,分别为K1,K2,K3,K4,K5,K6。K1为控制模式一的按键;
K2为控制模式二的按键;
K3为控制模式三的按键;
K4为控制模式四的按键;
K5为控制模式五的按键;
K6为控制洗衣机工作的按键。
输出设备有一个发光二极管,四个数码管。发光二极管亮表示注水完成,发光二极管灭表示正在注水。一个数码管用来显示当前的模式,1,2,3,4,5分别表示模式一,模式二,模式三,模式四,模式五;
一个数码管用来表示当前的状态,1,2,3,4分别表示注水,洗衣,漂洗,脱水状态;
两个数码管用来显示当前模式所剩下的时间,时间以1递减至0。
四、程序内容 module washclother(clk,clkk,k1,k2,k3,k4,k5,k6,state,mode,ttime,alarm,zhushui);input clk;//整个程序的时钟信号 input clkk;//扬声器的时钟信号 input k1;//模式一的控制按键 input k2;//模式二的控制按键 input k3;//模式三的控制按键 input k4;//模式四的控制按键 input k5;//模式五的控制按键 input k6;//工作使能按键 output [3:0] state;//状态 数码管显示信号 output [3:0] mode;//模式 数码管显示信号 output [7:0] ttime;//模式的总时间 output alarm,zhushui;reg zhushui;//注水信号 reg alarm;//扬声器信号 reg [3:0] jiao;//扬声器响的时间计时 reg [7:0] ttime;reg [3:0] mode;reg [3:0] state;reg work;//开始工作信号 reg over;//结束信号 always @(posedge clk or posedge k6)begin if(k6==1)//k6按下,work为1,开始工作 work<=1;else //k6未按,模式初始化 begin over<=1;jiao<=4'b0000;work<=0;if(k1==1)//初始化为模式一 begin ttime<=8'h55;mode<=4'b0001;end else if(k2==1)//初始化为模式二 begin ttime<=8'h45;mode<=4'b0010;end else if(k3==1)//初始化为模式三 begin ttime<=8'h35;mode<=4'b0011;end else if(k4==1)//初始化为模式四 begin ttime<=8'h20;mode<=4'b0100;end else if(k5==1)//初始化为模式五 begin ttime<=8'h5;mode<=4'b0101;end else //初始化为0 begin mode<=4'b0000;state<=4'b0000;ttime<=8'h0;end end if(work==1)//开始从某一模式工作 begin case(mode)//确定模式 4'b0001:begin //模式一的过程 if(((ttime>8'h53)&&(ttime<8'h56))||((ttime<8'h21)&&(ttime>8'h18))||((ttime<8'h11)&&(ttime>8'h8)))begin //注水状态 zhushui<=1'b0;state<=4'b0001;end else zhushui<=1'b1;if((ttime>8'h23)&&(ttime<8'h54))state<=4'b0010;//洗衣状态 if(((ttime>8'h13)&&(ttime<8'h19))||((ttime<8'h9)&&(ttime>8'h3)))state<=4'b0011;//漂洗状态 if(((ttime>8'h20)&&(ttime<8'h24))||((ttime<8'h14)&&(ttime>8'h10))||((ttime<8'h4)&&(ttime>8'h0)))state<=4'b0100;//脱水状态 if(ttime>8'h0)begin //时间递减到0 if(ttime[3:0]==4'b0000)begin ttime[3:0]<=4'b1001;ttime[7:4]<=ttime[7:4]-1'b1;end else ttime[3:0]<=ttime[3:0]-1'b1;end end 4'b0010:begin //模式二的过程 if(((ttime>8'h43)&&(ttime<8'h46))||((ttime<8'h21)&&(ttime>8'h18))||((ttime<8'h11)&&(ttime>8'h8)))begin zhushui<=1'b0;state<=4'b0001;end else zhushui<=1'b1;if((ttime>8'h23)&&(ttime<8'h44))state<=4'b0010;if(((ttime>8'h13)&&(ttime<8'h19))||((ttime<8'h9)&&(ttime>8'h3)))state<=4'b0011;if(((ttime>8'h20)&&(ttime<8'h24))||((ttime<8'h14)&&(ttime>8'h10))||((ttime<8'h4)&&(ttime>8'h0)))state<=4'b0100;if(ttime>0)begin if(ttime[3:0]==4'b0000)begin ttime[3:0]<=4'b1001;ttime[7:4]<=ttime[7:4]-1'b1;end else ttime[3:0]<=ttime[3:0]-1'b1;end end 4'b0011:begin //模式三的过程 if(((ttime>33)&&(ttime<36))||((ttime<21)&&(ttime>18))||((ttime<11)&&(ttime>8)))begin zhushui<=1'b0;state<=4'b0001;end else zhushui<=1'b1;if((ttime>8'h23)&&(ttime<8'h34))state<=4'b0010;if(((ttime>8'h13)&&(ttime<8'h19))||((ttime<8'h9)&&(ttime>8'h3)))state<=4'b0011;if(((ttime>8'h20)&&(ttime<8'h24))||((ttime<8'h14)&&(ttime>8'h10))||((ttime<8'h4)&&(ttime>8'h0)))state<=4'b0100;if(ttime>8'h0)begin if(ttime[3:0]==4'b0000)begin ttime[3:0]<=4'b1001;ttime[7:4]<=ttime[7:4]-1'b1;end else ttime[3:0]<=ttime[3:0]-1'b1;end end 4'b0100:begin //模式四的过程 if(((ttime>8'h18)&&(ttime<8'h21))||((ttime<8'h11)&&(ttime>8'h8)))begin zhushui<=1'b0;state<=4'b0001;end else zhushui<=1'b1;if(((ttime>8'h13)&&(ttime<8'h19))||((ttime<8'h9)&&(ttime>8'h3)))state<=4'b0011;if(((ttime>8'h10)&&(ttime<8'h14))||((ttime<8'h4)&&(ttime>8'h0)))state<=4'b0100;if(ttime>8'h0)begin if(ttime[3:0]==4'b0000)begin ttime[3:0]<=4'b1001;ttime[7:4]<=ttime[7:4]-1'b1;end else ttime[3:0]<=ttime[3:0]-1'b1;end end 4'b0101:begin //模式五的过程 if((ttime>8'h3)&&(ttime<8'h6))begin zhushui<=1'b0;state<=4'b0001;end else zhushui<=1'b1;if((ttime<8'h4)&&(ttime>8'h0))state<=4'b0100;if(ttime>8'h0)begin if(ttime[3:0]==4'b0000)begin ttime[3:0]<=4'b1001;ttime[7:4]<=ttime[7:4]-1'b1;end else ttime[3:0]<=ttime[3:0]-1'b1;end end 4'b0000:begin //停止工作 state<=4'b0000;ttime<=8'h0;zhushui<=1'b1;alarm<=1'b0;end endcase if((over==1)&&(ttime[7:0]==8'h1))begin over<=0;jiao<=4'b0010;//扬声器鸣叫2S end if(jiao>4'b0000)begin alarm<=~clkk;//扬声器鸣叫 jiao<=jiao-1'b1;//鸣叫时间递减到0 end else alarm<=0;end end endmodule 五、仿真波形图 1.模式一的仿真 2.模式二的仿真 3.模式三的仿真 4.模式四的仿真 5.模式五的仿真 六、课设感想与收获 每次课程设计都有些让我们即恐惧又兴奋,因为它充满挑战。本次课程设计亦是如此,趣味性强,同时也可以学到很多东西。
在这次课设中,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在课设过程中,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。
我不仅了解了数字系统的组成,学会了数字系统的设计方法及数字系统由上向下设计法的工具-ASM图,而且熟悉了现代数字系统的实现方法:用PLD器件取代传统的中规模集成器件实现数字电路与系统。我还掌握了分层次化实现数字电路与系统的方法,了解了使用硬件描述语言(Hardware Description Language)对数字电路与系统进行建模、仿真与实现的方法。
课设的过程永远是那么的纠结,那么的刺激,那么的值得回味,在某种意义上说,这是一种锻炼,一种知识的积累,能力的提高。完全可以把这个当作基础东西,只有掌握了这些最基础的,才可以更进一步,取得更好的成绩。很少有人会一步登天吧。永不言弃才是最重要的。
而且,这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。
虽然大二学过数电,对Verilog语言有一定的涉猎,但是并不熟悉,未掌握其核心内容,这次课程设计,不仅复习了数电知识的内容,而且使我对Verilog语言有了更进一步的了解,不管是从结构上,还是从语法上。Verilog语言是一门很实用的语言,应该说是一门很精确的语言。
我很高兴能顺利做完这门课程设计,迎接下一个挑战吧。
第三篇:洗衣机节水控制器管理系统介绍及解决方案
洗衣机节水控制器管理系统介绍及解决方案
一、洗衣机节水控制器管理系统概述:
随着水资源的日益短缺,节水已成为各个用水单位、整个国家以及世界各国的重要课题。在我国,用水存在着巨大的浪费,这既有政策方面的问题也有技术层面的原因。要实现用水的现代化管理,北京泰德汇智研制和改造的洗衣机节水控制器管理系统有效的减轻了这一现象。
洗衣机节水控制器管理系统有联网和脱机两种方式。脱机时可用采集卡进行数据采集;联网时可以与电脑通过网络连接后用软件进行设备参数设置、消费数据采集及查询、统计、报表、结算等处理。从而达到节水节电,科学收费,高效管理的目的。广泛应用于学校、企业、政府、工厂澡堂、浴室、开水房、饮水机等
北京泰德汇智科技有限公司是国内最大洗衣机节水控制器管理系统生产企业之一, 15年 洗衣机节水控制器管理系统生产经验,高品质量洗衣机节水控制器管理系统售后服务,数百家企业、上千台节水控制器设备使用中。
二、洗衣机节水控制器管理系统产品特点:
1.乳白色外观,造型简洁、美观大方;
2.外壳喷漆容易清洗;
3.人性放卡槽设计(解决浴室无处放卡问题); 4.防水防潮(尤其浴室潮气严重)专用模具; 5.红外开关(无寿命限制、开关暂停水流非常方便); 6 .稳定、维修率极低。
三、洗衣机节水控制器管理系统技术参数:
技术指标及技术参数: 电源: 12V 存储容量: ≥30000条 功耗: ≤2W 适用卡类: Mifare® One 读写速度: ≤0.1秒/次 工作温度: 0℃—70℃ 工作湿度: 10%—90%RH 感应距离: ≤10mm 通讯速率: 9600bps-38400bps 黑名单数量:65530个
支持控制阀类型:电磁阀、电机阀 计费精度: 1秒
外形尺寸: 145×102×45 mm 重量: 400g
四、洗衣机节水控制器管理系统功能特点:
1.全新防水设计,上下壳接缝装有硅胶密封件防水。
2.节水设计,采用读卡和红外感应双重方式控水,通过节水器上红外感应自由控制水的通断。
3.剩余金额不足洗浴 分钟时自动提醒,让浴客体会到人性化的设计。4.软件功能齐全,数据安全可靠。完善的黑名单管理机制。
5.可选择计量(水流量)方式扣费,配合流量表,计费更加科学、公平、合理。
6.脱机型采用电子钱包方式,设备仅记录消费总额,免去帐目核对的烦恼;采用采集卡即可提取消费累计数据,无须复杂联网,减少施工量。7.软件可强制水控器开阀或者关阀,便于远程灵活控制。8.无人值守的自助使用方式全天候运行,节省人力物力资源。
9.不同人员类别可设置不同费率,(在学校,老师一个价,学生一个价;在单位:经理一个价,员工一个价)使管理者对帐户的控制有足够的灵活性。
10.洗浴时实时显示卡中余额,让浴客更了解自己的消费情况,有利于提高节水意识。11.系统软件自动把消费明细转换成Excel格式,并一键打印输出各类统计报表。管理员如需打印消费明细单,直接打印即可,无需在用办公软件进行编辑。
12.强大的帐户管理功能(挂失、补办新卡、个人补助、集体补助、退款等等)。13.若浴客未通过红外感应开关关闭节水控制器,而强行将卡拿开,节水器将自动关闭阀门,并蜂鸣提示浴客将卡放回以便将余额回写,避免浴客洗后不关水,有效的控制了用水环节。
14.开放卡未使用的扇区空间,有利于扩展其他一卡通功能。15.超强大的帐户容量(10万人)。
16.精确的计算精度(消费计算精度:0.01 元)
17.功耗为6W,电压12V,节约用电的同时也百分百的防止了洗浴人员触电的危险。18.终端按区域管理,让管理者得心应手.19.可脱机也可联网。
五、洗衣机节水控制器管理系统组成:
洗衣机节水控制器管理系统由控制器、电磁阀(电动阀)、读卡器、通讯器、IC卡、软件组成。
六、洗衣机节水控制器管理系统原理:
通过服务器将现金货币转化为电子货币,存储于IC卡电子钱包内,当消费者需要消费时,只需将IC卡放在水控机即可消费,从卡中扣除消费金额。在交易过程没有现金参与其中,真正实现智能消费。
七、典型用户:
1、校园类:
安徽医科大学,天津大学,上海师范学院,杭州师范学院,中华女子学院,沈阳药科大学,徐州建筑职业技术学院,徐州师范大学,哈尔滨工业大学威海分校,内蒙古职业技术学院,青岛大学,西安外事学院,西安航空旅游职业学院,山西大学,天津理工大学,和河北工业大学,秦皇岛卫校,北京交通职业运输学院,北戴河海事学校,湖南交通职业学院36路,贵阳亚太学院,吉林农业科技学院, 姜堰三水学校, 淮北师范学校,河源中学,安徽医科大学,延安大学创新学院,西安思源学院,陕西航空旅游学院,长春师范大学,北京十四中,扬州仪征师范,江苏仪征职业技术学院,南京审计学院,江苏射阳中学,内蒙古锡盟6中,甘肃平凉一中。
2、企业类:
辽宁油田,大唐热电,张家口卷烟厂,石家庄市政府,塘沽口岸,北京市朝阳区劳动局,包头少年宫,北京市国土资源局,北京剑江制衣,河北昌黎宏信钢厂,河北唐山联通总部,张家港科技园。
3、地铁类:
北京地铁9号线, 北京地铁10号线, 北京地铁4号线,北京地铁5号线。
大连地铁, 沈阳地铁,郑州地铁。东莞地铁,青岛地铁。
第四篇:VHDL语言EDA四人抢答器
一.EDA技术简介
在计算机技术的推动下,20世纪末,电子技术获得了飞速的发展,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
20世纪90年代,国际上电子和计算机技术较先进的国家,一直在积极探索新的电子电路设计方法,并在设计方法、工具等方面进行了彻底的变革,取得了巨大成功。在电子技术设计领域,可编程逻辑器件(如CPLD、FPGA)的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵活性。这些器件可以通过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了EDA技术的迅速发展。
EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。
利用EDA工具,电子设计师可以从概念、算法、协议等开始设计电子系统,大量工作可以通过计算机完成,并可以将电子产品从电路设计、性能分析到设计出IC版图或PCB版图的整个过程的计算机上自动处理完成。
现在对EDA的概念或范畴用得很宽。包括在机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域,都有EDA的应用。目前EDA技术已在各大公司、企事业单位和科研教学部门广泛使用。例如在飞机制造过程中,从设计、性能测试及特性分析直到飞行模拟,都可能涉及到EDA技术。
二.设计要求
l、设计用于竞赛的四人抢答器,功能如下:
(1)有多路抢答器,台数为四,能显示抢答台号;
(2)具有抢答开始后20秒倒计时,20秒倒计时后无人抢答显示超时,并报警;
(3)能显示超前抢答台号并显示犯规警报;
2、系统复位后进入抢答状态,当有一路抢答键按下时,该路抢答信号将其余各路抢答封锁,同时铃声响,直至该路按键松开,显示牌显示该路抢答台号。
3、用VHDL语言设计符合上述功能要求的四人抢答器,并用层次设计方法设计该电路。
三.电路工作原理
简易逻辑数字抢答器由主体电路与扩展电路组成。优先编码电路、锁存器、译码电路将参赛队的输入信号在显示器上输出;用控制电路和主持人开关启动报警电路,以上两部分组成主体电路。通过定时电路和译码电路将秒脉冲产生的信号在显示器上输出实现计时功能,构成扩展电路。电路主要由脉冲产生电路、锁存电路、编码及译码显示电路、倒计时电路和音响产生电路组成。当有选手抢答时,首先锁存,阻止其他选手抢答,然后编码,再经译码器将数字显示在显示器上同时产生音响。主持人宣布开始抢答时,倒计时电路启动由20计到0,如有选手抢答,倒计时停止,如20秒后无人抢答,则会显示报警。
四.设计思路
使用VHDL语言编写的四人抢答器设计,根据现有知识及翻阅资料,经过反复推敲,基本设计思路可分为以下两点:
(一)抢答鉴别锁存及显示模块
根据设计要求,首先要有清零开关clr,主持人开关en,四人抢答按钮a、b、c、d,并由一个LED数码显示管显示选手组别,为了实现当有选手抢答后锁存电路使其他选手无法抢答的功能,设置两个锁存信号tmp1、tmp2。
按下清零开关(clr=1),tmp1、tmp2=0,若主持人开关未开启(en=0),此时有人抢答,则tmp2=1,关闭抢答电路,并由数码显示管输出抢答组别,同时speaker报警;若主持人按下开关后(en=1),此时有人抢答,则tmp1=1,关闭抢答电路,并由数码显示管输出抢答组别。
(二)数码管倒计时,暂停及报警模块
设计由两个数码管显示20秒抢答倒计时,在程序中,由8位二进制矢量数count控制,高四位表示十位,低四位表示个位,由给定的时钟信号clk高电平触发。按下清零开关(clr=1),数码管显示20(count=“00100000”),主持人按下开关后(en=1),开始20秒倒计时,当低四位为“0000”时,则赋值为9(“1001”),同时高四位表示的十位数自减1,当低四位不为0时则自减1,由此实现了20秒倒计时。
为实现有人抢答则暂停计时以及20秒时间到停止计时并报警的功能,设置暂停锁存信号tmp3,按下清零开关(clr=1),tmp3=0,主持人按下开关后(en=1),开始20秒倒计时,当有人抢答,则tmp3=1,暂停倒计时,若一直无人抢答,当20秒倒计时结束(count=“00000000”)时,则tmp3=1,停止倒计时并由speaker报警。
speaker报警可由脉冲信号clk0与(tmp3 or a or b or c or d)信号相与输出,从而实现选择性输出报警信号。
五.仿真波形
(一)有人抢答的仿真波形
由上图可知,clr=1,系统进入初始状态,即count=“00100000”,dps=“0000”;en=0时,若有人抢答(b=1),则speaker报警,且数码管显示组别(dps=“0010”);en=1时,count开始20秒倒计时,在15秒时(count=“00010101”)有人抢答(a=1),倒计时暂停,数码管显示组别(dps=“0001”),且speaker报警。
(二)无人抢答的仿真波形
由上图可知,en=1,20秒时间到而无人抢答(count=“00000000”),则speaker报警,按下清零开关(clr=1),重新开始20秒倒计时。
六.源程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity qdq is port(clr,clk,clk0,en,a,b,c,d:in std_logic;dps:out std_logic_vector(3 downto 0);count:out std_logic_vector(7 downto 0);speaker:out std_logic);end;architecture one of qdq is signal dps1:std_logic_vector(3 downto 0);signal count1:std_logic_vector(7 downto 0);signal tmp1,tmp2,tmp3:std_logic;begin p1:process(clr,en,tmp1,tmp2)begin if clr='1' then tmp1<='0';tmp2<='0';dps1<=“0000”;elsif en='1' then if tmp1='0' then if a='1' then tmp1<='1';dps1<=“0001”;end if;if b='1' then tmp1<='1';dps1<=“0010”;end if;if c='1' then tmp1<='1';dps1<=“0011”;end if;if d='1' then tmp1<='1';dps1<=“0100”;end if;end if;elsif en='0' then if tmp2='0' then if a='1' then tmp2<='1';dps1<=“0001”;end if;if b='1' then tmp2<='1';dps1<=“0010”;end if;if c='1' then tmp2<='1';dps1<=“0011”;end if;if d='1' then tmp2<='1';dps1<=“0100”;end if;end if;end if;end process;p2:process(clr,clk,tmp1,tmp3)begin if clk'event and clk='1' then if clr='1' then count1<=“00100000”;tmp3<='0';elsif en='1' and tmp1='0' and tmp3='0' then if count1=“00000000” then tmp3<='1';elsif count1(3 downto 0)=“0000” then count1(3 downto 0)<=“1001”;count1(7 downto 4)<=count1(7 downto 4)-'1';else count1(3 downto 0)<=count1(3 downto 0)-'1';end if;end if;end if;end process;count<=count1;dps<=dps1;speaker<=((tmp3 or a or b or c or d)and clk0);end;
七.设计心得体会
在课程设计的这段时间里,我的收获还是很多的,不但进一步掌握了数字电子技术的基础知识及一门专业仿真软件的基本操作,还提高了自己的设计能力和动手能力,同时对于智能抢答器的设计来了个系统的总结。更多的是让我清楚的认识到,凡事都需要足够的耐心,实践是检验学习成效的唯一标准。理论知识的不足在这次课程设计中表现的极为明显,这将有助于我今后更努力的学习,端正自己的学习态度,从而也提高了我的综合能力,使我在各方面都得到了锻炼。非常感谢我们的指导老师XX老师给予的悉心指导,使我们这次的课程设计任务圆满完成。
通过这次对抢答器的设计与实践,让我了解了关于抢答器设计的基本原理与设计理念,进一步加深了对EDA程序设计的了解,让我对它有了更加浓厚的兴趣。特别是当每一个模块编译调试成功时,兴奋之情溢于言表。通过这次课程设计我懂得了理论与实践相结合的重要性,从理论中反复琢磨得出的真知才能真正为社会服务,从而提高自己的实际动手能力和独立思考能力。在设计过程中可谓困难重重,同时在此间发现了自己的许多不足之处,对以前所学过的知识理解的不够深刻,掌握的不够牢固。
总的来说,这次设计的智能四人抢答器还是比较成功的,在设计中遇到的困难在老师的悉心指导下也都迎刃而解。终于觉得平时所学的知识有了实用价值,达到了理论与实践相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使我对以后的道路有了更加清楚的认识,同时,对未来也有了更多信心。
第五篇:C语言简易教程
C语言简易教程
变量(Variable)
现实生活中我们会找一个小箱子来存放物品,一来显得不那么凌乱,二来方便以后找到。计算机也是这个道理,我们需要先在内存中找一块区域,规定用它来存放整数,并起一个好记的名字,方便以后查找。这块区域就是“小箱子”,我们可以把整数放进去了。C语言中这样在内存中找一块区域: int a;int又是一个新单词,它是 Integer 的简写,意思是整数。a 是我们给这块区域起的名字;当然也可以叫其他名字,例如 abc、mn123 等。
这个语句的意思是:在内存中找一块区域,命名为 a,用它来存放整数。
注意 int 和 a 之间是有空格的,它们是两个词。也注意最后的分号,int a表达了完整的意思,是一个语句,要用分号来结束。
不过int a;仅仅是在内存中找了一块可以保存整数的区域,那么如何将 123、100、999 这样的数字放进去呢?
C语言中这样向内存中放整数: a=123;=是一个新符号,它在数学中叫“等于号”,例如 1+2=3,但在C语言中,这个过程叫做赋值(Assign)。赋值是指把数据放到内存的过程。把上面的两个语句连起来: int a;a=123;就把 123 放到了一块叫做 a 的内存区域。你也可以写成一个语句: int a=123;a 中的整数不是一成不变的,只要我们需要,随时可以更改。更改的方式就是再次赋值,例如:
int a=123;a=1000;a=9999;第二次赋值,会把第一次的数据覆盖(擦除)掉,也就是说,a 中最后的值是9999,123、1000 已经不存在了,再也找不回来了。
因为 a 的值可以改变,所以我们给它起了一个形象的名字,叫做变量(Variable)。
int a;创造了一个变量 a,我们把这个过程叫做变量定义。a=123;把 123 交给了变量 a,我们把这个过程叫做给变量赋值;又因为是第一次赋值,也称变量的初始化,或者赋初值。你可以先定义变量,再初始化,例如: int abc;abc=999;也可以在定义的同时进行初始化,例如: int abc=999;这两种方式是等价的。
变量定义的位置 在VC或VS下,变量定义要放在函数的开头;也就是说,在定义变量之前不能有其他代码。数据类型(Data Type)
数据是放在内存中的,变量是给这块内存起的名字,有了变量就可以找到并使用这份数据。但问题是,该如何使用呢?
我们知道,诸如数字、文字、符号、图形、音频、视频等数据都是以二进制形式存储在内存中的,它们并没有本质上的区别,那么,00010000 该理解为数字16呢,还是图像中某个像素的颜色呢,还是要发出某个声音呢?如果没有特别指明,我们并不知道。
也就是说,内存中的数据有多种解释方式,使用之前必须要确定;上面的int a;就表明,这份数据是整数,不能理解为像素、声音等。int 有一个专业的称呼,叫做数据类型(Data Type)。顾名思义,数据类型用来说明数据的类型,确定了数据的解释方式,让计算机和程序员不会产生歧义。在C语言中,有多种数据类型,例如:
说
明
字符型
短整型
整型
长整型
单精度浮点型
双精度浮点型
无类型 数据类型 char short int
long
float
double
void 这些是最基本的数据类型,是C语言自带的,如果我们需要,还可以通过它们组成更加复杂的数据类型,后面我们会一一讲解。
连续定义多个变量
为了让程序的书写更加简洁,C语言支持多个变量的连续定义,例如:
int a, b, c;
float m = 10.9, n = 20.56;
char p, q = '@';
连续定义的多个变量以逗号,分隔,并且要拥有相同的数据类型;变量可以初始化,也可以不初始化。
数据的长度(Length)所谓数据长度(Length),是指数据占用多少个字节。占用的字节越多,能存储的数据就越多,对于数字来说,值就会更大,反之能存储的数据就有限。
多个数据在内存中是连续存储的,彼此之间没有明显的界限,如果不明确指明数据的长度,计算机就不知道何时存取结束。例如我们保存了一个整数 1000,它占用4个字节的内存,而读取时却认为它占用3个字节或5个字节,这显然是不正确的。
所以,在定义变量时还要指明数据的长度。而这恰恰是数据类型的另外一个作用。数据类型除了指明数据的解释方式,还指明了数据的长度。因为在C语言中,每一种数据类型所占用的字节数都是固定的,知道了数据类型,也就知道了数据的长度。
在32位环境中,各种数据类型的长度一般如下:
说
明
字符型
短整型
整型
长整型
单精度浮点型
双精度浮点型 数据类型
char short int long float double 长
度 2 4 4 4 8
C语言有多少种数据类型,每种数据类型长度是多少、该如何使用,这是每一位C程序员都必须要掌握的,后续我们会一一讲解。最后的总结
数据是放在内存中的,在内存中存取数据要明确三件事情:数据存储在哪里、数据的长度以及数据的处理方式。
变量名不仅仅是为数据起了一个好记的名字,还告诉我们数据存储在哪里,使用数据时,只要提供变量名即可;而数据类型则指明了数据的长度和处理方式。所以诸如int n;、char c;、float money;这样的形式就确定了数据在内存中的所有要素。
最后需要说明的是:数据类型只在定义变量时指明,而且必须指明;使用变量时无需再指明,因为此时的数据类型已经确定了。
这一节主要讲解C语言中的几个基本概念。标识符
定义变量时,我们使用了诸如“a”“abc”“mn123”这样的名字,它们都是程序员自己起的,一般能够表达出变量的作用,这叫做标识符(Identifier)。
标识符就是程序员自己起的名字,除了变量名,后面还会讲到函数名、宏名、结构体名等。不过,名字也不能随便起,C语言规定,标识符只能由字母(A~Z, a~z)、数字(0~9)和下划线(_)组成,并且第一个字符必须是字母或下划线。
以下标识符是合法的: a, x, x3, BOOK_1, sum5
以下标识符是非法的: 3s
不能以数字开头 s*T
出现非法字符*-3x
不能以减号(-)开头
bowy-1
出现非法字符减号(-)
在使用标识符时还必须注意以下几点:
C语言虽然不限制标识符的长度,但是它受到不同编译器的限制,同时也受到具体机器的限制。例如在某个编译器中规定标识符前128位有效,当两个标识符前128位相同时,则被认为是同一个标识符。
在标识符中,大小写是有区别的,例如BOOK和book 是两个不同的标识符。
标识符虽然可由程序员随意定义,但标识符是用于标识某个量的符号,因此,命名应尽量有相应的意义,以便于阅读理解,作到“顾名思义”。
关键字 关键字(Keywords)是由C语言规定的具有特定意义的字符串,通常也称为保留字,例如 int、char、long、float、unsigned 等。我们定义的标识符不能与关键字相同,否则会出现错误。
你也可以将关键字理解为具有特殊含义的标识符,它们已经被系统使用,我们不能再使用了。
标准C语言中一共规定了32个关键字,大家可以参考C语言关键字及其解释[共32个],后续我们会一一讲解。注释
注释(Comments)可以出现在代码中的任何位置,用来向用户提示或解释程度的意义。程序编译时,会忽略注释,不做任何处理,就好像它不存在一样。C语言支持单行注释和多行注释:
单行注释以//开头,直到本行末尾(不能换行);
多行注释以/*开头,以*/结尾,注释内容可以有一行或多行。
运算符
C语言也可以进行加减乘除运算,但是运算符号与数学中的略有不同,见下表。
加法
减法
乘法
除法
求余数 数学
+
×
÷
无 C语言
+
*
/
% 加号、减号与数学中的一样,乘号、除号不同,另外C语言还多了一个求余数的运算符。
一个整数自身加一可以这样写: a+=1;它等价于a=a+1。
但是在C语言中还有一种更简单的写法,就是a++;或者++a。这种写法叫做自加或自增;意思很明确,就是自身加一。
相应的,也有a--和--a,叫做自减,表示自身减一。++和--分别称为自增和自减运算符。
自增自减完成后,会用新值替换旧值,并将新值保存在当前变量中。自增自减只能针对变量,不能针对数字,例如10++是错误的。
值得注意的是,++ 在变量前面和后面是有区别的:
++ 在前面叫做前自增(例如 ++a)。前自增先进行自增操作,再进行其他操作。
++ 在后面叫做后自增(例如 a++)。后自增先进行其他操作,再进行自增操作。自减(--)也一样,有前自减和后自减之分。int a=10, a1=++a;int b=20, b1=b++;结果: a=11, a1=11 b=21, b1=20
C语言提供了以下关系运算符:
关系运算符 含 义 数学中的表示 < <= > >= ==!= 小于 大于 等于 不等于
< > = ≠ 小于或等于 ≤ 大于或等于 ≥
关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,<、<=、>、>=的优先级相同,高于==和!=,==和!=的优先级相同。
在C语言中,有的运算符有两个操作数,例如 10+20,10和20都是操作数,+ 是运算符。我们将这样的运算符称为双目运算符。同理,将有一个操作数的运算符称为单目运算符,将有三个操作数的运算符称为三目运算符。
常见的双目运算符有 +、-、*、/ 等,单目运算符有 ++、--等,三目运算符只有一个,就是 ? :,我们将在《C语言条件运算符》中详细介绍。
关系运算符的两边可以是变量、数据或表达式,例如: 1)a+b > c-d 2)x > 3/2 3)'a'+1 < c 4)-i-5*j == k+1
关系运算符的运算结果只有 0 或 1。当条件成立时结果为 1,条件不成立结果为 0。例如:
5>0 成立,其值为 1;
34-12>100 不成立,其值为 0;
(a=3)>(b=5)由于3>5不成立,故其值为 0。
我们将运算结果 1 称为“真”,表示条件成立,将 0 称为“假”,表示条件不成立。需要提醒的是,==才表示等于,而=表示赋值,大家要注意区分,切勿混淆。
在C语言中,也有类似的逻辑运算: 运算符
说明
结合性
举例 && 与运算,双目,对应数学中的“且”
左结合 1&&0、(9>3)&&(b>a)||
或运算,双目,对应数学中的“或”
左结合1||0、(9>3)||(b>a)!
非运算,单目,对应数学中的“非”
右结合!a、!(2<5)逻辑运算的结果
在编程中,我们一般将零值称为“假”,将非零值称为“真”。逻辑运算的结果也只有“真”和“假”,“真”对应的值为 1,“假”对应的值为 0。
1)与运算(&&)参与运算的两个表达式都为真时,结果才为真,否则为假。例如:
5&&0 5为真,0为假,相与的结果为假,也就是 0。
(5>0)&&(4>2)5>0 的结果是1,为真,4>2结果是1,也为真,所以相与的结果为真,也就是1。2)或运算(||)参与运算的两个表达式只要有一个为真,结果就为真;两个表达式都为假时结果才为假。例如: || 0 10为真,0为假,相或的结果为真,也就是 1。
(5>0)||(5>8)5>0 的结果是1,为真,5>8 的结果是0,为假,所以相或的结果为真,也就是1。3)非运算(!)参与运算的表达式为真时,结果为假;参与运算的表达式为假时,结果为真。例如:
!0 0 为假,非运算的结果为真,也就是 1。
!(5>0)5>0 的结果是1,为真,非运算的结果为假,也就是 0。
优先级
逻辑运算符和其它运算符优先级从低到高依次为:
赋值运算符(=)< &&和|| < 关系运算符 < 算术运算符 < 非(!)&& 和 || 低于关系运算符,!高于算术运算符。
前面我们看到的代码都是顺序执行的,也就是先执行第一条语句,然后是第二条、第三条„„一直到最后一条语句,这称为顺序结构。
但是对于很多情况,顺序结构的代码是远远不够的,比如一个程序限制了只能成年人使用,儿童因为年龄不够,没有权限使用。这时候程序就需要做出判断,看用户是否是成年人,并给出提示。
在C语言中,使用if和else关键字对条件进行判断。
if 和 else 是两个新的关键字,if 意为“如果”,else 意为“否则”,用来对条件进行判断,并根据判断结果执行不同的语句。总结起来,if else 的结构为:
if(判断条件){
语句块1 } else {
语句块2 } 意思是,如果判断条件成立,那么执行语句块1,否则执行语句块2。其执行过程可表示为下图:
所谓语句块(Statement Block),就是由{ }包围的一个或多个语句的集合。如果语句块中只有一个语句,也可以省略{ },例如:
if(age>=18)printf(“恭喜,你已经成年,可以使用该软件!n”);
else printf(“抱歉,你还未成年,不宜使用该软件!n”);
由于if else 语句可以根据不同的情况执行不同的代码,所以也叫分支结构或选择结构
只使用if语句
有的时候,我们需要在满足某种条件时进行一些操作,而不满足条件时就不进行任何操作,这个时候我们可以只使用 if 语句。也就是说,if else 不必同时出现。
单独使用 if 语句的形式为:
if(判断条件){
语句块 } 意思是,如果判断条件成立就执行语句块,否则直接跳过。其执行过程可表示为下图:
多个if else语句
if else 语句也可以多个同时使用,构成多个分支,形式如下:
if(判断条件1){
语句块1 } else if(判断条件2){
语句块2 }else if(判断条件3){
语句块3 }else if(判断条件m){
语句块m }else{
语句块n } 意思是,从上到下依次检测判断条件,当某个判断条件成立时,则执行其对应的语句块,然后跳到整个 if else 语句之外继续执行其他代码。如果所有判断条件都不成立,则执行语句块n,然后继续执行后续代码。
也就是说,一旦遇到能够成立的判断条件,则不再执行其他的语句块,所以最终只能有一个语句块被执行。
在C语言中,共有三大常用的程序结构:
顺序结构:代码从前往后执行,没有任何“拐弯抹角”;
选择结构:也叫分支结构,重点要掌握 if else、switch 以及条件运算符;
循环结构:重复执行同一段代码。
前面讲解了顺序结构和选择结构,本节开始讲解循环结构。所谓循环(Loop),就是重复地执行同一段代码,例如要计算 1+2+3+„„+99+100 的值,就要重复进行99次加法运算。
while循环
while循环的一般形式为:
while(表达式){
语句块 } 意思是,先计算“表达式”的值,当值为真(非0)时,执行“语句块”;执行完“语句块”,再次计算表达式的值,如果为真,继续执行“语句块”„„这个过程会一直重复,直到表达式的值为假(0),就退出循环,执行 while 后面的代码。
我们通常将“表达式”称为循环条件,把“语句块”称为循环体,整个循环的过程就是不停判断循环条件、并执行循环体代码的过程。
用 while 循环计算1加到100的值:
#include
int main(){
int i=1, sum=0;
while(i<=100){
sum+=i;
i++;
}
printf(“%dn”,sum);
return 0;
}
运行结果: 5050
代码分析:
1)程序运行到 while 时,因为 i=1,i<=100 成立,所以会执行循环体;执行结束后 i 的值变为 2,sum 的值变为 1。
2)接下来会继续判断 i<=100是否成立,因为此时 i=2,i<=100 成立,所以继续执行循环体;执行结束后 i 的值变为 3,sum 的值变为3。
3)重复执行步骤 2)。
4)当循环进行到第100次,i 的值变为 101,sum 的值变为5050;因为此时 i<=100 不再成立,所以就退出循环,不再执行循环体,转而执行while循环后面的代码。
while 循环的整体思路是这样的:设置一个带有变量的循环条件,也即一个带有变量的表达式;在循环体中额外添加一条语句,让它能够改变循环条件中变量的值。这样,随着循环的不断执行,循环条件中变量的值也会不断变化,终有一个时刻,循环条件不再成立,整个循环就结束了。
如果循环条件中不包含变量,会发生什么情况呢?
1)循环条件成立时的话,while 循环会一直执行下去,永不结束,成为“死循环”。例如:
#include
int main(){
while(1){
printf(“1”);}
return 0;
}
运行程序,会不停地输出“1”,直到用户强制关闭。
2)循环条件不成立的话,while 循环就一次也不会执行。例如:
#include
int main(){
while(0){ printf(“1”);}
return 0;
}
运行程序,什么也不会输出。
do-while循环
除了while循环,在C语言中还有一种 do-while 循环。do-while循环的一般形式为:
do{
语句块 }while(表达式);do-while循环与while循环的不同在于:它会先执行“语句块”,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do-while 循环至少要执行一次“语句块”。
用do-while计算1加到100的值:
#include
int main(){
int i=1, sum=0;
do{
sum+=i;
i++;
}while(i<=100);
printf(“%dn”, sum);
return 0;
}
运行结果: 5050
注意while(i<=100);最后的分号;,这个必须要有。
while循环和do-while各有特点,大家可以适当选择,实际编程中使用while循环较多。
除了while循环,C语言中还有 for 循环,它的使用更加灵活,完全可以取代 while 循环。
上节我们使用 while 循环来计算1加到100的值,代码如下:
#include
int main(){
int i, sum=0;
i = 1;//语句①
while(i<=100 /*语句②*/){
sum+=i;
i++;//语句③
}
printf(“%dn”,sum);
return 0;
}
可以看到,语句①②③被放到了不同的地方,代码结构较为松散。为了让程序更加紧凑,可以使用 for 循环来代替,如下所示:
#include
int main(){
int i, sum=0;
for(i=1/*语句①*/;i<=100/*语句②*/;i++/*语句③*/){
sum+=i;
}
printf(“%dn”,sum);
return 0;
}
在 for 循环中,语句①②③被集中到了一起,代码结构一目了然。for 循环的一般形式为:
for(表达式1;表达式2;表达式3){
语句块 } 它的运行过程为: 1)先执行“表达式1”。
2)再执行“表达式2”,如果它的值为真(非0),则执行循环体,否则结束循环。
3)执行完循环体后再执行“表达式3”。
4)重复执行步骤 2)和 3),直到“表达式2”的值为假,就结束循环。
上面的步骤中,2)和 3)是一次循环,会重复执行,for 语句的主要作用就是不断执行步骤 2)和 3)。
“表达式1”仅在第一次循环时执行,以后都不会再执行,可以认为这是一个初始化语句。“表达式2”一般是一个关系表达式,决定了是否还要继续下次循环,称为“循环条件”。“表达式3”很多情况下是一个带有自增或自减操作的表达式,以使循环条件逐渐变得“不成立”。
for循环的执行过程可用下图表示:
break关键字
在《C语言switch语句》一节中,我们讲到了break,用它来跳出 switch 语句。
当 break 关键字用于 while、for 循环时,会终止循环而执行整个循环语句后面的代码。break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。
continue语句
continue 语句的作用是跳过循环体中剩余的语句而强制进入下一次循环。continue语句只用在 while、for 循环中,常与 if 条件语句一起使用,判断条件是否成立。