《2022年多路监控报警系统单片机课程设计》由会员分享,可在线阅读,更多相关《2022年多路监控报警系统单片机课程设计(28页珍藏版)》请在金锄头文库上搜索。
1、单片机课程设计 多路监控报警系统精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 28 页多路监控报警系统一、实验目地1 了解 A/D 芯片 TLC0809 转换性能及编程方法. 2 掌握 A/D 转换器与单片机地接口方法3 学会使用 A/D 转换器进行电压信号采集. 二、设计任务及要求利用串行模 /数转换芯片 TLC0809 、SST89E58及液晶显示器,设计完成一个数字电压多路监控报警系统.要求:数字电压多路监控报警系统可测量05V输入电压,电压值通过液晶轮流显示,并根据设置地限定值对输入超出额度地路端警报提示.三、工作原理及设计思
2、路多路监控报警系统地设计由A/D 转换、数据处理及显示控制等组成.A/D 转换由集成电路 TLC0809 完成,利用TLC0809 将模拟电压转换为数字量,经单片机将数字量转换成对应地电压值,并通过液晶显示输出.四、系统特点本系统可以每一路独立设置最高最低地电压值,并对每一路电压进行监控报警,对超出范围内地电路显示对应路值,并用LED 灯和蜂鸣器表示不同地路值.五、硬件电路设计及原理1、ADC0809(1)、ADC0809 管脚图及时序图:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 28 页该ADC0809 数据采集部分是单片CMO
3、S 器件,它具有8位模拟数字转换器,8通道多路复用器和微处理器兼容控制逻辑.8位A / D转换器采用逐次逼近作为转换技术.根据时序电路地分析,可以完成单片机编程.该系统在工作时,单片机将产生串行时钟,并按时序发送和接受数据位 .由上图可知,ADC0809 由一个 8路模拟开关、一个地址锁存与译码器、一个A/D 转换器和一个三态输出锁存器组成.多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D 转换器进行转换.三态输出锁器用于锁存A/D 转换完地数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完地数据.IN0IN7 :8条模拟量输入通道ADC0809 对输入模拟量要求:信号
4、单极性,电压范围是05V,若信号太小,必须进行放大;输入地模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路. 地址输入和控制线:4条 ALE 为地址锁存允许输入线,高电平有效.当ALE 线为高电平时,地址锁存与译码器将A,B,C三条地址线地地址信号进行锁存,经译码后被选中地通道地模拟量进转换器进行转换.A,B和C为地址输入线,用于选通IN0 IN7上地一路模拟量输入.数字量输出及控制线:11条 ST为转换启动信号.当 ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平.EOC为转换结束信号.当EOC为高电平时,表明转换结
5、束;否则,表明正在进行A/D 转换 .OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到地数据.OE1,输出转换得到地数据;OE 0,输出数据线呈高阻状态.D7 D0为数字量输出线. CLK 为时钟输入信号线.因ADC0809 地内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ , VREF (),VREF()为参考电压输入. (2)、ADC0809 应用说明ADC0809 内部带有输出锁存器,可以与AT89S51单片机直接相连,初始化时,使ST和OE信号全为低电平,送要转换地哪一通道地地址到A, B, C端口上,在 ST端给出一个至少有100ns宽地正脉冲
6、信号,是否转换完毕,我们根据EOC信号来判断,当 EOC变为高电平时,这时给OE为高电平,转换地数据就输出给单片机了. 2、SST89E58RD(1)、SST89E58RD管脚图:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 28 页3、1602液晶引脚功能说明第1脚: VSS为电源地,接GND. 第2脚: VDD 接5V 正电源 . 第3脚: VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高. 第4脚: RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器. 第5脚: RW为读写信号线,高电平时
7、进行读操作,低电平时进行写操作.当RS和RW共同为低电平时可以写入指令或者显示地址,当 RS为低电平 RW为高电平时可以读忙信号,当RS为高电平 RW 为低电平时可以写入数据 . 第6脚: E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令. 第7 14脚: D0D7为8位双向数据线. 第15脚: BLA 背光电源正极(+5V)输入引脚 . 第16脚: BLK 背光电源负极,接GND.序号指令RSR/WD7D6D5D4D3D2D1D01清显示00000000012光标返回000000001*3置输入模式00000001I/DS4显示开 /关控制0000001DCB5光标或字符移位00
8、0001S/CR/L*6置功能00001DLNF*7置字符发生存贮器地址0001字符发生存贮器地址8置数据存贮器地址001显示数据存贮器地址9读忙标志或地址01BF 计数器地址10写数到 CGRAM 或DDRAM )10要写地数据内容11从 CGRAM 或 DDRAM读数11读出地数据内容精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 28 页指令 1:清显示,指令码01H,光标复位到地址00H位置 指令 2:光标复位,光标返回到地址 00H 指令 3:光标和显示模式设置I/D:光标移动方向,高电平右移,低电平左移S:屏幕上所有文字是否
9、左移或者右移.高电平表示有效,低电平则无效指令 4:显示开关控制. D:控制整体显示地开与关,高电平表示开显示,低电平表示关显示C:控制光标地开与关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁指令 5:光标或显示移位S/C:高电平时移动显示地文字,低电平时移动光标指令6:功能设置命令DL :高电平时为4位总线,低电平时为8位总线N:低电平时为单行显示,高电平时双行显示F: 低电平时显示5x7地点阵字符,高电平时显示5x10地点阵字符指令7:字符发生器RAM 地址设置指令 8:DDRAM 地址设置指令 9:读忙信号和光标地址BF:为忙标志位,高电平表示忙,此
10、时模块不能接收命令或者数据,如果为低电平表示不忙. 指令 10:写数据指令 11:读数据 .读状态输入RS=L,R/W=H ,E=H输出D0D7=状态字写指令输入RS=L,R/W=L ,D0D7=指令码, E=高脉冲输出无读数据输入RS=H,R/W=H , E=H输出D0D7=数据写数据输入RS=H,R/W=L ,D0D7=数据, E=高脉冲输出无五、软件设计主程序设计:1) A/D 转换程序每次 5组电压值构成一个数组,数组中地值为AD 进入值 50次地平均值 . 2) 数据处理程序:可以说是整个程序设计地最难点,数据处理显示地电压值计算公式:V= ( A*500 )/255,(其中 A为经
11、 0809转换后所得地数字量)这样使得计算出来地数值为整型,避免了浮点数计算复杂地缺点,在之后地显示中加入小数点即可.子程序设计:由于 C语言地子程序功能比较强大,所以本程序调用相关子程序,减少了很多编程地繁琐,相关子程序功能如下所示:函数功能 :400ms延时延时函数功能 :5ms延时函数功能 :1602A按指定位置显示一个字符函数功能 :1602A初始化函数功能 :1602A 读状态函数功能 :1602A写指令函数功能 :1602A读数据函数功能 :1602A 写数据作用: AD0809 通道选择采样值流程图:精选学习资料 - - - - - - - - - 名师归纳总结 - - - -
12、- - -第 5 页,共 28 页否是六、系统 C程序根据上述软 /硬件地设计,编写好地源程序如下:/* ADC0809 地多路电压监视器* ADC0809+1602LCD+单片机* 作者:于萱格初始化液晶初始化 ADC0809 显示第 i 路电压For i=0。i5。i+ 显 示Warning 同 时蜂鸣器响、红灯亮显 示Warning 同时蜂鸣器响、红灯亮采集一路电压下溢出?上溢出上溢出?下溢出?开始是否有进入设置按键显示各路电压值进入设置限定值界面设置各个通道地高低值设置最高警戒值设置最低警戒值各路设置后进入主程序是否有 back 键按下精选学习资料 - - - - - - - - -
13、名师归纳总结 - - - - - - -第 6 页,共 28 页*/#include #include #include #include #include #define SYSTEM_OSC 12000000 /定义晶振频率12000000HZ #define SOUND_SPACE 4/5 /定义普通音符演奏地长度分率,/每 4分音符间隔#define uchar unsigned char #define uint unsigned int #define LCM_Data P2/ 数据接口sbit ST = P00。 /file:/ 片选端sbit EOC = P01 。 / fil
14、e:/ 时钟端sbit OE = P02。 /file:/ 数据输入输出复用sbit A = P03 。sbit b = P05。sbit C = P06 。sbit LCM_E=P35 。/定义接口sbit LCM_RW=P36 。sbit LCM_RS=P37 。sbit LED_GREEN=P31 。 /定义绿灯地口sbit LED_RED=P30 。 /定义红灯地口sbit BeepIO=P34 。 /定义输出管脚sbit EX_0=P32 。 /外部中断 INTO sbit EX_1=P33 。 /外部中断 INT1 sbit B_UP=P07 。 /定义外部按键 1 sbit B_
15、DOWN=P04 。 /定义外部按键 2 void LCM_WriteData(uchar WDLCM)。void LCM_WriteCommand(uchar WCLCM,BuysC)。uchar LCM_ReadData(void) 。uchar LCM_ReadStatus(void) 。void LCM_Init(void)。void DisplayOneChar(uchar X, uchar Y , uchar DData)。void DisplayListChar(uchar X, uchar Y , uchar code *DData) 。void Delay5Ms(void)
16、。void Delay400Ms(void) 。void init(void) 。 /AD0809 初始化void AD(uint M) 。 /选择通道来显示精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 28 页void Delay(uint m) 。 /AD0809 专用延时char B_UP_CHECK(void) 。 /向上按键去抖char B_DOWN_CHECK(void)。/向下按键去抖void InitialSound(void) 。void Delay1ms(unsigned int count) 。void Play
17、(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)。uchar code uctech10 = 0,1,2,3,4,5,6,7,8,9。unsigned int code FreTab12 = 262,277,294,311,330,349,369,392,415,440,466,494 。 /原始频率表unsigned char code SignTab7 = 0,2,4,5,7,9,11 。 /17在频率表中地位置unsigned char code LengthTab7=
18、 1,2,4,8,16,32,64 。unsigned char Sound_Temp_TH0,Sound_Temp_TL0 。/音符定时器初值暂存unsigned char Sound_Temp_TH1,Sound_Temp_TL1 。/音长定时器初值暂存/int func=0,func_ok=0,max_value=130,min_value=50。int AD_DATA 。uchar code net = Running。 /7 uchar code net1 = Set_Max_Value。 /13 uchar code net2 = Set_Min_Value。 /13 uchar
19、code net3 = Hello World!。 /7 uchar code net4 = Now_Value:。 /9 uchar code net5 = WARNNING!。 /9 uchar code net6 = CH。 /9 int func=0,func_ok=0 。uint max_value5=200,200,200,200,200。uint min_value5=0,0,0,0,0。/*Music*/挥着翅膀地女孩unsigned char code Music_Girl= 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0
20、x03, 0x16,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x02, 0x18,0x03, 0x17,0x03, 0x15,0x02, 0x18,0x03, 0x17,0x03, 0x18,0x02, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x15,0x03, 0x16,0x03, 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x1A,0x03, 0x1B,0x03, 0x1F,0x03
21、, 0x1F,0x03, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03,精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 28 页 0x18,0x03, 0x1F,0x03, 0x1F,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03,
22、 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04, 0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x
23、1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x00, 0x1A,0x03, 0x1A,0x03, 0x1A,0x03, 0x1B,0x03, 0x1B,0x03, 0x1A,0x03, 0x19,0x03, 0x19,0x02, 0x17,0x03, 0x15,0x17, 0x15,0x03, 0x16,0x03, 0x17,
24、0x03, 0x18,0x03, 0x17,0x04, 0x18,0x0E, 0x18,0x03, 0x17,0x04, 0x18,0x0E, 0x18,0x66, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x04, 0x1B,0x0E, 0x1B,0x03, 0x19,0x03, 0x19,0x0
25、3, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04, 0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,
26、0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x00, 0x18,0x02, 0x18,0x03, 0x1A,0x03, 0x19,0x0D, 0x15,0x03, 0x15,0x02, 0x18,0x66, 0x16,0x02, 0x17,0x02, 0x15,0x00, 0x00,0x00。/同一首歌unsigned char code Music_Same= 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x66, 0x18,0x03, 0x17,0x02, 0x15,0x02, 0
27、x16,0x01, 0x15,0x02, 0x10,0x02, 0x15,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x02, 0x18,0x66, 0x17,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x16,0x00, 0x17,0x01, 0x19,0x02, 0x1B,0x02, 0x1B,0x70, 0x1A,0x03, 0x1A,0x01, 0x19,0x02, 0x19,0x03, 0x1A,0x03, 0x1B
28、,0x02, 0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x18,0x66, 0x18,0x03, 0x19,0x02, 0x1A,0x02, 0x19,0x0C, 0x18,0x0D, 0x17,0x03, 0x16,0x01, 0x11,0x02, 0x11,0x03, 0x10,0x03, 0x0F,0x0C, 0x10,0x02, 0x15,0x00, 0x1F,0x01, 0x1A,0x01, 0x18,0x66, 0x19,0x03, 0x1A,0x01, 0x1B,0x02, 0x1B,0x03, 0x1B,0x03, 0x1B,0x0C, 0x1A,0x
29、0D, 0x19,0x03, 0x17,0x00, 0x1F,0x01, 0x1A,0x01, 0x18,0x66, 0x19,0x03, 0x1A,0x01, 0x10,0x02, 0x10,0x03, 0x10,0x03, 0x1A,0x0C, 0x18,0x0D, 0x17,0x03,精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 28 页 0x16,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x70, 0x18,0x03, 0x17,0x02, 0x15,0x03, 0x15,0x0
30、3, 0x16,0x66, 0x16,0x03, 0x16,0x02, 0x16,0x03, 0x15,0x03, 0x10,0x02, 0x10,0x01, 0x11,0x01, 0x11,0x66, 0x10,0x03, 0x0F,0x0C, 0x1A,0x02, 0x19,0x02, 0x16,0x03, 0x16,0x03, 0x18,0x66, 0x18,0x03, 0x18,0x02, 0x17,0x03, 0x16,0x03, 0x19,0x00, 0x00,0x00 。/两只蝴蝶unsigned char code Music_Two = 0x17,0x03, 0x16,0x0
31、3, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D,
32、0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01, 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x01, 0x1
33、9,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01, 0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00, 0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0
34、x03, 0x19,0x03, 0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x17,0x0D
35、, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0
36、x17,0x03, 0x19,0x03, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02, 0x10,0x03, 0x15,0x00, 0x00,0x00 。void Delay1ms(unsigned int
37、 count) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 28 页unsigned int i,j 。for(i=0 。 icount。i+) for(j=0 。 j) 。 Delay5Ms() 。 for(j=0 。 j) 。 Delay5Ms() 。 InitialSound() 。 EX0=1 。 /开外部中断 0 EX1=1 。 /开外部中断 1 EA=1 。 /开总中断 LCM_WriteCommand(0x01,1) 。 /显示清屏 Delay400Ms() 。 DisplayListChar(4, 0, net)
38、。/显示 Runing /以下为主循环 while(1) LED_GREEN=0 。 /绿灯灭 LED_RED=0 。 /红灯灭 BeepIO=1。 for(y=0 。y5。y+) /5 路扫描显示 for(x=0 。x5。 x+) / 五路电压扫描精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 28 页 for(j=0 。j(max_valuex) ) LCM_WriteCommand(0x01,1)。 /显示清屏 Delay5Ms() 。 Delay5Ms() 。 DisplayListChar(3, 0, net5) 。/显示
39、WARNNING! DisplayListChar(0, 1, net6) 。/显示 CH DisplayOneChar(2, 1, :) 。 DisplayOneChar(3, 1, uctechx+1) 。 Delay400Ms() 。 if(x=0) LED_GREEN=0 。 LED_RED=1 。 Play(Music_Girl,0,3,360) 。 if(x=1) LED_GREEN=1 。 LED_RED=0 。 Play(Music_Same,0,3,360) 。 if(x=2) LED_GREEN=1 。 LED_RED=1 。 Play(Music_Two,0,3,360)
40、 。 for(j=0 。j50 。j+)/ 继续扫描本路电压 AD(x) 。 i+=AD_DATA 。 i/=50 。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 12 页,共 28 页 m=i*500/256 。 nx=(unsigned int)m 。 if( nx(max_valuex) ) LCM_WriteCommand(0x01,1) 。 /显示清屏 Delay5Ms() 。 Delay5Ms() 。 DisplayListChar(4, 0, net) 。/显示 Runing /DisplayListChar(0, 1, net4)
41、 。/显示 Now_Value: break。 /* 以下为判断电压有没有下溢出*/ while( nx(min_valuex) ) LCM_WriteCommand(0x01,1)。 /显示清屏 Delay5Ms() 。 Delay5Ms() 。 DisplayListChar(3, 0, net5) 。/显示 WARNNING! DisplayListChar(0, 1, net6) 。/显示 CH DisplayOneChar(2, 1, :) 。 DisplayOneChar(3, 1, uctechx+1) 。 Delay400Ms() 。 if(x=0) LED_GREEN=0 。
42、 LED_RED=1 。 Play(Music_Girl,0,3,360) 。 if(x=1) LED_GREEN=1 。 LED_RED=0 。 Play(Music_Same,0,3,360) 。 if(x=2) LED_GREEN=1 。 LED_RED=1 。 Play(Music_Two,0,3,360) 。 for(j=0 。j(min_valuex) ) LCM_WriteCommand(0x01,1) 。 /显示清屏 Delay5Ms() 。 Delay5Ms() 。 DisplayListChar(4, 0, net) 。/显示 Runing /DisplayListChar
43、(0, 1, net4) 。/显示 Now_Value: break。 /*以下为设置各个通道地高低值*/ /设置最高警戒值 while(func=1) LCM_WriteCommand(0x01,1)。 /显示清屏 Delay5Ms() 。 Delay5Ms() 。 while(1) DisplayListChar(0, 0, net1) 。 /显示 Set_Max_Value DisplayListChar(0, 1, net6) 。/显示 CH DisplayOneChar(2, 1, uctechfunc) 。 DisplayOneChar(3, 1, :) 。 if(B_UP_CHE
44、CK() max_valuefunc-1+ 。 if(B_DOWN_CHECK() max_valuefunc-1- 。 bw=max_valuefunc-1/100 。 sw=max_valuefunc-1%100/10 。 gw=max_valuefunc-1%10 。 DisplayOneChar(4, 1, uctechbw) 。 DisplayOneChar(5, 1, .) 。 DisplayOneChar(6, 1, uctechsw) 。 DisplayOneChar(7, 1, uctechgw) 。精选学习资料 - - - - - - - - - 名师归纳总结 - - -
45、- - - -第 14 页,共 28 页 if(func5) break 。 /设置最低警戒值 while(func5) DisplayListChar(0, 0, net2) 。 /显示 Set_Min_Value DisplayListChar(0, 1, net6) 。/显示 CH DisplayOneChar(2, 1, uctechfunc-5) 。 DisplayOneChar(3, 1, :) 。 if(B_UP_CHECK() min_valuefunc-6+ 。 if(B_DOWN_CHECK() min_valuefunc-6- 。 bw=min_valuefunc-6/1
46、00 。 sw=min_valuefunc-6%100/10。 gw=min_valuefunc-6%10。 DisplayOneChar(4, 1, uctechbw) 。 DisplayOneChar(5, 1, .) 。 DisplayOneChar(6, 1, uctechsw) 。 DisplayOneChar(7, 1, uctechgw) 。 if(func_ok=1) LCM_WriteCommand(0x01,1) 。 /显示清屏 Delay5Ms() 。 Delay5Ms() 。 Delay5Ms() 。 DisplayListChar(4, 0, net) 。/显示 Ru
47、ning DisplayListChar(0, 1, net6) 。 break。 func=0。 func_ok=0 。 Delay400Ms() 。 Delay400Ms() 。 DisplayListChar(0, 1, net6) 。 DisplayOneChar(2, 1, uctechy+1) 。 bw=ny/100 。 sw=ny%100/10 。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 15 页,共 28 页 gw=ny%10 。 DisplayOneChar(5, 1, uctechbw) 。 DisplayOneChar(
48、6, 1, .) 。 DisplayOneChar(7, 1, uctechsw) 。 DisplayOneChar(8, 1, uctechgw) 。 void EXF0() interrupt 0 using 0 /ex0 入口 EA=0。 LCM_WriteCommand(0x01,1) 。 /显示清屏 Delay400Ms() 。 if(func=10) func=0 。 else func+。 EA=1。 void EXF1() interrupt 2 using 0 /ex1 入口 EA=0。 LCM_WriteCommand(0x01,1) 。 /显示清屏 Delay400Ms(
49、) 。 if(func_ok=1) func_ok=0。 else func_ok+ 。 EA=1。 char B_UP_CHECK(void) / 向上按键去抖 if(B_UP=0) Delay5Ms() 。Delay5Ms() 。 if(B_UP=0) return 1。 return 0。 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 16 页,共 28 页char B_DOWN_CHECK(void) / 向下按键去抖 if(B_DOWN=0) Delay5Ms() 。Delay5Ms() 。 if(B_DOWN=0) return 1。
50、 return 0。 /*ADC0809 地初始化 */ void init(void) ST=0。 OE=0。 /*/*参数名: AD(uint M) /*作用: AD0809 通道选择采样值/*输入参数: CH0,CH1,CH2 ,unit 型/*输出参数:选择参数地电压值,发在AD_DA TA处/*/void AD(uint M) ST=0。 if(M=0) A=1 。b=1。C=0。 else if(M=1) A=0 。b=0。C=1。 else if(M=2) A=1 。b=0。C=1。 else if(M=3) A=0 。b=1。C=1。 精选学习资料 - - - - - - -
51、- - 名师归纳总结 - - - - - - -第 17 页,共 28 页 else if(M=4) A=1 。b=1。C=1。 Delay(10)。 ST=1。 Delay(10)。 ST=0。 while(EOC=0) 。 OE=1。 AD_DATA=P1 。 OE=0。 /*AD0809 所用地延时 */ void Delay(uint m) while(-m) 。 void InitialSound(void) BeepIO = 0。Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256。/ 计算 TL1 应装入地初值(10ms地初装值 )So
52、und_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256。/ 计算 TH1应装入地初值TH1 = Sound_Temp_TH1 。TL1 = Sound_Temp_TL1 。TMOD = 0x11 。ET0 = 1。ET1 = 0。TR0 = 0。TR1 = 0。EA = 1。 void BeepTimer0(void) interrupt 1 /音符发生中断 00 void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed) uns
53、igned int NewFreTab12 。/新地频率表精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 18 页,共 28 页unsigned char i,j。unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength。unsigned char Tone,Length,SL,SH,SM,SLen,XG ,FD。for(i=0 。 i 11) j = j-12 。NewFreTabi = FreTabj*2 。 else NewFreTabi = F
54、reTabj 。if(Octachord = 1) NewFreTabi=2 。else if(Octachord = 3) NewFreTabi=2 。 SoundLength = 0。while(SoundSoundLength != 0x00) /计算歌曲长度 SoundLength+=2。 Tone = SoundPoint 。Length = SoundPoint+1 。/ 读出第一个音符和它时时值LDiv0 = 12000/Speed 。/ 算出 1分音符地长度(几个 10ms) LDiv4 = LDiv0/4。/ 算出 4分音符地长度LDiv4 = LDiv4-LDiv4*SOU
55、ND_SPACE。/ 普通音最长间隔标准TR0 = 0。TR1 = 1。while(Point = 2。/低音if (SM=3) CurrentFre = 2。/高音Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC)。/计算计数器初值Sound_Temp_TH0 = Temp_T/256 。Sound_Temp_TL0 = Temp_T%256 。TH0 = Sound_Temp_TH0 。TL0 = Sound_Temp_TL0 + 12 。 /加 12是对中断延时地补偿 SLen=LengthTabLength%10 。 /
56、算出是几分音符XG=Length/10%10 。/算出音符类型(0普通 1连音 2顿音 ) FD=Length/100 。LDiv=LDiv0/SLen。/算出连音音符演奏地长度(多少个10ms) if (FD=1) LDiv=LDiv+LDiv/2。if(XG!=1) if(XG=0) /算出普通音符地演奏长度if (SLen0。i-) /发规定长度地音 while(TF1=0) 。TH1 = Sound_Temp_TH1 。TL1 = Sound_Temp_TL1 。TF1=0。 if(LDiv2!=0) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - -
57、- -第 20 页,共 28 页 TR0=0。 BeepIO=0 。for(i=LDiv2 。i0。i-) /音符间地间隔 while(TF1=0) 。TH1 = Sound_Temp_TH1 。TL1 = Sound_Temp_TL1 。TF1=0。 Point+=2。Tone=SoundPoint 。Length=SoundPoint+1 。 BeepIO = 0。 /*1602A写数据函数 */*函数原型 :void LCM_WriteData(uchar WDLCM) /*函数功能 :1602A写数据/*输入参数 :要写入地数据/*输出参数 :无/*调用模块 : /*建立时间 :200
58、5/11/14 /*作者 :站长/*/void LCM_WriteData(uchar WDLCM) LCM_ReadStatus() 。/检测忙 LCM_Data = WDLCM。 LCM_RS = 1 。 LCM_RW = 0 。 LCM_E = 0 。/若晶振速度太高可以在这后加小地延时 LCM_E = 0 。/延时 LCM_E = 1 。 /*1602A写指令函数 */*函数原型 :void LCM_WriteCommand(uchar WCLCM,BuysC) /*函数功能 :1602A写指令/*输入参数 :要写入地指令/*输出参数 :无/*调用模块 : /*建立时间 :2005/1
59、1/14 /*作者 :站长/*/精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 21 页,共 28 页void LCM_WriteCommand(uchar WCLCM,BuysC)/BuysC为0时忽略忙检测 if (BuysC) LCM_ReadStatus() 。/根据需要检测忙 LCM_Data = WCLCM。 LCM_RS = 0 。 LCM_RW = 0 。 LCM_E = 0 。 LCM_E = 0 。 LCM_E = 1 。 /*1602A读数据函数 */*函数原型 :uchar LCM_ReadData(void) /*函数功能
60、 :1602A读数据/*输入参数 :无/*输出参数 :1602A返回地数据/*调用模块 : /*建立时间 :2005/11/14 /*作者 :站长/*/uchar LCM_ReadData(void) LCM_RS = 1 。 LCM_RW = 1 。 LCM_E = 0 。 LCM_E = 0 。 LCM_E = 1 。 return(LCM_Data) 。 /*1602A读状态函数 */*函数原型 :uchar LCM_ReadData(void) /*函数功能 :1602A读状态/*输入参数 :无/*输出参数 :1602A返回地状态/*调用模块 : /*建立时间 :2005/11/14
61、/*作者 :站长/*/uchar LCM_ReadStatus(void) LCM_Data = 0xFF 。 LCM_RS = 0 。 LCM_RW = 1 。 LCM_E = 0 。 LCM_E = 0 。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 22 页,共 28 页 LCM_E = 1 。 while (LCM_Data & 0x80)。/检测忙信号 return(LCM_Data) 。 /*1602A初始化函数 */*函数原型 :void LCM_Init(void) /*函数功能 :1602A初始化/*输入参数 :无/*输出参数
62、:无/*调用模块 : /*建立时间 :2005/11/14 /*作者 :站长/*/void LCM_Init(void) LCM_Data = 0 。 LCM_WriteCommand(0x38,0)。/三次显示模式设置,不检测忙信号 Delay5Ms() 。 LCM_WriteCommand(0x38,0)。 Delay5Ms() 。 LCM_WriteCommand(0x38,0)。 Delay5Ms() 。 LCM_WriteCommand(0x38,1)。/显示模式设置,开始要求每次检测忙信号 LCM_WriteCommand(0x08,1)。/关闭显示 LCM_WriteComman
63、d(0x01,1)。/显示清屏 LCM_WriteCommand(0x06,1)。/ 显示光标移动设置 LCM_WriteCommand(0x0C,1)。/ 显示开及光标设置 /*1602A按指定位置显示一个字符函数*/*函数原型 :void DisplayOneChar(uchar X, uchar Y , uchar DData)/*函数功能 :1602A按指定位置显示一个字符/*输入参数 :X坐标 Y坐标 要显示地字符/*输出参数 :无/*调用模块 : /*建立时间 :2005/11/14 /*作者 :站长/*/void DisplayOneChar(uchar X, uchar Y ,
64、 uchar DData) Y &= 0x1 。 X &= 0xF 。/限制 X不能大于 15,Y不能大于 1 if (Y) X |= 0x40 。/当要显示第二行时地址码+0x40。 X |= 0x80 。/ 算出指令码精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 23 页,共 28 页 LCM_WriteCommand(X, 0)。/这里不检测忙信号,发送地址码 LCM_WriteData(DData) 。 /*1602A按指定位置显示一串字符函数*/*函数原型 :void DisplayListChar(uchar X, uchar Y ,
65、 uchar code *DData)/*函数功能 :1602A按指定位置显示一个字符/*输入参数 :X坐标 Y坐标 要显示字符串地首地址/*输出参数 :无/*调用模块 : /*建立时间 :2005/11/14 /*作者 :站长/*/void DisplayListChar(uchar X, uchar Y , uchar code *DData) uchar ListLength 。 ListLength = 0 。 Y &= 0x1 。 X &= 0xF 。/限制 X不能大于 15,Y不能大于 1 while (DDataListLength0x20)/若到达字串尾则退出 if (X =
66、0xF)/X坐标应小于 0xF DisplayOneChar(X, Y , DDataListLength) 。/显示单个字符 ListLength+ 。 X+ 。 /*5ms延时函数 */*函数原型 :void Delay5Ms(void) /*函数功能 :5ms延时/*输入参数 :无/*输出参数 :无/*调用模块 : /*建立时间 :2005/11/14 /*作者 :站长/*/void Delay5Ms(void) unsigned int TempCyc = 5552 。 while(TempCyc-) 。 /*400ms延时延时函数*/精选学习资料 - - - - - - - - -
67、名师归纳总结 - - - - - - -第 24 页,共 28 页/*函数原型 :void Delay400Ms(void) /*函数功能 :400ms延时延时/*输入参数 :无/*输出参数 :无/*调用模块 : /*建立时间 :2005/11/14 /*作者 :站长/*/void Delay400Ms(void) uchar TempCycA = 5 。 unsigned int TempCycB 。 while(TempCycA-) TempCycB=7269 。 while(TempCycB-) 。 。系统总电路图:晶振电路:蜂鸣器电路:精选学习资料 - - - - - - - - -
68、名师归纳总结 - - - - - - -第 25 页,共 28 页重置按键电路:功能设置按键电路:七、调试程序将写好地程序放到KEIL 里:生成 hex 文件 :精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 26 页,共 28 页将编译生成地hex 文件烧录到单片机板子上:设置端口及波特率:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 27 页,共 28 页原件清单: SST89E58RD 一个、 ADC0809 一个、蜂鸣器一个、电阻若干、按键若干、LED红绿各一个、 LCD 一个、电容若干、导线
69、若干八、实验总结:这次单片机课程设计,使我有机会将理论与实践更进一步结合,以前只是在书面上或电脑上单纯地编程,这次实验让我有机会去接触JD51 开发板,接触相关地芯片,熟悉芯片地管脚,将抽象地理论具体化.通过这次课程设计让我对单片机地软件、硬件了解地更加深刻,学习到课堂上很多没学到地东西,编程能力也让我有了很大提高,为我今后进一步学习打下了扎实地基础.回顾起此次单片机课程设计,我仍感慨颇多,地确,从选题到定稿,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多地地东西,同时不仅可以巩固了以前所学过地知识,而且学到了很多在书本上所没有学到过地知识.通过这次课程设计使我懂得了理论
70、与实际相结合是很重要地,只有理论知识是远远不够地,只有把所学地理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己地实际动手能力和独立思考地能力.在设计地过程中遇到问题,可以说得是困难重重,这毕竟第一次做地,难免会遇到过各种各样地问题,同时在设计地过程中发现了自己地不足之处,对以前所学过地知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件地使用方法,对单片机汇编语言掌握得不好 通过这次课程设计之后,一定把以前所学过地知识重新温故.虽然过去从未独立应用过它们,但在学习地过程中带着问题去学我发现效率很高,这是我做这次课程设计地又一收获.后,要做好一个课程设计,就必须做
71、到:在设计程序之前,对所用单片机地内部结构有一个系统地了解,知道该单片机内有哪些资源;要有一个清晰地思路和一个完整地地软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计地必经之路;要养成注释程序地好习惯,一个程序地完美与否不仅仅是实现功能,而应该让人一看就能明白你地思路,这样也为资料地保存和交流提供了方便;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到地问题记录下来,并分析清楚,以免下次再碰到同样地问题地课程设计结束了,但是从中学到地知识会让我受益终身.发现、提出、分析、解决问题和实践能力地提高都会受益于我在以后地学习、工作和生活中.设计过程,好比是我们人类成长地历程,常有一些不如意,但毕竟这是第一次做,难免会遇到各种各样地问题 .在设计地过程中发现了自己地不足之处,对以前所学过地知识理解得不够深刻,掌握得不够牢固.最后感谢老师地指导和同学们地帮助.精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 28 页,共 28 页