基于SPCE061A单片机的教学楼用打铃器

时间:2019-05-15 01:13:57下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《基于SPCE061A单片机的教学楼用打铃器》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《基于SPCE061A单片机的教学楼用打铃器》。

第一篇:基于SPCE061A单片机的教学楼用打铃器

基于SPCE061A单片机的教学楼用打铃器

作 者:贾金贞

摘要:本文是做一个SPCE061A单片机的教学楼用打铃器,可以实时显示当前时间。硬件电路由键盘、声音输出模块、指示灯、LED数码管4部分组成。可以用键盘设定多个预定打铃时间,优点是凌阳61单片机的语音功能可以为教学楼打铃器增加语音提示功能,而其他单片机则无此功能。

关键字:SPCE061A单片机;声音输出模块;LED数码管;语音提示。

[1]1 引言

随着科学技术日新月异的发展,单片机技术在各个领域得到了广泛的应用。现代化的教学设备也在不断进步,朝着更人性化方向发展。本文介绍一种用SPCE061A单片机作出的教学楼用打铃器,更加接近现代化的教学设备。

凌阳61单片机的语音功能是其他单片机所不具备的,其实现的教学打铃器不但可以用键盘设定多个预定打铃时间,而且具有语音提示功能,这是以往其他打铃器所不具备的。系统总体介绍

2.1 设计思路

本文是一个教学楼用打铃器,实际上就是一个具有报时功能及作息时间控制钟。它利用SPCE061A单片机的2Hz时基计时,进行时间计算,并用LED数码管把它显示出来;在进行时间计算,分每加1时,都与规定的作息时间比较,如果相等则进行相应的控制或动作。

硬件电路由键盘、声音输出模块、指示灯、LED数码管4部分组成[2]。

第1页(共10页)

系统的IOA8~IOA15外接8个按键用于系统设置,什么时候打铃都可以通过这些按键设定。SPCE061A的DAC为电流型输出,经SPY0030驱动扬声器SPEAKER放音,SPEAKER可选用4Ω或8Ω扬声器。IOA0~IOA7接8个LED,到规定的打铃时间用LED闪烁来表示,使用者可根据具体需要来控制电铃等。2.2 技术要求

SPCE061A单片机的教学楼用打铃器,主要是用于教学工作,无论硬件或软件,都要求其具有非常高的稳定性[3]。

对于软件来说,系统软件需要可以任意升级,以满足教学要求,按星期编程播放,手动/自动播放,自动分区广播,无人管置,音乐打铃,标准接口等。对于硬件来说,则要求其经久耐用。系统硬件部分设计

硬件电路由键盘、声音输出模块、指示灯、LED数码管4部分组成[4]。

系统的IOA8~IOA15外接8个按键用于系统设置,什么时候打铃都可以通过这些按键设定。SPCE061A的DAC为电流型输出,经SPY0030驱动扬声器SPEAKER放音,SPEAKER可选用4Ω或8Ω扬声器。IOA0~IOA7接8个LED,到规定的打铃时间用LED闪烁来表示,使用者可根据具体需要来控制电铃等。

系统框图如下:

SPCE061AIOA0电铃的电源常开继电器电铃 图 1 教学打铃器的结构框图

电铃一般用高质白铁制造,表面电镀,不生锈不腐烂,打铃方式跟据电力学原理,将电能转化为动能,带动冲击棒敲打铃身,所以不存在敲断现象。声间清脆、宏亮。电铃的控制非常简单,有电的时候

第2页(共10页)

就会响,没有电的时候绝对不响,所以我们只需一根IO口线去控制电铃继电器的通断就可以了。

凌阳SPCE061A单片机的特点[5]正好为所设计的教学楼打铃器提供了语音处理功能,A/D 转换功能,而且其开发调试非常方便的特点,也为以后的改进做了铺垫。

SPCE061A 是凌阳科技公司µ’nSPTM(Microcontroller And Signal Processor)系列产品中的16位微控制器芯片, 内置32k闪存, 其较高的处理速度使芯片能够非常容易、快速地处理复杂的数字信号, 适用于数字语音识别等应用领域[6]。在2.6V~3.6V工作电压范围内, SPCE061A 的工作速度范围为0.32~49.152MHz, 具备8通道10位ADC 输入功能,内置的具有自动增益控制的麦克风输入功能,双通道10位DAC音频输出功能及A、B两个I/O口输入输出功能。

语音处理功能具有音频编解码及各种语音压缩算法实现的。各种算法相应的程序模块存放在语音算法库SCAM-LIB中, 使用时只需调用相应的模块就可方便地实现语音合成、语音播放、录音、识别等功能。

A/D 转换功能: SPCE061A内部集成了8 通道10 位的A/D 转换器, 采用逐次逼近原理实现模/数转换, 在检测连续变化的模拟量, 如温度、压力、流量、转速、声音、亮度时非常方便, 在语音类仪器仪表、家用电器中得到较好的应用。

开发调试方便: SPCE061A的开发是通过在线调试器PROBE 实现的。它既是一个编程器(即程序烧写器), 又是一个实时在线调试器, 因此在其应用项目开发调试中非常方便。3.1单片机主控板系统原理图及说明[7]

第3页(共10页)

+61板原理图VREFJ121CON2VRTVREF2C22104+C19100uAVSS1SLEEP1LED1KLEDVDD1D12LEDD22R12330C1AVSS1R11KAGCVMICVCMR3470KC2+4.7uAVSS1+R13MICVSSC5C4100u+C7104VSSC8104VSS+100uX1220uR43K1+2C11224C13224R510KR610KC9104+C622uAVSS1C12104MICPMICNR7MICOUTOPIR2C33300pC10VSS1043.3KOSCOSCOC1420pY132768C15VSS20pOSCIU1OSCOOSCI121314VDD15ICE_EN16ICE_SCK17ICE_SDA18VSS1920DAC121DAC222VREF223AVSS124AGC25OPI26MICOUT27MICN2829303132IOB5IOB6IOB7IOB8IOB9IOB10VDDHVCPVCPVDD_PRES_BIOB0IOB1IOB2IOB3IOB4PLLMICROPHONER83K5.1KC16AVSS1VDDHC20104C21+100uVSS502C17+C18104EZ-PROBESTORBEBUSYPD1PD0VSSJ1112345CON5R2633S5123CON3R28OE1_N3.3KPROBEJ412345CON5100uVSSDACVDDICE_ENICE_SCKICE_SDAVSSU4R2333PD0ICE_SDAVSSPD1R253.3KVSSOE1_NVDDC39104R243311***24681A11A21A31A42A12A22A32A41OE2OEVCC74HC244VDDH1Y11Y21Y31Y42Y12Y22Y32Y4GND***310ICE_SCKR27ICE_SDA33OSC32OOSC32IXTESTVDDXICEXICECLKXICESDAVSSPVINDAC1DAC2VREF2VSSAGCOPIMICOUTMICNPFUSENCNCNCNCNCVSSVCPVDDXRESBIOB0IOB1IOB2IOB3IOB4NCNCNCIOB5IOB6IOB7IOB8IOB9IOB10VDDHNCNCNCNCNCPVPPIOB11IOB12IOB13IOB14IOB15XSLEEPVSSXROMTIOA15IOA14IOA13IOA12IOA11IOA10IOA9MICPVCMVRTPADVDDVMICVSSNCNCIOA0IOA1IOA2IOA3IOA4IOA5IOA6IOA7VSSVSSVDDHVDDHIOA87473727******857565554DACJ2IOB11IOB12IOB13IOB14IOB15SLEEPVSSIOA15IOA14IOA13IOA12IOA11IOA10IOA9CON3C2352244AVSS1111098765432***797877767587U221SPY0030SPHJ321J12SPLSpeaker321PHONEJACK123+-DAC1C25R101041K2R91KC26AVSS2104VDDMICPVCMVRTVDD_AVMICAVSS1IOA0IOA1IOA2IOA3IOA4IOA5IOA6IOA7VSSVSSVDDHVDDHIOA******7484950515253BUSYIO_PORTVDDHIOB0IOB1IOB2IOB3IOB4IOB5IOB6IOB7VSSJ612345678910PBJ812345678910PAIOA2VDDHIOB8IOB9IOB10IOB11IOB12IOB13IOB14IOB15VSSJ712345678910PBJ912345678910PA2V5VDDH3J5123CON3C27C28C31104+AVSS100u1104VSS+C29100uC38D53.3V500P1POWERV5U32VIVO3V3R140R150R160R170VDD_AVDD_PVDDVDDH3RESETKEYVDDS2K1S3K22D3+J105V12+220uDIODEC33C341041SPY0029SOT-892IOA0IOA1D4DIODEC35+220uR190R210104R220VSSAVSS1AVSS2S1104C37VSSR184.7KRES_BVDDHIOA0IOA1IOA2IOA3IOA4IOA5IOA6IOA7VSS3VDDHIOA8IOA9IOA10IOA11IOA12IOA13IOA14IOA15VSSGND1C36-CON2VSS1S4K336图2 61板原理图

单片机主控板系统采用61板,它大小相当于一页扑克牌,是“凌阳大学计划”专为电子爱好者所设计的。61板资源包括:(01)CPU:SPCE061A,外部时钟为 32768Hz,内部倍频最高可至49MHz。(02)PROBE/EZ_PROBE接口。

(03)电池盒供电接口:开发板配有电池盒,也可外接5V稳压源。(04)32位IO口。(05)AD参考电压接口。(06)音频功放SPY0030。(07)麦克风:1路MIC音频输入。

(08)耳机接口:直接插耳机就可以听到音乐和语音。(09)喇叭接口:开发板配备喇叭。(10)音量调节旋钮:用于调整音量的大小。(11)端口电平可选:可以选择5V和3.3V。(12)两个外部中断输入口。(13)两个外部时钟源输入口。(14)串行通讯接口(SIO)。

(15)电源和睡眠指示灯:当系统进入睡眠状态,睡眠指示灯会被点亮。

第4页(共10页)

V5

3.2扩展板原理图及说明

为了提高数码管的亮度和系统稳定性,需要外加扩展。因为61板资源丰富,所以扩展板上硬件很少,只有8个按键,8个LED灯,6个LED数码管。它们与61板的核心SPCE061A单片机的接线如下:

IOB0IOB1IOB2IOB3IOB4IOB5IOB6IOB7IOB8R3113572468R-PACK4R321357R-PACK4R21470U11LED5621D11IOA0IOA1IOA2IOA3IOA4IOA5IOA6IOA724682222222D101111D5D7D9A+B+C+D+DD-E+F+COM3-G+DP+COM4-DD+U10LED5641A8COM1-1411COM2-10736NPN-8050-EBC2Q123Q41312Q223Q51V331S20IOA8IOA9IOA10IOA11IOA12IOA13IOA14IOA15S21S22S23S24S25S26S27IOB9IOB10IOB11IOB12IOB13IOB14IOB****42468R301357470*42Q323Q71123Q6246817A+COM5-B+C+D+E+COM6-F+G+DP+***1111109143652D4D6D82 图3 扩展板原理图

我们可以从图中看出,LED是SPCE061A的IO口直接驱动的,而数码管部分加了三极管是为了提高数码管的亮度和系统稳定性。

4系统软件设计

4.1主程序

主程序的主要功能是调用子程序,指示硬件完成用键盘设定多个预定打铃时间及语音提示功能。

楼打铃器由SPCE061A单片机控制,主程序里必须有键盘管理程序,让单片机识别并执行操作;由于断电或者单片机出现故障,不可避免的要重新校对时间,因此校时子程序就必不可少;语音提示功能是基于SPCE061A单片机的教学楼用打铃器最主要的功能部分,且其播放语音次序必须受控,播放语音子程序必须由主程序控制。

程序按照结构化程序设计,所有功能都可通过调用子程序完成,主程序较简单,流程如下图所示[8]。

第5页(共10页)

开始是否设置完毕NY设置打铃时间设置系统时间是否到打铃时间YN打铃YYN 是否遇复位命令图4 主程序流程图

4.2 键盘管理程序

系统有8个按键,代表的意义如下表所示: SPCE061A IOA0 IOA1 IOA2 IOA3 IOA4 IOA5 IOA6

LED数码管

D4 D5 D6 D7 D8 D9 D10

SPCE061A IOA8 IOA9 IOA10 IOA11 IOA12 IOA13 IOA14

LED数码管

S20 S21 S22 S23 S24 S25 S26

第6页(共10页)

IOA7 D11 IOA13 S27

表1 键盘定义

假设只要打铃一次,打铃时间是中午12点30分,那么设置过程 如下:按S20键(复位键),系统语音提示“请输入打铃次数”,这时通过S21和S22键把次数改为1,然后按S27键(确认键),系统提示“请输入第一次打铃时间”,通过S23和S24键把小时改为12,然后按S27键(确认键),通过S25和S26键把分钟改为30,然后按S27键(确认键),(若打铃次数是N,那就需要做N次这样的操作,照着语音提示作就行了),当系统提示“请输入当前时间”时,按照前面的方法设置系统当前时间,系统最后提示“输入完毕”的时候,系统就自动工作了,到指定的时间会做打铃的动作。整个设置过程均有语音提示,而且6位数码管也会同步显示相应的值。4.3校时子程序

利用2Hz中断做时钟源进行计时,每两次中断秒加1[9]。流程图如下所示:

第7页(共10页)

N有2Hz中断?Y半秒单元+1半秒单元=2?Y半秒单元=0N秒+1N秒=60?Y秒=0分+1N分=60?Y分=0时+1N时=24?Y时=0返回 图5

校时子程序

4.4播放语音子程序

报时用SACM-S480自动方式播放,流程图如下:

第8页(共10页)

SACM_S480放音的初始化SACM_S480压缩播放获取语音数据并解码等待中断播放

图6 播放语音子程序 结论

本文提出的教学楼用打铃器的设计经过软、硬件结合的实验验证,对该系统的设计有如下几点结论:教学楼用打铃器的设计采用了自顶向下的设计模式,即先进行总系统的设计,然后分模块各个击破,较传统的设计模式更快捷;对该系统还可进一步改进设计,可以与计算机结合,采用智能化控制[10]。

参 考 文 献

[1].罗亚非 《凌阳单片机应用基础》[M] 北京航天航空大学出版社 2005 [2].卢胜利 《基于凌阳SPCE061A设计实验平台的专业综合设计教程》[M] 机械工业出版社 2007 [3].洪应,宋国富《凌阳单片机实用技术教程》[M]中国铁道出版社 2007 [4].童诗白,华成英.模拟电子技术基础(第三版)[M].高等教育出版社,2000 [5].张友德.单片微型机原理、应用于实验[M].3版.上海:复旦大学出版社,2000 [6].王洪庆.微型计算机控制技术[M].北京:机械工业出版社,2006 [7].张培仁,张志坚,高修峰.单片机微处理器原理及应用(凌阳SPCE061A)[M] 北京清华大学出版社,2005 [8].彭为,黄科,雷道仲.单片机典型系统设计实例精讲[M].电子工业出版社,2006 [9].汪敏.凌阳32位单片机实验与实践[M] 北京航空航天大学出版社 2007 [10].杜刚.32位单片机原理及应用[M]

中国电力出版社 2007

第9页(共10页)

SPCE061A Monolithic machine-BasedTeaching Building uses dozen

of Bell implement

JIAJINZHEN Abstract:This is to be a teaching building SPCE061A MCU devices with rang the bell, you can real-time display the current time.Hardware circuit from the keyboard, voice output module, indicator, LED digital tube four parts.Can use the keyboard to play bells set the number of scheduled time, the advantage of voice-enabled Sunplus 61 SCM rang the bell for school buildings to increase device features voice prompts, while the other microcontroller does not have this feature.Key words: SPCE061A Single-Chip-Micro-Controller;Sound Output Module;LED Digital Tube

第10页(共10页)

第二篇:学校用TC2800型打铃器安装说明书(推荐)

电铃说明书

学校用TC2800型打铃器安装说明书:把打铃器后面二条出线看为一只开关的二条出线,220V电铃看象一只电灯泡一样,最后连接在220伏电源上。另外将打铃器插头通电源即调时间了。

一: 调试时间:按“功能”键当显示“01”时,按“序号”后又按“消除洗一下内存,屏幕显“01”,按“序号”再按“校时”和“校分”调入第一次打铃时间,按“编入”显示闪动一下即调入,再按“序号”显“02”,按“序号”一下,如上方法调第二次时间,依次类推。

二:调试星期:同样按“功能”当显示如3-1或3-0等字样,3表示星期三,后1是打铃,0是不打铃,转换星期按“序号”,按“编入”调打不打铃,调好一个星期后,如调的当天是星期日是休息,应调成显示7-0。

三:时间校对及修改:同样按“功能”当出现“01”时,连续按“序号”把每一个打铃时间逐个按出,如需修改就按“校时”“校分”改正,再按“编入”即改成。认定全调好后就按“功能”调出北京时间即投入使用!-

四: 临时打铃:在工作状态下按一下“序号”响20秒,按“消除”提前停。如果想那一天全临时打,就把那天调不打铃

第三篇:单片机实训二程序:课室打铃控制系统

广东石油化工学院

单片机综合实训报告

实训一:温度控制系统.................................................................................错误!未定义书签。

一、实训目的.................................................................................错误!未定义书签。

二、实训设备.................................................................................错误!未定义书签。

三、实训内容.................................................................................错误!未定义书签。

四、电路原理图.............................................................................错误!未定义书签。

五、实训程序设计.........................................................................错误!未定义书签。

六、作业及思考题.........................................................................错误!未定义书签。实训二:课室打铃控制系统.........................................................................错误!未定义书签。

一、实训目的.................................................................................错误!未定义书签。

二、实训设备.................................................................................错误!未定义书签。

三、实训内容.................................................................................错误!未定义书签。

四、电路原理图.............................................................................错误!未定义书签。

五、实训程序设计.........................................................................错误!未定义书签。

六、作业及思考题.........................................................................错误!未定义书签。实训三:LED点阵显示实训..........................................................................错误!未定义书签。

一、实训目的.................................................................................错误!未定义书签。

二、实训设备.................................................................................错误!未定义书签。

三、实训内容.................................................................................错误!未定义书签。

四、电路原理图.............................................................................错误!未定义书签。

五、实训程序设计.........................................................................错误!未定义书签。

六、作业及思考题.........................................................................错误!未定义书签。实训心得体会.................................................................................................错误!未定义书签。

实训二:课室打铃控制系统 #include

#include

unsigned char code dis_week[]={“SUN,MON,TUE,WED,THU,FRI,SAT”};

unsigned char code para_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5};//星期月参变数

unsigned char data dis_buf1[16];

//lcd上排显示缓冲区

unsigned char data dis_buf2[16];

//lcd下排显示缓冲区

unsigned char data year,month,date,week;//年、月、日、星期

unsigned char data armhour,armmin,armsec;//闹钟时、分、秒

unsigned char data hour,min,sec,sec100;//时、分、秒、百分之一秒

unsigned char data flag,vkey,skey;//设置状态计数标志、按键先前值、按键当前值

bit alarm;//标识是否启用闹钟,1--启用,0--关闭

sbit

rs = P2^6;

//LCD数据/命令选择端(H/L)

sbit

rw = P2^5;

//LCD读/写选择端(H/L)

sbit

ep = P2^7;

//LCD使能控制

sbit

PRE = P1^6;

//调整键(k3)杜邦线将P1.6接到独立按键

sbit

SET = P1^7;

//调整键(k4)

杜邦线将P1.7接到独立按键 sbit

SPK = P1^5;

//蜂鸣器

void delayms(unsigned char ms);//延时程序

bit lcd_busy();

//测试LCD忙碌状态程序

void lcd_wcmd(char cmd);

//写入指令到LCD程序

void lcd_wdat(char dat);

//写入数据到LCD程序

void lcd_pos(char pos);

//LCD数据指针位置程序

void lcd_init();

//LCD初始化设定程序

void pro_timedate();

//时间日期处理程序

void pro_display();

//显示处理程序

void pro_key();

//按键处理程序

void time_alarm();

//定时报警功能(闹钟)

unsigned char scan_key();

//按键扫描程序

unsigned char week_proc();

//星期自动计算与显示函数

bit leap_year();

//判断是否为闰年

void lcd_sef_chr();

//LCD自定义字符程序

void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s);

//更新显示缓冲区函数

// 延时程序

void delay(unsigned char ms)

{

while(ms--)

{

unsigned char i;

for(i = 0;i< 250;i++)

{

_nop_();

//执行一条_nop_()指令为一个机器周期

_nop_();

_nop_();

_nop_();

}

}

}

//测试LCD忙碌状态

bit lcd_busy()

{

bit result;

rs = 0;

rw = 1;

ep = 1;

_nop_();

_nop_();

_nop_();

_nop_();

result =(bit)(P0&0x80);//LCD的D0--D7中,D7=1为忙碌,D7=0为空闲

ep = 0;

return result;

}

//写入指令到LCD

void lcd_wcmd(char cmd)

{

while(lcd_busy());//当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写指令

rs = 0;

rw = 0;

ep = 0;

_nop_();

_nop_();

P0 = cmd;

_nop_();

_nop_();

_nop_();

_nop_();

ep = 1;

_nop_();

_nop_();

_nop_();

_nop_();

ep = 0;

}

//写入数据到LCD

void lcd_wdat(char dat)

{

while(lcd_busy());//当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写数据

rs = 1;

rw = 0;

ep = 0;

P0 = dat;

_nop_();

_nop_();

_nop_();

_nop_();

ep = 1;

_nop_();

_nop_();

_nop_();

_nop_();

ep = 0;

}

//LCD数据指针位置程序

void lcd_pos(char pos)

{

lcd_wcmd(pos|0x80);//数据指针=80+地址码(00H~27H,40H~67H)

}

//设定二个自定义字符,(注意:LCD1602中自定义字符的地址为0x00--0x07,即可定义8个字符)

//这里我们设定把一个自定义字符放在0x00位置(000),另一个放在0x01位子(001)

void lcd_sef_chr()

{

//第一个自定义字符

lcd_wcmd(0x40);//“01 000 000” 第1行地址(D7D6D5D4D3为字符存放位置(0--7),D2D1D0为字符行地址(0--7))

lcd_wdat(0x1f);//“XXX 11111”

第1行数据(D7D6D5为XXX,表示为任意数(一般用000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭)

lcd_wcmd(0x41);//“01 000 001” 第2行地址

lcd_wdat(0x11);//“XXX 10001”

第2行数据

lcd_wcmd(0x42);//“01 000 010” 第3行地址

lcd_wdat(0x15);//“XXX 10101”

第3行数据

lcd_wcmd(0x43);//“01 000 011” 第4行地址

lcd_wdat(0x11);//“XXX 10001”

第4行数据

lcd_wcmd(0x44);//“01 000 100” 第5行地址

lcd_wdat(0x1f);//“XXX 11111”

第5行数据

lcd_wcmd(0x45);//“01 000 101” 第6行地址

lcd_wdat(0x0a);//“XXX 01010”

第6行数据

lcd_wcmd(0x46);//“01 000 110” 第7行地址

lcd_wdat(0x1f);//“XXX 11111”

第7行数据

lcd_wcmd(0x47);//“01 000 111” 第8行地址

lcd_wdat(0x00);//“XXX 00000”

第8行数据

//第二个自定义字符

lcd_wcmd(0x48);//“01 001 000” 第1行地址

lcd_wdat(0x01);//“XXX 00001”

第1行数据

lcd_wcmd(0x49);//“01 001 001” 第2行地址

lcd_wdat(0x1b);//“XXX 11011”

第2行数据

lcd_wcmd(0x4a);//“01 001 010” 第3行地址

lcd_wdat(0x1d);//“XXX 11101”

第3行数据

lcd_wcmd(0x4b);//“01 001 011” 第4行地址

lcd_wdat(0x19);//“XXX 11001”

第4行数据

lcd_wcmd(0x4c);//“01 001 100” 第5行地址

lcd_wdat(0x1d);//“XXX 11101”

第5行数据

lcd_wcmd(0x4d);//“01 001 101” 第6行地址

lcd_wdat(0x1b);//“XXX 11011”

第6行数据

lcd_wcmd(0x4e);//“01 001 110” 第7行地址

lcd_wdat(0x01);//“XXX 00001”

第7行数据

lcd_wcmd(0x4f);//“01 001 111” 第8行地址

lcd_wdat(0x00);//“XXX 00000”

第8行数据

}

//LCD初始化设定

void lcd_init()

{

lcd_wcmd(0x38);

//设置LCD为16X2显示,5X7点阵,八位数据借口

delay(1);

lcd_wcmd(0x0c);

//LCD开显示及光标设置(光标不闪烁,不显示“-”)

delay(1);

lcd_wcmd(0x06);

//LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)

delay(1);

lcd_wcmd(0x01);

//清除LCD的显示内容

delay(1);

}

//闰年的计算

bit leap_year()

{

bit leap;

if((year%4==0&&year%100!=0)||year%400==0)//闰年的条件

leap=1;

else

leap=0;

return leap;

}

//星期的自动运算和处理

unsigned char week_proc()

{

unsigned char num_leap;

unsigned char c;

num_leap=year/4-year/100+year/400;//自00年起到year所经历的闰年数

if(leap_year()&& month<=2)

//既是闰年且是1月和2月

c=5;

else

c=6;

week=(year+para_month[month]+date+num_leap+c)%7;//计算对应的星期

return week;

}

//更新显示缓冲区

void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s)

{

dis_buf1[0]=t1;

//

dis_buf1[1]=0x20;

//空格

dis_buf1[2]=50;

//'2'

dis_buf1[3]=48;

//'0'

dis_buf1[4]=year/10+48;

dis_buf1[5]=year%10+48;

dis_buf1[6]=0x2d;

dis_buf1[7]=month/10+48;

dis_buf1[8]=month%10+48;

dis_buf1[9]=0x2d;

//'-'

dis_buf1[10]=date/10+48;

dis_buf1[11]=date%10+48;

dis_buf1[12]=0x20;

dis_buf1[13]=dis_week[4*week];

dis_buf1[14]=dis_week[4*week+1];

dis_buf1[15]=dis_week[4*week+2];

dis_buf2[0]=t2[0];

dis_buf2[1]=t2[1];

dis_buf2[2]=t2[2];

dis_buf2[3]=t2[3];

dis_buf2[4]=t2[4];

dis_buf2[5]=t2[5];

dis_buf2[6]=0x20;

//空格

if(alarm)

dis_buf2[7]=0x01;

//alarm=1,显示闹钟启用标致(第二个自定义字符)

else

dis_buf2[7]=0x20;

//alarm=0,不显示闹钟启用标致

dis_buf2[8]=dis_h/10+48;

dis_buf2[9]=dis_h%10+48;

dis_buf2[10]=0x3a;

//':'

dis_buf2[11]=dis_m/10+48;

dis_buf2[12]=dis_m%10+48;

dis_buf2[13]=0x3a;

dis_buf2[14]=dis_s/10+48;

dis_buf2[15]=dis_s%10+48;

}

//时间和日期处理程序

void pro_timedate()

{

sec++;

if(sec > 59)

{sec = 0;

min++;

if(min>59)

{min=0;

hour++;

if(hour>23)

{hour=0;

date++;

if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)

if(date>31){date=1;month++;}

//大月31天

if(month==4||month==6||month==9||month==11)

if(date>30){date=1;month++;}

//小月30天

if(month==2)

{if(leap_year())

//闰年的条件

{if(date>29){date=1;month++;}}

//闰年2月为29天

else

{if(date>28){date=1;month++;}}

//平年2月为28天

}

if(month>12){month=1;year++;}

if(year>99)year=0;

}

}

}

week_proc();

if(sec==armsec && min==armmin && hour==armhour)

{if(alarm)

TR1=1;

//闹钟启用时,报警时间到,启动Timer1

}

}

//显示处理程序

void pro_display()

{

unsigned char i;

lcd_pos(0x00);

for(i=0;i<=15;i++)

{lcd_wdat(dis_buf1[i]);}

lcd_pos(0x40);

for(i=0;i<=15;i++)

{lcd_wdat(dis_buf2[i]);}

}

//Timer0中断处理程序,秒的产生

void timer0()interrupt 1

{

TH0=0xdc;

//Timer0置10ms定时初值dc00H(2^16=65536D,dc00H=56320D)

TL0=0x00;

//定时时间=(65536-56320)*(1/11.0592)*12=10ms(f0=11.0592Mhz)

sec100++;

if(sec100 >= 100)

//1秒时间(100*10ms=1000ms=1s)

{sec100 = 0;

pro_timedate();//调用时间和日期处理程序

}

if(sec&0x01)

//“willar”闪一秒,停一秒

update_disbuf(0x00,“

”,hour,min,sec);

//0x00表示显示00位置的自定义字符

else

update_disbuf(0x00,“willar”,hour,min,sec);

pro_display();

//调用显示处理函数

}

//按键扫描程序

unsigned char scan_key()

{

skey=0x00;

//给变量vkey置初值

skey|=PRE;

//读取PRE键的状态

skey=skey<<1;

//将PRE键的状态存于skey的B1位

skey|=SET;

//读取SET键的状态,并存于skey的B0位

return skey;

//返回skey的键值(即PRE,SET的状态)

}

//外部中断INT0中断处理程序

void int0()interrupt 0

{

TR0=0;

//禁止Timer0

IE=0;

//禁止中断

lcd_wcmd(0x0e);

//显示光标“_”,整个光标不闪烁

alarm=1;

update_disbuf(0x50,“alarm:”,armhour,armmin,armsec);//更新显示数据,0x50表示要显示“P”

pro_display();

//调用显示处理程序

lcd_pos(0x47);

//使光标位于第一个调整项下

flag=0;

vkey=0x03;

while(flag^0x0a)

{skey = scan_key();

//扫描按键状态

if(skey^vkey)

//若skey与vkey相同,跳出循环,相异执行循环体

{

delay(10);

//去按键抖动

skey = scan_key();

//转回扫描按键状态

if(skey^vkey)

//若skey与vkey相同,跳出循环,相异执行循环体

{

vkey=skey;

//将skey的值付给vkey

if(skey==0x01)

//PRE键按下

{

flag++;

//调整标志位加1

switch(flag)

//将光标置于相应调整位置

{

case 1: lcd_pos(0x49);break;

//光标置小时报警设置位置

case 2: lcd_pos(0x4c);break;

//光标置分钟报警设置位置

case 3: lcd_pos(0x4f);break;

//光标置秒时报警设置位置

case 4: update_disbuf(0x50,“time: ”,hour,min,sec);

pro_display();

lcd_pos(0x05);break;

//光标置年调整位置

case 5: lcd_pos(0x08);break;

//光标置月调整位置

case 6: lcd_pos(0x0b);break;

//光标置日调整位置

case 7: lcd_pos(0x49);break;

//光标置时调整位置

case 8: lcd_pos(0x4c);break;

//光标置分调整位置

case 9: lcd_pos(0x4f);break;

//光标置秒调整位置

default:break;

}

}

if(skey==0x02)

//SET键按下

{

pro_key();

//转设置按键处理程序

}

}

}

}

lcd_wcmd(0x0c);

//设置LCD开显示及光标不闪烁,不显示“-”

lcd_wcmd(0x01);

//清除LCD的显示内容

IE=0x8f;

//CPU开中断,INT0,INT1,开中断

TR0=1;

//Timer0启动

}

//主程序,初始化及初值设定

void main()

{

lcd_init();

//初始化LCD

lcd_sef_chr();

//写入自定义字符号

hour=0;min=0;sec=0;

//开机时的时,分,秒显示

armhour=0;armmin=0;armsec=0;

//开机时的时,分,秒报警初值

year= 5;month=1;date=1;

//开机时的年,月,日,星期显示

week_proc();

alarm=1;

//初始开机,启用闹钟

IE = 0x8f;

//CPU开中断,INT0,INT1,Timer0,Timer1开中断

IP = 0x04;

//设置INT0为中断最高优先级

IT0=0;IT1=0;

//外部INT0,INT1设置为电平触发方式(注意,触发不要选边沿方式,易误动)

TMOD = 0x11;

//Timer0,Timer1工作于模式1, 16位定时方式

TH0 = 0xdc;TL0 = 0x00;

//Timer0置10ms定时初值

TH1 = 0xff;TL1 = 0x00;

//Timer1置初值

TR0 = 1;

//Timer0启动

TR1 = 0;

while(1);

} //设置按键处理程序

void pro_key()

{

switch(flag)

{

case 0:alarm=!alarm;

//启用或关闭闹钟(alarm=1:启用,alarm=0:关闭)

update_disbuf(0x50,“alarm:”,armhour,armmin,armsec);//更新显示数据

pro_display();

//调用显示处理

lcd_pos(0x47);break;

//光标回到原调整位置

case 1:armhour++;

if(armhour>23)armhour=0;

update_disbuf(0x50,“alarm:”,armhour,armmin,armsec);//更新显示数据

pro_display();

//调用显示处理

lcd_pos(0x49);break;

//光标回到原调整位置

case 2:armmin++;

if(armmin>59)armmin=0;

update_disbuf(0x50,“alarm:”,armhour,armmin,armsec);

pro_display();

lcd_pos(0x4c);break;

case 3:armsec++;

if(armsec>59)armsec=0;

update_disbuf(0x50,“alarm:”,armhour,armmin,armsec);

pro_display();

lcd_pos(0x4f);break;

case 4:year++;

if(year> 99)year= 0;

week_proc();

//星期自动运算

update_disbuf(0x50,“time: ”,hour,min,sec);

pro_display();

lcd_pos(0x05);break;

case 5:month++;

if(month>12)month=1;

week_proc();

//星期自动运算

update_disbuf(0x50,“time: ”,hour,min,sec);

pro_display();

lcd_pos(0x08);break;

case 6:date++;

if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)

if(date>31)date=1;

//大月31天

if(month==4||month==6||month==9||month==11)

if(date>30)date=1;

//小月30天

if(month==2)

{if(leap_year())

//闰年的条件

{if(date>29)date=1;}

//闰年2月为29天

else

{if(date>28)date=1;}}

//平年2月为28天

week_proc();

//星期自动运算

update_disbuf(0x50,“time: ”,hour,min,sec);

pro_display();

lcd_pos(0x0b);break;

case 7:hour++;

if(hour>23)hour=0;

update_disbuf(0x50,“time: ”,hour,min,sec);

pro_display();

lcd_pos(0x49);break;

case 8:min++;

if(min>59)min=0;

update_disbuf(0x50,“time: ”,hour,min,sec);

pro_display();

lcd_pos(0x4c);break;

case 9:sec++;

if(sec>59)sec=0;

update_disbuf(0x50,“time: ”,hour,min,sec);

pro_display();

lcd_pos(0x4f);break;

default: break;

}

}

//Timer1中断处理程序,产生打铃的声音

void timer1()interrupt 3

{

TH1=0xff;

TL1=0x00;

SPK=~SPK;

}

//外部中断INT1中断处理程序,停止打铃声音

void int1()interrupt 2

{

if(TR1)

TR1=0;

}

第四篇:科学教案 吹泡泡(用吹泡器)

小班科学教案:吹泡泡(用吹泡器)

活动目标:

1、知道肥皂的特征和用途,学会使用吹泡器吹出泡泡。

2、尝试用圆形(三角形、正方形)吹泡器吹泡泡,感知不同形状的吹泡器吹出来的泡泡的特性,并能用语言的方式表达泡泡的形状。

3、喜欢吹泡泡活动,体验成功吹出泡泡的乐趣。

活动准备:

肥皂水一盆,用铁丝自制的圆形、方形、三角形吹泡器、杯子等。

活动过程:

一、初步了解肥皂的特性和用途。

1、教师:小朋友洗手需要什么呀?肥皂有什么用?

2、教师:我们怎样洗手?手上擦了肥皂搓搓会发现什么?

二引导幼儿吹泡泡,激发幼儿兴趣。

师:用气筒给气球、皮球充气,能吹出鼓鼓的大气球和大皮球,我们的嘴巴也能吹气吗?(可以)启发幼儿在自己的手上吹气,感知嘴巴能吹出气体。

教师示范用圆形吹泡器吹泡泡,再请个别幼儿吹泡泡,观察泡泡形状。

三、尝试探索用不同形状的吹泡器吹泡泡,感知泡泡形状。

师:(出示圆形的吹泡器)用它吹泡泡能吹出什么形状的泡泡?(圆形)

师:(出示正方形的吹泡器)用它吹泡泡能吹出什么形状的泡泡?(正方形)

教师示范用正方形的吹泡器吹泡泡,让幼儿看。

师:你看到的泡泡是正方形的吗?(不是,是圆的)

师:那猜猜三角形的工具吹出来的泡泡会是什么样子的?

师:(出示三角形的吹泡器)用它吹泡泡能吹出什么形状的泡泡?(三角形、圆形)

请个别幼儿选择自己喜欢的吹泡泡器,尝试吹泡泡,感知泡泡的色彩、大小和多少。并交流自己吹泡泡的发现。

师:你用什么形状的吹泡器,你吹出的泡泡是什么形状的?(幼儿自有讨论、发言)

教师小结:我们不管用圆形、正方形、三角形的吹泡器出泡泡,我们吹出的泡泡都是圆形的,它和吹泡器的形状没有关系。

四、让幼儿自主选择吹泡泡器,进一步感知观察吹出泡泡的形状,探索发现吹泡器的形状与吹出的泡泡形状的关系,体验成功的乐趣。

五、延伸活动:

探索五角星形的泡泡器,吹出的泡泡是什么形状?

小班科学活动:《漫游糖果王国》教案

活动目标:

1.运用多种感官感知不同糖果的特征(软硬、形状、颜色、味道),初步建立护牙意识,体验认识糖的乐趣。

2.愿意大胆表述自己的发现,并愿意与教师、同伴交流分享。活动准备:

各种糖果。糖果王国头饰一个

一、进入糖果王国。

1.进入糖果王国。T:“小朋友好,我是糖果王国的国王。糖果王国里有许多糖宝宝,你们想不想和他们做朋友呀?”

2.找糖果。

T:“那请每个小朋友在箩筐里找一个糖宝宝做朋友吧!”

二、感知糖果的特征,体验认识糖的乐趣。

1.幼儿自由地感知、初步探索糖果的特征,并与同伴交流。T:“你们都找到了糖宝宝朋友,请你们看一看,再跟旁边的小伙伴说一说自己的糖宝宝朋友是怎么样的。”

2.幼儿在教师的引导下进一步感知糖果的特征,并交流自己的发现。(1)摸糖果、捏糖果、感知糖果的质地。T:“请你用手摸一摸、捏一捏,然后告诉老师或其它小朋友你的糖宝宝是怎么样的?(2)看糖果,了解糖果的包装。

T:“你的糖宝宝穿了件什么样的衣服?(3)剥糖果,了解糖果的外形、颜色。T:“现在请你把糖宝宝的衣服脱掉,衣服放在桌子上,糖宝宝放在手心里面,看看糖宝宝是什么颜色、什么形状的?

(4)闻糖果,感知糖果的气味。

T:“我闻到了好多糖宝宝的味道,你们闻闻看糖宝宝是什么味的?那用小舌头轻轻地添一下,是什么味道啊?

(5)尝糖果,了解糖果的味道。T:“那把糖宝宝轻轻地送到你们的嘴巴里面,咦?这又是什么味道啊?

(6)尝试动手做糖果

T:我们认识了这么多的糖果,小朋友,你们想不想来动手做一些糖果啊?让我们一起来做一些糖果好吗?

3.小结。T:“今天,我们在糖果王国认识了许多糖宝宝,每个糖宝宝都有自己的漂亮衣服。糖宝宝有文档仅供参考

文档仅供参考 的很软,有的很硬。糖宝宝的颜色、形状也不同,有的圆圆的,有的方方的,有的扁扁的,颜色有红色、黄色、绿色等。闻一闻还有不同的气味,吃到嘴里甜甜的,有许多种味道。

三、体验吃糖的益处和害处,初步建立护牙意识

T:“糖好不好吃啊?张开嘴巴让我闻闻,恩…好香啊,啊呀,糖都跑到你们的牙齿里面去了,牙齿里面藏着糖会怎么样啊?那我们吃完糖以后应该怎么样啊?所以,我们吃完糖以后一定要刷牙漱口。

第五篇:单片机开机次数记忆器的设计及实现

信息与电气工程学院

单片机应用系统(三级项目)

设计说明书

(2014/2015学年第二学期)

开机次数记忆器设计及实现

专业班级

电子信息工程班

学生学号

学生姓名

指导教师

设计周数

2周设计成绩

2015年X月X日

1、项目设计

1.1

设计要求

(1)以单片机AT89C52为核心,使用24C02串行EEPROM进行存储开机次数;

(2)用LCD1602显示存储的开机次数;

(3)单片机复位一次,从24C02中读取数据,然后加1;

(4)在此基础上可以拓展对一组密码数据存储对比后,才能进入正常界面。

1.2

设计目的(1)培养学生正确的设计思想,理论联系实际的工作作风,严肃认真、实事求是的科学态度和勇于探索的创新精神。

(2)锻炼学生自学软件的能力及分析问题、解决问题的能力。

(3)通过课程设计,使学生在理论计算、结构设计、工程绘图、查阅设计资料、标准与规范的运用和计算机应用方面的能力得到训练和提高。

(4)巩固、深化和扩展学生的单片机理论知识。

(5)培养学生的团队合作能力。

2、项目设计正文

2.1方案设计

2.1.1设计思路

此次项目设计的目的是实现单片机开机次数的记忆及显示功能,即其复位断电关机都能准确的将开机次数显示在LCD1602显示屏上。根据对项目设计要求和实际应用的分析,选用以单片机AT89C52为核心,使用24C02串行EEPROM进行存储开机次数的方法,使C52单片机的P2.0口和P2.1口分别控制24C02的数据线SDA和时钟信号线SCK来完成数据的读写功能,然后用LCD1602显示屏将24C02中存储的数据显示出来。

具体设计实现的逻辑流程图如图1所示:

图1

逻辑实现流程图

2.1.2主要元器件

(1)

处理器AT89C52,引脚图如图2所示:

图2

AT89C52单片机引脚图

AT89C52是一个低电压,高性能CMOS

8位单片机,片内含8k

bytes的可反复擦写的Flash只读程序存储器和256

bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。

AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2

个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。

(2)

外部存储器24C02

串行E2PROM是基于I2C-BUS的存储器件,遵循二线制协议,由于其具有接口方便,体积小,数据掉电不丢失等特点,在仪器仪表及工业自动化控制中得到大量的应用。具有以下几大特点:

1.宽范围的工作电压1.8v~5.5v

2.低电压技术:

1mA典型工作电流

1uA典型待机电流

3.储存器组织结构

4.2线串行接口,完全兼容I2C总线

5.施密特触发输入噪声抑制

6.硬件数据写保护

7.内部与周期(最大5ms)

8.自动递增地址

9.可按照字节写

10.esd保护大于2.5kV

11.高可靠性:擦写寿命:100万次

数据保持时间:100年

12.无铅工艺,符合RoHS标准

2.2单元电路设计

2.2.1处理器AT89C52引脚的选择

本次项目设计选择的引脚分别为P0口、P2口、RES端口。

P0

口是一组8

位漏极开路型双向I/O

口,也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8

个TTL逻辑门电路,对端口P0

写“1”时,可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8

位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash编程时,P0

口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。

P2口

是一个带有内部上拉电阻的8

位双向I/O

口,P2的输出缓冲级可驱动(吸收或输出电流)4

个TTL

逻辑门电路。对端口P2

写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。访问外部程序存储器或16

位地数据存储器(例如执行MOVX

@DPTR

指令)时,P2

口送出高8

位地址数据。在访问8

位地址的外部数据存储器(如执行MOVX@RI

指令)时,P2

口输出P2锁存器的内容。Flash编程或校验时,P2亦接收高位地址和一些控制信号。P2.0口和P2.1口分别控制24C02的数据线SDA和时钟信号线SCK来完成数据的读写功能。

RST为复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。

单片机引脚图连接选择如图3所示:

图3

单片机的引脚连接图

2.2.2

RC复位电路

复位电路图如图4所示:

图4

复位电路图

系统复位的工作过程是在加电时,复位电路通过电容加给RST端一个短暂的高电平信号,此高电平信号随着VCC对电容的充电过程而逐渐回落,即RST端的高电平持续时间取决于电容的充电时间。为了保证系统能够可靠地复位,RST端的高电平信号必须维持足够长的时间。在图4的复位电路中,当VCC掉电时,必然会使RST端电压迅速下降到0V以下,但是,由于内部电路的限制作用,这个负电压将不会对器件产生损害。另外,在复位期间,端口引脚处于随机状态,复位后,系统将端口置为全“1”态。如果系统在上电时得不到有效的复位,则程序计数器PC将得不到一个合适的初值,CPU可能会从一个未被定义的位置开始执行程序。

2.2.3

LCD1602显示屏的连接

LCD1602各引脚的功能如下:

第1脚:VSS为电源地

第2脚:VDD接5V电源正极

第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。

第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。

第6脚:E(或EN)端为使能(enable)端。

第7~14脚:D0~D7为8位双向数据端。

单片机的P2.5,P2.6,P2.7分别接LCD1602的RS、RW、E端口,如图5所示:

图5

LCD1602显示屏的连接

2.2.4

24C02的连接

C52单片机的P2.0口和P2.1口分别控制24C02的数据线SDA和时钟信号线SCK来完成数据的读写功能,具体电路图如图6所示:

图6

24C02的连接

2.2.5

整体电路

系统整体仿真电路和实物操作电路如图7和图8所示:

图7

整体仿真电路图

图8

仿真实物图

2.3系统实现程序

#include

#include

sbit

SDA

=

P2^0;

//AT24C01串行数据

5脚

sbit

SCL

=

P2^1;

//AT24C01串行时钟

6脚

int

time=0;

int

time2=0;

typedef

unsigned

char

uint8;

/*

defined

for

unsigned

8-bits

integer

variable

无符号8位整型变量

*/

typedef

signed

char

int8;

/*

defined

for

signed

8-bits

integer

variable

有符号8位整型变量

*/

typedef

unsigned

char

BYTE;

typedef

unsigned

int

WORD;

typedef

bit

BOOL

;

sbit

rs

=

P2^6;

sbit

rw

=

P2^5;

sbit

ep

=

P2^7;

BYTE

code

dis1[]

=

{“TIME“};

BYTE

dis2[10]={“0123456789“};

BYTE

dis3[10]={“0123456789“};

delay(BYTE

ms)

{

//

延时子程序

BYTE

i;

while(ms--)

{

for(i

=

0;

i<

250;

i++)

{

_nop_();

_nop_();

_nop_();

_nop_();

}

}

}

BOOL

lcd_bz()

{

//

测试LCD忙碌状态

BOOL

result;

rs

=

0;

rw

=

1;

ep

=

1;

_nop_();

_nop_();

_nop_();

_nop_();

result

=

(BOOL)(P0

&

0x80);

ep

=

0;

return

result;

}

lcd_wcmd(BYTE

cmd)

{

//

写入指令数据到LCD

while(lcd_bz());

rs

=

0;

rw

=

0;

ep

=

0;

_nop_();

_nop_();

P0

=

cmd;

_nop_();

_nop_();

_nop_();

_nop_();

ep

=

1;

_nop_();

_nop_();

_nop_();

_nop_();

ep

=

0;

}

lcd_pos(BYTE

pos)

{

//设定显示位置

lcd_wcmd(pos

|

0x80);

}

lcd_wdat(BYTE

dat)

{

//写入字符显示数据到LCD

while(lcd_bz());

rs

=

1;

rw

=

0;

ep

=

0;

P0

=

dat;

_nop_();

_nop_();

_nop_();

_nop_();

ep

=

1;

_nop_();

_nop_();

_nop_();

_nop_();

ep

=

0;

}

lcd_init()

{

//LCD初始化设定

lcd_wcmd(0x38);

delay(1);

lcd_wcmd(0x0c);

delay(1);

lcd_wcmd(0x06);

delay(1);

lcd_wcmd(0x01);

//清除LCD的显示内容

delay(1);

}

////2402程序2

void

AT2401_Delay()

{;;}

void

busy()

{

BYTE

temp;

temp=0x00;

rs=0;

rw=1;

ep=1;

while((temp&0x80)==0x80)

{

ep=0;

_nop_();

ep=1;

_nop_();

}

}

void

AT2401_Start()//启动信号

{

SDA=1;

AT2401_Delay();

SCL=1;

AT2401_Delay();

SDA=0;

AT2401_Delay();

}

void

AT2401_Stop()//停止信号

{

SDA=0;

AT2401_Delay();

SCL=1;

AT2401_Delay();

SDA=1;

AT2401_Delay();

}

void

AT2401_Respons()//响应

{

uint8

i;

SCL=1;

AT2401_Delay();

while((SDA==1)&&(i<250))

i++;

SCL=0;

AT2401_Delay();

}

void

AT2401_Init()//初始化函数

{

SDA=1;

AT2401_Delay();

SCL=1;

AT2401_Delay();

}

void

AT2401_WByte(uint8

date)//写一个字节

{

uint8

i,temp;

temp=date;

for(i=0;i<8;i++)

{

temp=temp<<1;

SCL=0;

AT2401_Delay();

SDA=CY;

AT2401_Delay();

SCL=1;

AT2401_Delay();

}

SCL=0;

AT2401_Delay();

SDA=1;

AT2401_Delay();

}

uint8

AT2401_RByte()//读一个字节

{

uint8

i,k;

SCL=0;

AT2401_Delay();

SDA=1;

AT2401_Delay();

for(i=0;i<8;i++)

{

SCL=1;

AT2401_Delay();

k=(k<<1)|SDA;

SCL=0;

AT2401_Delay();

}

return

k;

}

void

AT2401_WAddr(uint8

address,uint8

date)//指定地址写一个数据

{

AT2401_Start();

AT2401_WByte(0xa0);

AT2401_Respons();

AT2401_WByte(address);

AT2401_Respons();

AT2401_WByte(date);

AT2401_Respons();

AT2401_Stop();

}

uint8

AT2401_RAddr(uint8

address)//指定地址读取一个字节

{

uint8

date;

AT2401_Start();

AT2401_WByte(0xa0);

AT2401_Respons();

AT2401_WByte(address);

AT2401_Respons();

AT2401_Start();

AT2401_WByte(0xa1);

AT2401_Respons();

date=AT2401_RByte();

AT2401_Stop();

return

date;

}

void

wr_com(BYTE

com)

{

ep=0;

rs=0;

rw=0;

P0=com;

_nop_();

ep=1;

_nop_();

ep=0;

}

void

wr_data(BYTE

date)

{

busy();

ep=0;

rs=1;

rw=0;

P0=date;

_nop_();

ep=1;

_nop_();

ep=0;

}

///////////////////////////////////////

///////////////////////////////////////

main()

{

BYTE

i;

lcd_init();

//

初始化LCD

AT2401_Init();

time

=

AT2401_RAddr(0x01);

time2

=

AT2401_RAddr(0x02);

if(time>=9)

{

AT2401_WAddr(0x01,0);

time2+=1;

}

time+=1;

if(time2>9&&time>=9)

{

time=0;

time2=0

;

}

AT2401_WAddr(0x01,time);

AT2401_WAddr(0x02,time2);

lcd_pos(4);

//

设置显示位置为第一行的第5个字符

i

=

0;

while(dis1[i]

!=

'\0')

{

//

显示字符“TIME“

lcd_wdat(dis1[i]);

i++;

}

lcd_pos(0x49);

//

设置显示位置为第二行第一位字符

dis2[time];

lcd_wdat(dis2[time]);

//

显示字符

delay(1);

lcd_pos(0x48);

//

设置显示位置为第二行第二位字符

dis2[time2];

lcd_wdat(dis3[time2]);

//

显示字符

while(1);

}

3、项目设计总结

通过此次课程设计,使我更加扎实的掌握了有关单片机应用系统设计方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。

课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。通过这次课程设计,我掌握了AT89C52、24C02和LCD1602的基本知识和连接测试,也通过查资料熟悉了外部存储24C02的工作原理。了解了C语言程序在单片机系统设计中的应用,掌握了系统电路的调试方法。

在此次的课程设计过程中,也对团队精神的进行了考察,我们小组三个人分工合作,查资料、电路设计、程序设计、硬件实物仿真都做得有条不紊,我们配合越来越默契,有问题一起解决,在成功后一起体会喜悦。果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。我认为,此次课设不仅培养了我们独立思考、团队协作、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,我们学会了很多自主学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。

4、参考文献

[1]

张毅刚,彭喜元,董继成.单片机原理及应用.北京:高等教育出版社,2003.[2]

史良.LCD12864显示模块与微处理器的接口设计

[J].矿业安全与环保,1999.项目设计

项目设计

成绩

指导教师

(签字)

****年**月**日

下载基于SPCE061A单片机的教学楼用打铃器word格式文档
下载基于SPCE061A单片机的教学楼用打铃器.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐