找回密码
 立即注册

QQ登录

只需一步,快速开始

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

SHT30的C51单片机程序 ,数码管显示,误差±1,可直接移植

  [复制链接]
跳转到指定楼层
楼主
736898032 发表于 2018-12-10 11:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <intrins.h>
#include <STC12C5A60S2.h>
#include "I2C.h"
#include "SHT30.h"
#define uint unsigned int
#define uchar unsigned char

void display();

unsigned char code tableduan[]= {
    0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71
};

uchar data DIS_ROME[6]= {0,0,0,0,0,0}; //显示缓存区(4)
uchar DISP=0;//缓存区指针
uchar SCANF=0xDF;//扫描指针
sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;

sbit VOC_A=P3^5;
sbit VOC_B=P3^6;

sbit dula=P2^6; //IO口定义
sbit wela=P2^7;
sbit key=P3^4;
sbit beep_dr=P2^3;
uint pm1 = 0;
uint pm2 = 0;
uint pm10 = 0;
uchar vr=0;
uint intrcnt=0;
bit F_1HZ;
uint voice_time_cnt;
uchar Uart_Buf;
uchar Rec_Addr=0;
uchar mode=0;
uchar Rec_Uart=0;
uchar Recive_Buf[30]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
#define key P34
#define const_key_time1  50
unsigned char ucKeySec=0;   //被触发的按键编号

unsigned int  uiKeyTimeCnt1=0; //按键去抖动延时计数器
unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志
unsigned char displaycnt=0;
void keyscan()
{
    if(key==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
    {
        ucKeyLock1=0; //按键自锁标志清零
        uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
    }
    else if(ucKeyLock1==0)//有按键按下,且是第一次被按下
    {
        uiKeyTimeCnt1++; //累加定时中断次数
        if(uiKeyTimeCnt1>const_key_time1)
        {
            uiKeyTimeCnt1=0;
            ucKeyLock1=1;  //自锁按键置位,避免一直触发
            ucKeySec=1;    //触发1号键
        }
    }

}
void keyservice()
{
        if(ucKeySec)
        {
                displaycnt=!displaycnt;
        
        }
                ucKeySec=0;

}

void UartInit(void)                //9600bps@12.000MHz
{
    TMOD=0x01;  //设置定时器0为工作方式1
    TH0=0xf8;   //重装初始值(65535-500)=65035=0xfe0b
    TL0=0x2f;


    SCON=0x50;
    TMOD=0X21;


    IP =0x10;  //把串口中断设置为最高优先级,


    EA=1;
    ES=1;
    ET0=1;
    TR0=1;
}



void T0_time(void) interrupt 1   //定时中断
{
    TF0=0;  //清除中断标志
    TR0=0; //关中断
    keyscan();
          keyservice();
    display();
    if(++intrcnt==1000)
    {
        intrcnt=0;

    }
    TH0=0xf8;
    TL0=0x2f;
    TR0=1;  //开中断

}



void display()        //LED扫描
{


    if(displaycnt==1)
                {               
                                DIS_ROME[0]=0;
                                DIS_ROME[1]=Hum_num[4];
                                DIS_ROME[2]=Hum_num[3];
                                DIS_ROME[3]=Hum_num[2];
                                DIS_ROME[4]=Hum_num[1];
                                DIS_ROME[5]=Hum_num[0];
    }
                else
                {
                                DIS_ROME[0]=0;
                                DIS_ROME[1]=TEMP_num[4];
                                DIS_ROME[2]=TEMP_num[3];
                                DIS_ROME[3]=TEMP_num[2];
                                DIS_ROME[4]=TEMP_num[1];
                                DIS_ROME[5]=TEMP_num[0];
                }



    wela=1;

    P0=SCANF;
    wela=0;

    dula=1;
    P0=tableduan[DIS_ROME[DISP]];//数据端口送数据
    dula=0;

    DISP++;//缓存指针加1
    SCANF=_cror_(SCANF,1);//扫描切换
    if(DISP==7)//缓存指针到尾
    {
        DISP=0;//计数归零
        SCANF=0xDF;//扫完四个数码管,扫描复位
    }
//        delay(5);
}




void main(void)  //主函数
{

    UartInit();

    I2C_inita();
    while(1)
    {
                        
                  Getdat_SHT30();
                  SHT30_DATEChange();
    }   
}


sht30C51.rar

46.21 KB, 下载次数: 200, 下载积分: 黑币 -5

调试ok,可以直接移植

评分

参与人数 2黑币 +65 收起 理由
perfect123 + 15 不管能不能用,赞一个
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
kodak0818 发表于 2019-3-14 16:25 | 只看该作者
感谢楼主分享
回复

使用道具 举报

板凳
perfect123 发表于 2019-3-14 20:56 | 只看该作者
撸主,我已经完全调试好了你的代码,你的代码有一些小地方需要改动,并不能直接使用,否则各种报错。
本着这是你的代码的缘由,我不便于发出修改版本,除非获得你的允许
回复

使用道具 举报

地板
qjq 发表于 2019-4-13 23:16 | 只看该作者
perfect123 发表于 2019-3-14 20:56
撸主,我已经完全调试好了你的代码,你的代码有一些小地方需要改动,并不能直接使用,否则各种报错。
本着 ...

能发给我看看嘛,我修改不出来
回复

使用道具 举报

5#
小僧悟悟 发表于 2019-4-15 22:41 | 只看该作者
perfect123 发表于 2019-3-14 20:56
撸主,我已经完全调试好了你的代码,你的代码有一些小地方需要改动,并不能直接使用,否则各种报错。
本着 ...

我也是写不出来,希望大佬发一下1553554329@qq.com
回复

使用道具 举报

6#
1450528588 发表于 2019-5-18 12:59 | 只看该作者
应该会有用吧
回复

使用道具 举报

7#
75535451 发表于 2019-5-19 11:19 | 只看该作者
感谢楼主分享
回复

使用道具 举报

8#
fdingy 发表于 2019-8-14 14:13 | 只看该作者
这个程序好像是有点问题
回复

使用道具 举报

9#
zhangshanqiao 发表于 2019-12-27 23:05 | 只看该作者
程序参考意义非凡,只需按照楼主的提示做,完全可以调试成功。
回复

使用道具 举报

10#
xiaocongya 发表于 2020-1-31 15:06 | 只看该作者
感谢楼主分享
回复

使用道具 举报

11#
xiaocongya 发表于 2020-1-31 15:07 | 只看该作者
我已经完全调试好了你的代码,你的代码有一些小地方需要改动,并不能直接使用,否则各种报错。 本着这是你的代码的缘由,我不便于发出修改版本,除非获得
回复

使用道具 举报

12#
yesheng_tang 发表于 2020-3-20 21:39 | 只看该作者
感谢楼主分享
回复

使用道具 举报

13#
azjzg10000 发表于 2020-4-14 11:20 | 只看该作者
感谢楼主分享
回复

使用道具 举报

14#
面具下的狼性 发表于 2020-5-11 23:03 | 只看该作者
新人入坑,看不懂这里的诀窍:“unsigned int  uiKeyTimeCnt1=0; //按键去抖动延时计数器
unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志
unsigned char displaycnt=0;
void keyscan()
{
    if(key==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
    {
        ucKeyLock1=0; //按键自锁标志清零
        uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。”在申明变量的时候已经赋值了,为何还要在后面重新赋值?
回复

使用道具 举报

15#
 楼主| 736898032 发表于 2020-5-18 08:59 | 只看该作者
面具下的狼性 发表于 2020-5-11 23:03
新人入坑,看不懂这里的诀窍:“unsigned int  uiKeyTimeCnt1=0; //按键去抖动延时计数器
unsigned char u ...

按键松开计时清零标记位和按键去抖计数器
回复

使用道具 举报

16#
007001z 发表于 2020-10-22 15:23 | 只看该作者
下载了,试试看
回复

使用道具 举报

17#
HSY666NB 发表于 2020-11-22 22:59 | 只看该作者
感谢大佬,借用SHT30.c的代码正常运行,调试了3 4天终于有结果了,万分感谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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