电动车棚投币式充电控制器------求转正
znnwe12013/01/27软件综合 IP:湖北
公司电动车棚要进行改造于是就有了这货,只是个初级品,大神们别踩
QQ截图未命名.jpg
51c代码:
#include<reg51.h>   //包含头文件
#include<intrins.h>//包函_nop_延时函数的头文件
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义
//595芯片控制脚定义
sbit SH=P1^7;//HC595移位控制
sbit ST=P1^6;//HC595锁存更新显示
sbit DS=P1^5;//HC595串行数据输入
//输入引脚定义
sbit  TB=P1^4;  //投币键
sbit  shu1=P1^3;  //第一组输入选择
sbit  shu2=P1^2;  //第二组输入选择
sbit  shu3=P1^1;  //第三组输入选择
sbit  shu4=P1^0;  //第四组输入选择
//输出引脚定义
sbit  out1=P3^0;  //第一组输出
sbit  out2=P3^1;  //第二组输出
sbit  out3=P3^2;  //第三组输出
sbit  out4=P3^3;  //第四组输出
//计时用变量
int cou=0;      //计数器
int TIME_SS=0;    //秒
int TIME_MM=0;    //分
int TIME_HH=0;    //时
//显示缓存数组,第一个元素为显示数据,后面两个为显示八段码的地址已经初始赋值后面的程序只要维护显示数据元素
char P_HC[4][4][3]={{{0x00,0x00,0x01},{0x00,0x00,0x02},{0x00,0x00,0x04},{0x00,0x00,0x08}},{{0x00,0x00,0x10},{0x00,0x00,0x20},{0x00,0x00,0x40},{0x00,0x00,0x80}},{{0x00,0x01,0x00},{0x00,0x02,0x00},{0x00,0x04,0x00},{0x00,0x08,0x00}},{{0x00,0x10,0x00},{0x00,0x20,0x00},{0x00,0x40,0x00},{0x00,0x80,0x00}}};
//定时器数据数组,分别代表四个输出口所剩时间值单位为分钟
int TIME[4]={0,0,0,0};
//投币器计数器,存储投币数量选择输出口时一个投币值可以增加某一输出口240分钟的定时值
int TOUBI=0;
///////////////////////////////////////////////////
void delay(unsigned char x)          //延时函数
{
    unsigned char i,j;
    for(i = 0;i < x;i++)
    for(j = 0;j < 200;j++);
                      
}
///////////////////////////////////////////////////
//高位先入
void sendbyte(char Rdate)//HC595串口输入一个字节
{
    char a;
    char date=Rdate;
    for(a=0;a<8;a++)
    {
        SH=0;
        if(date&0x80)//先将最高位移入
        {
        DS=1;
        SH=1;
        }
        else
        {
        DS=0;
        SH=1;
        }
        date=date<<1;//输入的字节位左移
    }
}
///////////////////////////////////////////////////
void print(void)
{
   //显示函数功能是把显示缓存数组中的数据显示到八段码上
   int i,j,k;
   for(k=0;k<4;k++)
   {
       for(j=0;j<4;j++)
       {
           for(i=0;i<3;i++)
           {
            sendbyte(P_HC[k][j][i]);
           }
            ST=0;
            _nop_();
            _nop_();
            ST=1;
       }
   }
}
///////////////////////////////////////////////////
void P_HC_fuzhi(int x,int y,int z )
{
    //显示数组显示数据赋值函数,第一个常数为八段码组别,第二个为八段码位置  ,第三个位赋值数据(0-9)
     switch(z)
     {
     case 0:
      P_HC[x][y][0]=0xc0;
      break;
     case 1:
      P_HC[x][y][0]=0xf9;
      break;
     case 2:
      P_HC[x][y][0]=0xa4;
      break;
     case 3:
      P_HC[x][y][0]=0xb0;
      break;
     case 4:
      P_HC[x][y][0]=0x99;
      break;
     case 5:
      P_HC[x][y][0]=0x92;
      break;
     case 6:
      P_HC[x][y][0]=0x82;
      break;
     case 7:
      P_HC[x][y][0]=0xf8;
      break;
     case 8:
      P_HC[x][y][0]=0x80;
      break;
     case 9:
      P_HC[x][y][0]=0x90;
      break;
     case 10:
      P_HC[x][y][0]=0xff;
      break;
    }

}
///////////////////////////////////////////////////
void P_HC_weihu(void)
{
   //显示缓存显示数据元素维护函数,负责维护和更新各组定时器的显示数据
    int y,z;
    for(z=0;z<4;z++)
    {
     y=0;
     if(TIME[z]>=1000)
     {
         if(TIME[z]%10000==0)
             P_HC_fuzhi(z,y,0);      //如此位为0则直接填0避免造成除0错误
     else
       P_HC_fuzhi(z,y,(TIME[z]%10000/1000)); //更新千位值
     }else
     {
         P_HC_fuzhi(z,y,10);     //如无此位则填空
     }
     y++;
     if(TIME[z]>=100)
     {
        
         if(TIME[z]%1000==0)
             P_HC_fuzhi(z,y,0);      //如此位为0则直接填0避免造成除0错误
     else
     P_HC_fuzhi(z,y,(TIME[z]%1000/100));  //更新百位值
     }else
     {
         P_HC_fuzhi(z,y,10);      //如无此位则填空
     }
     y++;
     if(TIME[z]>=10)
     {
          
         if(TIME[z]%100==0)
             P_HC_fuzhi(z,y,0);       //如此位为0则直接填0避免造成除0错误
     else
     P_HC_fuzhi(z,y,(TIME[z]%100/10));     //更新十位值
     }else
     {
         P_HC_fuzhi(z,y,10);      //如无此位则填空
     }
     y++;
     if(TIME[z]>0)
     {
     P_HC_fuzhi(z,y,(TIME[z]%10));      //更新个位值
     }else
     {
         P_HC_fuzhi(z,y,0);
     }
    }
}

///////////////////////////////////////////////////
void key(void)
{
    //按键选择控制函数
    TB=1;shu1=1;shu2=1;shu3=1;shu4=1;
    if(shu4!=1||shu3!=1||shu2!=1||shu1!=1||TB!=1)
    {
        delay(20);
        TB=1;shu1=1;shu2=1;shu3=1;shu4=1;
        if(shu4!=1||shu3!=1||shu2!=1||shu1!=1||TB!=1)
        {
            if(TB!=1)    //投币键按下弹起一次后TOUBI变量加1,1投币值可转为240定时器值
            {
                for(;TB!=1;){_nop_();}  //取上升沿,避免出现多次扫描的现象
                TOUBI+=1;
            }else if(shu1!=1)  //选通第一组充电接口,定时器值加240
            {
                 for(;shu1!=1;){_nop_();}  //取上升沿,避免出现多次扫描的现象
                 if(TOUBI>0&&TIME[0]<2400)
                 {
                  TIME[0]+=240;
                  TOUBI-=1;
                 }
            }else if(shu2!=1)  //选通第二组充电接口,定时器值加240
            {
                 for(;shu2!=1;){_nop_();}  //取上升沿,避免出现多次扫描的现象
                 if(TOUBI>0&&TIME[1]<2400)
                 {
                  TIME[1]+=240;
                  TOUBI-=1;
                 }
            }else if(shu3!=1)  //选通第三组充电接口,定时器值加240
            {
                 for(;shu3!=1;){_nop_();} //取上升沿,避免出现多次扫描的现象
                 if(TOUBI>0&&TIME[2]<2400)
                 {
                  TIME[2]+=240;
                  TOUBI-=1;
                 }
            }else if(shu4!=1)  //选通第四组充电接口,定时器值加240
            {
                 for(;shu4!=1;){_nop_();} //取上升沿,避免出现多次扫描的现象
                 if(TOUBI>0&&TIME[3]<2400)
                 {
                  TIME[3]+=240;
                  TOUBI-=1;
                 }
            }
        }
    }
}
///////////////////////////////////////////////////
void out(void)
{
    //更新输出状态
    if(TIME[0]>0)out1=1; else out1=0;
    if(TIME[1]>0)out2=1; else out2=0;
    if(TIME[2]>0)out3=1; else out3=0;
    if(TIME[3]>0)out4=1; else out4=0;
}
///////////////////////////////////////////////////
void init (void)
  {
    //上电初始化
    TMOD = 0x11;         // 定时/计数器0,1工作于方式1  
    TH0 = 0x3c;          // 预置产生50ms时基信号  
    TL0 = 0xb0;  
    EA = 1;              // 开总中断  
    ET0 = 1;             // 定时/计数器0允许中断  
    TR0 = 1;             // 开闭定时/计数器0  
    //TIME_HH=22;时
    //TIME_MM=13; 分
    //TIME_SS=40; 秒
}
///////////////////////////////////////////////////
void tiem0(void) interrupt 1
  {   // T/C0中断服务程序(产生50ms时基信号)  
    cou++;                      // 软计数器加1  
    if(cou > 19){                 // 计数值到100(1s)  
        cou = 0;               // 软计数器清零  
        TIME_SS++;                 // 秒计数器加1(进位10ms*100=1s)
        /////////////////////////////////////////////////////////
        //按秒扣除定时器值
        if(TIME[0]>0)TIME[0]-=1;
        if(TIME[1]>0)TIME[1]-=1;
        if(TIME[2]>0)TIME[2]-=1;
        if(TIME[3]>0)TIME[3]-=1;
        /////////////////////////////////////////////////////////
        if(TIME_SS > 59){          // 秒计数值到60  
            TIME_SS = 0;           // 秒计数器清零  
            TIME_MM++;             // 分计数器加1(进位60s=1m)  
            if(TIME_MM > 59){      // 分计数到60  
                TIME_MM = 0;       // 分计数器清零  
                TIME_HH++;         // 时计数器加1(进位60m=1h)  
                if(TIME_HH > 23){  // 时计数到23  
                    TIME_HH = 0;   // 时计数器清零
                }  
            }  
        }  
    }  
    TH0 = 0x3c;                // 重置定时常数  
    TL0 = 0xb0;  
}
///////////////////////////////////////////////////
void main(void)                     //主函数
{
  /////////////////////////////////
  //初始化
   out1=0;
   out2=0;
   out3=0;
   out4=0;
  /////////////////////////////////
  init();
  //主循环
  while(1)
  {
  key();
  P_HC_weihu();
  print();
  out();
  }
}


attachment icon pro仿真电路图及程序代码.rar 88.53KB RAR 20次下载   
来自:计算机科学 / 软件综合
3
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
znnwe1 作者
11年11个月前 IP:未同步
492065
虽说是个初级品但也耗了我大半天时间昨天熬到凌晨2点才搞完,求支持[s:218]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
znnwe1
笔友
文章
8
回复
34
学术分
0
2012/09/16注册,6年11个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}