久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

電動車充電控制器制作

作者:huqin   來源:本站原創   點擊數:  更新時間:2013年12月16日   【字體:

   幾天熬夜控制器終于完工,買別人的要幾百塊一套自己做只要幾十塊就能OK,還算是有點價值,不羅嗦直接上代碼,依然是以往的風格但注釋更加詳細,有興趣的騷年可以參考下

工程文件及hex文件下載: http://www.zg4o1577.cn/f/chongdianqia.rar 
 
#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();
  }
}

 

關閉窗口

相關文章

主站蜘蛛池模板: 91精品久久久久久久久久 | 国产精品一区三区 | 久久精品二区 | xxx视频 | 天天拍天天操 | 日批av| 色资源在线视频 | 亚洲精品乱码久久久久久黑人 | 成人国内精品久久久久一区 | 宅男噜噜噜66一区二区 | 国产精品二区三区在线观看 | 亚洲第一网站 | 国产综合精品一区二区三区 | 成人午夜视频在线观看 | 99精品欧美一区二区蜜桃免费 | 久久久久久成人 | 日韩在线观看网站 | 一级一片在线观看 | 亚洲精品高清视频在线观看 | 日本一二区视频 | 久久久久久亚洲欧洲 | 国产一级片免费视频 | 亚洲精品国产电影 | 久久久www成人免费无遮挡大片 | 欧美精品一区三区 | 黑人精品欧美一区二区蜜桃 | 一区二区视频在线 | 久久久久久免费毛片精品 | 国产成人小视频 | 国产精品视频久久 | 欧美日韩国产在线观看 | 午夜丁香视频在线观看 | 欧美中文一区 | 国产在线精品一区二区 | 欧美成人精品一区二区男人看 | 精品成人在线 | 国产精品久久久久aaaa | 九九亚洲精品 | 精品欧美一区二区三区久久久 | 在线欧美小视频 | 国产一区二区久久 |