找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2188|回复: 11
收起左侧

编辑的时候一直提示missing';'before'set',改了一遍前面的所有分号,仍不对,求指点

[复制链接]
ID:748796 发表于 2020-5-11 08:15 | 显示全部楼层 |阅读模式
编辑的时候一直提示missing';'before'set',改了一遍前面的所有分号,仍然显示不对。单片机小白,求指点。

问题截图

问题截图
回复

使用道具 举报

ID:76227 发表于 2020-5-11 11:29 | 显示全部楼层
uchar不是标准的变量类型,可以改为unsigned char
回复

使用道具 举报

ID:748796 发表于 2020-5-11 12:24 来自手机 | 显示全部楼层
木木de 发表于 2020-5-11 11:29
uchar不是标准的变量类型,可以改为unsigned char

改了之后后面的又错了
IMG_20200511_122358.jpg
回复

使用道具 举报

ID:748796 发表于 2020-5-11 12:28 来自手机 | 显示全部楼层
//程序头函数 #include <reg52.h> sbit LED_R= P2^2;        //COled sbit LED_Y= P2^0; sbit FENG = P2^5;        //蜂鸣器 sbit san=P3^4;                //风扇 //ADC0809 sbit ST=P3^3; sbit EOC=P3^6; sbit OE=P3^2; sbit A0=P3^1;                //0809A0地址脚 //按键 sbit Key1=P2^6;                //设置键 sbit Key2=P2^7;                //加键 sbit Key3=P3^7;                //减键 bit bdata flag4,flag138; 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 MQ4=0,MQ138=0;                //读取传感器数据变量 //指示灯变量 uchar WARNING4=30,WARNING138=60;                //初始上限值 void init()                                 //定时器初始化函数 {         TMOD=0x01;                          //工作方式采用16位定时方式,通过TR1置位启动          TL0=0xb0;           //这是给定时器T0设定时初值。分别给T0高8位,低8位送初值,这个值在12MHZ时,应该是定时50ms          TH0=0x3c;                         //赋初值          EA=1;                                 //打开中断总开关         ET0=1;                                //打开中断允许开关          TR0=1;                                //打开中断定时开关 }  void main()                           //主函数 {         Init1602();                   //初始化显示函数         init();                           //初始化定时器         while(1)                   //进入循环         {                 A0=0;                   //地址脚=0时,读取MQ4数据                                                                    MQ4=ADC0809();                 A0=1;                   //地址脚=1时,读取MQ138数据                 MQ138=ADC0809();                 if(set==0)           //不在设置状态时                 Display_1602(MQ4,MQ138,WARNING4,WARNING138); //正常显示数据                 if(set==0)                 {                         if(MQ4<WARNING4)           //判断数据是否小于报警值                         flag4=0;                         else if(MQ4>WARNING4)                         flag4=1;                         if(MQ138<WARNING138)                         flag138=0;                         else if(MQ138>WARNING138)                         flag138=1;                                         }                 else                 {                         flag4=0;flag138=0;                 }                 Key();                                                 //扫描按键函数         } } //ADC0809读取信息 uchar ADC0809() {         uchar temp_=0x00;         OE=0;        //初始化高阻太         ST=0;        //转化初始化         ST=1;        //开始转换         ST=0;         while(EOC==0)        //外部中断等待AD转换结束         OE=1;           //读取转换的AD值         temp_=Data_ADC0809;         OE=0;         return temp_; }  void Key()                          //按键函数 {         if(Key1==0)                   //设置按键         {                 while(Key1==0);//按键释放                 FENG=0;                   //打开蜂鸣器                 set++;                   //设置变量加                 flag4=0;                 flag138=0;           //报警变量清零                 LED_Y=1;                 LED_R=1;           //关闭LED                 san=1;                   //关闭风扇                 TR0=0;                   //关闭定时器         }         if(set==1)                   //设置报警值         {                 write_com(0x38);//屏幕初始化                 write_com(0x80+0x40+6);//位置                    write_com(0x0f);//打开显示 无光标 光标闪烁                    write_com(0x06);//当读或写一个字符是指针后一一位                 FENG=1;          }         if(set==2)         {                 write_com(0x38);//屏幕初始化                 write_com(0x80+0x40+15);//位置                    write_com(0x0f);//打开显示 无光标 光标闪烁                    write_com(0x06);//当读或写一个字符是指针后一一位                 FENG=1;          }         else if(set>=3)                 //设置完         {                 set=0;                         //清零                 write_com(0x38);//屏幕初始化                 write_com(0x0c);//打开显示 无光标 无光标闪烁                 FENG=1;                        //关闭蜂鸣器                 TR0=1;                        //打开定时器         }         if(Key2==0&&set==1)        //加按键按下         {                 while(Key2==0);                //按键释放                 FENG=0;                                //打开蜂鸣器,做按键音                 WARNING4++;                                                //报警值加                 if(WARNING4>=255)                                //报警值加到最大                 WARNING4=0;                                                //报警值清零                 write_com(0x80+0x40+4);                        //选中位置显示报警值                 write_data('0'+WARNING4/100);        //将报警值拆开成单独的一位,显示。例如报警值是123,那么123除以100的商是1,这里显示的就是1                 write_data('0'+WARNING4/10%10);        //123除以10得到的商是12,,12除以10的余数就是2,这里显示的就是2                 write_data('0'+WARNING4%10);        //123除以10的余数是3,这里显示的就是3,数据+“0”是为了得到液晶中对应数字的显示码                 write_com(0x80+0x40+6);                        //闪烁的位置                 FENG=1;                                                        //关闭蜂鸣器         }         if(Key2==0&&set==2)                                        //注释同上         {                 while(Key2==0);                 FENG=0;                 WARNING138++;                 if(WARNING138>=255)                 WARNING138=0;                 write_com(0x80+0x40+13);                 write_data('0'+WARNING138/100);                 write_data('0'+WARNING138/10%10);                 write_data('0'+WARNING138%10);                 write_com(0x80+0x40+15);//位置                 FENG=1;         }         if(Key3==0&&set==1)         {                 while(Key3==0);                 FENG=0;                 WARNING4--;                 if(WARNING4<=0)                 WARNING4=255;                 write_com(0x80+0x40+4);                 write_data('0'+WARNING4/100);                 write_data('0'+WARNING4/10%10);                 write_data('0'+WARNING4%10);                 write_com(0x80+0x40+6);//位置                 FENG=1;         }         if(Key3==0&&set==2)         {                 while(Key3==0);                 FENG=0;                 WARNING138--;                 if(WARNING138<=0)                 WARNING138=255;                 write_com(0x80+0x40+13);                 write_data('0'+WARNING138/100);                 write_data('0'+WARNING138/10%10);                 write_data('0'+WARNING138%10);                 write_com(0x80+0x40+15);//位置                 FENG=1;         } }  void  time1_int(void) interrupt 1//定时器工作函数 {         uchar count;                                 //定义变量用于定时                  TL0=0xb0;          TH0=0x3c;                                         //定时器重新赋初值50ms           count++;                                         //变量50ms加一次         if(count==10)                                 //加10次就是500ms         {                 count=0;                                 //变量清零                 if(flag4==0)                         //报警关                         LED_Y=1;                         //报警指示灯熄灭                 else                                         //报警开                         LED_Y=0;                         //对应的报警指示灯点亮                 if(flag138==0)                         LED_R=1;                 else                          LED_R=0;                 if(flag4==1||flag138==1)         //有报警                 {                         FENG=!FENG;                         //蜂鸣器闪烁报警                         san=0;                                 //打开继电器启动风扇                 }                 if(flag4==0&&flag138==0)         //都没有报警                 {                         FENG=1;                                 //关闭蜂鸣器                         san=1;                                 //关闭风扇                 }         } } 显示 //宏定义 #define uint unsigned int  #define uchar unsigned char  //LCD管脚声明 sbit LCDRS = P2^3; sbit LCDEN= P2^4;  //初始画时显示的内容 uchar code Init1[]="MQ4:    MQ138 :   "; uchar code Init2[]="H4 :    H138  :   ";  //LCD延时 void LCDdelay(uint z) {   uint x,y;   for(x=z;x>0;x--)     for(y=10;y>0;y--); } //写命令 void write_com(uchar com) {   LCDRS=0;   P0=com;   LCDdelay(5);   LCDEN=1;   LCDdelay(5);   LCDEN=0; } //写数据 void write_data(uchar date) {   LCDRS=1;   P0=date;   LCDdelay(5);   LCDEN=1;   LCDdelay(5);   LCDEN=0; } //1602初始化 void Init1602() {   uchar i=0;   write_com(0x38);//屏幕初始化   write_com(0x0c);//打开显示 无光标 无光标闪烁   write_com(0x06);//当读或写一个字符是指针后一一位   write_com(0x01);//清屏   write_com(0x80);//设置位置    for(i=0;i<16;i++)   {                 write_data(Init1[i]);   }                                                                     write_com(0x80+0x40);//设置位置            for(i=0;i<16;i++)   {                 write_data(Init2[i]);   } }  void Display_1602(uchar NOW_GAS,uchar NOW_CO,uchar SET_GAS,uchar SET_CO) {          write_com(0x80+4);         write_data('0'+NOW_GAS/100);         write_data('0'+NOW_GAS/10%10);         write_data('0'+NOW_GAS%10);          write_com(0x80+0x40+4);         write_data('0'+SET_GAS/100);         write_data('0'+SET_GAS/10%10);         write_data('0'+SET_GAS%10);          write_com(0x80+13);         write_data('0'+NOW_CO/100);         write_data('0'+NOW_CO/10%10);         write_data('0'+NOW_CO%10);          write_com(0x80+0x40+13);         write_data('0'+SET_CO/100);         write_data('0'+SET_CO/10%10);         write_data('0'+SET_CO%10); }
回复

使用道具 举报

ID:748796 发表于 2020-5-11 12:30 来自手机 | 显示全部楼层
木木de 发表于 2020-5-11 11:29
uchar不是标准的变量类型,可以改为unsigned char

//程序头函数
#include <reg52.h>
sbit LED_R= P2^2;        //COled
sbit LED_Y= P2^0;
sbit FENG = P2^5;        //蜂鸣器
sbit san=P3^4;                //风扇
//ADC0809
sbit ST=P3^3;
sbit EOC=P3^6;
sbit OE=P3^2;
sbit A0=P3^1;                //0809A0地址脚
//按键
sbit Key1=P2^6;                //设置键
sbit Key2=P2^7;                //加键
sbit Key3=P3^7;                //减键
bit bdata flag4,flag138;
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 MQ4=0,MQ138=0;                //读取传感器数据变量
//指示灯变量
uchar WARNING4=30,WARNING138=60;                //初始上限值
void init()                                 //定时器初始化函数
{
        TMOD=0x01;                          //工作方式采用16位定时方式,通过TR1置位启动
        TL0=0xb0;           //这是给定时器T0设定时初值。分别给T0高8位,低8位送初值,这个值在12MHZ时,应该是定时50ms
        TH0=0x3c;                         //赋初值
        EA=1;                                 //打开中断总开关
        ET0=1;                                //打开中断允许开关
        TR0=1;                                //打开中断定时开关
}

void main()                           //主函数
{
        Init1602();                   //初始化显示函数
        init();                           //初始化定时器
        while(1)                   //进入循环
        {
                A0=0;                   //地址脚=0时,读取MQ4数据                                                   
                MQ4=ADC0809();
                A0=1;                   //地址脚=1时,读取MQ138数据
                MQ138=ADC0809();
                if(set==0)           //不在设置状态时
                Display_1602(MQ4,MQ138,WARNING4,WARNING138); //正常显示数据
                if(set==0)
                {
                        if(MQ4<WARNING4)           //判断数据是否小于报警值
                        flag4=0;
                        else if(MQ4>WARNING4)
                        flag4=1;
                        if(MQ138<WARNING138)
                        flag138=0;
                        else if(MQ138>WARNING138)
                        flag138=1;                       
                }
                else
                {
                        flag4=0;flag138=0;
                }
                Key();                                                 //扫描按键函数
        }
}
//ADC0809读取信息
uchar ADC0809()
{
        uchar temp_=0x00;
        OE=0;        //初始化高阻太
        ST=0;        //转化初始化
        ST=1;        //开始转换
        ST=0;
        while(EOC==0)        //外部中断等待AD转换结束
        OE=1;           //读取转换的AD值
        temp_=Data_ADC0809;
        OE=0;
        return temp_;
}

void Key()                          //按键函数
{
        if(Key1==0)                   //设置按键
        {
                while(Key1==0);//按键释放
                FENG=0;                   //打开蜂鸣器
                set++;                   //设置变量加
                flag4=0;
                flag138=0;           //报警变量清零
                LED_Y=1;
                LED_R=1;           //关闭LED
                san=1;                   //关闭风扇
                TR0=0;                   //关闭定时器
        }
        if(set==1)                   //设置报警值
        {
                write_com(0x38);//屏幕初始化
                write_com(0x80+0x40+6);//位置
                   write_com(0x0f);//打开显示 无光标 光标闪烁
                   write_com(0x06);//当读或写一个字符是指针后一一位
                FENG=1;

        }
        if(set==2)
        {
                write_com(0x38);//屏幕初始化
                write_com(0x80+0x40+15);//位置
                   write_com(0x0f);//打开显示 无光标 光标闪烁
                   write_com(0x06);//当读或写一个字符是指针后一一位
                FENG=1;

        }
        else if(set>=3)                 //设置完
        {
                set=0;                         //清零
                write_com(0x38);//屏幕初始化
                write_com(0x0c);//打开显示 无光标 无光标闪烁
                FENG=1;                        //关闭蜂鸣器
                TR0=1;                        //打开定时器
        }
        if(Key2==0&&set==1)        //加按键按下
        {
                while(Key2==0);                //按键释放
                FENG=0;                                //打开蜂鸣器,做按键音
                WARNING4++;                                                //报警值加
                if(WARNING4>=255)                                //报警值加到最大
                WARNING4=0;                                                //报警值清零
                write_com(0x80+0x40+4);                        //选中位置显示报警值
                write_data('0'+WARNING4/100);        //将报警值拆开成单独的一位,显示。例如报警值是123,那么123除以100的商是1,这里显示的就是1
                write_data('0'+WARNING4/10%10);        //123除以10得到的商是12,,12除以10的余数就是2,这里显示的就是2
                write_data('0'+WARNING4%10);        //123除以10的余数是3,这里显示的就是3,数据+“0”是为了得到液晶中对应数字的显示码
                write_com(0x80+0x40+6);                        //闪烁的位置
                FENG=1;                                                        //关闭蜂鸣器
        }
        if(Key2==0&&set==2)                                        //注释同上
        {
                while(Key2==0);
                FENG=0;
                WARNING138++;
                if(WARNING138>=255)
                WARNING138=0;
                write_com(0x80+0x40+13);
                write_data('0'+WARNING138/100);
                write_data('0'+WARNING138/10%10);
                write_data('0'+WARNING138%10);
                write_com(0x80+0x40+15);//位置
                FENG=1;
        }
        if(Key3==0&&set==1)
        {
                while(Key3==0);
                FENG=0;
                WARNING4--;
                if(WARNING4<=0)
                WARNING4=255;
                write_com(0x80+0x40+4);
                write_data('0'+WARNING4/100);
                write_data('0'+WARNING4/10%10);
                write_data('0'+WARNING4%10);
                write_com(0x80+0x40+6);//位置
                FENG=1;
        }
        if(Key3==0&&set==2)
        {
                while(Key3==0);
                FENG=0;
                WARNING138--;
                if(WARNING138<=0)
                WARNING138=255;
                write_com(0x80+0x40+13);
                write_data('0'+WARNING138/100);
                write_data('0'+WARNING138/10%10);
                write_data('0'+WARNING138%10);
                write_com(0x80+0x40+15);//位置
                FENG=1;
        }
}

void  time1_int(void) interrupt 1//定时器工作函数
{
        uchar count;                                 //定义变量用于定时         
        TL0=0xb0;
        TH0=0x3c;                                         //定时器重新赋初值50ms
          count++;                                         //变量50ms加一次
        if(count==10)                                 //加10次就是500ms
        {
                count=0;                                 //变量清零
                if(flag4==0)                         //报警关
                        LED_Y=1;                         //报警指示灯熄灭
                else                                         //报警开
                        LED_Y=0;                         //对应的报警指示灯点亮
                if(flag138==0)
                        LED_R=1;
                else
                        LED_R=0;
                if(flag4==1||flag138==1)         //有报警
                {
                        FENG=!FENG;                         //蜂鸣器闪烁报警
                        san=0;                                 //打开继电器启动风扇
                }
                if(flag4==0&&flag138==0)         //都没有报警
                {
                        FENG=1;                                 //关闭蜂鸣器
                        san=1;                                 //关闭风扇
                }
        }
}
显示
//宏定义
#define uint unsigned int
#define uchar unsigned char

//LCD管脚声明
sbit LCDRS = P2^3;
sbit LCDEN= P2^4;

//初始画时显示的内容
uchar code Init1[]="MQ4:    MQ138 :   ";
uchar code Init2[]="H4 :    H138  :   ";

//LCD延时
void LCDdelay(uint z)
{
  uint x,y;
  for(x=z;x>0;x--)
    for(y=10;y>0;y--);
}
//写命令
void write_com(uchar com)
{
  LCDRS=0;
  P0=com;
  LCDdelay(5);
  LCDEN=1;
  LCDdelay(5);
  LCDEN=0;
}
//写数据
void write_data(uchar date)
{
  LCDRS=1;
  P0=date;
  LCDdelay(5);
  LCDEN=1;
  LCDdelay(5);
  LCDEN=0;
}
//1602初始化
void Init1602()
{
  uchar i=0;
  write_com(0x38);//屏幕初始化
  write_com(0x0c);//打开显示 无光标 无光标闪烁
  write_com(0x06);//当读或写一个字符是指针后一一位
  write_com(0x01);//清屏
  write_com(0x80);//设置位置

  for(i=0;i<16;i++)
  {
                write_data(Init1);
  }                                                                  
  write_com(0x80+0x40);//设置位置         
  for(i=0;i<16;i++)
  {
                write_data(Init2);
  }
}

void Display_1602(uchar NOW_GAS,uchar NOW_CO,uchar SET_GAS,uchar SET_CO)
{

        write_com(0x80+4);
        write_data('0'+NOW_GAS/100);
        write_data('0'+NOW_GAS/10%10);
        write_data('0'+NOW_GAS%10);

        write_com(0x80+0x40+4);
        write_data('0'+SET_GAS/100);
        write_data('0'+SET_GAS/10%10);
        write_data('0'+SET_GAS%10);

        write_com(0x80+13);
        write_data('0'+NOW_CO/100);
        write_data('0'+NOW_CO/10%10);
        write_data('0'+NOW_CO%10);

        write_com(0x80+0x40+13);
        write_data('0'+SET_CO/100);
        write_data('0'+SET_CO/10%10);
        write_data('0'+SET_CO%10);
}
回复

使用道具 举报

ID:748796 发表于 2020-5-11 12:31 来自手机 | 显示全部楼层
木木de 发表于 2020-5-11 11:29
uchar不是标准的变量类型,可以改为unsigned char

这是原程序,用的是keil uVersion4版本。
回复

使用道具 举报

ID:749061 发表于 2020-5-11 14:27 | 显示全部楼层
程序开头没有使用宏定义 #define uchar unsigned char
回复

使用道具 举报

ID:347349 发表于 2020-5-11 15:21 | 显示全部楼层
//程序头函数
#include <reg52.h>
//宏定义
#define uint unsigned int
#define uchar unsigned char
sbit LED_R= P2^2;        //COled
sbit LED_Y= P2^0;
sbit FENG = P2^5;        //蜂鸣器
sbit san=P3^4;                //风扇
//ADC0809
sbit ST=P3^3;
sbit EOC=P3^6;
sbit OE=P3^2;
sbit A0=P3^1;                //0809A0地址脚
//按键
sbit Key1=P2^6;                //设置键
sbit Key2=P2^7;                //加键
sbit Key3=P3^7;                //减键
bit bdata flag4,flag138;
uchar set;
//函数声明
extern uchar ADC0809();
extern void Key();
/*
回复

使用道具 举报

ID:735148 发表于 2020-5-11 15:31 | 显示全部楼层
在include下面加上#define uchar unsigned char   或者直接把程序中的uchar替换成unsigned char
回复

使用道具 举报

ID:557403 发表于 2020-5-11 15:58 | 显示全部楼层
没有 uchar 的定义
回复

使用道具 举报

ID:213173 发表于 2020-5-12 07:20 | 显示全部楼层
A_cherry 发表于 2020-5-11 12:31
这是原程序,用的是keil uVersion4版本。

给你整理了一下,可以通过编译。是否能用未经验证。
  1. //程序头函数
  2. #include <reg52.h>
  3. //宏定义
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define Data_ADC0809 P1
  7. //LCD管脚声明
  8. sbit LCDRS = P2^3;
  9. sbit LCDEN= P2^4;
  10. sbit LED_R= P2^2;        //COled
  11. sbit LED_Y= P2^0;
  12. sbit FENG = P2^5;        //蜂鸣器
  13. sbit san=P3^4;                //风扇
  14. //ADC0809
  15. sbit ST=P3^3;
  16. sbit EOC=P3^6;
  17. sbit OE=P3^2;
  18. sbit A0=P3^1;                //0809A0地址脚
  19. //按键
  20. sbit Key1=P2^6;                //设置键
  21. sbit Key2=P2^7;                //加键
  22. sbit Key3=P3^7;                //减键

  23. //初始画时显示的内容
  24. uchar code Init1[]="MQ4:    MQ138 :   ";
  25. uchar code Init2[]="H4 :    H138  :   ";

  26. bit bdata flag4,flag138;
  27. uchar set;
  28. uchar MQ4=0,MQ138=0;                //读取传感器数据变量
  29. //指示灯变量
  30. uchar WARNING4=30,WARNING138=60;                //初始上限值
  31. //函数声明
  32. uchar ADC0809();
  33. void Key();
  34. //LCD延时
  35. void LCDdelay(uint z)
  36. {
  37.   uint x,y;
  38.   for(x=z;x>0;x--)
  39.     for(y=10;y>0;y--);
  40. }
  41. //写命令
  42. void write_com(uchar com)
  43. {
  44.   LCDRS=0;
  45.   P0=com;
  46.   LCDdelay(5);
  47.   LCDEN=1;
  48.   LCDdelay(5);
  49.   LCDEN=0;
  50. }
  51. //写数据
  52. void write_data(uchar date)
  53. {
  54.   LCDRS=1;
  55.   P0=date;
  56.   LCDdelay(5);
  57.   LCDEN=1;
  58.   LCDdelay(5);
  59.   LCDEN=0;
  60. }
  61. //1602初始化
  62. void Init1602()
  63. {
  64.   uchar i=0;
  65.   write_com(0x38);//屏幕初始化
  66.   write_com(0x0c);//打开显示 无光标 无光标闪烁
  67.   write_com(0x06);//当读或写一个字符是指针后一一位
  68.   write_com(0x01);//清屏
  69.   write_com(0x80);//设置位置

  70.   for(i=0;i<16;i++)
  71.   {
  72.                 write_data(Init1);
  73.   }                                                                  
  74.   write_com(0x80+0x40);//设置位置         
  75.   for(i=0;i<16;i++)
  76.   {
  77.                 write_data(Init2);
  78.   }
  79. }

  80. void Display_1602(uchar NOW_GAS,uchar NOW_CO,uchar SET_GAS,uchar SET_CO)
  81. {

  82.         write_com(0x80+4);
  83.         write_data('0'+NOW_GAS/100);
  84.         write_data('0'+NOW_GAS/10%10);
  85.         write_data('0'+NOW_GAS%10);

  86.         write_com(0x80+0x40+4);
  87.         write_data('0'+SET_GAS/100);
  88.         write_data('0'+SET_GAS/10%10);
  89.         write_data('0'+SET_GAS%10);

  90.         write_com(0x80+13);
  91.         write_data('0'+NOW_CO/100);
  92.         write_data('0'+NOW_CO/10%10);
  93.         write_data('0'+NOW_CO%10);

  94.         write_com(0x80+0x40+13);
  95.         write_data('0'+SET_CO/100);
  96.         write_data('0'+SET_CO/10%10);
  97.         write_data('0'+SET_CO%10);
  98. }

  99. /*
  100. void delay(uint z)
  101. {
  102.         uint i,j;
  103.         for(i=0;i<z;i++)
  104.         for(j=0;j<121;j++);
  105. }
  106. */
  107. //

  108. void init()                                 //定时器初始化函数
  109. {
  110.         TMOD=0x01;                          //工作方式采用16位定时方式,通过TR1置位启动
  111.         TL0=0xb0;           //这是给定时器T0设定时初值。分别给T0高8位,低8位送初值,这个值在12MHZ时,应该是定时50ms
  112.         TH0=0x3c;                         //赋初值
  113.         EA=1;                                 //打开中断总开关
  114.         ET0=1;                                //打开中断允许开关
  115.         TR0=1;                                //打开中断定时开关
  116. }


  117. //ADC0809读取信息
  118. uchar ADC0809()
  119. {
  120.         uchar temp_=0x00;
  121.         OE=0;        //初始化高阻太
  122.         ST=0;        //转化初始化
  123.         ST=1;        //开始转换
  124.         ST=0;
  125.         while(EOC==0)        //外部中断等待AD转换结束
  126.         OE=1;           //读取转换的AD值
  127.         temp_=Data_ADC0809;
  128.         OE=0;
  129.         return temp_;
  130. }

  131. void Key()                          //按键函数
  132. {
  133.         if(Key1==0)                   //设置按键
  134.         {
  135.                 while(Key1==0);//按键释放
  136.                 FENG=0;                   //打开蜂鸣器
  137.                 set++;                   //设置变量加
  138.                 flag4=0;
  139.                 flag138=0;           //报警变量清零
  140.                 LED_Y=1;
  141.                 LED_R=1;           //关闭LED
  142.                 san=1;                   //关闭风扇
  143.                 TR0=0;                   //关闭定时器
  144.         }
  145.         if(set==1)                   //设置报警值
  146.         {
  147.                 write_com(0x38);//屏幕初始化
  148.                 write_com(0x80+0x40+6);//位置
  149.                    write_com(0x0f);//打开显示 无光标 光标闪烁
  150.                    write_com(0x06);//当读或写一个字符是指针后一一位
  151.                 FENG=1;

  152.         }
  153.         if(set==2)
  154.         {
  155.                 write_com(0x38);//屏幕初始化
  156.                 write_com(0x80+0x40+15);//位置
  157.                    write_com(0x0f);//打开显示 无光标 光标闪烁
  158.                    write_com(0x06);//当读或写一个字符是指针后一一位
  159.                 FENG=1;

  160.         }
  161.         else if(set>=3)                 //设置完
  162.         {
  163.                 set=0;                         //清零
  164.                 write_com(0x38);//屏幕初始化
  165.                 write_com(0x0c);//打开显示 无光标 无光标闪烁
  166.                 FENG=1;                        //关闭蜂鸣器
  167.                 TR0=1;                        //打开定时器
  168.         }
  169.         if(Key2==0&&set==1)        //加按键按下
  170.         {
  171.                 while(Key2==0);                //按键释放
  172.                 FENG=0;                                //打开蜂鸣器,做按键音
  173.                 WARNING4++;                                                //报警值加
  174.                 if(WARNING4>=255)                                //报警值加到最大
  175.                 WARNING4=0;                                                //报警值清零
  176.                 write_com(0x80+0x40+4);                        //选中位置显示报警值
  177.                 write_data('0'+WARNING4/100);        //将报警值拆开成单独的一位,显示。例如报警值是123,那么123除以100的商是1,这里显示的就是1
  178.                 write_data('0'+WARNING4/10%10);        //123除以10得到的商是12,,12除以10的余数就是2,这里显示的就是2
  179.                 write_data('0'+WARNING4%10);        //123除以10的余数是3,这里显示的就是3,数据+“0”是为了得到液晶中对应数字的显示码
  180.                 write_com(0x80+0x40+6);                        //闪烁的位置
  181.                 FENG=1;                                                        //关闭蜂鸣器
  182.         }
  183.         if(Key2==0&&set==2)                                        //注释同上
  184.         {
  185.                 while(Key2==0);
  186.                 FENG=0;
  187.                 WARNING138++;
  188.                 if(WARNING138>=255)
  189.                 WARNING138=0;
  190.                 write_com(0x80+0x40+13);
  191.                 write_data('0'+WARNING138/100);
  192.                 write_data('0'+WARNING138/10%10);
  193.                 write_data('0'+WARNING138%10);
  194.                 write_com(0x80+0x40+15);//位置
  195.                 FENG=1;
  196.         }
  197.         if(Key3==0&&set==1)
  198.         {
  199.                 while(Key3==0);
  200.                 FENG=0;
  201.                 WARNING4--;
  202.                 if(WARNING4<=0)
  203.                 WARNING4=255;
  204.                 write_com(0x80+0x40+4);
  205.                 write_data('0'+WARNING4/100);
  206.                 write_data('0'+WARNING4/10%10);
  207.                 write_data('0'+WARNING4%10);
  208.                 write_com(0x80+0x40+6);//位置
  209.                 FENG=1;
  210.         }
  211.         if(Key3==0&&set==2)
  212.         {
  213.                 while(Key3==0);
  214.                 FENG=0;
  215.                 WARNING138--;
  216.                 if(WARNING138<=0)
  217.                 WARNING138=255;
  218.                 write_com(0x80+0x40+13);
  219.                 write_data('0'+WARNING138/100);
  220.                 write_data('0'+WARNING138/10%10);
  221.                 write_data('0'+WARNING138%10);
  222.                 write_com(0x80+0x40+15);//位置
  223.                 FENG=1;
  224.         }
  225. }
  226. void main()                           //主函数
  227. {
  228.         Init1602();                   //初始化显示函数
  229.         init();                           //初始化定时器
  230.         while(1)                   //进入循环
  231.         {
  232.                 A0=0;                   //地址脚=0时,读取MQ4数据                                                   
  233.                 MQ4=ADC0809();
  234.                 A0=1;                   //地址脚=1时,读取MQ138数据
  235.                 MQ138=ADC0809();
  236.                 if(set==0)           //不在设置状态时
  237.                 Display_1602(MQ4,MQ138,WARNING4,WARNING138); //正常显示数据
  238.                 if(set==0)
  239.                 {
  240.                         if(MQ4<WARNING4)           //判断数据是否小于报警值
  241.                         flag4=0;
  242.                         else if(MQ4>WARNING4)
  243.                         flag4=1;
  244.                         if(MQ138<WARNING138)
  245.                         flag138=0;
  246.                         else if(MQ138>WARNING138)
  247.                         flag138=1;                        
  248.                 }
  249.                 else
  250.                 {
  251.                         flag4=0;flag138=0;
  252.                 }
  253.                 Key();                                                 //扫描按键函数
  254.         }
  255. }
  256. void  time1_int(void) interrupt 1//定时器工作函数
  257. {
  258.         uchar count;                                 //定义变量用于定时         
  259.         TL0=0xb0;
  260.         TH0=0x3c;                                         //定时器重新赋初值50ms
  261.           count++;                                         //变量50ms加一次
  262.         if(count==10)                                 //加10次就是500ms
  263.         {
  264.                 count=0;                                 //变量清零
  265.                 if(flag4==0)                         //报警关
  266.                         LED_Y=1;                         //报警指示灯熄灭
  267.                 else                                         //报警开
  268.                         LED_Y=0;                         //对应的报警指示灯点亮
  269.                 if(flag138==0)
  270.                         LED_R=1;
  271.                 else
  272.                         LED_R=0;
  273.                 if(flag4==1||flag138==1)         //有报警
  274.                 {
  275.                         FENG=!FENG;                         //蜂鸣器闪烁报警
  276.                         san=0;                                 //打开继电器启动风扇
  277.                 }
  278.                 if(flag4==0&&flag138==0)         //都没有报警
  279.                 {
  280.                         FENG=1;                                 //关闭蜂鸣器
  281.                         san=1;                                 //关闭风扇
  282.                 }
  283.         }
  284. }
复制代码
回复

使用道具 举报

ID:748796 发表于 2020-5-12 16:40 来自手机 | 显示全部楼层
wulin 发表于 2020-5-12 07:20
给你整理了一下,可以通过编译。是否能用未经验证。

确实用不了(ó﹏ò),不过还是十分感谢的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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