| 网站首页 | 业界新闻 | 小组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
买学问 - 大佬一对一辅导,有问必答买学问 - 专业的付费知识问答平台
共有 404 人关注过本帖
标题:代码没有问题,仿真可以用,做出实物就不能用了,这是为什么?
只看楼主 加入收藏
灬星灬
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2021-1-5
收藏
 问题点数:0 回复次数:3 
代码没有问题,仿真可以用,做出实物就不能用了,这是为什么?
#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char        // 以后unsigned char就可以用uchar代替
#define uint  unsigned int        // 以后unsigned int 就可以用uint 代替

sfr ISP_DATA  = 0xe2;            // 数据寄存器
sfr ISP_ADDRH = 0xe3;            // 地址寄存器高八位
sfr ISP_ADDRL = 0xe4;            // 地址寄存器低八位
sfr ISP_CMD   = 0xe5;            // 命令寄存器
sfr ISP_TRIG  = 0xe6;            // 命令触发寄存器
sfr ISP_CONTR = 0xe7;            // 命令寄存器

sbit LcdRs_P   = P1^2;    // 1602液晶的RS管脚      
sbit LcdRw_P   = P1^3;    // 1602液晶的RW管脚
sbit LcdEn_P   = P1^4;    // 1602液晶的EN管脚
sbit KeySet_P  = P3^2;        // “设置”按键的管脚
sbit KeyDown_P = P3^3;        // “减”按键的管脚
sbit KeyUp_P   = P3^4;        // “加”按键的管脚
sbit Buzzer_P  = P1^5;        // 蜂鸣器
sbit DHT11_P   = P1^1;         // 温湿度传感器DHT11数据接入
sbit LedTH_P   = P2^0;        // 温度过高报警指示灯
sbit LedTL_P   = P2^1;        // 温度过低报警指示灯
sbit LedHH_P   = P2^2;        // 湿度过高报警指示灯
sbit LedHL_P   = P2^3;        // 湿度过低报警指示灯
sbit LedPM_P   = P2^4;        // PM2.5过高报警指示灯

uchar temp;                                // 保存温度
uchar humi;                                // 保存湿度
uint  pm;                                    // 保存PM2.5

uchar gIndex=0;                        // 串口接收索引
uint  Value[20]={0};            // 串口数据缓存区

uchar AlarmTL;                        // 温度下限报警值
uchar AlarmTH;                        // 温度上限报警值
uchar AlarmHL;                         // 湿度下限报警值
uchar AlarmHH;                        // 湿度上限报警值
uint  AlarmPM;                        // PM2.5报警值



/*********************************************************/
// 单片机内部EEPROM不使能
/*********************************************************/
void ISP_Disable()
{
    ISP_CONTR = 0;
    ISP_ADDRH = 0;
    ISP_ADDRL = 0;
}


/*********************************************************/
// 从单片机内部EEPROM读一个字节,从0x2000地址开始
/*********************************************************/
unsigned char EEPROM_Read(unsigned int add)
{
    ISP_DATA  = 0x00;
    ISP_CONTR = 0x83;
    ISP_CMD   = 0x01;
    ISP_ADDRH = (unsigned char)(add>>8);
    ISP_ADDRL = (unsigned char)(add&0xff);
    // 对STC89C51系列来说,每次要写入0x46,再写入0xB9,ISP/IAP才会生效
    ISP_TRIG  = 0x46;      
    ISP_TRIG  = 0xB9;
    _nop_();
    ISP_Disable();
    return (ISP_DATA);
}


/*********************************************************/
// 往单片机内部EEPROM写一个字节,从0x2000地址开始
/*********************************************************/
void EEPROM_Write(unsigned int add,unsigned char ch)
{
    ISP_CONTR = 0x83;
    ISP_CMD   = 0x02;
    ISP_ADDRH = (unsigned char)(add>>8);
    ISP_ADDRL = (unsigned char)(add&0xff);
    ISP_DATA  = ch;
    ISP_TRIG  = 0x46;
    ISP_TRIG  = 0xB9;
    _nop_();
    ISP_Disable();
}


/*********************************************************/
// 擦除单片机内部EEPROM的一个扇区
// 写8个扇区中随便一个的地址,便擦除该扇区,写入前要先擦除
/*********************************************************/
void Sector_Erase(unsigned int add)      
{
    ISP_CONTR = 0x83;
    ISP_CMD   = 0x03;
    ISP_ADDRH = (unsigned char)(add>>8);
    ISP_ADDRL = (unsigned char)(add&0xff);
    ISP_TRIG  = 0x46;
    ISP_TRIG  = 0xB9;
    _nop_();
    ISP_Disable();
}


/*********************************************************/
// 毫秒级的延时函数,time是要延时的毫秒数
/*********************************************************/
void DelayMs(uint time)
{
    uint i,j;
    for(i=0;i<time;i++)
        for(j=0;j<112;j++);
}


/*********************************************************/
// 10us级延时程序
/*********************************************************/
void Delay10us()
{
    _nop_();    // 执行一条指令,延时1微秒
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}


/*********************************************************/
// 读取DHT11单总线上的一个字节
/*********************************************************/
uchar DhtReadByte(void)
{   
    bit bit_i;
    uchar j;
    uchar dat=0;

    for(j=0;j<8;j++)   
    {
        while(!DHT11_P);    // 等待低电平结束   
        Delay10us();            // 延时
        Delay10us();
        Delay10us();
        if(DHT11_P==1)        // 判断数据线是高电平还是低电平
        {
            bit_i=1;
            while(DHT11_P);
        }
        else
        {
            bit_i=0;
        }
        dat<<=1;                   // 将该位移位保存到dat变量中
        dat|=bit_i;   
    }
    return(dat);  
}


/*********************************************************/
// 读取DHT11的一帧数据,湿高、湿低(0)、温高、温低(0)、校验码
/*********************************************************/
void ReadDhtData()
{         
    uchar HumiHig;        // 湿度高检测值
    uchar HumiLow;        // 湿度低检测值
    uchar TemHig;            // 温度高检测值
    uchar TemLow;            // 温度低检测值
    uchar check;            // 校验字节
   
    DHT11_P=0;                // 主机拉低
    DelayMs(20);            // 保持20毫秒
    DHT11_P=1;                // DATA总线由上拉电阻拉高

    Delay10us();             // 延时等待30us
    Delay10us();
    Delay10us();

    while(!DHT11_P);    // 等待DHT的低电平结束
    while(DHT11_P);        // 等待DHT的高电平结束

    //进入数据接收状态
    HumiHig = DhtReadByte();     // 湿度高8位
    HumiLow = DhtReadByte();     // 湿度低8为,总为0
    TemHig  = DhtReadByte();     // 温度高8位
    TemLow  = DhtReadByte();     // 温度低8为,总为0
    check   = DhtReadByte();    // 8位校验码,其值等于读出的四个字节相加之和的低8位

    DHT11_P=1;                // 拉高总线

    if(check==HumiHig + HumiLow + TemHig + TemLow)         // 如果收到的数据无误
    {
        temp=TemHig;             // 将温度的检测结果赋值给全局变量temp
        humi=HumiHig;            // 将湿度的检测结果赋值给全局变量humi
    }
}



/*********************************************************/
// 1602液晶写命令函数,cmd就是要写入的命令
/*********************************************************/
void LcdWriteCmd(uchar cmd)
{
    LcdRs_P = 0;
    LcdRw_P = 0;
    LcdEn_P = 0;
    P0=cmd;
    DelayMs(2);
    LcdEn_P = 1;   
    DelayMs(2);
    LcdEn_P = 0;   
}


/*********************************************************/
// 1602液晶写数据函数,dat就是要写入的数据
/*********************************************************/
void LcdWriteData(uchar dat)
{
    LcdRs_P = 1;
    LcdRw_P = 0;
    LcdEn_P = 0;
    P0=dat;
    DelayMs(2);
    LcdEn_P = 1;   
    DelayMs(2);
    LcdEn_P = 0;
}


/*********************************************************/
// 1602液晶初始化函数
/*********************************************************/
void LcdInit()
{
    LcdWriteCmd(0x38);        // 16*2显示,5*7点阵,8位数据口
    LcdWriteCmd(0x0C);        // 开显示,不显示光标
    LcdWriteCmd(0x06);        // 地址加1,当写入数据后光标右移
    LcdWriteCmd(0x01);        // 清屏
}


/*********************************************************/
// 液晶光标定位函数
/*********************************************************/
void LcdGotoXY(uchar line,uchar column)
{
    // 第一行
    if(line==0)        
        LcdWriteCmd(0x80+column);
     // 第二行
    if(line==1)        
        LcdWriteCmd(0x80+0x40+column);
}


/*********************************************************/
// 液晶输出数字(PM2.5的)
/*********************************************************/
void LcdPrintNum1(uint num)
{
    LcdWriteData(num/100+48);                    // 百位
    LcdWriteData(num%100/10+48);            // 十位
    LcdWriteData(num%10+48);                     // 个位
}


/*********************************************************/
// 液晶输出数字(温湿度的)
/*********************************************************/
void LcdPrintNum2(uchar num)
{
    LcdWriteData(num/10+48);                    // 十位
    LcdWriteData(num%10+48);                     // 个位
}



/*********************************************************/
// 液晶输出字符串函数
/*********************************************************/
void LcdPrintStr(uchar *str)
{
    while(*str!='\0')
        LcdWriteData(*str++);
}


/*********************************************************/
// 液晶显示内容初始化
/*********************************************************/
void LcdShowInit()
{
    LcdGotoXY(0,0);                                        // 液晶光标定位到第0行第0列
    LcdPrintStr(" PM2.5:   ug/m3 ");    // 显示内容
    LcdGotoXY(1,0);                                        // 液晶光标定位到第1行第0列
    LcdPrintStr("T:   C   H:  %RH");    // 显示内容
    LcdGotoXY(1,4);                                        // 温度单位摄氏度上面的圆圈符号
    LcdWriteData(0xdf);   
}


/*********************************************************/
// 串口初始化
/*********************************************************/
void UartInit()
{
    SCON = 0x50;        // 配置串口寄存器
    TMOD = 0x20;        // 配置定时器寄存器
    TH1  = 0xf4;        // 计算波特率的值为2400
    TL1  = 0xf4;        // 计算波特率的值为2400
    EA   = 1;                // 打开总中断
    ES   = 1;                // 打开串口中断
    TR1  = 1;                // 启动定时器
}


/*********************************************************/
// 按键扫描
/*********************************************************/
void KeyScanf()
{
    if(KeySet_P==0)        // 判断设置按键是否被按下
    {
        EA=0;
        
        /*将液晶显示改为设置温度的页面****************************************************/
        LcdWriteCmd(0x01);                     
        LcdGotoXY(0,0);
        LcdPrintStr("Temperature Set ");
        LcdGotoXY(1,0);
        LcdPrintStr("      -    C    ");
        LcdGotoXY(1,10);                        
        LcdWriteData(0xdf);            

        LcdGotoXY(1,4);                         // 在液晶上填充温度的下限值   
        LcdPrintNum2(AlarmTL);   
        LcdGotoXY(1,7);                         // 在液晶上填充温度的上限值
        LcdPrintNum2(AlarmTH);

        LcdGotoXY(1,5);                         // 光标定位到第1行第5列
        LcdWriteCmd(0x0f);                // 光标闪烁
        
        DelayMs(10);                          // 去除按键按下的抖动
        while(!KeySet_P);                     // 等待按键释放
        DelayMs(10);                          // 去除按键松开的抖动

        /*设置温度的下限值****************************************************************/
        while(KeySet_P)                        // “设置键”没有被按下,则一直处于温度下限的设置
        {
            if(KeyDown_P==0)                // 判断 “减按键“ 是否被按下        
            {
                if(AlarmTL>0)                    // 只有当温度下限值大于0时,才能减1
                    AlarmTL--;
                LcdGotoXY(1,4);                 // 重新刷新显示更改后的温度下限值   
                LcdPrintNum2(AlarmTL);         
                LcdGotoXY(1,5);                // 重新定位闪烁的光标位置
                DelayMs(350);                    // 延时
            }
            if(KeyUp_P==0)                  // 判断 “加按键“ 是否被按下
            {
                if(AlarmTL<99)               // 只有当温度下限值小于99时,才能加1
                    AlarmTL++;
                LcdGotoXY(1,4);                  // 重新刷新显示更改后的温度下限值
                LcdPrintNum2(AlarmTL);
                LcdGotoXY(1,5);                // 重新定位闪烁的光标位置
                DelayMs(350);                    // 延时
            }   
        }

        LcdGotoXY(1,8);
        DelayMs(10);                          // 去除按键按下的抖动
        while(!KeySet_P);                     // 等待按键释放
        DelayMs(10);                          // 去除按键松开的抖动

        /*设置温度的上限值****************************************************************/   
        while(KeySet_P)                      // “设置键”没有被按下,则一直处于温度上限的设置
        {
            if(KeyDown_P==0)                // 判断 “减按键“ 是否被按下
            {
                if(AlarmTH>0)                  // 只有当温度上限值大于0时,才能减1            
                    AlarmTH--;
                LcdGotoXY(1,7);               // 重新刷新显示更改后的温度上限值
                LcdPrintNum2(AlarmTH);
                LcdGotoXY(1,8);                // 重新定位闪烁的光标位置
                DelayMs(350);                    // 延时
            }
            if(KeyUp_P==0)                   // 判断 “加按键“ 是否被按下
            {
                if(AlarmTH<99)                 // 只有当温度上限值小于99时,才能加1
                    AlarmTH++;
                LcdGotoXY(1,7);                // 重新刷新显示更改后的温度上限值     
                LcdPrintNum2(AlarmTH);
                LcdGotoXY(1,8);                // 重新定位闪烁的光标位置
                DelayMs(350);                    // 延时
            }                                 
        }

        /*将液晶显示改为设置湿度的页面****************************************************/
        LcdWriteCmd(0x01);                     
        LcdGotoXY(0,0);
        LcdPrintStr("  Humidity Set  ");
        LcdGotoXY(1,0);
        LcdPrintStr("      -   %RH   ");        

        LcdGotoXY(1,4);                         // 在液晶上填充湿度的下限值   
        LcdPrintNum2(AlarmHL);   
        LcdGotoXY(1,7);                         // 在液晶上填充湿度的上限值
        LcdPrintNum2(AlarmHH);

        LcdGotoXY(1,5);                         // 光标定位到第1行第5列
        
        DelayMs(10);                          // 去除按键按下的抖动
        while(!KeySet_P);                     // 等待按键释放
        DelayMs(10);
        
        /*设置湿度的下限值****************************************************************/
        while(KeySet_P)                         // “设置键”没有被按下,则一直处于湿度下限的设置
        {
            if(KeyDown_P==0)                // 判断 “减按键“ 是否被按下
            {
                if(AlarmHL>0)                     // 只有当湿度下限值大于0时,才能减1
                    AlarmHL--;
                LcdGotoXY(1,4);                // 重新刷新显示更改后的湿度下限值     
                LcdPrintNum2(AlarmHL);
                LcdGotoXY(1,5);                // 重新定位闪烁的光标位置
                DelayMs(350);
            }
            if(KeyUp_P==0)                  // 判断 “加按键“ 是否被按下
            {
                if(AlarmHL<99)              // 只有当湿度下限值小于99时,才能加1
                    AlarmHL++;
                LcdGotoXY(1,4);                  // 重新刷新显示更改后的湿度下限值
                LcdPrintNum2(AlarmHL);
                LcdGotoXY(1,5);              // 重新定位闪烁的光标位置
                DelayMs(350);                    // 延时
            }   
        }

        LcdGotoXY(1,8);
        DelayMs(10);                          // 去除按键按下的抖动
        while(!KeySet_P);                     // 等待按键释放
        DelayMs(10);                          // 去除按键松开的抖动
        
        /*设置湿度的上限值****************************************************************/
        while(KeySet_P)                       // “设置键”没有被按下,则一直处于湿度上限的设置
        {
            if(KeyDown_P==0)                 // 判断 “减按键“ 是否被按下
            {
                if(AlarmHH>0)                  // 只有当湿度上限值大于0时,才能减1
                    AlarmHH--;
                LcdGotoXY(1,7);                  // 重新刷新显示更改后的湿度上限值
                LcdPrintNum2(AlarmHH);
                LcdGotoXY(1,8);               // 重新定位闪烁的光标位置
                DelayMs(350);
            }
            if(KeyUp_P==0)                     // 判断 “加按键“ 是否被按下
            {
                if(AlarmHH<99)                // 只有当湿度上限值小于99时,才能加1
                    AlarmHH++;
                LcdGotoXY(1,7);                 // 重新刷新显示更改后的湿度上限值   
                LcdPrintNum2(AlarmHH);
                LcdGotoXY(1,8);                 // 重新定位闪烁的光标位置
                DelayMs(350);                    // 延时
            }   
        }

        /*将液晶显示改为设置PM2.5的页面****************************************************/
        LcdWriteCmd(0x01);                      // 设置界面的显示框架
        LcdGotoXY(0,0);
        LcdPrintStr("   PM2.5 Set    ");
        LcdGotoXY(1,0);
        LcdPrintStr("        ug/m3   ");
        LcdGotoXY(1,4);                                // 显示当前的报警值
        LcdPrintNum1(AlarmPM);               

        LcdGotoXY(1,6);                                 // 光标定位到第1行第6列
        DelayMs(10);                                  // 去除按键按下的抖动
        while(!KeySet_P);                             // 等待按键释放
        DelayMs(10);
        
        while(KeySet_P)                                 // “设置键”没有被按下,则一直处于光强下限的设置
        {
            if(KeyDown_P==0)                        // 判断 “减按键“ 是否被按下
            {
                if(AlarmPM>1)                            // 只有gAlarmPM大于1才能减1                                
                    AlarmPM--;               
                LcdGotoXY(1,4);                        // 液晶光标定位
                LcdPrintNum1(AlarmPM);        // 刷新改变后的报警值
                LcdGotoXY(1,6);
                DelayMs(200);                            // 延时一下
            }
            if(KeyUp_P==0)                          // 判断 “加按键“ 是否被按下
            {
            if(AlarmPM<999)                            // 只有gAlarmPM小于999才能加1
                    AlarmPM++;               
                LcdGotoXY(1,4);                        // 液晶光标定位
                LcdPrintNum1(AlarmPM);        // 刷新改变后的报警值
                LcdGotoXY(1,6);
                DelayMs(200);                            // 延时一下
            }   
        }

        /*完成设置,退出前的处理**********************************************************/
        LcdWriteCmd(0x0C);                              // 取消光标闪烁
        LcdShowInit();                                        // 液晶显示为检测界面的

        DelayMs(10);                                          // 去除按键按下的抖动
        while(!KeySet_P);                                     // 等待按键释放
        DelayMs(10);                                          // 去除按键松开的抖动

        Sector_Erase(0x2000);                             // 存储之前必须先擦除
        EEPROM_Write(0x2000,AlarmTL);            // 把温度下限存入到EEPROM的0x2000这个地址
        EEPROM_Write(0x2001,AlarmTH);            // 把温度上限存入到EEPROM的0x2001这个地址
        EEPROM_Write(0x2002,AlarmHL);            // 把湿度下限存入到EEPROM的0x2002这个地址
        EEPROM_Write(0x2003,AlarmHH);            // 把湿度上限存入到EEPROM的0x2003这个地址
        EEPROM_Write(0x2004,AlarmPM/100);    // 把PM2.5存入到EEPROM的0x2004和0x2005这两个地址
        EEPROM_Write(0x2005,AlarmPM%100);
        
        EA=1;
    }   
}


/*********************************************************/
// 报警判断
/*********************************************************/
void AlarmJudge(void)
{
    /*温度*/
    if(temp>AlarmTH)                // 温度是否过高
    {
        LedTH_P=0;
        LedTL_P=1;
    }
    else if(temp<AlarmTL)        // 温度是否过低
    {
        LedTL_P=0;
        LedTH_P=1;
    }
    else                                        // 温度正常
    {
        LedTH_P=1;
        LedTL_P=1;
    }

    /*湿度*/
    if(humi>AlarmHH)               // 湿度是否过高
    {
        LedHH_P=0;
      LedHL_P=1;
    }
    else if(humi<AlarmHL)        // 湿度是否过低
    {
        LedHL_P=0;
        LedHH_P=1;
    }
    else                                       // 湿度正常
    {
        LedHH_P=1;
        LedHL_P=1;
    }
   
    /*PM2.5*/
    if(pm>AlarmPM)
        LedPM_P=0;
    else
        LedPM_P=1;

    /*蜂鸣器*/
    if((LedHH_P==0)||(LedHL_P==0)||(LedTH_P==0)||(LedTL_P==0)||(LedPM_P==0))     // 蜂鸣器判断,只要至少1个报警灯亮,蜂鸣器就报警
        Buzzer_P=0;
    else   
        Buzzer_P=1;
}


/*********************************************************/
// 报警值初始化
/*********************************************************/
void AlarmInit(void)
{
    AlarmTL=EEPROM_Read(0x2000);    // 从EEPROM的0x2000这个地址读取温度的报警下限
    AlarmTH=EEPROM_Read(0x2001);    // 从EEPROM的0x2001这个地址读取温度的报警上限
    AlarmHL=EEPROM_Read(0x2002);    // 从EEPROM的0x2002这个地址读取湿度的报警下限   
    AlarmHH=EEPROM_Read(0x2003);    // 从EEPROM的0x2003这个地址读取湿度的报警上限
    AlarmPM=EEPROM_Read(0x2004)*100+EEPROM_Read(0x2005);        // 读取PM2.5报警值
   
    if((AlarmTL==0)||(AlarmTL>100))    // 如果温度下限报警值读出来异常(等于0或大于100),则重新赋值
        AlarmTL=20;
    if((AlarmTH==0)||(AlarmTH>100))    // 如果温度上限报警值读出来异常(等于0或大于100),则重新赋值
        AlarmTH=35;
    if((AlarmHL==0)||(AlarmHL>100))    // 如果温度下限报警值读出来异常(等于0或大于100),则重新赋值
        AlarmHL=40;
    if((AlarmHH==0)||(AlarmHH>100))    // 如果温度上限报警值读出来异常(等于0或大于100),则重新赋值
        AlarmHH=85;
    if((AlarmPM==0)||(AlarmPM>1300))    // 如果读取到的报警值异常,则重新赋值
        AlarmPM=200;
}


/*********************************************************/
// 主函数
/*********************************************************/
void main(void)
{
    uchar i;                // 循环变量
    uint ret;                // 保存PM2.5测量结果

    LcdInit();                        // 液晶功能初始化
    LcdShowInit();                    // 液晶显示初始化
    UartInit();                            // 串口初始化
    AlarmInit();                        // 报警值初始化

    while(1)
    {
        /*PM2.5的读取*/
        ret=0;                                            // 清零测量结果
        for(i=0;i<10;i++)                        // 将最新的20个测量结果求和
        {
            ret=ret+Value[i];
        }
        ret=ret/10;                                    // 再除以20求得平均值
        pm=((ret*5)/1024.0)*180;        // 将读取到的电压值转换为灰尘浓度值   
        LcdGotoXY(0,7);                            // 液晶定位到第0行第6列
        LcdPrintNum1(pm);                        // 显示测量结果
        
        /*温湿度读取*/
        EA=0;
        ReadDhtData();                             // 检测温湿度数据;
        EA=1;
        LcdGotoXY(1,2);                             // 定位到要显示温度的地方
        LcdPrintNum2(temp);                    // 显示温度值
        LcdGotoXY(1,11);                        // 定位到要显示湿度的地方
        LcdPrintNum2(humi);                    // 显示湿度值
        
        // 报警判断
        AlarmJudge();                        
        
        /*按键扫描和延时*/
        for(i=0;i<30;i++)
        {
            KeyScanf();                                // 按键判断
            DelayMs(10);
        }
    }
}


/*********************************************************/
// 串口中断服务程序
/*********************************************************/
void UartInt(void) interrupt 4
{
    uchar VoutH,VoutL;
   
    if(RI==1)
    {
        RI=0;
        if(SBUF==0xAA)        // 起始位
        {
            while(!RI);
            VoutH=SBUF;            // Vout(H)
            RI=0;
            while(!RI);
            VoutL=SBUF;            // Vout(L)
            RI=0;
            while(!RI);            // Vref(H)
            RI=0;
            while(!RI);            // Vref(L)
            RI=0;
            while(!RI);            // 校验位
            RI=0;
            while(!RI);            // 停止位
            RI=0;
            
            Value[gIndex]=VoutH*256+VoutL;
            
            gIndex++;
            if(gIndex==20)
                gIndex=0;
        }
    }
}



搜索更多相关主题的帖子: 显示 按键 void while 报警 
2021-05-27 23:31
lgwd
Rank: 2
等 级:论坛游民
威 望:5
帖 子:87
专家分:67
注 册:2014-1-17
收藏
得分:0 
这种大段程序没人有功夫去研究你的问题!还是要靠自己。这里建议几点:
1. 对于LCD1602和其它外购硬件,首先根据商家提供的例程调试成功。熟悉和理解外设驱动的原理,单独调试某个硬件时可尝试根据自己理解修改一下看看变化(循序渐进)。
2. 将外设逐个合成在一起,确保每一步各个外设都能正常工作。
3. 再根据设计要求,逐个改动。一旦发现问题,立即退回,再试再改动。这样容易发现问题。一次步子迈的太大,不容易发现问题。
4. 很多时候单独每个硬件工作正常,合在一起就不行了。首先排除硬件连线等冲突,再查软件编程的冲突。
   总之,要一步一步合成和排除!
2021-05-30 13:57
nosnoy
Rank: 9Rank: 9Rank: 9
来 自:mcu
等 级:贵宾
威 望:14
帖 子:537
专家分:1153
注 册:2016-9-17
收藏
得分:0 
赞成楼上的观点。

而且单片机不是一个无实物表演的东西 ,代码最终都要落到高低电平,可能你的io口上拉电阻阻值不对,虚焊,假焊等等 都会影响最终的结果

穷举是最暴力的美学
2021-06-02 18:11
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:375
帖 子:11563
专家分:42866
注 册:2006-5-13
收藏
得分:0 
    仿真仅仅是验证代码的基本方法之一,仿真成功并不一定代表实际运行也同样成功,一定要在实物单片机上测试成功才行。正如2楼和3楼所说,影响因素很多,只能一个个环节去调试和排错。

活到老,学到老! http://www. E-mail:hu-jj@
2021-09-27 20:54
快速回复:代码没有问题,仿真可以用,做出实物就不能用了,这是为什么?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.064763 second(s), 9 queries.
Copyright©2004-2021, BCCN.NET, All Rights Reserved