中科昊芯DSC28034湖人版OLED屏上显示温湿度值

/******************************************************************
编  译  器:haawking ide v0.1.2
  d  s  p:dsc28034湖人板
电 脑 配 置:windows10 专业版; 64 位操作系统
仿  真  器:hx100v2
使  用  库:无
作         用:在oled屏上显示温湿度值
说         明:debug as程序后在oled屏上显示温湿度数值
版         本:v0.0.1
******************************************************************/
第一步:创建工程
上篇文章中有具体流程,这里不做过多赘述
第二步:编程
根据官方提供的dht11使用手册。流程如下:
dht11链接:https://pan.baidu.com/s/1dxby9vmtx5blxtpix6okkq 
提取码:8034
将gpio0设为普通io口,并设置为输出状态,拉高主机,拉低主机18-20ms,拉高主机20-40us;设置为输入状态,等待从机响应;响应过后判断输入的高电平,在高电平段延时40us后仍为高电平则输入1,为低电平则输入0。
程序如下:
dht11.c
//初始化gpio0
void gpio0_init(void)
{
eallow;
gpioctrlregs.gpapud.bit.gpio0 = 0;
gpioctrlregs.gpamux1.bit.gpio0 =0;
gpioctrlregs.gpaqsel1.bit.gpio0 = 0;
edis;
}
//主机输出设置
void dht11_rst(void)
{
uchar i;
eallow;
dat_dir=1;
edis;
// // test
// while(1) {
// dat= 0;
// delay_us(10);
// dat = 1;
// delay_us(10);
// }
dat= 0;
delay_us(300000);
dat = 1;
delay_us(350);
}
(注:程序中的test目的是测试延时函数delay_us()的真实值)
//等待dht11的响应
uint8 dht11_check(void){
uint8 retry=0;
eallow;
dat_dir=0;
edis;
    while (dat&&retry=100)return 1; else retry=0;
    while (!dat&&retry=100)return 1;else return 0;
}
//初始化dht11
uint8 dht11_init (void){
dht11_rst();
return dht11_check();
}
//从dht11读取一个位
uchar dht11_readbit(void){
    uchar retry=0;
    while (dat&&retry<100){
           retry++;
            delay_us(1);
        }
       retry=0;
    while(!dat&&retry<100){
      retry++;
      delay_us(1);
    }
    delay_us(400);
    if(dat)return 1; else return 0;
}
//从dht11读取一个字节
uchar dht11_readbyte(void){
    uchar i,dat;
    dat=0;
    for (i=0;i<8;i++){
        dat<<=1;
        dat|=dht11_readbit();
    }
    return dat;
}
//读取一次数据
uint8 dht11_readdata(uint8 *temp,u8 *humi){
uchar buf[5];
uchar i;
dht11_rst();
    if(dht11_check()==0){
        for(i=0;i<5;i++){
            buf[i]=dht11_readbyte();
        }
        if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]){
        *humi=buf[0];
        *temp=buf[2];
        }
    }
}
dht11.h
#define uchar                  unsigned char
#define dat_dir gpioctrlregs.gpadir.bit.gpio0 
#define dat gpiodataregs.gpadat.bit.gpio0
extern char temp[4];
void gpio0_init(void);
void dht11_rst(void);
uint8 dht11_check(void);
uint8 dht11_init (void);
uchar dht11_readbit(void);
uchar dht11_readbyte(void);
uint8 dht11_readdata(uint8 *temp,u8 *humi);
这里给出oled屏.h取字模板,oled模块例程主页有,还请自行参考
static int hzk[][32]=
{
{0x10,0x60,0x02,0x8c,0x00,0x00,0xfe,0x92,0x92,0x92,0x92,0x92,0xfe,0x00,0x00,0x00},
{0x04,0x04,0x7e,0x01,0x40,0x7e,0x42,0x42,0x7e,0x42,0x7e,0x42,0x42,0x7e,0x40,0x00},/*温,0*/
{0x10,0x60,0x02,0x8c,0x00,0xfe,0x92,0x92,0x92,0x92,0x92,0x92,0xfe,0x00,0x00,0x00},
{0x04,0x04,0x7e,0x01,0x44,0x48,0x50,0x7f,0x40,0x40,0x7f,0x50,0x48,0x44,0x40,0x00},/*湿,1*/
{0x00,0x00,0xfc,0x24,0x24,0x24,0xfc,0x25,0x26,0x24,0xfc,0x24,0x24,0x24,0x04,0x00},
{0x40,0x30,0x8f,0x80,0x84,0x4c,0x55,0x25,0x25,0x25,0x55,0x4c,0x80,0x80,0x80,0x00},/*度,2*/
};
static int f8x16[]=
{
0x00,0xe0,0x10,0x08,0x08,0x10,0xe0,0x00,0x00,0x0f,0x10,0x20,0x20,0x10,0x0f,0x00,/*0,0*/
0x00,0x00,0x10,0x10,0xf8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3f,0x20,0x20,0x00,/*1,1*/
0x00,0x70,0x08,0x08,0x08,0x08,0xf0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*2,2*/
0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1c,0x00,/*3,3*/
0x00,0x00,0x80,0x40,0x30,0xf8,0x00,0x00,0x00,0x06,0x05,0x24,0x24,0x3f,0x24,0x24,/*4,4*/
0x00,0xf8,0x88,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x20,0x20,0x20,0x11,0x0e,0x00,/*5,5*/
0x00,0xe0,0x10,0x88,0x88,0x90,0x00,0x00,0x00,0x0f,0x11,0x20,0x20,0x20,0x1f,0x00,/*6,6*/
0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,0x00,0x00,0x00,0x3e,0x01,0x00,0x00,0x00,/*7,7*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1c,0x22,0x21,0x21,0x22,0x1c,0x00,/*8,8*/
0x00,0xf0,0x08,0x08,0x08,0x10,0xe0,0x00,0x00,0x01,0x12,0x22,0x22,0x11,0x0f,0x00,/*9,9*/
0xc0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,/*c,10*/
0xf0,0x08,0xf0,0x80,0x60,0x18,0x00,0x00,0x00,0x31,0x0c,0x03,0x1e,0x21,0x1e,0x00,/*%,11*/
0x00,0x00,0x04,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*^,12*/
0x08,0xf8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3f,0x20,0x00,0x03,0x0c,0x30,0x20,/*r,13*/
0x08,0xf8,0x08,0x00,0x00,0x08,0xf8,0x08,0x20,0x3f,0x21,0x01,0x01,0x21,0x3f,0x20,/*h,14*/
};
main.c
void delay();
uint8 temperature;
uint8 humidity;
void main(void)
{
initsysctrl();
dint;
initpiectrl();
ier_disable(0xffff);
ifr_disable(0xffff);
initpievecttable();
initcputimers();
    gpio0_init();
    i2c_gpio_config_oled();
    oled_init();
oled_clear();
oled_showchinese(0,0,0);
oled_showchinese(16,0,2);
oled_showchinese(0,4,1);
oled_showchinese(16,4,2);
    while(1)
    {
          dht11_readdata(&temperature,&humidity);
      oled_shownum(40,0,temperature,2,16);
      oled_shownum(40,4,humidity,2,16);
oled_showchar(56,0,12,16);
oled_showchar(64,0,10,16);
oled_showchar(56,4,11,16);
oled_showchar(64,4,13,16);
oled_showchar(72,4,14,16);
      delay();
   }
}
void delay(void)
{
for(int i=0;i<50000;i++);
}
第三步:调试与显示温湿度
调试无错后,全速状态下显示的温湿度值会因环境温湿度的变化而变化,显示效果如下:
特别鸣谢 原创作者 博主「晟逸轩」

Google似乎正在测试Google搜索用户界面中的细微调整
中国已成为数字医疗行业的领军者
耳机用无线还是有线 到底哪一种比较好
5G云游戏和VR集于一体?
研究人员开发半透明太阳能电池 可用于车辆天窗
中科昊芯DSC28034湖人版OLED屏上显示温湿度值
彩电行业即迎来一轮新的巨变?
纯电容补偿为什么会放大谐波
CEVA推出增强型NeuPro-M NPU IP系列,大力推动生成式人工智能(Generative AI)
“电磁炉”也做无线充电器,iPad也可以充!(实物赏析)
如何用算法来压榨MCU的性能
在传统印刷工艺中植入 NFC 芯片可通过中国邮政 App 读取芯片内容
麻省理工无电池自供电传感器,实现环境能量获取
超28小时续航 荣耀亲选Earbuds X2双11超低折扣
NASA使用HoloLens模拟“蜻蜓”登陆土星泰坦计划
区块链颠覆人类未来生活?究竟有没有未来
突发!软银集团发生人事变动:首席战略官计划离职
全球第一款360度视角VR眼镜发布 竟然还支持通话发短信刷微信
白宫表示将会在两年的最后期限前禁止与华为合作
JST端子/连接器的使用注意事项