第3章单片机中断与定时_第1页
第3章单片机中断与定时_第2页
第3章单片机中断与定时_第3页
第3章单片机中断与定时_第4页
第3章单片机中断与定时_第5页
已阅读5页,还剩130页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 3.1单片机中断与定时系统单片机中断与定时系统知识第第3章章 单片机中断与定时单片机中断与定时1.什么是中断? 比如,你正在家中做作业,突然门铃响了,有快递,你放下书,去接快递的同时,厨房煤气灶上汤烧开了,这时,你会先去关了煤气灶,再去接快递,然后继续做作业。这就是生活中的“中断”的现象,就是正常的过程被外部的事件打断了。 “有快递”、“汤烧开了”等是中断源; “汤烧开了”比“有快递”急,所以要先去响应,这就是中断优先级; “关煤气灶”、“接快递”等就是中断响应。2.中断源中断源(哪些信号可以引起单片机中断?)中断源数量和种类越多,中断源数量和种类越多,MCU处理突发事件的能力就越强。处理突

2、发事件的能力就越强。80C51单片机共有单片机共有5种中断源。种中断源。中断源分为三类:2个外部中断,2个定时器/计数器中断,1个串行口中断。(1)外部中断INT0:外部中断0,由引脚P3.2输入,可选择低电平或者下降沿触发。INT1:外部中断1,由引脚P3.3输入,可选择低电平或者下降沿触发。(2)定时器/计数器中断 T0:定时器/计数器0中断,定时器0提供片内计数溢出触发,或者P3.4引脚提供片外计数触发。 T1:定时器/计数器1中断,定时器1提供片内计数溢出触发,或者P3.5引脚提供片外计数触发。(3)RX、TX为串行口中断所用,由片内串口提供,分为发送中断和接收中断,当串口完成一帧发送

3、或接收时,触发中断。3.中断请求标志中断请求标志(单片机如何知道中断信号出现了?)(单片机如何知道中断信号出现了?)当中断信号出现时,单片机中的某些位寄存器当中断信号出现时,单片机中的某些位寄存器(中断请求标志位中断请求标志位)可被硬件置)可被硬件置1。CPU通过定期查看中断请求标志位是否为通过定期查看中断请求标志位是否为1,便可,便可知道有无中断请求。知道有无中断请求。 TCON寄存器寄存器定时定时/计数器的控制寄存器计数器的控制寄存器(Timer/Counter Control Register),),可位寻址。可位寻址。 SCON寄存器寄存器IE寄存器寄存器51单片机复位,IE各位清0,

4、所有中断被禁止。每个位开关赋值为1则开中断,赋值为0则关中断。只有打开总中断位开关,其它各位的开关才可以开启。可以整体赋值,如:IE=0 x81;表示开启总中断,打开外部中断0可以单独赋值:如:EA=1;EX0=1;也表示开启总中断,打开外部中断0。 IP 寄存器寄存器51单片机复位,IP各位清0,所有中断同为低优先级。每位可赋值为1,则高优先级,赋值为0,则低优先级,同级按自然优先级排序执行。自然优先级顺序由高到低排列为:外部中断0、定时器/计数器0中断、外部中断1、定时器/计数器1中断、个串行口中断。可以整体赋值,如:IP=0 x02;表示定时器/计数器0中断为高优先级中断。可以单独赋值:

5、如:PT0=1;也表示定时器/计数器0中断为高优先级中断。优先级原则小结:优先级原则小结:1)高级中断请求可以打断正在执行的低级中断;)高级中断请求可以打断正在执行的低级中断;2)同级或低级中断请求不能打断正在执行的中断;)同级或低级中断请求不能打断正在执行的中断;3)同级中断源同时提出请求时按自然优先级响应:)同级中断源同时提出请求时按自然优先级响应: INT0 T0 INT1T1TI/RI4)单片机复位时,)单片机复位时,IP各位都被置各位都被置0, 所有中断源为低级中断所有中断源为低级中断4.中断系统的组成中断系统的组成(影响中断的因素?)5.中断系统的组成中断系统的组成(影响中断的因素

6、?)定时定时/计数器的结构与原理计数器的结构与原理 8051单片机内部有两个16位的可编程定时/计数器,称为T0(T0)和T1(T1) 应用1:T0/T1用作计数对芯片对芯片引脚引脚T0/T1上上输入的脉冲计数,输入的脉冲计数,每输入一个脉冲,每输入一个脉冲,加法计数器加加法计数器加120VSS19XTAL118XTAL217/P3.716/P3.615T1/P3.514T0/P3.413/P3.312/P3.211TXD/P3.110RXD/P3.09RST/VPD8P1.77P1.66P1.55P1.44P1.33P1.22P1.11P1.0P2.021P2.122P2.223P2.324

7、P2.425P2.526P2.627P2.72829ALE/ 30 /VPP31P0.732P0.633P0.534P0.435P0.336P0.237P0.138P0.039VCC401INTW RRDEAPROGPSEN80318051875189C510INTT0外部计数应用应用2:T0/T1用作内部定时用作内部定时对内部机器周期脉冲计数,由于机器对内部机器周期脉冲计数,由于机器周期是定值,所以可周期是定值,所以可设定初值设定初值进行定进行定时。时。内部定时内部定时/ /计数器的启动计数器的启动 INT1 0INT 或启动定时/计数器 根据设置的定时/计数器启动方式,启动定时/计数器。

8、如果采用软件启动: 1.TR0或TR1置1; 如果采用硬软共同启动方式: 1.控制寄存器中的TR0或TR1置1, 2.外部启动信号 为高电平。INT1 0INT 或定时/计数器的初值 设置计数初值pT0T0、T1T1是是1616位加法计数器,分别由两个位加法计数器,分别由两个8 8位专用寄存器组成,位专用寄存器组成,T0T0由由TH0TH0和和TL0TL0组成,组成,T1T1由由TH1TH1和和TL1TL1组成。组成。p在计数器允许的计数范围内,计数器可以从任何值开始计数,在计数器允许的计数范围内,计数器可以从任何值开始计数,对于加对于加1 1计数器,当计到最大值时(对于计数器,当计到最大值时

9、(对于8 8位计数器,当计数值位计数器,当计数值从从255255再加再加1 1时,计数值变为时,计数值变为0 0),产生溢出。),产生溢出。p定时定时/ /计数器允许用户编程设定开始计数的数值,称为赋初值。计数器允许用户编程设定开始计数的数值,称为赋初值。初值不同,则计数器产生溢出时,计数个数也不同。初值不同,则计数器产生溢出时,计数个数也不同。 1 定时器工作方式寄存器(定时器工作方式寄存器(TMOD,89H)作用:设置两个定时器作用:设置两个定时器/计数器工作方式。计数器工作方式。但但TMOD寄存器不能位寻址,只能用字节传送指令设置寄存器不能位寻址,只能用字节传送指令设置其内容。其内容。位

10、序号位序号 D7D6D5D4 D3D2D1D0位符号位符号 GATEC/TM1M0GATEC/TM1M0 T1 T0 M1、M0工作方式选择位。工作方式选择位。M1 M0工作方式工作方式功功 能能 描描 述述0 00 11 01 1方式方式 0方式方式1方式方式2方式方式313位计数器位计数器16位计数器位计数器自动再装入自动再装入8位计数器位计数器定时器定时器0:分成两个:分成两个8位计数器位计数器定时器定时器1:停止计数:停止计数 定时方式或计数方式选择位定时方式或计数方式选择位 0定时工作方式定时工作方式1计数工作方式计数工作方式T/CT/CT/C位序号位序号 D7D6D5D4 D3D2

11、D1D0位符号位符号 GATEC/TM1M0GATEC/TM1M0 GATE门控位门控位 GATE0 以运行控制位以运行控制位TR0(TR1)启动定时器)启动定时器 GATE1 以外中断请求信号以外中断请求信号 启动定时器启动定时器 INT1 0INT 或 复位后,复位后,TMOD0。位序号位序号 D7D6D5D4 D3D2D1D0位符号位符号GATE 0C/T0M11M00GATE0C/T1M10M01例例: 设定时器设定时器1为定时工作方式,要求由为定时工作方式,要求由TR1启动定时器启动定时器1,按方式按方式2工作。定时器工作。定时器0为计数方式,要求由为计数方式,要求由TR0启动定时启

12、动定时器器0,按方式,按方式1工作。工作。TMOD=0 x25定时器控制寄存器(定时器控制寄存器(TCON,88H)位地址位地址8F8E8D8C8B8A8988位符号位符号TF1TR1TF0TR0IE1IT1IE0IT0位地址位地址8F8E8D8C8B8A8988位符号位符号TF1TR1TF0TR0IE1IT1IE0IT0TR0(TR1): 定时器运行控制位。定时器运行控制位。定时器的初始值的计算对于不同的工作方式,计数器位数不同,故最大计数值对于不同的工作方式,计数器位数不同,故最大计数值M也不同:也不同: 方式方式0:M=213=8192 方式方式1:M=216=65536 方式方式2:M

13、=28=256 方式方式3:定时器:定时器0分为分为2个个8位计数器,每个位计数器,每个M均为均为256。因为定时因为定时/计数器是作加计数器是作加1计数,并在计满溢出时产生中断,因此初计数,并在计满溢出时产生中断,因此初值值X的计算如下:的计算如下: X = M 计数值计数值 计算出来的结果计算出来的结果X转换为转换为16进制数后分别写入进制数后分别写入TL0(TL1)、)、TH0(TH1)。)。注意!方式注意!方式0时初始值写入时,对于时初始值写入时,对于TL不用的高不用的高3位应填入位应填入0!举例1 用用T1、工作方式、工作方式1实现实现1秒延时函数,晶振秒延时函数,晶振频率为频率为1

14、2MHz。 方式方式1采用采用16位计数器,其最大定时时间为:位计数器,其最大定时时间为:655361 s = 65.536ms,因此,定时时间选择定时时间为,因此,定时时间选择定时时间为50ms,再循环,再循环20次。次。 定时时间为定时时间为50ms,则计数值为,则计数值为50ms/1 s =50000,T1的初的初值为:值为: X = M 计数值计数值= 65536 50000 = 15536 = 0 x3CB0 = 所以:所以: TH1=0 x3C ;TL1=0 xB0;TMOD=0 x10;用用T1T1、工作方式、工作方式2 2实现实现1 1秒延时,晶振频率为秒延时,晶振频率为12M

15、Hz12MHz。因工作方式因工作方式2 2是是8 8位计数器,其最大定时时间为:位计数器,其最大定时时间为:2562561 1 s s = 256= 256 s s,为实现,为实现1 1秒延时,可选择定时时间为秒延时,可选择定时时间为250250 s s,再,再循环循环40004000次。次。 定时时间选定后,可确定计数值为定时时间选定后,可确定计数值为250250,则,则T1T1的初值的初值为:为:X = M X = M 计数值计数值=256 =256 250 = 6 = 0 x6 250 = 6 = 0 x6。采用。采用T1T1方式方式2 2工作,因此,工作,因此,TMOD =0 x20T

16、MOD =0 x20。举 例2 3.2 简易秒表项目设计简易秒表项目设计项目动手做动手做画出硬件电路图画出硬件电路图 简易秒表的程序设计如下。#include #define uchar unsigned char void delay(uchar); void watch(uchar,uchar);uchar i,l,msecond,second; uchar led=0 x3f,0 x6,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x7,0 x7f,0 x6f; /09码表/*主程序*/void main()TMOD=0 x01; /T0,工作方式1,16位TL0=-5

17、0000%256; /T0初值低8位,定时50毫秒TH0=-50000/256; /T0初值高8位,定时50毫秒IE=0 x82; /T0允许,总中断允许TR0=1; /运行T0while(1) watch(i,l); /秒表数码管显示/*秒表数码管显示*/void watch(uchar m,uchar n)P2=0 x08; P0=ledm; /数码管1显示十位delay(5);P2=0 x09; P0=ledn; /数码管2显示个位 delay(5);/*T0中断服务程序,中断号为1*/ void Time0() interrupt 1 TL0=-50000%256; /T0初值低8位,

18、定时50毫秒TH0=-50000/256; /T0初值高8位,定时50毫秒msecond+;if(msecond=20) /1秒时间到msecond=0;second+;if(second=60) /等于60秒归零second=0;i=second/10; /十位:整除求商 l=second%10; /个位:整除求余/*延时函数t(ms)*/void delay(uchar t ) uchar j,k; for(j=0;jt;j+) for(k=0;k255;k+) 语句“TL0=-50000%256;”,完整的表达为“TL0=(65536-50000)%256;”。由于T0工作方式为1,是十

19、六位,所以最大为216,即65536,语句中50000表示计数次数,实现50毫秒。将十进制换成十六进制,采用余运算,即%256,得到T0初值低8位。 同理,求商运算,即/256,得到T0初值高8位。 语句“i=second/10;”表示整除求商,得到秒时间的十位,语句“l=second%10;”表示整除求余,得到个位。 同理,可以利用“整除求商求余”来拆分提取一个数的个十百千位。 求商求余运算符,不仅能用在数学运算中,还可以用来拆分提取一个数的个十百千位。在单片机显示程序中,不管是液晶屏还是数码管,必须用到这种提取算法,先把一个数的个十百千位一个个拆分提取出来,然后再送到显示屏上显示,所以这种

20、算法很常见和实用。“个,十,百,千”位只是一个虚数,具体是多少应该根据实际项目而定,也有可能是“个,十,百,千,万,十万,百万.”等位,但是处理的思路和方法都是一致的。 拆分提取的思路。比如97532这个数,万位是9,千位是7,百位是5,十位是3,个位是2。可以依次进行如下运算。9=97532/10000;7=7532/1000;5=532/100;3=32/10;2=2/1; 上述用到了整除求商,但是7532、532、32、2又是如何通过97532分解得到的呢?需要用到整除求余,运算如下。7532=97532%10000;532=97532%1000;32=97532%100;2=97532

21、%10; 最后综合在一起,连在一起写:9=97532/10000;7=(97532%10000)/1000;5=(97532%1000)/100;3=(97532%100)/10;2=(97532%10)/1;因为,预先知道了这个数最大位是万位,所以万位直接整除10000求商就可以了。实际项目中,只是用某个变量,而这个变量的大小并不知道具体是什么,它的最大位可能并不止万位,也有可能是十万位,所以需要把上述最高位的万位也做一下100000整除余数,然后在整除10000求商,计算如下。9=(97532%100000)/10000;7=(97532%10000)/1000;5=(97532%1000

22、)/100;3=(97532%100)/10;2=(97532%10)/1;以此类推,如果求十万,百万,也是用一样的方法。有一些单片机的C编译器可能不支持long类型数据的求余求商连写在一起,那么就要用一个中间变量分两步走,先求余,再求商,分开来操作,表达如下。9=(97532%100000)/10000;分成如下两步走。a=97532%100000;a=a/10000;上述的变量a就是引入的中间变量。以5位数x为例,拆分得到各位数字的程序如下。unsigned char a,b,c,d,e; unsigned long int x; a=(x%100000)/10000; /拆分提取万位b=

23、(x%10000)/1000; /拆分提取千位c=(x%1000)/100; /拆分提取百位d=(x%100)/10; /拆分提取十位e=(x%10)/1; /拆分提取个位由于x是5位数,必须是unsigned long int类型以上。x不能是unsigned char类型,它的最大范围是255,不够;也不能是unsigned int,最大范围为65536,也不够。仿真运行图 3.3 时分秒的计时项目设计时分秒的计时项目设计项目动手做动手做画出硬件电路图画出硬件电路图 时分秒的计时程序设计如下。#include #define uchar unsigned charvoid delay(uc

24、har);void watch(uchar,uchar,uchar,uchar,uchar,uchar); /数码管显示函数声明uchar s1,s2,m1,m2,h1,h2,msecond,second,minute,hour; uchar led=0 x3f,0 x6,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x7,0 x7f,0 x6f; /09段码/*主程序*/void main()TMOD=0 x01; /T0工作方式1TL0=-50000%256; /50ms初值低8位TH0=-50000/256; /50ms初值高8位 IE=0 x82; /定时中断允许TR

25、0=1; /启动定时中断while(1) watch(s1,s2,m1,m2,h1,h2); /数码管显示时分秒/*数码管显示时分秒*/void watch(uchar ss1,uchar ss2,uchar mm1,uchar mm2,uchar hh1,uchar hh2)P2=0 x08; P0=ledhh1; delay(1);P2=0 x09; P0=ledhh2; /数码管显示时delay(1);P2=0 x0a; P0=ledmm1; delay(1);P2=0 x0b; P0=ledmm2; /数码管显示分delay(1);P2=0 x0c; P0=ledss1; delay(

26、1);P2=0 x0d; P0=ledss2; /数码管显示秒delay(1);/*定时器0中断函数*/void Time0() interrupt 1TL0=-50000%256; /T0初值重置TH0=-50000/256;msecond+;if(msecond=20) /1000ms为1秒msecond=0;second+;if(second=60) /60秒为1分second=0;minute+;s1=second/10; /秒十位s2=second%10; /秒个位if(minute=60) /60分为1小时minute=0;hour+;m1=minute/10; /分十位 m2=m

27、inute%10; /分十位 if(hour=24) hour=0; h1=hour/10; /时十位 h2=hour%10; /时十位 /*延时函数t(ms)*/void delay(uchar t ) uchar j,k; for(j=0;jt;j+) for(k=0;k255;k+) 仿真运行图 3.4 光电计时项目设计光电计时项目设计项目 光电开关是利用被检测物对光束的遮挡或反射,从而检测物体的有无。光电计时硬件电路使用两个对射式光电开关,其中对射式光电开关0作为外中断0,当有物体经过时,阻挡光路,触发控制单片机定时器开始;对射式光电开关1作为外中断1,当有物体经过时,阻挡光路,触发控

28、制单片机定时器结束,根据开始和结束间隔来完成计时,并用数码管显示读秒,动手做动手做画出硬件电路图画出硬件电路图 光电计时程序设计如下。#include #define uchar unsigned char void delay(uchar); void init(void);void display(void); /数码管显示计数unsigned long int t_ms;uchar led=0 x3F,0 x06,0 x5B,0 x4F,0 x66,0 x6D,0 x7D,0 x07,0 x7F,0 x6F; /09段码 uchar wan,qian,bai,shi ,ge; /计时的万

29、、千、百、十、个位。/*主程序*/void main()init();while(1) display(); /*定时器0外中断0、1初始化*/void init(void)TMOD=0 x01; /定时器0方式1,16位TH0=(65536-1000)/256; /定时器0的1ms初值高8位 TL0=(65536-1000)%256; /定时器0的1ms初值低8位IT0=1; /外部中断0下降沿触发IT1=1; /外部中断1下降沿触发ET0=1; /允许定时0中断EA=1; /总中断允许EX0=1; /允许外部中断 0,EX1=1; /允许外部中断 1,/*外中断0函数*/void int0

30、(void) interrupt 0 /外部中断0服务程序:计时开始TR0=1; /开定时中断0,开始计时t_ms=0;/*定时器0中断函数*/void time0(void) interrupt 1 /定时器中断0TH0=(65536-1000)/256; /定时器0的1ms初值高8位 TL0=(65536-1000)%256; /定时器0的1ms初值低8位t_ms=t_ms+1;if(t_ms=100000) t_ms=0; /超过100秒归0/*外部中断1函数*/void int1(void) interrupt 2 /外部中断1服务程序:计时结束 TR0=0; /关定时中断0,结束计时

31、/*数码管显示计数*/void display()wan= (t_ms%100000)/10000; /万位qian=(t_ms%10000)/1000; /千位bai= (t_ms%1000)/100; /百位shi= (t_ms%100)/10; /十位ge= (t_ms%10)/1; /个位P2=0 x8; P0=ledwan; /显示万位(秒十位)在第1个数码管delay(1);P2=0 x9; P0=ledqian; /显示千位(秒个位)在第2个数码管delay(1);P2=0 xa; P0=0 x80; /显示.在第3个数码管delay(1); P2=0 xb; P0=ledbai

32、; /显示百位(毫秒百位)在第4个数码管 delay(1);P2=0 xc; P0=ledshi; /显示十位(毫秒十位)在第5个数码管 delay(1);P2=0 xd; P0=ledge; /显示个位(毫秒个位)在第6个数码管delay(1);/*延时函数t(ms)*/void delay(uchar t ) uchar j,k; for(j=0;jt;j+) for(k=0;k255;k+) 仿真运行图 3.5 定时器计数项目设计定时器计数项目设计项目单片机定时/计时器具有计数功能,可以对管脚P3.4/T0或P3.5/T1的脉冲下降沿计数,在由高电平变成低电平的时候计数一次,直到再次检测

33、到下降沿。动手做动手做画出硬件电路图画出硬件电路图 1. 采用中断方式 按钮按键作为计数,计5次改变LED状态,采用中断方式计数的程序如下。#includesbit LED=P14; /LED接口端/*定时器0初始化*/void timer0_init(void)TMOD=0X06; /定时器0,计数,方式2TH0=-5; /计数5次为上限TL0=-5; /计数5次为上限IE=0X82; /允许中断TR0=1; /启动中断/*定时器0中断函数*/void Timer0_int() interrupt 1 using 0 /定时器0计数中断 LED=!LED; /*主程序*/void main(

34、)LED=0;timer0_init();while(1) ;2. 采用查询方式 按钮按键作为计数,计5次改变LED状态,采用查询方式计数的程序如下。#includesbit LED=P14; /LED接口端/*定时器0初始化*/void time0_init(void)TMOD=0X06; /定时器0,计数,方式2TH0=-5; /计数5次为上限TL0=-5; /计数5次为上限TR0=1; /启动计数器0/*主程序*/void main()LED=0;time0_init(); /定时器0计数中断while(1)while(TF0=0); /等待定时器0中断TF0=0; /定时器0中断到,清

35、标记LED=!LED; 仿真运行图 3.6 模拟交通信号灯项目设计模拟交通信号灯项目设计项目 用51单片机设计一交通信号灯模拟控制系统,采用12MHz晶振。具体要求如下。(1)南北方向为主道,东西方向为支道,轮流放行,南北绿灯放行25s,黄灯延时5s,红灯20s;东西绿灯放行15s,黄灯延时5s,红灯30s。(2)有紧急车辆通过时,均为红灯。(3)要求由数码管显示红绿灯倒计时时间。动手做动手做画出硬件电路图画出硬件电路图 模拟交通灯项目的程序设计如下。#include #define uchar unsigned charuchar a10=0 x3F,0 x06,0 x5B,0 x4F,0

36、x66,0 x6D,0 x7D,0 x07,0 x7F,0 x6F; /09段码uchar b4=0 x0D,0 x0E,0 x07,0 x0B;/P2口控制数码管显示位:南北个、十位,东西个、十位。uchar c4=0 x3A,0 x36,0 x5C,0 x6C;/4个状态:东西红,南北绿;东西红,南北黄灯闪;东西绿,南北红;东西黄闪,南北红。uchar NS=25,EW=30; /NS表示南北向25秒绿灯亮,EW表示东西向30秒红灯亮。uchar NS_G=25,EW_G=15,Y=5; /NS向绿灯亮25秒,东西绿15秒,黄灯5秒。uchar i,k=0,count=0; void de

37、lay(uchar);void trafic_light(); /四个交通灯状态函数声明void led_display(); /数码管显示函数声明sbit key_end=P35; /结束紧急状态/*定时器0初始化函数*/void init(void)TMOD=0 x01; /定时器0方式1,16位TH0=(65536-50000)/256; /定时器0的50ms初值高8位 TL0=(65536-50000)%256; /定时器0的50ms初值低8位ET0=1; /允许定时0中断TR0=1; /运行定时0中断EX1=1; /允许外中断1EA=1; /总中断允许/*外部中断1中断函数*/voi

38、d int1(void) interrupt 2 /外部中断1,P3.3,,紧急状态P1=0 x3C,P0=a9; /东南西北红灯,数码管显示99EA=0; /关中断TR0=!TR0; /停定时器0中断while(1)for(i=0;i4;i+)P2=bi;delay(1);if(key_end=0) /紧急状态结束,继续delay(10); if(key_end=0)while(!key_end) for(i=0;i=20) /20*50ms=1秒NS-; EW-; count=0; if(NS=0|EW=0) /NS或EW减到零k+;if(k3) k=0;switch(k) case 0:

39、NS=NS_G;EW=NS_G+Y;break; /状态0:东西红,南北绿的时间case 1:NS=Y;EW=Y;break; /状态1:东西红,南北黄闪时间 case 2:NS=EW_G+Y;EW=EW_G;break; /状态2:东西绿,南北红的时间case 3:NS=Y;EW=Y;break; /状态3:东西黄闪,南北红时间/*延时函数t(ms)*/void delay(uchar t ) uchar j,k; for(j=0;jt;j+) for(k=0;k255;k+) /*交通灯状态函数*/void trafic_light() /4个亮灯状态P1=ck; /灯状态0或状态2if(

40、P1=c1&count=0) /状态1、 1秒时间到,灭黄灯,形成闪烁 P1=0 x3E; elseif(P1=c3&count=0) /状态3、1秒时间到,灭黄灯,形成闪烁 P1=0 x7C; /*数码管倒计时*/void led_display() P2=b0;P0=aNS%10; /南北个位delay(5); P2=b1;P0=aNS/10; /南北十位delay(5);P2=b2;P0=aEW%10; /东西个位delay(5); P2=b3;P0=aEW/10; /东西十位delay(5); /*主程序*/void main(void)init(); /定时器0初始化

41、while(1)trafic_light(); /交通灯状态变化led_display(); /数码管倒计时显示仿真运行图 3.7 带设置功能的交通灯项目设计带设置功能的交通灯项目设计项目 用51单片机设计一交通信号灯模拟控制系统,采用12MHz晶振。具体要求如下。(1)南北方向为主道,东西方向为支道,轮流放行,南北绿灯放行25s,黄灯延时5s,红灯20s;东西绿灯放行15s,黄灯延时5s,红灯30s。(2)有紧急车辆通过时,均为红灯。(3)要求由数码管显示红绿灯倒计时时间。(4)可以对南北、东西的交通灯时间进行设置。动手做动手做画出硬件电路图画出硬件电路图 带设置功能的交通灯项目源程序如下。

42、#include #define uchar unsigned char uchar a10=0 x3F,0 x06,0 x5B,0 x4F,0 x66,0 x6D,0 x7D,0 x07,0 x7F,0 x6F; /09段码uchar b4=0 x0D,0 x0E,0 x07,0 x0B; /P2口控制数码管显示位:南北个、十位,东西个、十位。uchar c4=0 x3A,0 x36,0 x5C,0 x6C; /4个状态:东西红,南北绿;东西红,南北黄灯闪;东西绿,南北红;东西黄闪,南北红。uchar NorthSouth=25,EastWest=30;/NorthSouth表示南北向25秒

43、绿灯亮,EastWest表示东西向30秒红灯亮。uchar NorthSouth_G=25,EastWest_G=15,Y=5; /NorthSouth向绿灯亮25秒,东西绿15秒,黄灯5秒。uchar i,k=0,count=0; void delay(uchar);void trafic_light(); /四个交通灯状态函数声明void led_display(); /数码管显示函数声明void led_set(); /数码管设置sbit NorthSouth_up=P30; /南北绿灯设置时间加1,或重新开始sbit EastWest_up1=P36; /东西绿灯设置时间加1,或重新开

44、始sbit key_end=P35; /结束设置时间,或结束紧急状态sbit NorthSouth_down=P31; /南北绿灯设置时间减1sbit EastWest_down1=P37; /东西绿灯设置时间减1/*定时器0,外部中断0、1初始化函数*/void init(void)TMOD=0 x01; /定时器0方式1,16位TH0=(65536-50000)/256; /定时器0的50ms初值高8位 TL0=(65536-50000)%256; /定时器0的50ms初值低8位IT0=1; /外部中断0下降沿触发ET0=1; /允许定时0中断TR0=1; /运行定时0中断EA=1; /总

45、中断允许EX0=1; /允许外部中断 0,EX1=1; /允许外部中断 1,/*外部中断0服务程序:时间设置,P3.2*/void int0(void) interrupt 0 EA=0; /关中断P1=0 x3C; /东西、南北红LEDTR0=!TR0; /关定时中断0while(1)led_set(); if(NorthSouth_up=0) /南北绿灯设置时间加1delay(10); if(NorthSouth_up=0)while(!NorthSouth_up) led_set(); NorthSouth_G+; if(NorthSouth_G+Y)=100) NorthSouth_G

46、=1; if(NorthSouth_down=0) /南北绿灯设置时间减1delay(10); if(NorthSouth_down=0)while(!NorthSouth_down) led_set(); NorthSouth_G-; if(NorthSouth_G+Y)=5) NorthSouth_G=94; if(EastWest_up1=0) /东西绿灯设置时间加1delay(10); if(EastWest_up1=0)while(!EastWest_up1) led_set(); EastWest_G+; if(EastWest_G+Y)=100) EastWest_G=1; if

47、(EastWest_down1=0) /东西绿灯设置时间减1delay(10); if(EastWest_down1=0) while(!EastWest_down1) led_set(); EastWest_G-; if(EastWest_G+Y)=5) EastWest_G=94; if(key_end=0) /结束设置时间delay(10); if(key_end=0)while(!key_end) led_set(); TR0=!TR0; EA=1; break; /*外部中断1,P3.3,紧急状态*/void int1(void) interrupt 2 P1=0 x3C,P0=a9

48、; /东南西北红灯,数码管显示99EA=0; /关中断TR0=!TR0; /停定时器0中断while(1)for(i=0;i4;i+)P2=bi;delay(1);if(key_end=0) /紧急状态结束,继续delay(10); if(key_end=0)while(!key_end) for(i=0;i=20) /20*50ms=1秒NorthSouth-; EastWest-; count=0; if(NorthSouth=0|EastWest=0) /NorthSouth或EastWest减到零k+;if(k3) k=0;switch(k) case 0:NorthSouth=Nor

49、thSouth_G;EastWest=NorthSouth_G+Y;break; /状态0:东西红,南北绿的时间case 1:NorthSouth=Y;EastWest=Y;break; /状态1:东西红,南北黄灯闪的时间 case 2:NorthSouth=EastWest_G+Y;EastWest=EastWest_G;break; /状态2:东西绿,南北红的时间case 3:NorthSouth=Y;EastWest=Y;break; /状态3:东西黄闪,南北红的时间/*延时函数t(ms)*/void delay(uchar t ) uchar j,k; for(j=0;jt;j+) f

50、or(k=0;k255;k+) /*交通灯状态函数*/void trafic_light() /4个亮灯状态P1=ck; /灯状态0或状态2if(P1=c1&count=0) /状态1,同时1秒时间到,灭黄灯,形成闪烁 P1=0 x3E; elseif(P1=c3&count=0) /状态3、 1秒时间到,灭黄灯,闪烁 P1=0 x7C; /*数码管倒计时*/void led_display() P2=b0;P0=aNorthSouth%10; /南北个位delay(5); P2=b1;P0=aNorthSouth/10; /南北十位delay(5);P2=b2;P0=aEas

51、tWest%10; /东西个位delay(5); P2=b3;P0=aEastWest/10; /东西十位delay(5); /*数码管设置值显示*/void led_set() P2=b0;P0=a(NorthSouth_G+Y)%10; /南北设置时间个位delay(5); P2=b1;P0=a(NorthSouth_G+Y)/10; /南北设置时间十位delay(5); P2=b2;P0=a(EastWest_G+Y)%10; /东西设置时间个位delay(5); P2=b3;P0=a(EastWest_G+Y)/10; /东西设置时间十位delay(5); /*主程序*/void ma

52、in(void)init(); while(1)key(); trafic_light(); led_display(); 仿真运行图 3.8 直流电机的直流电机的PWM控制项目设计控制项目设计项目 设计一个直流电机控制系统,控制功能要求实现电机的正转启动、反转启动、停止、加速、减速共五种功能,使用按键和数码管,实现人机交互。 K1控制正转启动、K2控制反转启动、K3停止控制、K4加速控制、K5减速控制,用3个发光二极管显示状态:正转时红灯亮,反转时黄灯亮,不转时绿灯亮。并利用1位LED数码管显示电机转速档位动手做动手做画出硬件电路图画出硬件电路图 电机属于大功率的器件,而单片机的I/O口所提

53、供的电流往往十万有限,所以必须外加驱动电路。 由于专用的驱动芯片由于结构简单、价格便宜、可靠性高等特点,因而被广泛的应用实现电机的驱动。电机的驱动芯片很多如L298N、BST7970、MC33886等。 电机属于L298可驱动2个电动机,2、3、13、14脚OUT1,OUT2和OUT3,OUT4之间可分别接电动机。5、7、10、12脚的IN1、IN2、IN3、IN4接输入控制电平,控制电机的正反转。EnA,EnB接控制使能端,控制电机的停转。IN1 IN2 IN3IN4转向转向PWM调调速速EnAPWM调调速速EnB直流电机直流电机110- -正矩形波-01- -反矩形波-00- -停矩形波-

54、直流电机直流电机2-10 正-矩形波-01 反-矩形波-00 停-矩形波直流电机的PWM调速 所谓PWM就是脉宽调制器,通过调制器给电机提供一个具有一定频率的脉冲宽度可调的脉冲电。脉冲宽度越大即占空比越大,提供给电机的平均电压越大,电机转速就高。反之脉冲宽度越小,则占空比越越小。提供给电机的平均电压越小,电机转速就低。 PWM不管是高电平还是低电平时电机都是转动的,电机的转速取决于平均电压。 PWM调速程序中,可以使用软件延时的方法,也可以使用定时器的方法,在单片机I/O口实现高低电平的延时翻转,输出不同占空比的PWM信号。直流电机的PWM控制项目程序设计如下。#include#define

55、uchar unsigned charuchar m; /用来标志速度档位uchar num; /计数标志uchar led=0 x3f,0 x6,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x7,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71; /七段码表 sbit LE=P20; sbit k1=P21; /正转按钮 sbit k2=P22; /反转按钮sbit k3=P23; /停按钮sbit k4=P27; /加速按钮sbit k5=P26; /减速按钮sbit PWM=P15; /PWM信号从P14输出sbit IN

56、2=P16; /直流电机正反转控制sbit IN1=P17; /直流电机正反转控制/*定时器的初始化函数*/ void init() /定时器的初始化 TMOD=0X01; /定时器0工作方式1TH0=(65536-50000)/256;TL0=(65536-50000)%256; /装载初值TR0=1; /开始计数ET0=1; /开启定时器中断使能EA=1; /开启总中断IN1=0;IN2=0; /IN1=0,IN2=0;控制电动机停m=0; /开启电动机为0档/*延时t(ms)函数*/ void delay(uchar t ) unsigned char j,k; for(j=0;jt;j

57、+) for(k=0;k3) m=3;while(!k4); /松开后继续执行if(P1=0 x01) P1=0 x01; if(P1=0 x10) P1=0 x10; if(k5=0) /检测减速按钮delay(10); /消抖10msif(k5=0) /如果减速按钮按下 if(m1)m-; /档位减一if(m=1)m=1;while(!k5); /松开后继续执行if(P1=0 x01) P1=0 x01; if(P1=0 x10) P1=0 x10;if(m3)m=3; /档位最大为3档if(m0)m=0; /档位最小为0档LE=1; /锁存器数据透明P0=ledm;LE=0; /锁存器数

58、据锁存/*定时器0中断函数*/ void Time0_Int() interrupt 1 /中断程序TH0=(65536-50000)/256;TL0=(65536-50000)%256; /装载初值num+;if(num = m) /对应的脉宽值输出低电平 PWM = 0;if(num = 3) /3段一个周期到达后PWM = 1; /输出高电平num = 0; 仿真运行图 3.9 红外遥控项目设计红外遥控项目设计项目 按下遥控器的某一个键,遥控器会发出一连串经过调制后的信号,这个信号经过红外一体化模块接收后,输出解调后的数字脉冲,每个按键对应不同的脉冲,故识别出不同的脉冲就能识别出不同的按

59、键。 红外遥控是以调制的方式发射数据,就是把数据和一定频率的载波进行“与”操作,这样既可以提高发射效率又可以降低电源功耗。 原始信号就是要发送的一个数据“0”位或者一位数据“1”位。 调制载波频率一般在30khz到60khz之间,大多数使用的是38kHz,占空比1:3的方波。这是由发射端所使用的455kHz晶振决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz1237.9 kHz38kHz。 数据“0”位或 “1”位调制后波形如下: 根据红外发射的NEC协议,数据“1”为2.25ms,脉冲时间560us;数据“0”为1.12ms,脉冲时间560us。根据脉冲时间长短来解

60、码。38kHz调制后的数据1与数据0的表示遥控是以调制的方式发射数据,就是把数据和一定频率的载波进行“与”操作,这样既可以提高发射效率又可以降低电源功耗。 根据红外发射的NEC协议,首次发送的是9ms的高电平脉冲,其后是4.5ms的低电平,接下来就是8bit的地址码,从低有效位开始发,而后是8bit的地址码的反码,主要是用于校验是否出错。然后是8bit 的命令码,也是从低有效位开始发,而后也是8bit 的命令码的反码。 一个完整的全码 = 引导码 +用户地址码 +用户地址码反码 + 命令码 + 命令码反码 + 数据反码。 数据格式包括了引导码、用户地址码、用户地址码反码、命令码和命令码反码,编码总占32位。反码是地址码、数据码反相后的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论