普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 4863|回复: 6

给大家分享我的第一个实际项目。

 关闭 [复制链接]

13

主题

152

帖子

669

积分

高级会员

Rank: 4

积分
669
发表于 2017-2-21 15:01:57 | 显示全部楼层 |阅读模式
本帖最后由 NH6496 于 2017-2-23 17:36 编辑

从年前开起学C到现在1个多月了。
给大家分享我这几天的第一个实际开发项目(一商业产品)。也为以后自己翻阅,1年后,会否莞尔如今的笨拙?
任务要求:按下起动,水泵通电一段时间;到气泵通1段时间;2段时间可预置及寄忆,下次开机按预置时间。
      选件:利用V2.0开发板(现成而已),触摸用SC12A.先开发程序。以后再选1体单片机。
      调试总结:1,EEPROM读写真慢:2,有许多意外,需灵活处理。3,到处放小灯调程序有时比用KEIL还好用。
       源文件:(红色部分调试硬加才达到目的)
                /**************************************************************************************
*                                                                                                                               *
实现现象:倒计时1不到0,P2,6亮        。 倒计时1到0,P2,6灭;
          倒计时2倒计时 ,P2,5亮。倒计时2到0 ,P2,5也 灭。                                                                                                                                                     
***************************************************************************************/

#include "reg52.h"        //此文件中定义了单片机的一些特殊功能寄存器

#include "i2c.h"
#define KEY P1
typedef unsigned int uint;          //对数据类型进行声明定义
typedef unsigned char u8;
unsigned char addr;
unsigned char dat;

int s,m=2,sa,ma=1,num;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit OUTa=P2^5;
sbit OUT=P2^6;


sbit LE=P2^7;//预留以防显示要求闪动
    uint a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0到9
    uint sg,ss,mg,ms,sga,ssa,mga,msa;
/*******************************************************************************
* 函 数 名         : delay
* 函数功能                   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(uint i)
{
        while(i--);        
}

/*******************************************************************************
* 函数名         :Keypros()
* 函数功能                 :按键处理函数
* 输入           : 无
* 输出                  : 键值
*******************************************************************************/
int Keypros()
{
        if((KEY&0x0f)==0x05)
          {
             m--;
                 delay(30000);//这个值浪费1天才找到原因并设好
                if(m<0)
                 m=0;
          }
         
        if((KEY&0x0f)==0x06)
        
         {
             m++;
                 delay(30000);
                if(m>30)
                 m=30;
         }
         

        if((KEY&0x0f)==0x08)
        {
           ma--;
         
          delay(30000);
                if(ma<0)
                 ma=0;
         }

        if((KEY&0x0f)==0x09)
        {
             ma++ ;
          delay(30000);
                 if(ma>30)
                 ma=30;
                }
                 if((KEY&0x0f)==0x0a)
          {
                delay(1000);  //消抖处理
                if((KEY&0x0f)==0x0a)
                {        
                        At24c02Write(1,m);   //在地址1内写入数据
                    delay(1000);        // 等待写完。
                        At24c02Write(2,ma);   //在地址2内写入数据
                }
        
           }
                if((KEY&0x0f)==0x0c)
           {
                 delay(1000);  //消抖处理
             if((KEY&0x0f)==0x0c)
                {
                  num=At24c02Read(1);          //读取EEPROM地址1内的数据保存在num中
                  m=num;
                   delay(1000);
                  num=At24c02Read(2);
                  ma=num;
                }
          }
         
}

/***************************************************
动态置LEDCOM口低电平
**********************/
void DigDisplay()

  {                          
                u8 i;
                    sg=s%10;
                    ss=s/10;
                    mg=m%10;
                    ms=m/10;
                           sga=sa%10;
                    ssa=sa/10;
                    mga=ma%10;
                    msa=ma/10;
                 for(i=0;i<8;i++)
                 {        
                  switch(i)         //位选,选择点亮的数码管,
                   {
                        case(0):
                                LSA=0;LSB=0;LSC=0;   P0=a[sg]; break;//显示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0;  P0=a[ss]; break;//显示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0;   P0=a[mg]; break;//显示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0;   P0=a[ms];break;//显示第3位
                        case(4):
                                LSA=0;LSB=0;LSC=1;  P0=a[sga]; break;//显示第4位
                        case(5):
                                LSA=1;LSB=0;LSC=1;  P0=a[ssa];break;//显示第5位
                        case(6):
                                LSA=0;LSB=1;LSC=1;  P0=a[mga];; break;//显示第6位
                        case(7):
                                LSA=1;LSB=1;LSC=1;   P0=a[msa]; break;//显示第7位        
                   }

                delay(101); //间隔一段时间扫描  可增减亮度。      
                P0=0x00;//消隐
           }
}

/*******************************************************************************
* 函 数 名         : Timer0Init
* 函数功能                   : 定时器0初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer0Init()
{        
        TMOD=0X11;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
        ET0=1;//打开定时器0中断允许
        EA=1;//打开总中断
        TR0=1;//打开定时器                        
}
/*******************************************************************************
* 函 数 名         : void Timer0() interrupt 1
* 函数功能                   : 定时器1中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer0() interrupt 1
{
        static uint i;
            TH0=0X3c;        //给定时器赋初值,定时50ms
            TL0=0Xb0;
            i++;
   if((s||m)!=0)
        {
           if(i==20)                  //中断次数
        {
          {
                  i=0;
          s--;
                  }
         if(s<=-1&&(m!=0))
        {
          s=59;
          m--;
                }

              }


        }
  else
        {
        if((sa||ma)!=0)
        {
          if(i==20)
        {
          {
                  i=0;
          sa--;
                  }
         if(sa<=-1&&(ma!=0))
        {
          sa=59;
          ma--;
                }
        else{ ma-=0; if(ma<=-1) { ma=0; flagb=1; }}
              }
        else{ sa-=0; if(sa<=-1) { sa=0; flaga=1; }}

                 if((sa||ma)!=0)
           {
               
                    OUTa=0;        OUT=1;
               
                   }

             if((sa||ma)==0)  
             {OUTa=1; OUT=1;TR0=0;}
          }
        }         
}


/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{            
     while(1)

      {        
           if((KEY&0x0f)!=0x01)
            {
                  delay(100);
                  if((KEY&0x0f)!=0x01)
                   Keypros();
           DigDisplay();
                 }
                    else
                  {
                          if((KEY&0x0f)==0x01)
                           delay(100);
                           if((KEY&0x0f)==0x01)
                   {
                   num=At24c02Read(1);          //读取EEPROM地址1内的数据保存在num中
                   m=num;
                   delay(1000);
                   num=At24c02Read(2);
                   ma=num;
                          OUT=0;
                        
      
                    DigDisplay();
                  
                   Timer0Init();  //定时器0初始化
                  
                   }           
                }                                            
           }      
}
"i2c.h"。i2c.c.参考例程,论坛不许发太多字。




1056128144@QQ.COM
回复

使用道具 举报

13

主题

152

帖子

669

积分

高级会员

Rank: 4

积分
669
 楼主| 发表于 2017-2-21 15:09:20 | 显示全部楼层
还有很多可优化的地方,也可以有(现在才想到的)更好的思路。但,毕竟完成了。
回复 支持 反对

使用道具 举报

42

主题

563

帖子

1907

积分

金牌会员

Rank: 6Rank: 6

积分
1907
发表于 2017-2-21 15:53:51 | 显示全部楼层
很不错,多谢楼主分享
回复 支持 反对

使用道具 举报

20

主题

1344

帖子

8379

积分

论坛元老

Rank: 8Rank: 8

积分
8379
发表于 2017-2-21 16:22:17 | 显示全部楼层
谢谢分享!实际产品哦,好高级的样子。
一时还不明白,看看有没空研究一下,有问题再找你。呵呵,这两天忙
回复 支持 反对

使用道具 举报

13

主题

152

帖子

669

积分

高级会员

Rank: 4

积分
669
 楼主| 发表于 2017-2-21 16:45:17 | 显示全部楼层
HC6800-ES-V2.0 发表于 2017-2-21 16:22
谢谢分享!实际产品哦,好高级的样子。
一时还不明白,看看有没空研究一下,有问题再找你。呵呵,这两天忙

很简单的吧,自告奋勇的。多指教。
1056128144@QQ.COM
回复 支持 反对

使用道具 举报

13

主题

152

帖子

669

积分

高级会员

Rank: 4

积分
669
 楼主| 发表于 2017-2-21 16:47:14 | 显示全部楼层
本帖最后由 NH6496 于 2017-2-21 16:49 编辑
大瓶子凌凌漆 发表于 2017-2-21 15:53
很不错,多谢楼主分享


论坛太冷清,没几条小鱼在游。活跃1下。钓点大虾出来。
1056128144@QQ.COM
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-25 11:33 , Processed in 0.122091 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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