找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1702|回复: 2
打印 上一主题 下一主题
收起左侧

大佬帮忙看一下单片机程序哪里出错了,在此非常感谢

[复制链接]
跳转到指定楼层
楼主
ID:723220 发表于 2022-9-22 20:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//程序头函数
#include <reg52.h>
//显示函数
#include <display.h>
#include <intrins.h>
#include "eeprom52.h"
//宏定义
#define uint unsigned int
#define uchar unsigned char
#define Data_ADC0809 P1                //定义P1口为Data_ADC0809

//管脚声明
sbit LED_R= P2^2;                          //红色指示灯
sbit LED_G= P2^0;                          //绿色指示灯
sbit FENG = P2^5;                          //蜂鸣器
sbit san=P3^4;                                  //继电器
//ADC0809
sbit ST=P3^3;
sbit EOC=P3^6;
sbit OE=P3^2;
//按键
sbit Key1=P2^6;
sbit Key2=P2^7;
sbit Key3=P3^7;

bit bdata flag;                                  //定义位变量
uchar set;                                          //设置变量


//函数声明
extern uchar ADC0809();
extern void Key();
/*
void delay(uint z)
{
        uint i,j;
        for(i=0;i<z;i++)
        for(j=0;j<121;j++);
}
*/

//酒精含量变量
uchar temp=0;

//指示灯变量

uchar WARNING=25;                //报警值变量

/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
        SectorErase(0x2000);
        byte_write(0x2000, WARNING);
        byte_write(0x2060, a_a);        
}

/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
        WARNING   = byte_read(0x2000);
        a_a      = byte_read(0x2060);
}

/**************开机自检eeprom初始化*****************/
void init_eeprom()
{
        read_eeprom();                //先读
        if(a_a != 1)                //新的单片机初始单片机内问eeprom
        {
                WARNING   = 25;
                a_a = 1;
                write_eeprom();           //保存数据
        }        
}
void init()                                //定时器初始化函数
{
        TMOD=0x01;                        //定时器工作方式
         TL0=0xb0;
         TH0=0x3c;                        //赋初值50ms
         EA=1;                                //打开中断总开关
        ET0=1;                                //打开定时器0中断允许开关
         TR0=1;                                //打开定时器0定时开关
}

void main()                                //主函数
{
        Init1602();                                                 //初始化液晶函数
        init_eeprom();  //开始初始化保存的数据
        init();                                                         //初始化定时器
        while(1)                                                 //进入循环
        {
                temp=ADC0809();                                 //读取AD数值
                if(set==0)                                         //set为0,说明现在不是设置状态
                Display_1602(temp,WARNING);         //显示AD数值和报警值
                if(temp<WARNING&&set==0)         //AD数值小于报警值
                {
                        flag=0;                                         //关闭报警
                }
                else if(temp>WARNING&&set==0)//AD值大于报警值
                {
                        flag=1;                                         //打开报警
                }
                Key();                                                 //调用按键函数
        }
}
//ADC0809读取信息
uchar ADC0809()
{
        uchar temp_=0x00;
        //初始化高阻太

        OE=0;
        //转化初始化
        ST=0;
        //开始转换
        ST=1;
        ST=0;
        //外部中断等待AD转换结束
        while(EOC==0)
        //读取转换的AD值
        OE=1;
        temp_=Data_ADC0809;
        OE=0;
        return temp_;
}

void Key()                                          //按键函数
{
        if(Key1==0)                                  //设置键按下
        {
                while(Key1==0);                  //按键松开
                FENG=0;                                  //蜂鸣器响
                set++;                                  //设置变量加
                flag=0;                                  //关闭报警
                san=1;                                  //关闭继电器
                TR0=0;                                  //关闭定时器
        }
        if(set==1)                                  //设置报警值时
        {
                write_com(0x38);//屏幕初始化
                write_com(0x80+0x40+13);//位置
                   write_com(0x0f);//打开显示 无光标 光标闪烁
                   write_com(0x06);//当读或写一个字符是指针后一一位
                FENG=1;                                //关闭蜂鸣器

        }
        else if(set>=2)                //设置完成时
        {
                set=0;                        //变量清零
                write_com(0x38);//屏幕初始化
                write_com(0x0c);//打开显示 无光标 无光标闪烁
                FENG=1;                        //关闭蜂鸣器
                flag=1;                        //打开报警
                TR0=1;                        //打开定时器
        }
        if(Key2==0&&set!=0)                        //设置报警值时加键按下
        {
                while(Key2==0);                        //按键松开
                FENG=0;                                        //打开蜂鸣器
                WARNING++;                                //报警值加
                if(WARNING>=255)                //最大加到255
                WARNING=0;                                //清零
                write_com(0x80+0x40+11);           //选中液晶屏上的第二行第十一列
                write_data('0'+WARNING/100);   //开始显示报警值。例如报警值是123,123除以100的商是1,加上‘0’是为了得到液晶中对应1的显示码
                write_data('0'+WARNING%100/10);//123除以100的余数是23,23再除以10得到的商是2
                write_data('0'+WARNING%100%10);//23除以10的余数是3
                write_com(0x80+0x40+13);//位置
                FENG=1;                                                //关闭蜂鸣器
                write_eeprom();                           //保存数据
        }
        if(Key3==0&&set!=0)                                //注释同加按键
        {
                while(Key3==0);
                FENG=0;
                WARNING--;
                if(WARNING<=0)
                WARNING=255;
                write_com(0x80+0x40+11);
                write_data('0'+WARNING/100);
                write_data('0'+WARNING/10%10);
                write_data('0'+WARNING%10);
                write_com(0x80+0x40+13);//位置
                FENG=1;
                write_eeprom();                           //保存数据
        }
}

void  time1_int(void) interrupt 1                  //定时器工作函数
{
        uchar count;                                                  //定义计时变量
        TL0=0xb0;
         TH0=0x3c;                                                          //重新赋初值50ms
          count++;                                                          //变量加一次就是50ms
        if(count==10)                                                  //加到10次就是500ms
        {
                if(flag==0)                                                  //flag=0时,也就是不开启报警
                {
                        LED_G=0;                                          //绿灯点亮
                        LED_R=1;                                          //红灯熄灭
                        FENG=1;                                                  //关闭蜂鸣器
                        san=1;                                                  //关闭继电器
                }
                if(flag==1)                                                  //flag为1时,也就是打开报警
                {
                        LED_G=1;                                          //绿灯熄灭
                        LED_R=0;                                          //红灯点亮
                        FENG=0;                                                  //打开蜂鸣器
                        san=0;                                                  //打开继电器
                }
        }

           if(count==20)                                                  //计数20次,就是1s
           {                                                                          //在1s时,红绿灯都是熄灭状态,蜂鸣器也是关闭状态,装可以达到闪烁的目的
                count=0;                                                  //变量清零
                if(flag==0)                                                  //不是报警状态时
                {
                        LED_G=1;
                        LED_R=1;
                        FENG=1;
                        san=1;                                                  //都关闭
                }
                if(flag==1)                                                  //报警状态时
                {
                        LED_G=1;
                        LED_R=1;
                        FENG=1;
                        san=0;                                                  //继电器一直吸和
                }
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:94031 发表于 2022-9-23 09:31 | 只看该作者
缺 display.h,eeprom52.h 头文件,缺 SectorErase 原型函数。
回复

使用道具 举报

板凳
ID:1045628 发表于 2022-9-23 10:49 | 只看该作者
都没说清除什么问题,不会是代码问题吧,姑且认为头文件和缺失的函数没错,如果代码没错是没办法定位问题的
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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