4130|7

30

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求好心人帮忙,51单片机实现4位共阴数码管数字温度上下限报警功能的c程序和仿真图谢谢 [复制链接]

求好心人帮忙,51单片机实现4位共阴数码管数字温度上下限报警功能的c程序和仿真图,P0口控制数码管,P3.7口控制蜂鸣器,P1口控制4x4矩阵键盘,键盘的功能能调节温度上下限,谢谢!
此帖出自51单片机论坛

最新回复

这两天忙着在弄3d打印机所以没上来看,现在才看到你贴出程序,初步看了下没时间详细研究。你显示的问题应该是table中代码不对,除了U和L能正常显示,0~9都是乱码,修正代码后应该就能显示数字。不报警是你的alarm子程序逻辑错误,生活应用中只有低了或是高了,不会同时存在高和低吧;  详情 回复 发表于 2016-5-9 10:28
点赞 关注
 

回复
举报

2万

帖子

0

TA的资源

超级版主

沙发
 
“51单片机实现4位共阴数码管数字温度上下限报警功能的c程序和仿真图”
这个好像是作业。
写这么个程序并不难,仿真也容易。
但给了你之后,你仍然是什么也没有学到。
此帖出自51单片机论坛
 
 
 

回复

30

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这是我们的小组实训任务来的,做了好几天了,程序出现了问题,我们要有和老师一起讨论过呢,但是还是不行呀,我们小组成员的成绩还是可以的,但是。。。还是没有解决呢,所以。。。只能厚着脸皮来求程序了。。。
此帖出自51单片机论坛

点评

你的出发点错了,既然已有程序只是出现问题,那应该把程序贴出来和描述问题详细,让大家给你意见去解决,这样你们才能学到东西  详情 回复 发表于 2016-5-7 13:39
 
 
 

回复

30

帖子

0

TA的资源

一粒金砂(初级)

4
 
罗观武 发表于 2016-5-7 12:57
这是我们的小组实训任务来的,做了好几天了,程序出现了问题,我们要有和老师一起讨论过呢,但是还是不行呀 ...

明天就要上交实物了,有点紧,您懂的话可以帮一下吗,拜托了
此帖出自51单片机论坛
 
 
 

回复

216

帖子

0

TA的资源

一粒金砂(中级)

5
 
罗观武 发表于 2016-5-7 12:57
这是我们的小组实训任务来的,做了好几天了,程序出现了问题,我们要有和老师一起讨论过呢,但是还是不行呀 ...

你的出发点错了,既然已有程序只是出现问题,那应该把程序贴出来和描述问题详细,让大家给你意见去解决,这样你们才能学到东西
此帖出自51单片机论坛
 
 
 

回复

30

帖子

0

TA的资源

一粒金砂(初级)

6
 
philipchiu 发表于 2016-5-7 13:39
你的出发点错了,既然已有程序只是出现问题,那应该把程序贴出来和描述问题详细,让大家给你意见去解决, ...

/*这是我们的程序,问题是实物上不能正常显示温度和报警,还有在4x4矩阵键盘上用4个键控制“设置”、“上限增”、”下限减“和“确定”,怎么弄啊,有认真检查过实物没有问题的,可以帮忙检查和修改一下吗,谢谢你了/*
测试版本1:正常显示温度
/*
测试版本1:正常显示温度
*/
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar t;
sbit DQ=P2^5;
sbit beep=P2^7;//报警蜂鸣器
//bit signal;         //报警信号
//sbit flag
//sbit bell=P3^0;        //蜂鸣器
sbit warn=P2^6;         //报警灯
uchar alarmH=35;
uchar alarmL=10;

//18b20子程序列表
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
unsigned int ReadTemperature(void);
void Init_DS18B20(void);
void delay5us(unsigned char i);
void delay3ms(void); //延时3MS子程序

void alarm();

uchar code table[12]={0xa0,0xbe,0x62,0x2a,0x3c,0x29,0x21,0xba,0x20,0x38,0xbf,0xff};//0~9的LED字符
//unsigned  uchar scanh[4]=
uchar num1[3]={11,0,0};                                   //dai xian shi
uchar weixuan[3]={0x01,0x02,0x04};
uchar i;                 //xian shi ji shu


void alarm(unsigned char t)
{
        if(t>=alarmL&&alarmH>=t)
                beep=0;       
        else
                beep=1;
           if(t>=alarmL&&alarmH>=t)
                warn=1;
         else
         warn=0;

}                

main ()
{
        unsigned char i;
        unsigned int temp;
        unsigned char TempH,TempL;
//        unsigned char j;

        TMOD=0X01;
        TH0= 0XF8;
        TL0= 0X30;
        EA=1;
        ET0=1;
        TR0=1;
        beep=0;
        while(1)
        {
                temp=ReadTemperature();

                if(temp&0x8000)
                {
                          num1[0]=10;        //负号标志
                           temp=~temp;          //求原码
                        temp +=1;
                }
                        else
                         num1[0]=11;        //正号标志
       
                TempH=temp>>4;
//                TempL=temp&0x0F;
//                TempL=TempL*6/10;        //小数近似处理

                alarm(TempH);

                num1[1]=TempH%100/10;                  //shi
                num1[2]=TempH%10;                  //ge
                for(i=0;i<4;i++)                         //延时30ms
                {
                        delay3ms();
                }
          
        }         
}
       

/******************************************************************/
/*                    延时函数                                    */
/******************************************************************/
void delay(unsigned int i)
{
while(i--);
}
/******************************************************************/
/*                    初始化                                      */
/******************************************************************/
void Init_DS18B20(void)
{
         unsigned char x=0;
//         EA=0;
         DQ = 1;            //DQ复位
         delay(8);          //稍做延时
         DQ = 0;            //单片机将DQ拉低
         delay(80);         //精确延时 大于 480us
         DQ = 1;            //拉高总线
         delay(10);
         x=DQ;              //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
         delay(5);
//         EA=1;
}

/******************************************************************/
/*                    读一个字节                                  */
/******************************************************************/
unsigned char ReadOneChar(void)
{
        unsigned char i=0;
        unsigned char dat = 0;
        EA=0;
        for (i=8;i>0;i--)
        {
                  DQ = 0; // 给脉冲信号
                  dat>>=1;
                  DQ = 1; // 给脉冲信号
                  if(DQ)
                           dat|=0x80;
                  delay(5);
        }
        return(dat);
        EA=1;
}

/******************************************************************/
/*                 写一个字节                                     */
/******************************************************************/
void WriteOneChar(unsigned char dat)
{
        unsigned char i=0;
        EA=0;
        for (i=8; i>0; i--)
        {
                DQ = 0;
                  DQ = dat&0x01;
                  delay(5);
                  DQ = 1;
                  dat>>=1;
        }
        delay(5);
        EA=1;
}

/******************************************************************/
/*                   读取温度                                     */
/******************************************************************/
unsigned int ReadTemperature(void)
{
        unsigned char a=0;
        unsigned int b=0;
        unsigned int t=0;
        Init_DS18B20();
        WriteOneChar(0xCC); // 跳过读序号列号的操作
        WriteOneChar(0x44); // 启动温度转换
        delay(200);
        Init_DS18B20();
        WriteOneChar(0xCC); //跳过读序号列号的操作
        WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
        a=ReadOneChar();           //低位
        b=ReadOneChar();           //高位
        b<<=8;                                //合成采集16位采集结果
        t=a+b;
        return(t);
}
void delay3ms(void)                     //延时3MS子程序
{ unsigned char i,j,k;
  for(i=0;i<3;i++)
    for(j=0;j<64;j++)
      for(k=0;k<51;k++);
}

void int_t0(void) interrupt 1
{
        TH0= 0Xf8;
        TL0= 0X30;
//        signal=~signal;
        P0=0xff;
        P2=weixuan;
        P0=table[num1];
        i++;
        i=i%3;
}

此帖出自51单片机论坛
 
 
 

回复

216

帖子

0

TA的资源

一粒金砂(中级)

7
 
这两天忙着在弄3d打印机所以没上来看,现在才看到你贴出程序,初步看了下没时间详细研究。你显示的问题应该是table中代码不对,除了U和L能正常显示,0~9都是乱码,修正代码后应该就能显示数字。不报警是你的alarm子程序逻辑错误,生活应用中只有低了或是高了,不会同时存在高和低吧;
此帖出自51单片机论坛
 
 
 

回复

30

帖子

0

TA的资源

一粒金砂(初级)

8
 
好的,谢谢你了
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表