欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2602|回復: 1
打印 上一主題 下一主題
收起左側

單片機代碼編譯有錯誤 求大佬幫忙解決一下

[復制鏈接]
跳轉到指定樓層
樓主
ID:926406 發表于 2021-5-27 18:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
50黑幣
系統主程序代碼controller.c:
#include <reg52.h>               
#include <intrins.h>          //庫函數頭文件,代碼中引用了_nop_()函數
#include "define.h"                //變量定義和函數的聲明
#include "init.h"                //初始化模塊
#include "AD.h"                        //AD轉換模塊
#include "yj1602.h"                //液晶1602顯示模塊
#include "AT24C02.h"           //數據存儲模塊
/*主函數*/
void main()
{
        init();
        init1602();
        init24c02();
        battery_v=get_ad();
        yj1602();
        if(battery_v<108) PWM=0;   //首次要直接充電
        else PWM=1;
        while(1)
        {        
                delay(5000);
                battery_v=get_ad();
                yj1602();
                if(battery_v<0)//蓄電池反接,立刻關閉充放電電路,蜂鳴器報警
                {
                        PWM=1;FuZai=1;buzzer();
                }
                if(battery_v>=108)//蓄電池電壓大于10.8V
                {
                        if(145<=battery_v)
                        {
                                LED1=0; //開啟過電壓指示燈
                                LED=1;
                                LED2=1;
                                PWM=1;//停止充電
                                buzzer();        //蜂鳴器報警
                                write=1;
                                AT24c02();   
                     }        
                else if(120<=battery_v<145)//蓄電池電壓大于12v而且小于13.5v        
                        {
                                LED=0;
LED1=1;LED2=1;
                                TR0=1;         //開啟固定PWM充電
                                if(count==4)
                                {
                                        PWM=0;
                                }
                                if(count==12)
                                {
                                        count=0;
                                        PWM=1;
                                }                        
                        }
                        else if(battery_v<120)
                        {
                                LED=0;LED1=1;LED2=1;
                                TR0=0;
                                PWM=0;
                        }

                }
                else
                {
                        LED=1;//開啟欠壓指示燈
                        LED1=1;
                        LED2=0;
                        FuZai=1;//關閉負載
                        PWM=0;
                        buzzer();
                        write=1;        
                        AT24c02();
                }
        }
}


/*****定時中斷函數*****/
void timer0() interrupt 1
{
        
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;//定時時間為50ms,每50ms中斷一次
        count++;
}               


以下代碼為define.h                   //變量定義和函數的聲明
#define uchar unsigned char
#define uint unsigned int
// 定義控制信號端口
//充放電控制端口
sbit PWM= P3^2;//蓄電池開關
sbit FuZai=P3^3;//負載開關
sbit LED=P2^3;//充電指示燈           
sbit LED1=P2^4;//充電指示燈
sbit LED2=P2^5;//欠壓指示燈
sbit beep=P2^6;//蜂鳴器控制位
uchar count,battery_v;
//AD轉換
sbit csad=P2^7;                //定義AD的片選位
sbit adwr=P3^6;                //定義AD的WR端口
sbit adrd=P3^7;                //定義AD的RD端口
unsigned char V1,V2,V3,adval,ad_vo;        
//1602液晶顯示
sbit RS=P2^0;    //P2.0
sbit RW=P2^1;   //P2.1
sbit EN=P2^2;    //P2.2
unsigned char code table1[]=" TYNCFDKZQXTSJ";
unsigned char code table2[]=" D:12.0  N:";
unsigned char code lcdd[]="0123456789";
uchar xs_vo,num;
//AT24c02保存數據
bit  write=0;     //寫24C02的標志;
sbit scl=P2^4;
sbit sda=P2^5;
uchar p=2,a1;
RS232串口通信
sbit RXD=P3^0;
sbit TXD=P3^1;
/*聲明調用函數*/
void init();//初始化主函數
void delay(unsigned int t);   //可控延時函數
void delay1();     //軟件實現延時函數,5個機器周期
void buzzer();
uchar get_ad();                //        AD程序
//1602液晶顯示部分
void write_com(uchar com);
void write_data(uchar date);
void init1602();
void yj1602();
//AT24c02保存數據
void init24c02();
void start();  //啟動
void stop();   //停止
void respons();  //應答
void write_byte(uchar date);
//uchar read_byte();
void write_add(uchar address,uchar date);
//uchar read_add(uchar address);
void AT24c02();


以下代碼為init.h                        //初始化模塊
void init()//初始化主函數
{
        TMOD=0x01;
        TH0=(65536-50)/256;
        TL0=(65536-50)%256;//定時時間為50ms,每50ms中斷一次
        EA=1;
        ET0=1;
        PWM=1;//初始化時先關閉充電
        LED=0;//開啟正常工作指示燈
        LED1=1;//關閉異常指示燈
        LED2=1;
        beep=1;
        write=0;        
}

/*延時函數*/
  void delay(unsigned int t)     
{
   unsigned int j,i;
   for(i=0;i<t;i++)
      for(j=0;j<110;j++);
}
/*延時函數1*/
void delay1()      
{
   _nop_();                 _nop_();
   _nop_();                 _nop_();
   _nop_();

}
//蜂鳴器報警函數
void buzzer()
{
        beep=0;                delay(10);
        beep=1;
}

以下代碼為AD.h                                //AD轉換模塊
//ad轉換程序
uchar get_ad()                //        AD程序
{
        csad=0;           //置CSAD為0,
        adwr=1;
        _nop_();
        adwr=0;                        //啟動AD轉換
        _nop_();
        adwr=1;
    delay(2);       //AD轉換時間

        P1=0xff;        //讀取P1口之前先給其寫全1
    adrd=1;          //選通ADCS
        _nop_();        
        adrd=0;                     //AD讀使能
        _nop_();
        adval=P1;                        //AD數據讀取賦給P1口,得到ad轉換的結果
        adrd=1;
    ad_vo=(float)adval*150.0/256.0;//得到蓄電池的電壓
        return(ad_vo);               
}




以下代碼為yj1602.h                //液晶1602顯示模塊
/*LCD1602顯示部分子函數*/
void init1602()   //LCD初始化函數
{
        EN=0;
        write_com(0x38);//設置16X2顯示,5X7點陣,8位數據接口
        write_com(0x0c);//設置開顯示,不顯示光標
        write_com(0x06);//寫一個字符后地址指針加1
        write_com(0x01);//顯示清零,數據指針清零
}
void write_com(uchar com)//1602寫命令函數
{
        RW=0;        delay1();
        RS=0;    // RW=0,RS=0,寫LCD命令字
        delay1();
        EN=1;    //E端時序
        delay1();
        P0=com;   //將com中的命令字寫入LCD數據口
        delay1();
        EN=0;        delay1();
        delay(5);        
}
void write_data(uchar date)//1602寫數據函數
{
   RW=0;  delay1();
   RS=1;   // RW=1,RS=0,寫LCD數據
   delay1();
   EN=1;    // E端時序
   delay1();
   P0=date;   // 將dat中的顯示數據寫入LCD數據口
   delay1();
   EN=0;   delay1();
   delay(5);        
}
void yj1602()
{        uchar xs_vo;
        init1602();
        xs_vo=battery_v;
        V1=xs_vo/100;
    V2=xs_vo%100/10;
        V3=xs_vo%10;

        write_com(0x80+0x10);
        for(num=0;num<14;num++)
        {
                write_data(table1[num]);
                delay(5);
        }
        write_com(0x80+0x50);
        write_data(' ');
        delay(5);
        write_data('S');
        delay(5);
        write_data(':');
        write_data(' ');
        delay(5);
        write_data(lcdd[1]);
        delay(5);
        write_data(lcdd[2]);
        delay(5);
        write_data('.');
        delay(5);
        write_data(lcdd[0]);
        delay(5);
        write_data(' ');
        delay(5);
        write_data(' ');
        delay(5);
        write_data('N');
        delay(5);
        write_data(':');
        delay(5);
        write_data(lcdd[V1]);
        delay(5);
        write_data(lcdd[V2]);
        delay(5);
        write_data('.');
        delay(5);
        write_data(lcdd[V3]);
        delay(5);
        
        for(num=0;num<16;num++)//移屏顯示
        {
                write_com(0x1c);
                delay(1000);
        }
}


以下代碼為AT24C02.h           //數據存儲模塊
//at24c02部分子函數
void init24c02()//24c02初始化函數
{
        sda=1;        delay1();
        scl=1;        delay1();
}
void start()  //開始信號
{        
        sda=1;        delay1();
        scl=1;        delay1();
        sda=0;        delay1();
}
void stop()   //停止
{
        sda=0;        delay1();
        scl=1;        delay1();
        sda=1;        delay1();
}
void respons()  //應答
{
        uchar i;
        scl=1;        delay1();
        while((sda==1)&&(i<250)) i++;
        scl=0;        delay1();
}

void write_byte(uchar date)//串行發送字節函數
{
        uchar i,temp;
        temp=date;
        for(i=0;i<8;i++)
        {
                temp=temp<<1;
                scl=0;   delay1();
                sda=CY;        delay1();
                scl=1;        delay1();
        }
        scl=0;        delay1();
        sda=1;        delay1();
}
uchar read_byte()//串行讀字節函數
{
        uchar i,k;
        scl=0;
        delay1();
        sda=1;
        delay1();
        for(i=0;i<8;i++)
        {
                scl=1;
                delay1();        
                k=(k<<1)|sda;
                scl=0;
                delay1();        
        }
        return k;
}
void write_add(uchar address,uchar date)//24c02字節寫入函數
{
        start();
        write_byte(0xa0);
        respons();
        write_byte(address);
        respons();
        write_byte(date);
        respons();
        stop();
}
uchar read_add(uchar address)//24c02字節讀操作函數
{
        uchar date;
        start();
        write_byte(0xa0);                respons();
        write_byte(address);        respons();
        start();
        write_byte(0xa1);
        respons();
        date=read_byte();
        stop();
        return date;
}
void AT24c02()
{
        init24c02();
        a1=battery_v;    //保存蓄電池過電壓數據
        if(write==1)                       //判斷計時器是否計時一秒
            {
                        write=0;              //清零
                        write_add(p,a1);            //在24c02的地址p中寫入數據a1
                        p++;        
                }
  }

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:328014 發表于 2021-5-27 18:23 | 只看該作者
可惜我們沒有你寫的這幾個頭文件,無法幫你排查錯誤了.

#include "init.h"                //初始化模塊
#include "AD.h"                        //AD轉換模塊
#include "yj1602.h"                //液晶1602顯示模塊
#include "AT24C02.h"           //數據存儲模塊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表