2016-09-19 19:05:23 baidu_35534327 阅读数 772
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3402 人正在学习 去看看 朱有鹏
#include <reg52.h>
#include "./delay/delay.h"

#define SEGPORT P0

sbit start = P1^0;
sbit end = P1^1;
sbit seg_select = P2^1;        
sbit bit_select = P2^0;          

unsigned char flag = 1;
unsigned char duanma[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};               
unsigned char weima[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; 
unsigned char TempData[8];

unsigned char shi = 0, fen = 0, miao = 0;

void display()
{
	  static unsigned char i = 0;
	  SEGPORT = 0x0;
	  seg_select = 1;
	  seg_select = 0;
	  
	  SEGPORT = 0xff;
	  bit_select = 1;
	  bit_select = 0;
	
	  SEGPORT = TempData[i];
	  seg_select = 1;
	  seg_select = 0;
	  
	  SEGPORT = weima[i];
	  bit_select = 1;
	  bit_select = 0;
	  
		i++;
	
	  if(8 == i)
		{
				i = 0;
    }  
}

void time0_init(void)
{
	  EA = 1;             
	  TMOD |= 0x01;
	  TH0 = (65536 - 2000) / 256;
	  TL0 = (65536 - 2000) % 256;   
	  ET0 = 1;           
	  TR0 = 1;
	   

}

void time0_isr() interrupt 1
{
		static unsigned char i = 0;
    TH0 = (65536 - 200) / 256;
	  TL0 = (65536 - 200) % 256;    
	  i++;	
	  
		if(flag)
		{
				if(50 == i)	
				{
						i = 0;
						miao++;
						if(60 == miao)
						{
					 
								miao = 0;
								fen++;
							
								if(60 == fen)
								{
										fen = 0;
										shi++;
									
										if(24 == shi)
										{
												shi = 0;
										
										}
								}
						}
				}
		}	
		TempData[0] = duanma[shi / 10];
		TempData[1] = duanma[shi % 10];
		TempData[2] = 0x40;
		TempData[3] = duanma[fen / 10];
		TempData[4] = duanma[fen % 10];
		TempData[5] = 0x40;
		TempData[6] = duanma[miao / 10];
		TempData[7] = duanma[miao % 10];
}

void time1_init(void)
{
    EA = 1;                               
	  TMOD |= 0x10;                        
	  TH1 = (65536 - 2000) / 256;
	  TL1 = (65536 - 2000) % 256;          
	  ET1 = 1;                            
	  TR1 = 1;                             
		
	 
}

void time1_isr() interrupt 3             
{
    TH1 = (65536 - 2000) / 256;
	  TL1 = (65536 - 2000) % 256; 
    
	  display();
}
                

void main()
{		
	  time1_init();
		time0_init();
	  
	  while(1)
		{
			  
				if(0 == start)
				{
					  while(!start);    //È¥¶¶¶¯
						delay_ms(10);
						while(!start);
					
						if(0 == flag)
						{
								flag = 1;
						}
						else
						{
								flag = 0;
						}
				}
				
				if(0 == end)
				{
						while(!end);         //È¥¶¶¶¯
						delay_ms(10);
						while(!end);
					
						shi = 0;
						fen = 0;
						miao = 0;							
				}
		}
}

/*****delay.c***********/
void delay_us(unsigned char t)
{
		while(--t);
}

void delay_ms(unsigned char t)
{
		while(t--)
		{
			delay_us(245);
			delay_us(245);
		
		}
}

void delay_s(unsigned char t)
{
    while(t--)
		{
        delay_ms(200);
				delay_ms(200);
			  delay_ms(200);
				delay_ms(200);
			  delay_ms(200);
		}
}

/****delay.h*******/
#ifndef _DELAY_H_
#define _DELAY_H_

extern void delay_us(unsigned char t);
extern void delay_ms(unsigned char t);
extern void delay_s(unsigned char t);

#endif

2018-08-03 17:15:08 Jiafu_Liu 阅读数 7043
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3402 人正在学习 去看看 朱有鹏

51单片机超声波测距程序:
使用模块:HC-SR04,74LS138,四位一体的8段共阴数码管等。

/********************************************************************************************************************
HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能, 测距精度可达高到 3mm;模块包括超声波发射器、接收器与控制电路。
 基本工作原理:
(1)采用 IO 口 TRIG 触发测距,给至少 10us 的高电平信号; 
(2)模块自动发送 8个40khz 的方波,自动检测是否有信号返回; 
(3)有信号返回,通过IO口ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;
*********************************************************************************************************************/
#include<reg52.h> 
#include<intrins.h> 

typedef unsigned int u16;
typedef unsigned char u8;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 DisplayData[3];
u8 code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//TRIG为控制端
sbit TRIG = P1^6; //超声波的 TRIG端  插在了P1.6口
//ECHO 为接收端
sbit ECHO = P1^7; //超声波的 ECHO端  插在了P1.7口

u8 flag = 0; //标志定时器是否溢出

/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
    while(i--); 
}

void init_time()
{
    TMOD = 0x01; //选择定时器0工作 工作方式为方式1
    TH0 = 0; //装初值0
    TL0 = 0;

    TF0 = 0; //中断溢出标志位
    ET0 = 1; //开定时器中断
    EA = 1; // 开总中断
}

/*******************************************************************************
* 函数名         :display(int num)
* 函数功能       :数码管显示函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/

void display(int num) //显示函数
{   
    u8 i;
    if(num == -1) //当超出范围 显示999
    {
        DisplayData[0] = table[9];
        DisplayData[1] = table[9];
        DisplayData[2] = table[9];
    }
    else  //显示到前三个数码管上  因为测距范围为2-400cm 故3位即可 
    {

        //取百位
        DisplayData[0] = table[num / 100]|0x80;

        //取十位
        DisplayData[1] = table[num/10%10];

        //取个位
        DisplayData[2] = table[num %10];

    }

    for(i=0;i<3;i++)
    {
        switch(i)    //位选,选择点亮的数码管,
        {
            case(0):
                LSA=0;LSB=0;LSC=0; break;//显示第0位
            case(1):
                LSA=1;LSB=0;LSC=0; break;//显示第1位
            case(2):
                LSA=0;LSB=1;LSC=0; break;//显示第2位    
        }
        P0=DisplayData[i];//发送数据
        delay(100); //间隔一段时间扫描  
        P0=0x00;//消隐
    }

}

void delayed(unsigned int x) //延时xmS
{
    unsigned int i,j;
    for(i = x; i > 0; i--)
    {
        for(j = 113; j >0; j--);
    }
}

void main()
{
    int x; 
    u16 distance,out_TH0,out_TL0;

    TRIG = 0; // 先给控制端初始化为0

    while(1)
    {
    /*超声波传感器的使用方法:
    控制口发一个10US 以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的,此时就为此次测距的时间,方可算出距离。如此不断的周期测, 就可以达到移动测量的值了*/
        init_time(); //初始化定时器
        flag = 0;    //置溢出标志位为0
        //控制口发一个10US 以上的高电平
        TRIG = 1;    
        delay(2);
        TRIG = 0;
        //等待接收端出现高电平
        while(!ECHO);
        TR0 = 1; //启动计时器 开始计时
        while(ECHO); //等待高电平结束
        TR0 = 0; //关闭低电平

        out_TH0 = TH0; //取定时器的值
        out_TL0 = TL0;
        out_TH0 <<= 8;  //右移8位 
        distance = out_TH0 | out_TL0; //合并为16位的值  
        distance /= 58; 

        if(flag == 1) //如果定时器溢出 则超出超声波测量范围
        {
            display(-1);
            flag = 0;
        }
        else
        {
            for(x =5; x >=0; x--)//加此循环只是为了将结果在数码管上停留时间长点便于观察
            {
                display(distance);
            }
        }
        delay(600);//60ms的周期,这里不是6ms,太多会闪烁。
    }

}

void timer0() interrupt 1 //中断函数
{
    flag=1; //溢出标志位置1
}

实验结果:
这里写图片描述

2011-12-11 22:04:57 yxtouch 阅读数 716
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3402 人正在学习 去看看 朱有鹏

/*

此代码为一个单片机简单通信程序,程序实现功能为PC机向单片机发A然后单片机向PC会B,程序仅供大家参考。

*/


#include <reg51.h>

sfr AUXR   = 0x8E;

void InitUART(void)
{
    TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xDC;
    TL1 = TH1;
    PCON = 0x00;
    EA = 1;
    ES = 1;
    TR1 = 1;
}

void SendOneByte(unsigned char c)
{
    SBUF = c;
    while(!TI);
    TI = 0;
}

void main(void)
{
    AUXR = AUXR|0x40;  // T1, 1T Mode
    InitUART();
}

void UARTInterrupt(void) interrupt 4
{
    static number;
    if(RI)
    {
        RI = 0;
  number = SBUF;
  number = number+1;
  SendOneByte(number);
    }
    else
        TI = 0;
}

 

2019-10-30 21:46:37 qq_44629109 阅读数 166
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3402 人正在学习 去看看 朱有鹏

单片机独立按键使用程序 (51单片机)

独立按键是单片机中很重要的一个器件,在这篇文章里,通过这个用独立按键控制LED灯的小程序来介绍独立按键开关的使用。

#include<reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit key=P3^1; 
sbit led=P2^0;  

void delay(u16 num)//延时函数
{
 u16 x,y;
 for(x=num;x>0;x--)
  for(y=110;y>0;y--)
 {
  ;
 }
}
void main(void)
{
 led=1;
 while(1)
{
 if(key==0)
 {
  
  delay(10);//消抖程序
  if(key==0)
  {
  led=~led;//取反
  }
  while(!key);//使灯在开关下一次按下之前不发生变化,不跳出大循环
 }
}
}

两次按下按键的结果图
1

在这里插入图片描述

运行视频
在这里插入图片描述

2018-03-29 22:16:31 u010659978 阅读数 590
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3402 人正在学习 去看看 朱有鹏

我们都听说过微信小程序,但是你听说过用单片机开发的小程序吗?

世界上没有什么不可以做,只是你没想到。。。。。。见图,所见即所得:



图中的手机可不是一般的手机,其内部包含了stm32单片机,我们叫它智能屏,这里讲的智能屏其实就是手机模块与单片机结合开发的智能屏。我们可以利用上层软件平台给单片机提供的API,在单片机上用C语言开发小程序。

此屏可不一样,对,我们不一样!!!

说多没有用,详细情况可以了解我在公司论坛上发的一篇帖子,帖子里有demo,代码+视频演示:

点击打开链接

单片机程序框架

阅读数 474

单片机程序框架

博文 来自: qq_41262681

单片机简单程序

阅读数 639

没有更多推荐了,返回首页