微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 急急急。。。。求大神帮忙看一下!

急急急。。。。求大神帮忙看一下!

时间:10-02 整理:3721RD 点击:
程序调试没有错误,放到仿真里面按键不起作用,一直停在初始状态,,,,求大神指导!急急急!
#include <reg52.h>
#include<intrins.h>                
#define uchar unsigned char
#define uint  unsigned int
sbit beep = P1^4;   //蜂鸣器IO口定义
bit flag_300ms ;
sbit CS=P2^4;                //CS定义为P2口的第4位脚,连接ADC0832CS脚
sbit SCL=P2^3;                //SCL定义为P2口的第3位脚,连接ADC0832SCL脚
sbit DO=P2^2;                //DO定义为P2口的第4位脚,连接ADC0832DO脚
sbit K1=P1^6;
sbit K2=P1^7;
sbit rs=P1^0;         //1602数据/命令选择引脚 H:数据              L:命令
sbit rw=P1^1;         //1602读写引脚                 H:数据寄存器          L:指令寄存器
sbit e =P1^2;         //1602使能引脚          下降沿触发
uchar a_a;
uchar code table_num[]={"0123456789abcdefg"};       
//  按键的IO变量的定义
uchar key_can;                 //按键值的变量
uchar menu_1;        //菜单设计的变量
uint TRX_h;
uint TRX;                        //天燃气
//延时1ms函数
void delay_1ms(uint q)
{
        uint i,j;
        for(i=0;i<q;i++)
                for(j=0;j<120;j++);
}
       
//小延时
void delay_uint(uint q)
{
        while(q--);
}
//1602命令函数
void write_com(uchar com)
{
        e=0;
        rs=0;
        rw=0;
        P0=com;
        delay_uint(25);
        e=1;
        delay_uint(100);
        e=0;
}
//1602写数据函数
void write_data(uchar dat)
{
        e=0;
        rs=1;
        rw=0;
        P0=dat;
        delay_uint(25);
        e=1;
        delay_uint(100);
        e=0;       
}
//lcd1602上显示两位十进制数
/*void write_sfm2(uchar hang,uchar add,uint date)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(0x30+date/10%10);
        write_data(0x30+date%10);       
}
*/
//lcd1602上显示两位十进制数
void write_sfm_TRX(uchar hang,uchar add,uint date)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
                write_data(0x30+date/100%10);
                write_data(0x30+date/10%10);
                write_data(0x30+date%10);       
}
//lcd1602上显示这字符函数
void write_string(uchar hang,uchar add,uchar *p)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
                while(1)                                                                                                                 
                {
                        if(*p == '\0')  break;
                        write_data(*p);
                        p++;
                }       
}
//lcd1602初始化设置
void init_1602()        //lcd1602初始化
{
        write_com(0x38);       
        write_com(0x0c);
        write_com(0x06);
        delay_uint(1000);
        write_string(1,0,"    CO:000 PPM     ");       
        write_string(2,0,"Set CO:000 PPM     ");       
}
//读数模转换数据
unsigned char ad0832read(bit SGL,bit ODD)
{
        unsigned char i=0,value=0,value1=0;               
                SCL=1;
                DO=1;
                CS=0;                //开始
                SCL=0;                //第一个上升沿       
                SCL=1;
                DO=ODD;
                SCL=0;          //第二个上升沿
                SCL=1;
                DO=SGL;
                SCL=0;            //第三个上升沿       
                DO=1;
                for(i=0;i<8;i++)
                {
                        SCL=1;
                        SCL=0;                 //开始从第四个下降沿接收数据
                        value<<=1;
                        if(DO)
                                value++;                                               
                }
                for(i=0;i<8;i++)
                {                        //接收校验数据
                        value1>>=1;
                        if(DO)
                                value1+=0x80;
                        SCL=1;
                        SCL=0;
                }
                SCL=1;       
                if(value==value1)                                //与校验数据比较,正确就返回数据,否则返回0       
                        return value;
        return 0;
}
//定时器0初始化程序
void time_init()          
{
        EA   = 1;                   //开总中断
        TMOD = 0X01;          //定时器0、定时器1工作方式1
        ET0  = 1;                  //开定时器0中断
        TR0  = 1;                  //允许定时器0定时
}
//独立按键程序
uchar key_can;         //按键值
void key()         //独立按键程序
{
        static uchar key_new;
        key_can=20;                   //按键值还原
        P1|=0xc0;
        if((P1&0xc0)!=0xc0)                //按键按下
        {
                delay_1ms(1);                     //按键消抖动
                if(((P1&0xc0)!=0xc0)&&(key_new == 1))
                {                                                //确认是按键按下
                        key_new=0;
                        switch(P1&0xc0)
                        {
                                case 0x10:key_can=2; break;           //得到k3键值
                                case 0x20:key_can=1; break;           //得到k4键值
                        }               
                }                       
        }
        else
                key_new=1;       
}
//按键显示函数
void key_with()
{
        if(key_can==1)
        {
                TRX_h++;                        //设置天燃气加1
                if(TRX_h>=999)
                        TRX_h=999;
        }
        if(key_can==2)                         //设置天燃气减1
        {
                TRX_h--;                       
                if(TRX_h<=1)
                        TRX_h=1;
        }
        write_sfm_TRX(2,7,TRX_h);           //显示湿度
}
//报警函数
void clock_h_l()
{
        if(TRX >= TRX_h)
        {
                beep = ~beep;           //蜂鸣器报警
        }
        else
        {
                beep = 1;
        }
       
}
//定时器0中断服务程序
void time0_int() interrupt 1
{       
        static uchar value;
        TH0 = 0x3c;
        TL0 = 0xb0;     // 50ms
        value ++;         
        if(value % 6 == 0)
        {
                flag_300ms = 1;           //300ms       
                value = 0;       
        }
}  
//主程序  
void main()
{               
        beep = 0;                                                //开机叫一声   
        delay_1ms(150);
        P0 = P1 = P2 = P3 = 0xff;
        time_init();                                                          //定时器初始化
        init_1602();                                                        //lcd1602初始化
        write_sfm_TRX(2,7,TRX_h);                            //显示天燃气
        while(1)
        {
                if(flag_300ms == 1)
                {
                        flag_300ms = 0;
                        if(menu_1 == 0)           //开始界面显示的内容
                        {               
                                TRX = ad0832read(1,0);       
                                TRX = TRX * 450 / 255.0;
                            TRX = TRX - 100;              //首先减去零点漂移,
                                write_sfm_TRX(1,7,TRX);                           //显示天燃气
                        }       
                        clock_h_l();   //报警函数
                }
                key();
                if(key_can < 10)
                {
                        key_with();                            //设置报警温度       
                }
                delay_1ms(1);
        }
}



这不是很正常吗              1 0 0 2 9 2 5 0 9 4   

menu_1 似乎从来没有赋值过,另外开始界面显示的内容和初始化显示的内容有什么区别

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top