入门51单片机一个多月,参加一个比赛熬夜写出了OLED+DHT11程序。
单片机源程序如下:
- #include "REG51.h"
- #include "oled.h"
- #include<intrins.h>
- typedef unsigned char BYTE;
- typedef unsigned int WORD;
- #define uint unsigned int
- #define uchar unsigned char
- sbit io=P1^2;//dht11data端接单片机的P1^0口//
- sbit IN1 = P1^0;
- sbit IN2 = P1^1; //输入电机接口
- sbit K1 = P3^0;
- sbit K2 = P3^1; //按键接口
- uchar data_byte;
- uchar RH,RL,TH,TL;
- int count1,a;
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- void DelayMs(unsigned char t)
- {
- while(t--)
- {
- //大致延时1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- void delay(uchar ms) //延时模块//
- {
- uchar i;
- while(ms--)
- for(i=0;i<100;i++);
- }
- void delay1()//一个for循环大概需要8个多机器周期一个机器周期为1us晶振为12MHz也就是说本函数延时8us多此延时函数必须德稍微精确一点
- {
- uchar i;
- for(i=0;i<1;i++);
- }
- //电机的程序
- void ZHUAN(){
-
- IN2=0;
- }
- void speed(int cnt,int sd)
- {
- if(cnt<sd)
- {
- IN1=1;
- }
- else
- {
- IN1=0;
- }
-
- }
- void turn(int cnt,int sd)
- {
- ZHUAN();
- speed(cnt,sd);
- }
- void start()//开始信号
- {
- io=1;
- delay1();
- io=0;
- delay(25);// 主机把总线拉低必须大于18ms保证DHT11能检测到起始信号
- io=1; //发送开始信号结束后拉高电平延时20-40us
- delay1();//以下三个延时函数差不多为24us符合要求
- delay1();
- delay1();
- }
- uchar receive_byte()//接收一个字节//
- {
- uchar i,temp;
- for(i=0;i<8;i++)//接收8bit的数据
- {
- while(!io);//等待50us的低电平开始信号结束
- delay1();//开始信号结束之后延时26us-28us以下三个延时函数
- delay1();
- delay1();
- temp=0;//时间为26us-28us表示接收的为数据'0'
- if(io==1)
- temp=1; //如果26us-28us之后还为高电平则表示接收的数据为'1'
- while(io);//等待数据信号高电平'0'为26us-28us'1'为70us
- data_byte<<=1;//接收的数据为高位在前右移
- data_byte|=temp;
- }
- return data_byte;
- }
- void receive()//接收数据//
- {
- uchar T_H,T_L,R_H,R_L,check,num_check,i;
- start();//开始信号//
- io=1; //主机设为输入判断从机DHT11响应信号
- if(!io)//判断从机是否有低电平响应信号//
- {
- while(!io);//判断从机发出 80us 的低电平响应信号是否结束//
- while(io);//判断从机发出 80us 的高电平是否结束如结束则主机进入数据接收状态
- R_H=receive_byte();//湿度高位
- R_L=receive_byte();//湿度低位
- T_H=receive_byte();//温度高位
- T_L=receive_byte();//温度低位
- check=receive_byte();//校验位
- io=0; //当最后一bit数据接完毕后从机拉低电平50us//
- for(i=0;i<7;i++)//差不多50us的延时
- delay1();
- io=1;//总线由上拉电阻拉高进入空闲状态
- num_check=R_H+R_L+T_H+T_L;
- if(num_check==check)//判断读到的四个数据之和是否与校验位相同
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- check=num_check;
- }
- }
- }
- int main(void)
- {
- TMOD=0x01;
- EA=1;
- TH0=(65536-1000)/256;
- TL0=(65536-1000)%256;
- ET0=1;
- TR0=1;
-
- a = 100;
- OLED_Init(); //初始化OLED
- OLED_Clear() ;
- OLED_ShowCHinese(36,0,0);
- OLED_ShowCHinese(54,0,1);
- OLED_ShowCHinese(72,0,2);
- OLED_ShowCHinese(0,2,3);
- OLED_ShowCHinese(18,2,5);
- OLED_ShowCHinese(0,4,4);
- OLED_ShowCHinese(18,4,5);
- OLED_ShowString(37,4,":",16);
- OLED_ShowString(37,2,":",16);
- while(1)
- {
- turn(count1,a);
- if(K1==0)
- {
- DelayMs(100);
- if(K1==0)// 去抖动
- {
- if(a>=0)
- a=a-10;
- }
- }
- if(K2==0)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
OLED_DHT11.zip
(97.73 KB, 下载次数: 462)
|