搜索
bottom↓
回复: 47

课程设计 添加简陋的上位机 画实时温度曲线

[复制链接]

出0入0汤圆

发表于 2010-11-19 12:20:47 | 显示全部楼层 |阅读模式
最初的在

http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4375941&bbs_page_no=1&search_mode=3&search_text=QQ373466062&bbs_id=9999
  
在上面的基础上添加了几句,发送温度(收到P)   上位机比较难看, 但是功能都有了



(原文件名:VC2.jpg)


(原文件名:VC.jpg)


点击此处下载 ourdev_599032YTR11A.zip(文件大小:7.42M) (原文件名:Scomm_VC6.zip)

   没有整理   可以看看IDC的对应关系 和 源码里面的注释      
    用的是MSCOMM 和 NTGraph

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-11-19 12:54:46 | 显示全部楼层
不错啊,就是界面太粗燥了,好歹你也对齐下,哈哈

出0入134汤圆

发表于 2010-11-19 13:56:55 | 显示全部楼层
没我的漂亮  o(∩_∩)o  
哪位知道如何使X轴显示为时间?

出0入0汤圆

 楼主| 发表于 2010-11-19 17:08:14 | 显示全部楼层
在选项里面有   你也可以用MFC中的Timer来作为时间轴

出0入0汤圆

发表于 2010-11-19 17:54:14 | 显示全部楼层
学习下,不错

出0入0汤圆

发表于 2010-11-19 18:48:19 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-11-19 19:04:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-19 19:22:24 | 显示全部楼层
路过,

出0入0汤圆

 楼主| 发表于 2010-11-20 13:01:19 | 显示全部楼层
添加了些东西:


(原文件名:Version2-1.jpg)

出0入198汤圆

发表于 2010-11-20 13:09:40 | 显示全部楼层
回复【8楼】QQ373466062 萤火虫
-----------------------------------------------------------------------

楼主,挺你~~能不能把新版的也发布下~~

出0入0汤圆

 楼主| 发表于 2010-11-20 20:30:42 | 显示全部楼层
继续:

(原文件名:Version Modify.jpg)

出0入0汤圆

 楼主| 发表于 2010-11-20 20:31:53 | 显示全部楼层
程序还需要继续改进   过段时间发布

出0入0汤圆

发表于 2010-11-20 21:11:39 | 显示全部楼层
唉,不知如何说,我当年刚懂些时,也做了一个,也是串口的,现在想做一个usb,现在usb学会了,就,是工作太忙,没时间做了.看我的图,我当时是做成多种加热方式,直接控制负载的,还有控温的过程,用VB/vb.net够了,无必需用VC,只要关注业务逻辑,实现所需要的功能。不要少看这东西,先用此模拟,然后知道规律,改写入单片机,就是这种控温效果!不多说,上图!

tu (原文件名:hot.JPG)

最主要的是,我用此软件实现了pid的算法,在运行时,很容易修改p,i,d的参数,就能看到出来的效果,由于用的是可控硅,产生的效果,就是一条直线!

出0入0汤圆

 楼主| 发表于 2010-11-20 21:40:24 | 显示全部楼层
To LS:

   用VC的原因是这个学期课程安排了 C++ 虽然我们的大牛老师什么也没有教
   还有就是自己大二的时候买了一本 C++ Primer (英文版),更为关键一点,自己以前用的是 C, VB下个学期学,也玩过一点.
   
   正如你而言,关注核心内容,逐渐学习.



   做这个东西其实是想,以后调试智能车的时候用无线模块加上位机,监测智能车在运行中的参数,并能够改变车的控制中的PID.
  一步步的这样做着.....

 如果安装了 Visual Studio 2008 或者 以上版本的 VS ,那么可以安装软件测试,了:



(原文件名:Icon.jpg)


(原文件名:setup1.jpg)

安装包,在安装有 Visual Studio 2008 及 2010 没有问题,其他的不行ourdev_599352TODKD0.zip(文件大小:754K) (原文件名:setup.zip)

出0入0汤圆

 楼主| 发表于 2010-11-20 21:45:23 | 显示全部楼层
许多时候,想玩(或者说不专心学某一个东西)是因为想实现小时候的某些想法,还有就是现在还有兴趣和热情玩
   
  例如 接触 Linux ...

出0入0汤圆

 楼主| 发表于 2010-11-20 22:33:30 | 显示全部楼层
安装包弄好了 :



点击此处下载 ourdev_599378B93QAL.zip(文件大小:5.46M) (原文件名:SComm_VC6.zip)

出0入0汤圆

发表于 2010-11-20 23:05:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-21 01:22:40 | 显示全部楼层
mark

出0入198汤圆

发表于 2010-11-22 20:57:38 | 显示全部楼层
回复【15楼】QQ373466062  萤火虫
-----------------------------------------------------------------------
哥们~~给个说明书什么的吧??下位机该给上位机软件发什么格式的数据呢??

出0入0汤圆

 楼主| 发表于 2010-11-23 12:59:50 | 显示全部楼层
TO  楼上:
   
     可以看我的单片机程序

       
                        if( 'P' == RecieveBuff )
                {
                           get_temperature();
                        if( f == 0 )
                          TemF = '+';
                        else
                          TemF = '-';

                    Uart_Printf("%c%c%c.%c",TemF,tempint/10+'0',tempint%10+'0',tempdf * 5 / 8 + '0');
            }
               
全部源程序在
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4375941&bbs_page_no=1&search_mode=3&search_text=QQ373466062&bbs_id=9999
只需要在上面添加上面的那段代码就可以了

单片机发送的是+21.5 这样的数,  你也可以改上位机和下位机的程序,符合自己的要求.下面将程序的main文件贴在下面
(程序有太多的地方需要提高,望理解与提出建议)

















#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include "MacroAndConst.h"
#include "DS1302DY.h"
#include "LCD1602YT.h"
#include "18B20.h"
#include "key44y.h"
#include "UartPrintf.h"

sbit LED = P3^3;
sbit BELL = P3^7;

static char i=0; //全局按键SubSw标志  子菜单按键9
static uint8 j = 0;//用于在RecieveComm数组中的空格

bit StoreFlag = 0;   // 是否储存标志
uint8 RCC = 0;        // 收到的是命令则用此变量计数
uint8 RecieveComm[21];  // 储存命令
uint8 TempChar = 0;


char TemF;        // 温度的标志位
//char TimeString[21],TempString[9]; // 分别是时间和温度储存字符串   是字符串  从它们的数值转换过来  在ChangAllValueToString()函数中进行
//char KeyValMain = 0;  //main函数中4*4键盘扫描值

//uint8 DS1302[7] ; //将DS1302中的年月日时分秒放入数组中  方便与DS1302Ch数组的交流
unsigned char DS1302Ch[7] = {0};
unsigned char DS1302Limit[7] = {99,12,31,23,59,59,7};

uint8 volatile PageF = 0;
uint8 volatile SubSw = 0;

int8 TiAH = 8;        //闹钟小时
int8 TiAM = 1;        //闹钟分钟
bit  volatile TAOC = 1; //闹钟开关标志位


uint8 volatile TeAH = 30; //DS18B20报警上限温度的整数部分
//uint8 TeAHFloat = 5;   // DS18B20报警上限温度的小数部分
bit TeAHF        = 1;   // 符号位

uint8 volatile TeAL = 20;  //DS18B20报警下限温度的整数部分
//uint8 TeALFloat = 4;
bit TeALF        = 0;

uint8 YearCh = 10;                                                          
uint8 MontCh = 9 ;

void LCD1602_Display_1302();
void LCD1602_Display_18B20();
void SystemIni( );
void DisplayTempTime( );
void KeyEqu2( ); // 判断按键是否为2
void KeyEqu9( ); // 按键9 为子选项按键 对应SubSW变量
void DisplayTimeAlarm();
void DisplayTempAlarm();
void KeyEqu1_Plus( uint8 i);
void KeyEqu5_Sub(uint8 i);
void SetDs1302Display(uint8 i);
//void Bell(void);
void delay1ms();   // 这个延时函数并不知道大约多久,只是用于在光标和Bell中稍微延时一下罢了
uint8 KeyData_Plus( uint8 Data );   //对应的变量加
uint8 KeyData_Sub ( uint8 Data ); //对应的变量减
void TimeAlarmBell(); //闹钟蜂鸣器报警
void TempAlarmBellLed(); // 温度报警函数
void JudgeMonthDays(void);          // 设置月份的最多天数
uint8 GetWeekFromDay(unsigned char year,unsigned char month,unsigned char day);//计算任一天是星期几

/***************************************************************************************************/



void UartService(void)  interrupt 4
{
         char RecieveBuff = 0;
        EA = 0;
        ES = 0;
   //************************用上位机发送数据时要用16进制发送,否则不准确***************************//
                if(1 == RI)
                {
                        RecieveBuff = SBUF;                                // 缓存接收到的数据
                        RI = 0;                                                // 接收标志清零
                }
       
//=======================================Command Format=====================================================================//
//要修改时间那么输入D-99-12-31-23-59-59#=========区分大小写并且每一个数据必须是2位,如果是一位数,请加零(如D-02-......)=======//
//要修改上下限报警温度:  A-±22-+±33E#   (±为+- 是温度的±值)=================================================================//
//用软件(字符形式)发送的时候不能够一串发完,必须1位1位的发,如================================================================//
//         D 发送  - 发送  1 发送 2发送.......     12不能够就发送12  因为是以字符形式发送的    =============================//   
//==========================================================================================================================//
                if(0 == StoreFlag)
                {
                        LED = 1;  
                        BELL = 1;
                        RCC = 0;
                       
       
                        if(('A' == RecieveBuff)||('D' == RecieveBuff))
                        {
                                BELL = 0;
                                RecieveComm[0] = RecieveBuff;
                                StoreFlag = 1;       
                           //        ++RCC;
                        }
                /****************************
                        else
                        {
                           Uart_Printf("Start by A or D%n");
                           StoreFlag = 0;
                        }
        *****************************************/
                }
       

                if(1 == StoreFlag)
                {
                        LED = 1;
                        BELL = 1;
                        RecieveComm[RCC] = RecieveBuff;          
                        RCC++;       
                               
                        if(RecieveComm[RCC-1] == '#')
                        {                         
                                RCC = RCC-2;        //退到#的前一位

                                if('D' == RecieveComm[0])
                                {
                               
                                        for(j=0; j<6; j++)       
                                        {
                                          RecieveComm[j] = (RecieveComm[j+j+j+2]-48)*10 + (RecieveComm[j+j+j+3] - 48);
                                     
                                        }
                                        WriteYs (RecieveComm[0]);
                                        WriteMn (RecieveComm[1]);
                                        WriteDay(RecieveComm[2]);
                                        WriteHr (RecieveComm[3]);
                                        WriteMin(RecieveComm[4]);
                                        WriteSec(RecieveComm[5]);
                                        WriteWe( GetWeekFromDay(ReadYs(), ReadMn(), ReadDay()) );   //自动设置勤
                                         StoreFlag = 0;
                                }

                                if('A' == RecieveComm[0])
                                {
                                        if('I' == RecieveComm[RCC]) //time Alarm set
                                        {
                                                TAOC = (bit)(RecieveComm[2]==1 ? 1:0);  //必须强制转换 否则TAOC永远为1                
                                                TiAH = (RecieveComm[4]-48)*10 + (RecieveComm[5] - 48);
                                                TiAM = (RecieveComm[7]-48)*10 + (RecieveComm[8] - 48);
                                                Uart_Printf("----TAOC==%d",TAOC);
                                          
                                        }
                                        if('E' == RecieveComm[RCC]) //time Alarm set
                                        {
                                                TeALF = (RecieveComm[2]=='+' ? 1:0);               
                                                TeAL  = (RecieveComm[3]-48)*10 + (RecieveComm[4] - 48);
                                               
                                                TeAHF = (RecieveComm[6]=='+' ? 1:0);               
                                                TeAH  = (RecieveComm[7]-48)*10 + (RecieveComm[8] - 48);
                                          
                                        }

出0入0汤圆

 楼主| 发表于 2010-11-23 13:01:06 | 显示全部楼层
StoreFlag = 0;
                                }
                       
                        }
               
                }
                //        Uart_Printf("Get=%c=%n",RecieveBuff);
                //        Uart_Printf("Get=%d=%n",RecieveBuff);

               
                        if( 'P' == RecieveBuff )
                {
                           get_temperature();
                        if( f == 0 )
                          TemF = '+';
                        else
                          TemF = '-';

                    Uart_Printf("%c%c%c.%c",TemF,tempint/10+'0',tempint%10+'0',tempdf * 5 / 8 + '0');
            }
               

                if(RecieveBuff == 'T')
                {                                                 
                        LED = 0;
                        BELL = 0;
                        Uart_Printf("%nIf you Reciece this, the uart is OK!%n");
                        BELL = 1;
                }

       
        EA = 1;
        ES = 1;

}


void main()
{
   SystemIni( );

  while(1)
  {
  

         Uart_Printf("Hello%n");
//        UART_TXDSTRING("Test the Uart is OK !! From Func", 1);
//            printf("From Printf");


           TempAlarmBellLed(); // 温度报警函数
//=============================---1---Time Temperature Display==========================================//       
              SubSw = 0;
          while(PageF == 2)
          {
                 TimeAlarmBell();//Time Alarm 闹钟
                 TempAlarmBellLed();

                for( i = 0 ; i<8; i++ )        // i为SubSw9按键值
                {
                        //Clear1602          // 清屏  用于消去闹钟标志在没有指定的位置多显示

                        TimeAlarmBell();
                        TempAlarmBellLed(); // 温度报警函数
               
                        if(1 == SubSw)                DS1302Ch[0] = ReadYs();
                        if(2 == SubSw)                DS1302Ch[1] = ReadMn();
                        if(3 == SubSw)                DS1302Ch[2] = ReadDay();
                        if(4 == SubSw)                DS1302Ch[3] = ReadHr();
                        if(5 == SubSw)                DS1302Ch[4] = ReadMin();
                        if(6 == SubSw)                DS1302Ch[5] = ReadSec();
                        if(7 == SubSw)                DS1302Ch[6] = ReadWe();
                 
                        if(2 != PageF)        break;

                        while(i == SubSw)
                    {

                                if(SubSw == 0)        break;

                                SetDs1302Display(SubSw);

                                if(0 == DS1302Ch[6])  //防止星期出现0  星期为unsigned char 型  在SetDs1302Display()函数中加减时能出现0
                                        DS1302Ch[6] = 1;
                               
                                if(0 == DS1302Ch[1])  //防止月份出现0  月份为unsigned char 型  在SetDs1302Display()函数中加减时能出现0
                                        DS1302Ch[1] = 1;


//******************在下面这段边界判断中 用到了DS1302Ch[]数组 因此在这之前需要先刷新一遍这个数组****************************//
//*****************具体函数在SystemIni()系统初始化函数中(        DS1302Ch[0] = ReadYs();...语句)*********************************//
                                JudgeMonthDays();
                                if(DS1302Ch[i-1] > DS1302Limit[i-1])        // 防止调节时间时过界  如调小时时 大于24
                                {
                                        DS1302Ch[i-1] = DS1302Limit[i-1];
                                }
                       
                                if(0 == DS1302Ch[i-1] && KeyScanValue()==5)         //
                                {
                                        DS1302Ch[i-1] = DS1302Limit[i-1];
                                }
                                if(1 == DS1302Ch[1]&& KeyScanValue()==5)
                                        DS1302Ch[1] = 12;
                                               
                                if(DS1302Limit[i-1] == DS1302Ch[i-1] && KeyScanValue()==1)
                                {
                                        if( 1 != i) DS1302Ch[i-1] = 0;  // 星期从1开始 而非0
                                        else
                                                DS1302Ch[i-1] = 1;
                                }

                                if(1 == i)       
                                {
                                        WriteYs (DS1302Ch[0]);  WriteWe( GetWeekFromDay(ReadYs(), ReadMn(), ReadDay()) );   //自动设置星期
                                }
                                if(2 == i)
                                {
                                        WriteMn (DS1302Ch[1]); WriteWe( GetWeekFromDay(ReadYs(), ReadMn(), ReadDay()) );   //自动设置星期
                                }
                                if(3 == i)
                                {
                                        WriteDay(DS1302Ch[2]);        WriteWe( GetWeekFromDay(ReadYs(), ReadMn(), ReadDay()) );   //自动设置星期
                                }
                                if(4 == i)
                                {
                                        WriteHr (DS1302Ch[3]);WriteWe( GetWeekFromDay(ReadYs(), ReadMn(), ReadDay()) );   //自动设置星期
                                }
                                if(5 == i)
                                {
                                        WriteMin(DS1302Ch[4]);WriteWe( GetWeekFromDay(ReadYs(), ReadMn(), ReadDay()) );   //自动设置星期
                                }

                                if(6 == i)
                                {
                                        WriteSec(DS1302Ch[5]);WriteWe( GetWeekFromDay(ReadYs(), ReadMn(), ReadDay()) );   //自动设置星期
                                }
                                if(7 == i)
                                {
                                 WriteWe( GetWeekFromDay(ReadYs(), ReadMn(), ReadDay()) );   //自动设置星期  注意这条语句是在 7==i 的条件下才运行
                                                                                                                                                          //所有只有按9键(使SubSw==7)使i==7,才满足while(i==SubSw)才运行
                                                                                                                                                         //因此需要按9键 让光标跳到星期位置 才会自动设置
                                //        WriteWe (DS1302Ch[6]);
                                }
               
                                if(0 == SubSw)                        
                                {
                                  TimeAlarmBell();
                                  TempAlarmBellLed(); // 温度报警函数
                                  WriteC( NOFlashCur1602 , 1 );
                          
                                  DisplayTempTime( );
                                  KeyEqu9( );
                                }

                /**************这两句仅仅是用于让光标显示清晰***下面的也一样****************/                  
                                  delay1ms();
                                  WriteC( NOFlashCur1602 , 1 );
                /***************************************************************************/
                            DisplayTempTime( );
                            KeyEqu9( );       
                            KeyEqu2( );
                                if(2 != PageF)        break;       
                        }

                        while(0 == SubSw)
                        {
                                TimeAlarmBell();
       
                                DisplayTempTime( );
                            KeyEqu9( );       
                            KeyEqu2( );
                                 if(2 != PageF)        break;
                        }

                 }

                        KeyEqu9( );
                        if(PageF != 2)        break;
                }
//===============================---2--Time Alarm Set============================================//
          //LCDRst();
                Clear1602          // 清屏  用于消去闹钟标志在没有指定的位置多显示
          SubSw = 0;
           while(PageF == 1)
          {
                  TempAlarmBellLed(); // 温度报警函数
                  while(0 == SubSw)
                {
                        KeyEqu9( );
                        KeyEqu2( );
                          DisplayTimeAlarm();
                        if(PageF != 1)        break;               
                }
        /************************************************************/
                while(1 == SubSw)
                {
                       
                        LcdSetXY(0,1);
                        WriteC( FlashCur1602 , 1 );

                    if( KeyScanValue()==5||KeyScanValue()==1)
                                TAOC = ~TAOC;
                                /***********************************/
                                delay1ms();
                                WriteC( NOFlashCur1602 , 1 );
                               
                         DisplayTimeAlarm();

                        KeyEqu9( );
                        KeyEqu2( );
                        if(PageF != 1)        break;       
                }
                WriteC( NOFlashCur1602 , 1 );

                while(2 == SubSw)
                {
                        LcdSetXY(4,1);
                        WriteC( FlashCur1602 , 1 );
                       
                        TiAH = KeyData_Plus( TiAH );
                        TiAH = KeyData_Sub

出0入0汤圆

 楼主| 发表于 2010-11-23 13:03:34 | 显示全部楼层
TiAH = KeyData_Sub ( TiAH );
                        if(TiAH > 23)
                                TiAH = 0;
                        if(TiAH < 0)
                                TiAH = 23;
               
                        delay1ms();
                        WriteC( NOFlashCur1602 , 1 );

                    DisplayTimeAlarm();

                        KeyEqu9( );
                        KeyEqu2( );
                        if(PageF != 1)
                        break;       
                }
                while(3 == SubSw)
                {
                        LcdSetXY(7,1);
                        WriteC( FlashCur1602 , 1 );
                       
                        TiAM = KeyData_Plus( TiAM );
                        TiAM = KeyData_Sub ( TiAM );
                           
                         if(TiAM > 59)
                                TiAM = 0;
                         if(TiAM < 0)
                            TiAM = 59;
                    delay1ms();
                                WriteC( NOFlashCur1602 , 1 );

                        DisplayTimeAlarm();

                        KeyEqu9( );
                        KeyEqu2( );
                        if(PageF != 1)
                        break;       
                }

                if(4 == SubSw)//这两条语句的作用是解决在这里按换屏键(2键,对应变量为PageF)无效
                        break;       
        //上面的两行与下面的KeyEqu2()函数是一样的         
                //KeyEqu2( );
                KeyEqu9( );
       
                if(PageF != 1)
                        break;
          }

//===============================---3--Temperature Alarm Set============================================//
            LCDRst();
            SubSw = 0;
                //TempAlarmBellLed(); // 温度报警函数
          while(PageF == 0)
          {
                TempAlarmBellLed(); // 温度报警函数
                while(0 == SubSw)
                {
                         TempAlarmBellLed(); // 温度报警函数
                        KeyEqu9( );               
                          DisplayTempAlarm();       
                        KeyEqu2( );
                        if(PageF != 0)
                                break;
                        break;               
                }

          while(1 == SubSw)
                {       
                        TempAlarmBellLed(); // 温度报警函数               
                        LcdSetXY(3,1);
                        WriteC( FlashCur1602 , 1 );
                       
                    if( KeyScanValue()==5||KeyScanValue()==1)
                                TeALF = ~TeALF;
                  
                    delay1ms();
                        WriteC( NOFlashCur1602 , 1 );
               
                          DisplayTempAlarm();       

                        KeyEqu9( );       
                       
                        KeyEqu2( );
                        if(PageF != 0)
                                break;
                       
                }

                        while(2 == SubSw)
                {       
                        TempAlarmBellLed(); // 温度报警函数                       
                        LcdSetXY(5,1);
                        WriteC( FlashCur1602 , 1 );
                       
                    TeAL = KeyData_Plus( TeAL );
                        TeAL = KeyData_Sub ( TeAL );
                  
                    delay1ms();
                        WriteC( NOFlashCur1602 , 1 );
               
                          DisplayTempAlarm();       

                        KeyEqu9( );       
                       
                        KeyEqu2( );
                        if(PageF != 0)
                                break;
                       
                }
                 
                        while(3 == SubSw)
                {
                        TempAlarmBellLed(); // 温度报警函数
                        LcdSetXY(11,1);
                        WriteC( FlashCur1602 , 1 );
                       
                    if( KeyScanValue()==5||KeyScanValue()==1)
                                TeAHF = ~TeAHF;
                  
                    delay1ms();
                        WriteC( NOFlashCur1602 , 1 );
               
                          DisplayTempAlarm();       

                        KeyEqu9( );       
                        KeyEqu2( );
                        if(PageF != 0)
                                break;
                       
                }

                        while(4 == SubSw)
                {       
                        TempAlarmBellLed(); // 温度报警函数                       
                        LcdSetXY(13,1);
                        WriteC( FlashCur1602 , 1 );
                       
                    TeAH = KeyData_Plus( TeAH );
                        TeAH = KeyData_Sub ( TeAH );
                  
                    delay1ms();
                        WriteC( NOFlashCur1602 , 1 );
               
                          DisplayTempAlarm();       

                        KeyEqu9( );       
                       
                        KeyEqu2( );
                        if(PageF != 0)
                                break;
                       
                }
                if(SubSw == 5)
                        break;       
        //        KeyEqu2( );               
                if(PageF != 0)
                        break;
          }
         
       
  }
}




void SystemIni(void)
{
        LCDRst();
        DS1308_init();   // 硬件设计上存在失误:  没有加上拉电阻  所以如果不给写入那么会出现85这个值
        DS1302Ch[0] = ReadYs ();
        DS1302Ch[1] = ReadMn ();
        DS1302Ch[2] = ReadDay();
        DS1302Ch[3] = ReadHr ();
        DS1302Ch[4] = ReadMin();
        DS1302Ch[5] = ReadSec();
        DS1302Ch[6] = ReadWe ();

        LCDRst();

//        DS1302_Write_Ini_Data(10,12,31,23,59,55,2); //因为已经将写入和读出的值均转换成BCD码  所以直接给10进制的数就可以了

        // 下面让18B20转换2次 第一个get_temperature是读出默认的+85
        // 第二个是DS18B20完成第一次转换,更新温度值,
        // 避免温度报警的第一次判断错误(即TempAlarmBellLed函数第一次判断)
        get_temperature();
        get_temperature();
       
        Uart_Init(9600);
        TR1 = 1;
}

void LCD1602_Display_1302()
{

        DisC(0,0,ys/10+'0');
        DisC(1,0,ys%10+'0');
       
        DisC(3,0,mn/10+'0');
        DisC(4,0,mn%10+'0');
       
        DisC(6,0,day/10+'0');  
        DisC(7,0,day%10+'0');
       
        DisC(0,1,hr/10+'0');
        DisC(1,1,hr%10+'0');

                   DisC(2,1,':');

        DisC(3,1,min/10+'0');
        DisC(4,1,min%10+'0');
               
                DisC(5,1,':');
       
       
        DisC(6,1,sec/10+'0');
        DisC(7,1,sec%10+'0');

        DisS(10,1,"Week:");               
        DisC(15,1,we+'0');
       
}



void LCD1602_Display_18B20()
{
        if(1 == f)  TemF = '-';
        if(0 == f)  TemF = '+';       

        DisC(10,0,TemF);
        DisC(11,0,tempint/10+'0');
        DisC(12,0,tempint%10+'0');
        DisC(13,0,'.');

        tempdf = (tempdf * 5 / 8); // 将温度的小数部分的0.00~0.15转换到0.0~0.9  
        DisC(14,0,tempdf+'0');
}

void DisplayTempTime(void)        // PageF == 0  时显示时间和温度
{

//        Clear1602
//        delay1ms();
  /************************下面是自定义字符 存在问题**************************************/
    v_LcdWriteSelfFont_f( );

                LcdSetXY( 2,0 );  // 自定义字符要在1602显示其他东西的最前面
        v_LcdDisplaySelfFont_f( 0 );             //年
                LcdSetXY( 5,0 );
        v_LcdDisplaySelfFont_f( 1 );          // 月
                LcdSetXY( 8,0 );
        v_LcdDisplaySelfFont_f( 2 );          // 日
       
        if(TAOC)
                LcdSetXY( 8,1 );
        v_LcdDisplaySelfFont_f( 3 );          //
                LcdSetXY( 15,0 );
        v_LcdDisplaySelfFont_f( 4 );          //温度标志℃       

                 read_DS1308();
        LCD1602_Display_1302();

        get_temperature();
        LCD1602_Display_18B20();

}


void KeyEqu2( void )
{
         if( KeyScanValue()==2)
  {
          PageF++;          
  }
           if(PageF == 3)
         {
                 PageF = 0;
         }
}


void KeyEqu9( void )
{
         if( KeyScanValue()==9)
  {
           SubSw++;
  }
  if(SubSw == 8)
         {
                 SubSw = 0;
         }
       
}

void KeyEqu1_Plus( uint8 SubSw )   //对应的时间加
{
         if( KeyScanValue()==1)
  {
           (DS1302Ch[SubSw-1])++;
  }
//  if( DS1302Ch == DS1302Limit)
//         {
//                 DS1302Ch = 0;
//         }
       
}


void KeyEqu5_Sub( uint8 SubSw )         //对应的时间减
{
         if( KeyScanValue()==5)
  {
           (DS1302Ch[SubSw-1])--;
  }

出0入0汤圆

 楼主| 发表于 2010-11-23 13:05:30 | 显示全部楼层
}

uint8 KeyData_Plus( uint8 Data )   //对应的变量加
{
         if( KeyScanValue()==1)
  {
           ++Data;
  }

         return Data;
}


uint8 KeyData_Sub( uint8 Data )         //对应的变量减
{
         if( KeyScanValue()==5)
  {
           --Data;
  }
         return Data;
}

void DisplayTimeAlarm()
{
       
          DisS(0,0,"1--TimeAlarm:");

//          DisC(0,1,(char)(TAOC) +'0');
          
          if(TAOC)
          {
                  LcdSetXY(0,1);
                  v_LcdDisplaySelfFont_f( 3 );
          }
          else
          {
                   //LcdSetXY(0,1);
                DisC(0,1,'C');
          }

          DisC(3,1,TiAH/10+'0');
          DisC(4,1,TiAH%10+'0');

          DisC(5,1,':');

          DisC(6,1,TiAM/10+'0');
          DisC(7,1,TiAM%10+'0');

}


void DisplayTempAlarm()
{
       
          DisS(0,0,"2--TempLimit:");

          DisC(0,1,'L');
          DisC(1,1,':');
          DisC(3,1, ((char)(TeALF)==0)?'-':'+');

          DisC(4,1,TeAL/10+'0');
          DisC(5,1,TeAL%10+'0');
//          DisC(4,1,'.');
//          DisC(5,1,TeALFloat);
//          DisC(6,1,'C');
                  LcdSetXY( 6,1 );
        v_LcdDisplaySelfFont_f( 4 );          //温度标志℃

          

          DisC(8,1,'H');
          DisC(9,1,':');
          DisC(11,1, ((char)(TeAHF)==0)?'-':'+');

          DisC(12,1,TeAH/10+'0');
          DisC(13,1,TeAH%10+'0');
//          DisC(12,1,'.');
//          DisC(13,1,TeAHFloat);
//          DisC(14,1,'C');
                  LcdSetXY( 14,1 );
        v_LcdDisplaySelfFont_f( 4 );          //温度标志℃

}


void SetDs1302Display(uint8 i)
{


        KeyEqu1_Plus( i );
        KeyEqu5_Sub(  i );
       

        if(1 == SubSw)
                LcdSetXY(1, 0);
        if( SubSw==3 || SubSw==2 )
        {
                LcdSetXY(SubSw+SubSw+SubSw-2,0);  // 3*i-2
        }

        if(4 == SubSw)
                LcdSetXY(1, 1);
        if( SubSw==5 || SubSw==6 )
        {
                LcdSetXY( SubSw+SubSw+SubSw-11,1);  // 3*i-2
        }
        if(7==SubSw)
        {
                LcdSetXY(15,1);
        }
         WriteC( FlashCur1602 , 1 );
}

void delay1ms()
{
        unsigned char i,j;
        for(i=0; i<100; i++)
                for(j=0; j<100; j++);
}

/*
void Bell(void)         
{
        BELL = 0;
        delay1ms();
        BELL = 1;
}
*/


void TimeAlarmBell()
{
        while( TAOC )
         {
                 if(min == TiAM &&  hr== TiAH)         // min,hr
                {
//                        BELL = 0;
                        break;
                }
                else
                {
                        BELL  = 1;
                        break;
                }
         }
}



void TempAlarmBellLed() // 温度报警函数
{

          //下面的四个判断 为上下对称两组 第一行是正的温度判断(标志位==1)  第二行是负温度的判断(标志位==0)//  
                 if(      (( (~f == TeAHF) && (TeAHF == 1) ) && (tempint >= TeAH) )
                    || (( ( ~f == TeALF) && (TeALF == 1) ) && (tempint <= TeAL) )
                    ||        (( ( ~f ==TeAHF ) && (TeAHF == 0) ) && (tempint <= TeAH) )  
                    || (  ( ~f == TeALF && ( TeALF == 0) ) && (tempint >= TeAL) ) )
                {
                //        BELL = 0;
                        LED  = 0;
       
                }
                else
                {
                //        BELL  = 1;
                        LED   = 1;
                }
         
}

void JudgeMonthDays()  // 设置月份的最多天数
{
        if(3 == i)   //如果是Day  那么得区分是30 还是31 如果是二月那么还应该判断是平年(28 days)还是闰年(29 days)
                                                             //if((year%4==0&&year%100!=0)||(year%400==0)) {那么是闰年}          
                                        {
                                                if(2 == ReadMn()) // 如果是二月
                                                 {
                                                        if( !(ReadYs()%4) )          //读取年份 如果是闰年  这里没判断%100!=0 但是在20XX年这个条件就够了
                                                                DS1302Limit[2] = 29;  
                                                        else
                                                                   DS1302Limit[2] = 28;  
                                                }
                                                else // 如果不是二月
                                                        {
                                                                if(4 == ReadMn() || 6 == ReadMn() || 9 == ReadMn() || 11 == ReadMn())  // 如果月份是 4 6 9 11 那么是30days
                                                                        DS1302Limit[2] = 30;
                                                                else
                                                                        DS1302Limit[2] = 31;        //剩下的月份是31days
                                                        }
                                         }
}

// 计算2000~2099年任一天星期几
// year    : 00-99
// month: 01-12
// day     : 01-31
uint8 GetWeekFromDay(unsigned char year,unsigned char month,unsigned char day)
{
    if( month == 1 || month == 2 )  
    {
        month += 12;
        if( year> 0 )
            year--;
        else
            year = 4;
    }

    // 返回星期几(星期一用1表示,而星期天用7表示)
    return 1+(( day + 2*month + 3*(month+1)/5 + year + year/4 ) %7);
}

出0入0汤圆

 楼主| 发表于 2010-11-23 13:10:09 | 显示全部楼层
程序在串口接收部分用的是很愚蠢的队列,速度慢,效率低
   而且串口中断部分太长

出0入198汤圆

发表于 2010-11-23 17:08:45 | 显示全部楼层
回复【23楼】QQ373466062  萤火虫
-----------------------------------------------------------------------

OK了已经能显示温度曲线了。给你的上位机软件提个建议:能不能在每次打开的时候自动给“串口设置”和“连续发送设置”中的选项都初始化数值,最好能保存上次使用的参数。

出0入0汤圆

发表于 2010-11-23 19:01:16 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2010-11-24 12:28:09 | 显示全部楼层
To LS的LS:

    直接在 IniDlg里面添加两句就行了;
   
       用 SetDlgItem 就行

出0入198汤圆

发表于 2010-11-24 13:20:48 | 显示全部楼层
回复【26楼】QQ373466062  萤火虫
-----------------------------------------------------------------------

哥们儿,我没有做过上位机软件,你说的那些我一点也看不懂啊。

出0入0汤圆

发表于 2010-11-24 14:12:53 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-12-4 15:38:50 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-12-7 20:39:17 | 显示全部楼层
太好了,真是非常感谢楼主!!!

出0入0汤圆

发表于 2010-12-8 22:45:22 | 显示全部楼层
回复【26楼】QQ373466062  萤火虫
-----------------------------------------------------------------------

我是老想学习上位机编软件了。楼主给你明示啊,怎么学这个VC控制单片机。从哪里入手,谢谢

出0入0汤圆

 楼主| 发表于 2010-12-9 13:29:51 | 显示全部楼层
To 楼上:

     如果你不知道C++ 的基本语法的话, 可以直接用 C 写, 直接写API就可以了,  如果你想用 C++来写的话, 先看看C++ 的语法然后用MFC也可以.  当然也可以选择其他的工具.   

      用LabvIEW应该是最简单的了  可以考虑一下.

出0入0汤圆

发表于 2011-4-4 10:16:19 | 显示全部楼层
回复【楼主位】QQ373466062 萤火虫
-----------------------------------------------------------------------

楼主,为什么我用VC6.0打开来运行不了呢?直接运行可执行文件也不行啊!

出0入0汤圆

发表于 2011-4-4 10:23:57 | 显示全部楼层
回复【楼主位】QQ373466062 萤火虫
-----------------------------------------------------------------------

哦行了,不好意思!有问题再请教你!

出0入0汤圆

发表于 2011-4-22 20:07:58 | 显示全部楼层
我用串口调试工具进行调试时  发送+12.3 20.0 30.0 40.0 50.0 60.0 70.0 80.0  总是跳过一个数的显示比如从20.0 到 40.0 跳过30.0
还有就是 那个NTGRAPH 方面的资料有介绍的吗  采样从左面到右面 再返回 从右面到左面 Y的坐标值 发生改变  ??????

出0入0汤圆

发表于 2011-4-24 23:26:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-25 12:25:19 | 显示全部楼层
学习中!谢谢分享

出0入0汤圆

发表于 2011-5-3 23:24:36 | 显示全部楼层
要怎么操作,才能显示温度曲线,看不懂楼主的MFC编程啊,

出0入0汤圆

发表于 2011-8-5 21:19:37 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-8-25 07:52:38 | 显示全部楼层
源码包在下面:


http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4980028&bbs_page_no=1&search_mode=3&search_text=QQ373466062&bbs_id=9999

出0入0汤圆

发表于 2011-8-28 16:57:34 | 显示全部楼层
恩,赞一个。

出0入0汤圆

发表于 2011-9-19 08:19:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-1 11:20:58 | 显示全部楼层
学习

出0入0汤圆

发表于 2012-4-17 13:50:39 | 显示全部楼层
“单片机发送的是+21.5 这样的数”,什么是+21.5 格式呀?

出0入0汤圆

发表于 2012-11-25 13:35:42 | 显示全部楼层

x

出0入0汤圆

发表于 2014-7-1 14:24:44 | 显示全部楼层
好 学习学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 16:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表