第12章 各种应用设计课件.ppt

上传人:小飞机 文档编号:2163307 上传时间:2023-01-22 格式:PPT 页数:84 大小:615.50KB
返回 下载 相关 举报
第12章 各种应用设计课件.ppt_第1页
第1页 / 共84页
第12章 各种应用设计课件.ppt_第2页
第2页 / 共84页
第12章 各种应用设计课件.ppt_第3页
第3页 / 共84页
第12章 各种应用设计课件.ppt_第4页
第4页 / 共84页
第12章 各种应用设计课件.ppt_第5页
第5页 / 共84页
点击查看更多>>
资源描述

《第12章 各种应用设计课件.ppt》由会员分享,可在线阅读,更多相关《第12章 各种应用设计课件.ppt(84页珍藏版)》请在三一办公上搜索。

1、1,第12章 单片机各种应用设计,介绍各种常用的单片机测控应用设计案例,通过案例使读者了解单片机系统的的各种常见的应用设计。12.1 单片机控制步进电机的设计 步进电机是将脉冲信号转变为角位移或线位移的开环控制元件。非超载的情况下,电机转速、停止位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,给电机加一脉冲信号,电机则转过一个步距角。因而步进电机只有周期性误差而无累积误差,在速度、位置等控制领域有较为广泛的应用。,2,3,1.控制步进电机的工作原理 驱动步进电机由单片机通过对每组线圈中的电流的顺序切换来使电机作步进式旋转,切换是单片机输出脉冲信号来实现。调节脉冲信号频率就可改变步进电

2、机转速;改变各相脉冲先后顺序,就可改变电机旋转方向。步进电机驱动可采用双四拍(ABBCCDDAAB)方式,也可采用单四拍(ABCDA)方式。为使步进电机旋转平稳,还可采用单、双八拍方式(AABBBCCCDDDAA)。各种工作方式时序见图12-1。,4,图12-1 各种工作方式时序图,5,图12-1脉冲信号是高电平有效,但实际控制时公共端是接在VCC上,所以实际控制脉冲是低电平有效。2.电路设计与编程【例12-1】单片机对步进电机控制的原理电路见图12-1。编写程序,用四路I/O口输出实现环形脉冲分配,控制步进电机按固定方向连续转动。同时,通过“正转”和“反转”两个按键来控制电机的正转与反转。按

3、下“正转”按键,步进电机正转;按下“反转”按键,步进电机反转;松开按键,电机停止转动。ULN2003是高耐压、大电流达林顿阵列系列产品,7个NPN达林顿管组成。多用于单片机、智能仪表、PLC等控制电,6,图12-2 单片机控制步进电机接口电路,7,路中。在5V电压下能与TTL和CMOS电路直接相连,可直接驱动继电器等负载。具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点。输入5V的TTL电平,输出可达500mA/50V。适于各类高速大功率驱动的系统。参考程序:#include reg51.h#define uchar unsigned char#define uint unsigne

4、d int#define out P2sbit pos=P00;/定义检测正转控制位P0.0sbit neg=P01;/定义检测反转控制位P0.1void delayms(uint);,8,uchar code turn=0 x02,0 x06,0 x04,0 x0c,0 x08,0 x09,0 x01,0 x03;/步进脉冲数组void main(void)uchar i;out=0 x03;while(1)if(!pos)/如果正转按键按下i=i 8?i+1:0;/如果i8,则i=i+1;否则i=0out=turni;delayms(50);,9,else if(!neg)i=i 0?i-

5、1:7;out=turni;delayms(50);void delayms(uint j)/函数功能:延时uchar i;for(;j0;j-)i=250;while(-i);i=249;while(-i);,10,12.2 单片机控制直流电机 直流电机多用在无交流电源、方便移动场合,具有低速大力矩等特点。如何用单片机控制直流电机。1.控制直流电机的工作原理 对直流电机可精确控制其旋转速度或转矩,通过两个磁场相互作用产生旋转。结构见图12-3(a),定子装设一对直流励磁的静止主磁极N和S,在转子上装设电枢铁心。定子与转子间有一气隙。在电枢铁心上放置了由两根导体连成的电枢线圈,线圈首端和末端分

6、别连到两个圆弧形铜片上,此铜片称为换向片。由换向片构成的整体称为换向器。,11,换向器固定在转轴上,换向片与转轴间互相绝缘。在换向片上放置一对固定不动的电刷B1和B2,当电枢旋转时,电枢线圈通过换向片和电刷与外电路接通。定子通过永磁体或受激励电磁铁产生一固定磁场,由于转子由一系列电磁体构成,当电流通过其中一个绕组时会产生一个磁场。对有刷直流电机,转子上换向器和定子电刷在电机旋转时为每个绕组供给电能。通电转子绕组与定子磁体有相反极性,因而相互吸引,使转子转动至与定子磁场对准的位置。当转子到达对准位置时,电刷通过换向器为下一组绕组供电,从而使转子维持旋转运动,见图12-3(b)。,12,(a)有刷

7、直流电机结构示意图,(i)导体ad处于N极下,(ii)导体ad处于S极下,(b)有刷直流电机工作示意图,图12-3 直流电机工作示意图,13,直流电机转速与施加电压成正比,转矩与电流成正比。由于必须在工作期间改变直流电机的速度,直流电机控制是一较困难问题。直流电机高效运行的常见方法是施加一个 PWM(脉宽调制)脉冲波,其占空比对应于所需速度。电机起到了一个低通滤波器作用,PWM信号相对容易产生,这种驱动方式使用更为广泛。,2.电路设计与编程【例12-2】原理电路见图12-4。使用单片机两个I/O脚控制直流电机转速和旋转方向。其中P3.7脚输出PWM信号控制直流电机转速;P3.6脚控制直流电机旋

8、转方向。,14,图12-4 单片机控制直流电机的接口电路,当P3.6=1时,P3.7发送PWM波,直流电机正转。且可通过“INC”和“DEC”两个按键来增大和减少直流电机转速。反之,P3.6=0时,P3.7发送PWM信号,直流电机反转。因此,增大和减小电机转速,实际上是通过按下“INC”或“DEC”按键来改变输出PWM信号占空比,控制直流电机转速。图12-4中驱动电路使用了NPN低频、低噪声小功率达林顿管2SC2547。参考程序如下:,15,16,#include reg51.h#include intrins.h#define uchar unsigned char#define uint

9、unsigned int sbit INC=P34;sbit DEC=P35;sbit DIR=P36;sbit PWM=P37;void delay(uint);int PWM=900;,void main(void)DIR=1;while(1)if(!INC)PWM=PWM0?PWM-1:0;/如果PWM0,则PWM=PWM-1;否则PWM=0,17,12.3 频率计的制作1.工作原理 利用单片机定时器/计数器可实现信号频率测量。频率测量有测频法和测周法两种。测频法利用外部电平变化引发的外部中断,测算1s内出现的次数,从而实现对频率测量;测周法是通过测算某两次电平变化引发的中断间的时间,再

10、求倒数,从而实现对频率测定。总之,测频法是直接根据定义来测定频率,测周法是通过测定周期间接测定频率。理论上,测频法适于较高频率测量,测周法适于较低频率测量。本例采用测频法。,2.电路设计与软件编程【例12-3】设计以单片机为核心的频率测量装置,测量加在P3.4脚上数字时钟信号频率,并在外部扩展的6位LED数码管上显示测量频率值。原理电路与仿真见图12-5。,本频率计测量的信号由数字时钟源“DCLOCK”产生,在电路中添加数字时钟源的具体操作与设置Proteus的使用说明。手动改变被测时钟信号源频率,观察是否与LED数码管上显示的测量结果相同。,19,图12-5 频率计原理电路与仿真,20,参考

11、程序如下。#includesfr16 DPTR=0 x82;/定义寄存器DPTRunsigned char cnt_t0,cnt_t1,qian,bai,shi,ge,bb,wan,shiwan;unsigned long freq;/定义频率unsigned char code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;/共阴数码管段码表void delay_1ms(unsigned int z)/函数功能:延时约1msunsign

12、ed char i,j;for(i=0;iz;i+)for(j=0;j110;j+);,21,void init()/函数功能:定时器/计数器及中断系统初始化freq=0;/频率赋初值cnt_t1=0;cnt_t0=0;IE=0 x8a;/开中断,T0,T1中断TMOD=0 x15;/T0为定时器方式1,T1为计数器于方式1TH1=0 x3c;/T1定时50msTL1=0 xb0;TR1=1;/开启定时器T1TH0=0;/T0清0TL0=0;TR0=1;/开启定时器T0void display(unsigned long freq_num)/函数功能:驱动数码管显示 shiwan=freq_n

13、um%1000000/100000;wan=freq_num%100000/10000;,22,qian=freq_num%10000/1000;/显示千位bai=freq_num%1000/100;/显示百位shi=freq_num%100/10;/显示十位ge=freq_num%10;/显示个位P0=0 xdf;/P0口是位选P2=tableshiwan;/显示十万位delay_1ms(5);P0=0 xef;P2=tablewan;/显示万位delay_1ms(3);P0=0 xf7;P2=tableqian;/显示千位delay_1ms(3);,23,P0=0 xfb;P2=table

14、bai;/显示百位delay_1ms(3);P0=0 xfd;P2=tableshi;/显示十位delay_1ms(3);P0=0 xfe;P2=tablege;/显示个位delay_1ms(3);void main()/主函数P0=0 xff;/初始化P0口init();/计数器初始化while(1)if(cnt_t1=19)/定时1s,24,cnt_t1=0;/定时完成后清0 TR1=0;/关闭T1定时器,定时1S完成delay_1ms(141);/延时较正误差,通过实验获得TR0=0;/关闭T0DPL=TH00;/利用DPTR读入其值DPH=TH0;freq=cnt_t0*65535;f

15、req=freq+DPTR;/计数值放入变量 display(freq);/调用显示函数void t1_func()interrupt 3/定时器T1的中断函数TH1=0 x3c;TL1=0 xb0;cnt_t1+;,25,void t0_func()interrupt 1/定时器T0的中断函数 cnt_t0+;,12.4 电话机拨号的模拟1.设计要求,设计模拟电话拨号时的状况,把模拟电话键盘拨出的某一电话号码,显示在LCD显示屏上。电话键盘除了09的10个数字键外,还有“*”键用于实现删除功能,即删除一位最后,26,输入的号码;“#”键用于清除显示屏上所有的数字显示。此外还要求每按下一个键,

16、发出声响,表示按下该键。还有LCD显示器,显示所拨的电话号码。2.电路设计与编程【例12-4】设计一模拟电话拨号时的电话键盘及显示装置,把电话键盘拨出的电话号码及其他信息,显示在LCD显示屏上。电话键盘共12个键,除了09的10个数字键外,还有“*”键用于删除最后输入的1位号码的功能;“#”键用于清除显示屏上,27,所有的数字显示。此外还要求每按下一个键,蜂鸣器要发出声响,以表示按下该键。显示信息共2行,第1行为设计者信息,第2行显示所拨的电话号码。本例的电话拨号键盘采用43矩阵键盘,共12个键。拨号号码显示采用LCD 1602 液晶显示模块。因此涉及了单片机与43矩阵式键盘以及与162的液晶

17、显示屏的接口设计,还有各种驱动程序的编制。液晶显示屏采用LCD1602(即Proteus中的LM016L)。本设计原理电路及仿真见图12-6。,28,图12-10 电话拨号的模拟,29,参考程序如下。#include#define uint unsigned int#define uchar unsigned charuchar keycode,DDram_value=0 xc0;sbit rs=P20;sbit rw=P21;sbit e=P22;sbit speaker=P23;uchar code table=0 x30,0 x31,0 x32,0 x33,0 x34,0 x35,0 x

18、36,0 x37,0 x38,0 x39,0 x20;uchar code table_designer=HIT ZYG Design;/第1行显示设计者信息,30,void lcd_delay();void delay(uint n);void lcd_init(void);void lcd_busy(void);void lcd_wr_con(uchar c);void lcd_wr_data(uchar d);uchar checkkey(void);uchar keyscan(void);void main()uchar num;lcd_init();lcd_wr_con(0 x80)

19、;,31,for(num=0;num=0),32,else if(keycode=0 x0b)uchar i,j;j=0 xc0;for(i=0;i=15;i+)lcd_wr_con(j);lcd_wr_data(table10);void lcd_delay()/函数功能:液晶显示延时 uchar y;for(y=0;y0 xff;y+);,33,void lcd_init(void)/函数功能:液晶初始化 lcd_wr_con(0 x01);lcd_wr_con(0 x38);,34,lcd_wr_con(0 x0c);lcd_wr_con(0 x06);void lcd_busy(voi

20、d)/函数功能:判液晶是否忙 P0=0 xff;rs=0;rw=1;e=1;e=0;while(P0,35,e=1;lcd_delay();void lcd_wr_con(uchar c)/函数功能:向液晶显示器写入命令lcd_busy();e=0;rs=0;rw=0;e=1;,36,P0=c;e=0;lcd_delay();void lcd_wr_data(uchar d)/函数功能:/向液晶写数据 lcd_busy();e=0;rs=1;rw=0;e=1;P0=d;e=0;lcd_delay();,37,void delay(uint n)/函数功能:延时 uchar i;uint j;f

21、or(i=50;i0;i-)for(j=n;j0;j-);uchar checkkey(void)/函数功能:检测键有无按下uchar temp;P1=0 xf0;temp=P1;,38,temp=temp if(checkkey()=0),39,return(0 xff);/无键按下,返回0 xff else/无键按下,返回0 xff uchar sound;for(sound=50;sound0;sound-)speaker=0;delay(1);speaker=1;delay(1);P1=0 x0f;,40,buff=P1;if(buff=0 x0e)hanghao=0;else if(

22、buff=0 x0d)hanghao=3;else if(buff=0 x0b)hanghao=6;,41,else if(buff=0 x07)hanghao=9;P1=0 xf0;buff=P1;if(buff=0 xe0)liehao=2;else if(buff=0 xd0)liehao=1;,42,else if(buff=0 xb0)liehao=0;keyvalue=hanghao+liehao;while(P1!=0 xf0);return(keyvalue);,43,12.5 8位竞赛抢答器设计,目前,各类竞赛中大多用到竞赛抢答器,以单片机为核心配上抢答按钮开关以及数码管显示

23、器并结合编写的软件,很容易制作一个竞赛抢答器,且修改方便。,1.设计要求,设计一个以单片机为核心8位竞赛抢答器,要求如下:(1)抢答器同时供8名选手或8个代表队比赛,分别用8个按钮S0S7表示。(2)设置一个系统清除和抢答控制开关S,该开关由主持人控制。,(3)抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,且优先抢答选手的编号一直保持到主持人将系统清除为止。(4)抢答器具有定时抢答功能,且一次抢答时间由主持人设定(如30秒)。当主持人启动“开始”键后,定时器进行减计时,同时扬声器发出短暂声响,声响持续时间为0.5s左右。(5)参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作

24、,显示器上显示选手的编号和抢答剩余时间,并保持到主持人将系统清除为止。,45,(6)如定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。通过键盘改变可抢答时间,可把定时时间变量设为全局变量,通过键盘扫描程序使每按下一次按键,时间加1(超过30时置0)。同时单片机不断进行按键扫描,当参赛选手的按键按下时,用于产生时钟信号的定时计数器停止计数,同时将选手编号(按键号)和抢答时间分别显示在LED上。2.电路设计与仿真【12-5】8位竞赛抢答器的原理电路与仿真见图12-7。晶振频率为12MHz。图中为剩余18秒时,7号选手抢答成功。,46,图中MAX7219是一串行接收数

25、据的动态扫描显示驱动器。MAX7219驱动8位以下LED显示器时,它的DIN、LOAD、CLK端分别与单片机三条口线(P3.0 P3.2)相连。MAX7219采用16位数据串行移位接收方式,即单片机将16 位二进制数逐位发送到DIN端,在CLK的每个上升沿将一位数据移入MAX7219 内移位寄存器,当16 位数据移入完后,在LOAD脚信号上升沿将16 位数据装入MAX7219内相应位置,能对送入的数据进行BCD译码并显示。本例对MAX7219进行相应的初始化设置,具体请查阅有关MAX7219技术资料。,47,图12-7 8位竞赛抢答器原理电路与仿真,48,参考程序如下:#includesbit

26、 DIN=P30;/与max7219接口定义sbit LOAD=P31;sbit CLK=P32;sbit key0=P10;/8路抢答器按键sbit key1=P11;sbit key2=P12;sbit key3=P13;sbit key4=P14;sbit key5=P15;sbit key6=P16;sbit key7=P17;sbit key_clear=P20;/主持人时间设置、清除sbit begin=P21;/主持人开始按键,49,sbit sounder=P37;/蜂鸣器unsigned char second=30;/秒表计数值unsigned char counter=0

27、;/counter每100,minite加1unsigned char people=0;/抢答结果unsigned charnum_add=0 x01,0 x02,0 x03,0 x04,0 x05,0 x06,0 x07,0 x08;/max7219读写地址、内容unsigned char num_dat=0 x80,0 x81,0 x82,0 x83,0 x84,0 x85,0 x86,0 x87,0 x88,0 x89;unsigned char keyscan()/键盘扫描函数unsigned char keyvalue,temp;keyvalue=0;P1=0 xff;temp=P

28、1;,50,if(P1,51,case 0 xef:keyvalue=5;break;case 0 xdf:keyvalue=6;break;case 0 xbf:keyvalue=7;break;case 0 x7f:keyvalue=8;break;default:keyvalue=0;break;return keyvalue;,52,void max7219_send(unsigned char add,unsigned char dat)/函数功能:向max7219写命令unsigned charADS,i,j;LOAD=0;i=0;while(i16)if(i8)ADS=add;e

29、lse ADS=dat;,53,for(j=8;j=1;j-)DIN=ADS,54,void time_display(unsigned char x)/函数功能:时间显示unsigned char i,j;i=x/10;j=x%10;max7219_send(num_add1,num_datj);max7219_send(num_add0,num_dati);void scare_display(unsigned char x)/函数功能:抢答结果显示 unsigned char i,j;i=x/10;j=x%10;,55,max7219_send(num_add3,num_datj);ma

30、x7219_send(num_add2,num_dati);void holderscan()/函数功能:抢答时间设置,0-60s time_display(second);scare_display(people);if(key_clear)/如果有键按下,改变抢答时间 while(key_clear);if(people)/如果抢答结果没有清空,抢答器重置 second=30;,56,people=0;if(second60)second+;else second=0;void timer_init()/定时器T0初始化 EA=1;ET0=1;TMOD=0 x01;/定时器T0方式0定时,

31、57,TH0=0 xd8;/装入定时器定时常数,设定10ms中断一次TL0=0 xef;void main()while(1)do holderscan();while(begin);/开始前进行设置,若未按下开始键 while(begin);/防抖 max7219_init();/芯片初始化 timer_init();/中断初始化 TR0=1;/开始中断 do,58,time_display(second);scare_display(people);people=keyscan();while(!people),59,else sounder=1;counter=0;second=seco

32、nd-1;TH0=0 xd8;/重新装载 TL0=0 xef;TR0=1;,在单片机应用系统中,有时往往需要一个实时时钟/日历作为测控时间基准。时钟/日历集成电路芯片多种,设计者只需选择合适芯片即可。本节介绍最为常见的时钟/日历芯片DS1302的功能、特性以及单片机的硬件接口设计及软件编程。,12.6 基于时钟/日历芯片DS1302的电子钟设计,时钟/日历芯片DS1302是美国DALLAS公司推出的涓流充电时钟芯片,功能特性如下。(1)能计算2100年前的年、月、日、星期、时、分、秒的信息;每月的天数和闰年天数可自动调整;时钟可设置为24或12小时格式。(2)与单片机间采用单线同步串行通信。,

33、1.工作原理,62,(3)31字节的8位静态RAM。(4)功耗低,保持数据和时钟信息时功率小于1mW;可选的涓流充电能力。(5)读/写时钟或RAM数据有单字节和多字节两种传送方式。DS1302引脚见图12-8。,图12-8 DS1302的引脚,63,各引脚功能如下:I/O:数据输入/输出。SCLK:同步串行时钟输入。RST*:芯片复位,1芯片的读/写使能,0芯片复位并被禁止读/写。VCC2:主电源输入,接系统电源。VCC1:备份电源输入引脚,通常接2.73.5V电源。当VCC2VCC1+0.2V时,芯片由VCC2供电;当VCC2VCC1时,芯片由VCC1供电。GND:地 X1,X2:接32.7

34、68KHz晶振引脚。,单片机与DS1302间无数据传输时,SCLK保持低电平,此时如果 从低变为高时,即启动数据传输,此时SCLK的上升沿将数据写入DS1302,而在SCLK的下降沿从DS1302读出数据。为低时,则禁止数据传输,读/写时序如图12-9所示。数据传输时,低位在前,高位在后。2.DS1302的命令字格式 单片机对DS1302的读/写,都必须由单片机先向DS1302写入一个命令字(8位)发起,命令字格式见表12-1。,65,图12-9 DS1302读/写时序,命令字各位功能:D7:必须为逻辑1,如为0,则禁止写入DS1302。D6:1读/写RAM数据,0读/写时钟/日历数据。D5D

35、1:为读/写单元的地址;D0:1对DS1302读操作,0对DS1302写操作。注意,命令字(8位)总是低位在先,命令字每1位都是在SCLK上升沿送出。,66,3.DS1302的内部寄存器 片内各时钟/日历寄存器以及其它的功能寄存器见表12-2。通过向寄存器写入命令字实现对DS1302操作。例如,如要设置秒寄存器的初始值,需要先写入命令字80H(见表12-2),然后再向秒寄存器写入初始值;如要读出某时刻秒值,需要先写入命令字81H,然后再从秒寄存器读取秒值。表12-2中各寄存器“取值范围”1列存放的数据均为BCD码。,67,表12-2 主要寄存器、命令字与取值范围及各位内容,68,CH:时钟暂停

36、位,1-振荡器停止,DS1302为低功耗方式;0-时钟开始 工作。10SEC:秒的十位数字,SEC为秒的个位数字 10MIN:分的十位数字,MIN为分的个位数字 12/24:12或24小时方式选择位 AP:小时格式设置位,0-上午模式(AM);1-下午模式(PM)10DATE:日期的十位数字,DATE为日期的个位数字 10M:月的十位数字,MONTH为日期的个位数字 DAY:星期的个位数字,69,10YEAR:年的十位数字,YEAR为年的十位数字 表12-2中后3个寄存器的功能及特殊位符号的意义说明如下。写保护寄存器:该寄存器的D7位WP是写保护位,其余7位(D0D6)置为0。在对时钟/日历单

37、元和RAM单元进行写操作前,WP必须为0,即允许写入。当WP为1时,用来防止对其它寄存器进行写操作。涓流充电寄存器:慢充电寄存器,用于管理对备用电源的充电。,TCS:当4位TCS=1010时,才允许使用涓流充电寄存器,其他任何状态都将禁止使用涓流充电器。DS:两DS位用于选择连接在VCC2和VCC1间的二极管数目。01-选择1个二极管;10-选择2个二极管;11或00-涓流充电器被禁止。RS:两位RS位用于选择涓流充电器内部在VCC2和VCC1之间的连接电阻。RS=01,选择R1(2k);RS=10时,选择R2(4k);RS=11时,选择R3(8k);RS=00时,不选择任何电阻。,71,时钟

38、突发寄存器:单片机对DS1302除单字节数据读/写外,还可采用突发方式,即多字节连续读/写。在多字节连续读/写中,只要对地址为3EH的时钟突发寄存器进行读/写操作,即把对时钟/日历或RAM单元的读/写设定为多字节方式。该方式,读/写都开始于地址0的D0位。当多字节方式写时钟/日历时,必须按照数据传送的次序写入最先的8个寄存器;但是以多字节方式写RAM时,没有必要写入所有的31个字节,每个被写入的字节都被传输到RAM,无论31个字节是否都被写入。4.电路设计与编程,72,(2)闰年自动判别。(3)键盘采用动态扫描方式查询,参量应能进行增1修改,由“启动日期与时间修改”功能键k1与6个参量修改键组

39、合来完成增1修改。即先按一下k1,然后按一下被修改参量键,即可使该参量增1,修改完毕,再按一下k1表示修改结束确认。本例时钟/日历原理电路与仿真见图12-9。LCD1602分两行显示日历与时钟。,73,【例12-6】制作一个使用时钟/日历芯片DS1302并采用LCD1602显示的日历/时钟,基本功能如下。(1)显示6个参量的内容,第一行显示:年、月、日;第二行显示:时、分、秒。,74,图12-10 LCD显示的时钟/日历原理电路及仿真,75,图12-10的43矩阵键盘,只用到了其中2行键共6个,余下的按键,本例未使用,可用于将来键盘功能扩展。参考程序如下:#include#include LC

40、D1602.h/液晶显示器LCD1602头文件#include DS1302.h/时钟/日历芯片DS1302头文件#define uchar unsigned char#define uint unsigned intbit key_flag1=0,key_flag2=0;SYSTEMTIME adjusted;/此处为结构体定义,76,uchar sec_add=0,min_add=0,hou_add=0;uchar day_add=0,mon_add=0,yea_add=0;uchar data_alarm7=0;int key_scan()/函数功能:键盘扫描,判是否有键按下 int i

41、=0;uint temp;P1=0 xf0;temp=P1;if(temp!=0 xf0)i=1;else i=0;return i;,77,uchar key_value()/函数功能:获取按下的按键值 uint m=0,n=0,temp;uchar value;uchar v43=2,1,0,5,4,3,8,7,6,b,a,9;P1=0 xfe;temp=P1;if(temp!=0 xfe)m=0;/采用分行、分列扫描的形式获取按键键值 P1=0 xfd;temp=P1;if(temp!=0 xfd)m=1;P1=0 xfb;temp=P1;if(temp!=0 xfb)m=2;P1=0

42、xf7;temp=P1;if(temp!=0 xf7)m=3;P1=0 xef;temp=P1;if(temp!=0 xef)n=0;P1=0 xdf;temp=P1;if(temp!=0 xdf)n=1;P1=0 xbf;temp=P1;if(temp!=0 xbf)n=2;,78,value=vmn;return value;void adjust(void)/函数功能:修改各参量if(key_scan(),79,default:break;adjusted.Second+=sec_add;adjusted.Minute+=min_add;adjusted.Hour+=hou_add;ad

43、justed.Day+=day_add;adjusted.Month+=mon_add;adjusted.Year+=yea_add;if(adjusted.Second59)adjusted.Second=adjusted.Second%60;adjusted.Minute+;if(adjusted.Minute59)adjusted.Minute=adjusted.Minute%60;adjusted.Hour+;,80,if(adjusted.Hour23)adjusted.Hour=adjusted.Hour%24;adjusted.Day+;if(adjusted.Day31)adj

44、usted.Day=adjusted.Day%31;if(adjusted.Month12)adjusted.Month=adjusted.Month%12;if(adjusted.Year100)adjusted.Year=adjusted.Year%100;,81,void changing(void)interrupt 0 using 0/中断处理函数,修改参量,或修改确认if(key_flag1)key_flag1=0;else key_flag1=1;main()/主函数uint i;uchar p1=D:,p2=T:;SYSTEMTIME T;EA=1;EX0=1;IT0=1;EA

45、=1;,82,EX1=1;IT1=1;init1602();Initial_DS1302();while(1)write_com(0 x80);write_string(p1,2);write_com(0 xc0);write_string(p2,2);DS1302_GetTime(,83,adjusted.Day=T.Day;adjusted.Month=T.Month;adjusted.Year=T.Year;for(i=0;i9;i+)adjusted.DateStringi=T.DateStringi;adjusted.TimeStringi=T.TimeStringi;adjust();DateToStr(,84,程序中,使用了自行编写的液晶显示器LCD1602的头文件“LCD1602.h”,由于液晶显示器LCD1602是单片机应用系统经常用到的器件,因此将其常用到的驱动函数等函数,写成一个头文件,如果以后在其他项目中也用到LCD1602,只需将该头文件包含进来即可,这样程序的编写提供了方便。同理涉及对时钟/日历芯片DS1302的控制,也可自行编写头文件“DS1302.h”,以后在其他项目中将该头文件包含进来即可。上述两个头文件清单见附录1与附录2。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号