程序流程框图
- 格式:doc
- 大小:159.74 KB
- 文档页数:22
三、系统的软件设计3.1程序流程框图开始初始化读、写日期、时间和温度分离日期\时间\温度显示值显示子程序确认返回日期、时间修改子程序确认返回闰月子程序返回图-A 主程序流程图图-B计算阳历程序流程图图-C 时间调整程序流程图四. 指标测试4.2硬件测试电子万年历的电路系统较大,对于焊接方面更是不可轻视,庞大的电路系统中只要出于一处的错误,则会对检测造成很大的不便,而且电路的交线较多,对于各种锋利的引脚要注意处理,否则会刺破带有包皮的导线,则会对电路造成短路现象。
在本电子万年历的设计调试中遇到了很多的问题。
回想这些问题只要认真多思考都是可以避免的,以下为主要的问题:(1)LCD显示出现重叠,,原因出于没有给出正确的显示地址。
解决:重新排列选取合适地址。
( 2)对万年历修改时间或日期时,有时LCD数码管被屏蔽掉,造成不显示现象。
解决:根据仪器的测试,发现电路的驱动能力不足,最后在DS1302时钟芯片的/CS、SCLK、RET端接入5.1K的上拉电阻后,电路的驱动能力才能满足,即可解决不亮现象。
4.3软件测试电子万年历是多功能的数字型,可以看当前日期,时间,还有温度的仪器。
电子万年历功能很多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。
最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。
在软件的调试过程中主要遇到的问题如下:1.烧入程序后,LCD液晶显示闪动,而且亮度不均匀。
解决:首先对调用的延时进行逐渐修改,可以解决显示闪动问题。
其次,由于本作品使作动态扫描方式显示的数字,动态扫描很快,人的肉眼是无法看出,但是调用的显示程序时,如果不在反回时屏蔽掉最后的附值,则会出现很亮的现象,所以在显示的后面加了屏蔽子令,最后解决了此问题。
2.加入温度的程序后,进行修改时间、日期时相应的液晶屏没有按要求显示。
解决:由于DS18B20是串行通信数据,只用一个口线传输,在处理采集的模拟信号时需要一定的时间,当把万年历的程序相接入时,会对延时有很大的影响。
符号变量类型TEMP数据类型网络1右行程开关IN 时间继电器2TON20 PT100 ms时间继电器2/中间继电器3时间继电器2中间继电器4符号时间继电器2右行程开关中间继电器3中间继电器4网络2左行程开关地址T38I0.3M0.3M0.4注释时间继电器1IN TON20 PT100 ms时间继电器1/中间继电器1时间继电器1中间继电器2符号时间继电器1中间继电器1中间继电器2左行程开关地址T37M0.1M0.2I0.2注释系统工作流程:此系统是一个双车位的沙石分离系统,右车位车辆到位后,行程开关闭合,中间继电器3得电,其NO触点闭合保护器、冲洗泵、分离机开始工作并通过时间继电器3NC触点形成一个计时5分钟的自锁回路,在右行程开关闭合时时间继电器2也开始计时,2s后中间继电器3断开,中间继电器4闭合,右气缸电磁阀闭合开始放水冲洗,计时2分钟或者行程开关断开后停止放水。
左车位原理同上,当左右行程开关都断开后,时间继电器3开始计时5分钟,时间到了自锁回路被破坏分离机等停止,同时冲洗泵接触器NC辅助触点闭合中间继电器5得电,左右电磁阀打开把水管残留的水排出防止气温低结冰,此时一次冲洗分离过程完成。
系统带有手动分离功能及手动停止功能。
网络3保护冲洗分离/中间继电器5符号保护冲洗分离中间继电器5网络4停止按钮/地址Q0.0M0.5注释启动按钮M0.0中间继电器1M0.0保护冲洗分离中间继电器3时间继电器3/保护冲洗分离半小时运行30秒/左行程开关/右行程开关/IN时间继电器3TON3000 PT100 ms符号半小时保护冲洗分离启动按钮时间继电器3停止按钮右行程开关运行30秒中间继电器1中间继电器3左行程开关地址T42Q0.0I0.1T39I0.0I0.3T43M0.1M0.3I0.2注释项目1 - 副本 /主程序 (OB1)网络5中间继电器5时间继电器4/左气缸电磁阀中间继电器2IN 时间继电器4TON1200 PT100 ms符号时间继电器4中间继电器2中间继电器5左气缸电磁阀网络6中间继电器5地址T40M0.2M0.5Q0.2注释时间继电器5/右气缸电磁阀中间继电器1IN 时间继电器5TON1200 PT100 ms符号时间继电器5右气缸电磁阀中间继电器1中间继电器5网络7地址T41Q0.1M0.1M0.5注释长期未启动则每半小时启动一次运行30秒运行30秒/IN半小时TON保护冲洗分离/18000 PT100 ms半小时半小时IN 运行30秒TON300 PT100 ms符号半小时保护冲洗分离运行30秒地址T42Q0.0T43注释。
1 流水灯流程框图:NY流水灯程序:/***********************************************************描述 : LED 流水灯的控制;8个LED 会进行流水灯的演示;***********************************************************/ #include<reg52.h>#define uchar unsigned chartemp 值赋给P1口延时 Temp 值左移一位 i=i+1i=0 temp=oxfe 开始 i<8#define uint unsigned intsbit PP=P3^6 ;/*********************************************************** * 名称 : Delay()* 功能 : 延时,延时时间为 10ms * del* 输入 : del* 输出 : 无***********************************************************/ void Delay(uint del){uint i,j;for(i=0; i<del; i++)for(j=0; j<1827; j++) ;}/*********************************************************** * 名称 : Main()* 功能 : 实现灯的闪烁* 输入 : 无* 输出 : 无***********************************************************/ void Main(void){uchar i, temp;PP=0;while(1){temp = 0xfe ;for(i=0; i<8; i++){P1 = temp; //把值赋给P1口Delay(10); //延时(10毫秒 * j)秒temp = temp << 1; //值左移一位temp = temp | 0x01;}}}流水灯运行效果图:2 四位数码管静态显示流程框图:开始初始化P3=0P1=tabley[X]四位数码管静态显示程序:/*********************************************************** * 文件名 : 数码管显示.c* 描述 : 该程序为数码管静态显示程序。
***********************************************************/ #include<reg52.h>#define uchar unsigned char#define uint unsigned int//数码管的段码编码uchar tabley[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};/*********************************************************** * 名称 : Main()* 功能 : 主函数* 输入 : 无* 输出 : 无***********************************************************/ void main(){uchar i = 0;P3=0;P1 =tabley[5];while(1){}}四位数码管静态显示程序运行效果:3 独立按键数码管加减流程框图:开始i=88NKEY()==1Yi=i-1NKEY()==2Yi=i+1位1显示位2显示独立按键控制数码管显示加减程序:/*********************************************************** * 文件名:独立按键.c* 描述 : 数码管上最开始显示“88”。
按S1,数码管上的值减1.按S3,数码管上的值加1.***********************************************************/ #include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit KEY1 = P2^4;sbit KEY3 = P2^6;uint i=88;//数码管的段码编码Ucha table[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};/*********************************************************** * 名称 : Delay_1ms()* 功能 : 延时子程序,延时时间为 1ms * x* 输入 : x (延时一毫秒的个数)* 输出 : 无***********************************************************/ void Delay_1ms(uint i){uint x,j;for(j=0;j<i;j++)for(x=0;x<=148;x++); }/*********************************************************** * 名称 : Delay()* 功能 : 延时,延时时间为 10ms * del* 输入 : del* 输出 : 无***********************************************************/ void Delay(uchar temp){uchar j;for(j=0;j<temp;j++){P1 = table[(i/10)%10];P3 = 0xfb;Delay_1ms(5);P1 = table[i%10];P3 = 0xf7;Delay_1ms(5);}}/*********************************************************** * 名称 : Delay()* 功能 : 实现按键功能,并在LED上显示* 输入 : 无* 输出 : 无***********************************************************/ uchar KEY(void){if(KEY1==0 || KEY3==0 ){Delay(2); //20毫秒软件防抖if(KEY1 == 0){Delay(10);return 1;}if(KEY3 == 0){Delay(10);return 3;}}return 0;}/*********************************************************** * 名称 : Main()* 功能 : 实现按键控制LED的显示* 输入 : 无* 输出 : 无***********************************************************/ void Main(void){uchar temp;while(1){temp = KEY();if(temp == 1){i--;}if(temp == 3){i++;}P1 = 0;P3 = 0xfb;P1 = table[(i/10)%10];Delay_1ms(3);P1 = 0;P3 = 0xf7;P1 = table[i%10];Delay_1ms(3);}}LCD液晶显示流程框图:开始延时30ms1602初始化显示第一行字符串单字符逐位显示第二行调用函数改变第一行改变第一列改变第一行改变第13位LCD液晶显示程序:/************************************************************ 文件名:液晶1602显示.c* 描述: 该程序实现了对液晶1602的控制。
第一行固定显示“Welcome To”。
第二行从左到右逐个显示“The MCU World”***********************************************************/#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit E=P2^7; //1602使能引脚sbit RW=P3^3; //1602读写引脚sbit RS=P3^2; //1602数据/命令选择引脚/************************************************************ 名称: delay()* 功能: 延时,延时时间大概为5US。
* 输入: 无* 输出: 无***********************************************************/ void delay(){_nop_();_nop_();_nop_();_nop_();_nop_();}/*********************************************************** * 名称: Delay_1ms()* 功能: 延时子程序,延时时间为1ms * x* 输入: x (延时一毫秒的个数)* 输出: 无***********************************************************/ void Delay(uint i){uint x,j;for(j=0;j<i;j++)for(x=0;x<=148;x++);}/*********************************************************** * 名称: bit Busy(void)* 功能: 这个是一个读状态函数,读出函数是否处在忙状态* 输入: 输入的命令值* 输出: 无***********************************************************/ bit Busy(void){bit busy_flag = 0;RS = 0;RW = 1;E = 1;delay();busy_flag = (bit)(P1 & 0x80);E = 0;return busy_flag;}/*********************************************************** * 名称: wcmd(uchar del)* 功能: 1602命令函数* 输入: 输入的命令值* 输出: 无***********************************************************/ void wcmd(uchar del){while(Busy());RS = 0;RW = 0;E = 0;delay();P1 = del;delay();E = 1;delay();E = 0;}/*********************************************************** * 名称: wdata(uchar del)* 功能: 1602写数据函数* 输入: 需要写入1602的数据* 输出: 无***********************************************************/ void wdata(uchar del){while(Busy());RS = 1;RW = 0;E = 0;delay();P1 = del;delay();E = 1;delay();E = 0;}/*********************************************************** * 名称: L1602_init()* 功能: 1602初始化,请参考1602的资料* 输入: 无* 输出: 无***********************************************************/void L1602_init(void){wcmd(0x38);Delay(5);wcmd(0x38);Delay(5);wcmd(0x38);Delay(5);wcmd(0x38);wcmd(0x08);wcmd(0x0c);wcmd(0x04);wcmd(0x01);}/************************************************************ 名称: L1602_char(uchar hang,uchar lie,char sign)* 功能: 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下L1602_char(1,5,'b')* 输入: 行,列,需要输入1602的数据* 输出: 无***********************************************************/void L1602_char(uchar hang,uchar lie,char sign){uchar a;if(hang == 1) a = 0x80;if(hang == 2) a = 0xc0;a = a + lie - 1;wcmd(a);wdata(sign);}/************************************************************ 名称: L1602_string(uchar hang,uchar lie,uchar *p)* 功能: 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下L1602_string(1,5,"ab cd ef;")* 输入: 行,列,需要输入1602的数据* 输出: 无***********************************************************/void L1602_string(uchar hang,uchar lie,uchar *p){uchar a,b=0;if(hang == 1) a = 0x80;if(hang == 2) a = 0xc0;a = a + lie - 1;while(1){wcmd(a++);if((*p == '\0')||(b==16)) break;b++;wdata(*p);p++;}}/*********************************************************** * 名称: Main()* 功能: 主函数* 输入: 无* 输出: 无***********************************************************/ void Main(){uchar i,*p;uchar table[16]={"The MCU World"};L1602_init();while(1){p = table;L1602_string(1,1," Welcome To ");for(i=0;i<13;i++){L1602_char(2,i+3,*p);p++;Delay(80);}Delay(500);wcmd(0x01);}}LCD液晶显示程序运行效果:4 查表花样闪烁灯:开始Table[]初始化Ni=0i<10P1=table[i]延时30msi++查表花样灯程序:/************************************************************ 描述 : 本实验,让8个LED不停显示依照规律轮流显示。