单片机学习笔记

介绍一些基础知识

单片机实验板

普中51单片机

软件 keil 和 stc-isp

我们安装的是 Keil5 C51 另外的版本 比如 Keil5 MDK 是用来开发 stm32的

单片机介绍

是什么

它是一块芯片 集成电路 英文Micro Controller Unit,简称MCU

内部集成了CPU、RAM、ROM、IO口输入/输出设备、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能

单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(例如电机,LED等)的控制

单片机跟计算机相比,单片机算是一个袖珍版计算机,一个芯片就能构成完整的计算机系统。但在性能上,与计算机相差甚远,但单片机成本低、体积小、结构简单,在生活和工业控制领域大有所用

学习使用单片机是了解计算机原理与结构的最佳选择 要学STM32 先花点时间入门51

型号

51 单片机是对所有兼容 Intel 8031 指令系统的单片机的统称。有很多公司 做单片机 有很多型号:

Intel(英特尔)的:i80C31、i80C51、i87C51,i80C32、i80C52、i87C52 等;

ATMEL(艾德梅尔)的:AT89C51、AT89C52、AT89C2051,AT89S51(RC),AT89S52 (RC)等;

Philips(飞利浦)、华邦、Dallas(达拉斯)、Siemens(西门子)等公司的许多产品;

STC(国产宏晶)单片机:STC89C51、STC89C52、STC89C516、STC90C516 等众多品牌。

能做什么

单片机目前的应用可以说是铺天盖地,比如说家里的电饭煲、微波炉、电磁炉、冰箱、空调、洗衣机,内部就是用单片机加不同的外围电路实现的。 还有就是共享单车、共享充电宝、充电桩、指纹锁这些就是属于物联网的一些应用,内部也是单片机配合不同电路实现。

如何学

C语言基础

数电模电很少的基础

跟着做

调试

兴趣… 作品 竞赛 考研 工作…

单片机原理介绍

单片机内部结构

在这里插入图片描述

单片机管脚图

在这里插入图片描述

单片机最小系统

在这里插入图片描述

开发板原理图

在这里插入图片描述

KeilC51安装

安装破解

工程项目建立

工程项目设置 魔术棒 点一下 output 生成hex 打钩 在编译生成hex文件

使用stc-isp 把hex文件烧录到 单片机内部

烧录之前记得 安装 ch340 驱动

直接安装 就可以

点亮LED灯

#include<reg51.h>

void delay()
{
	int i,j;
	for(i=0;i<1000;i++)
		for(j=0;j<100;j++);			
}

int main()
{
	while(1)
	{
			P2 = 0xfe;
			delay();
			P2 = 0xff;
			delay();
	}
}

了解 led 电路原理

了解 单片机 IO口 和 电路图之间的联系

熟悉 二进制 十六进制

十进制二进制十六进制
000
111
2102
3113
41004
51015
61106
71117
810008
910019
101010A
111011B
121100C
131101D
141110E
151111F

C51数据类型

8个LED灯移位

向右移位 >> 位运算 或 |

#include<reg51.h>
unsigned char leds,i;
void delay()
{
	int i,j;
	for(i=0;i<1000;i++)
		for(j=0;j<10;j++);			
}

int main()
{
	leds = 0x7f;  //0111 1111
								//1011 1111
								//1101 1111
	while(1)
	{
		leds = 0x7f;
		for(i=0;i<8;i++)
		{
			P2 = leds;
			delay();
			leds = (leds>>1)|0x80;
		}
	}
}

通过数组完成

#include<reg51.h>
unsigned char leds,i;
unsigned char led_s[8]={0x7f,0xbf ,0xdf ,0xef ,0xf7 ,0xfb ,0xfd ,0xfe};
void delay()
{
	int i,j;
	for(i=0;i<1000;i++)
		for(j=0;j<10;j++);			
}

int main()
{
	leds = 0x7f;//0111 1111
				//1011 1111
				//1101 1111....
	while(1)
	{ 
		for(i=0;i<8;i++)
		{
			P2 = led_s[i]; 
			delay();
		}
	}
}

发现Keil 的tab键是2个空格

蜂鸣器

//蜂鸣器模块 三个脚  VCC  GND  I/O--P1.0
#include<reg51.h>
sbit feng = P1^0;  //sbit定义IO口
unsigned char leds,i;
unsigned char led_s[8]={0x7f,0xbf ,0xdf ,0xef ,0xf7 ,0xfb ,0xfd ,0xfe};
void delay()
{
	int i,j;
	for(i=0;i<1000;i++)
		for(j=0;j<10;j++);			
}
void delay_1()//蜂鸣器小延时
{
	unsigned int i,j;
	for(i=0;i<6000;i++);			
}


int main()
{
	feng = 0; //蜂鸣器
	leds = 0x7f; 
	while(1)
	{ 
		for(i=0;i<8;i++)
		{
			P2 = led_s[i]; 
			delay(); 
		}
		//蜂鸣器响一次
		feng = 1;
		delay_1();//蜂鸣器小延时
		feng = 0;
	}
}

静态数码管实验

//0-9循环显示
#include "reg51.h"

typedef unsigned int uint;	 
typedef unsigned char uchar;

#define duanma	P0	 
 
uchar duanmas[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar n=0;
void delay()
{
	int i,j;
	for(i=0;i<1000;i++)
		for(j=0;j<100;j++);			
}
				
void main()
{	
	P2 = 0x0c;  //138译码器 选择哪个数码管 P2.2 P2.3 P2.4三个脚决定
	while(1)
	{
		duanma = duanmas[n];//查表得到短码给 P0
		delay();
		n++;
		if(n==10)
			n=0;
	   	
	}		
}

数码管动态扫描

//0-9循环显示
#include "reg51.h"

typedef unsigned int uint;	 
typedef unsigned char uchar;

#define duanma	P0	 
 
uchar duanmas[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
uchar s[8]={8,2,4,17,17,17,17,17};
uint n;
void delay()
{
	int i,j;
	for(i=0;i<10;i++)
		for(j=0;j<10;j++);			
}
jisuan()
{	
	s[0]=n%10;
	s[1]=n/10%10;
	s[2]=n/100;
}
				
void main()
{	
	uchar i=1;
	P2 = i<<2;  //138译码器 选择哪个数码管 P2.2 P2.3 P2.4三个脚决定
	n=567;

	s[0]=n%10;
	s[1]=n/10%10;
	s[2]=n/100;	
	while(1)
	{ 
		for(i=0;i<8;i++)
		{
			P2 = i<<2;  //显示位置   138译码器 选择哪个数码管 P2.2 P2.3 P2.4三个脚决定 
			duanma = duanmas[s[i]];//查表得到短码给 P0
			delay();
			jisuan();
			duanma = 0x00;//消影
		} 
	}		
}

 

数码管时钟显示

//0-9循环显示
#include "reg51.h"

typedef unsigned int uint;	 
typedef unsigned char uchar;

#define duanma	P0	 
 
uchar duanmas[19]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0,0x40};
uchar s[8]={2,1,18,6,5,18,3,1};
uint h=23, m=59, sec=50;//小时分钟秒
uchar t = 0; 
void delay()
{
	int i,j;
	for(i=0;i<10;i++)
		for(j=0;j<10;j++);			
}
jisuan()
{	
	s[0]=sec%10;
	s[1]=sec/10;
	 
	s[3]=m%10;
	s[4]=m/10; 
	
	s[6]=h%10;
	s[7]=h/10;
}
				
void main()
{	
	uchar i=1;
	P2 = i<<2;  //138译码器 选择哪个数码管 P2.2 P2.3 P2.4三个脚决定
	 
	jisuan();
	 
	while(1)
	{ 
		//刷新8个数码管
		for(i=0;i<8;i++)
		{
			P2 = i<<2;  //显示位置   138译码器 选择哪个数码管 P2.2 P2.3 P2.4三个脚决定 
			duanma = duanmas[s[i]];//查表得到短码给 P0
			delay();
			duanma = 0x00;//消影
		} 
		t++;
		if(t==80)//一秒差不多到了
		{
			t=0;
			sec++;
			if(sec==60)
			{
				sec = 0;
				m ++;
				if(m==60)
				{
					m = 0;
					h++;
					if(h==24)
					{
						h=0;
					}
				}
			} 
			jisuan();//将变量的 每一位 分配到s数组 用于显示
		}
	}		
}

 

调整时间

  1. 第0位闪烁 shezhiwei
  2. key1 移位按键 shezhiwei 可以 加1
  3. key2 加一键 某一位 加1 调整 sec m h
  4. 取余 数据合规
//0-9循环显示
#include "reg51.h"

typedef unsigned int uint;	 
typedef unsigned char uchar;

#define duanma	P0	 
//定义独立按键控制脚
sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;

 
uchar duanmas[19]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0,0x40};
uchar s[8]={2,1,18,6,5,18,3,1};
uint h=23, m=59, sec=50;//小时分钟秒
uchar t = 0; 
uchar shezhi_wei=-1;
/*******************************************************************************
* 函数功能		 : 延时函数,ten_us=1时,大约延时10us
*******************************************************************************/
void delay_10us(uint ten_us)
{
	while(ten_us--);	
}

void delay()
{
	int i,j;
	for(i=0;i<10;i++)
		for(j=0;j<10;j++);			
}
jisuan()
{	
	s[0]=sec%10;
	s[1]=sec/10;
	 
	s[3]=m%10;
	s[4]=m/10; 
	
	s[6]=h%10;
	s[7]=h/10;
}
				
void main()
{	
	uchar i=1;
	P2 = i<<2;  //138译码器 选择哪个数码管 P2.2 P2.3 P2.4三个脚决定
	 
	jisuan();
	 
	while(1)
	{ 
		//刷新8个数码管
		for(i=0;i<8;i++)
		{
			P2 = i<<2;  //显示位置   138译码器 选择哪个数码管 P2.2 P2.3 P2.4三个脚决定 
			if(t<50 && i==shezhi_wei)
				duanma = 0;
			else
				duanma = duanmas[s[i]];//查表得到短码给 P0
			delay();
			duanma = 0x00;//消影
		} 
		t++;
		if(t==100)//一秒差不多到了
		{
			t=0;
			if(shezhi_wei==-1)
			{
				sec++;
				if(sec==60)
				{
					sec = 0;
					m ++;
					if(m==60)
					{
						m = 0;
						h++;
						if(h==24)
						{
							h=0;
						}
					}
				} 
				jisuan();//将变量的 每一位 分配到s数组 用于显示
			}
		}

		if(KEY1 == 0)//检测按键K1是否按下   移位
		{
			delay_10us(1000);//消抖
			while(KEY1==0);
			shezhi_wei++;
			if(shezhi_wei==8)
				shezhi_wei=-1;
			if(shezhi_wei==2)
				shezhi_wei++;
			else if(shezhi_wei==5)
				shezhi_wei++;
		}
		if(KEY2 == 0)//检测按键K2是否按下 某位  +1
		{
			delay_10us(1000);//消抖
			while(KEY2==0);
			if(shezhi_wei==0)
			{
				sec++;
				sec%=60;
				jisuan();
			}
			else if(shezhi_wei==1)
			{
				sec+=10;
				sec%=60;
				jisuan();
			}
			else if(shezhi_wei==3)
			{
				m++;
				m%=60;
				jisuan();
			}
			else if(shezhi_wei==4)
			{
				m+=10;
				m%=60;
				jisuan();
			}
			else if(shezhi_wei==6)
			{
				h++;
				h%=24;
				jisuan();
			}
			else if(shezhi_wei==7)
			{
				h+=10;	
				h%=24;
				jisuan();
			}
		}
	}		
}

 

LCD1602

详见开发板程序即可


液晶打印number

//方法1 自己写一个 变量分配到字符串数组的函数 jisuan
u8 num = 123;
u8 num_s[5] = {'1','5','6','\0'};
void jisuan()
{
	num_s[0]='0'+num/100;
	num_s[1]='0'+num/10%10;
	num_s[2]='0'+num%10;
}
lcd1602_show_string(0,0,num_s);//µÚÒ»ÐÐÏÔʾ


//方法2 网上找个程序 大致如下
int LCD_Pow(unsigned char x,unsigned char y)
{
		int result = 1;
		unsigned char i = 0;
		
		for(i=0;i<y;i++)
		{
				result *= x;
		}
		
		return result;
}

void LCD_ShowNum(unsigned char Line,unsigned char Columu,unsigned int Num,unsigned int Length)
{
		unsigned char i = 0;
		
		LCD_SetCursor(Line,Columu);
		
		for(i=Length;i>0;i--)
		{
				LCD_WriteData('0'+Num/LCD_Pow(10,i-1)%10);
		}
}
 
方法3 通过 	sprintf(buf, "a = %d", (int)m);
需要加上 头文件  #include <stdio.h>

	u8 buf1[16];
	u8 buf2[16];
	float f1 = 3.14;
	u8 num=123sprintf(buf1, "a = %d", (int)m);
	sprintf(buf2, "f = %.2f", f1);
	lcd1602_init();//LCD1602初始化
	lcd1602_show_string(0,0,buf1);//显示 buf1 
	lcd1602_show_string(0,1,buf2);//显示 buf2 

温度传感器 DS18B20

//添加 ds18b20  public lcd1602 .c和.h的文件

#include "public.h"
#include "lcd1602.h"
#include <stdio.h> 
#include "ds18b20.h" 

void main()
{	 
	u8 buf1[16];  
	
	float t;
	 
	ds18b20_init();//DS18B20³õʼ»¯
	lcd1602_init();//LCD1602³õʼ»¯
	while(1)
	{
		delay_ms(1000);
		t = ds18b20_read_temperture(); //»ñȡζÈ
		sprintf(buf1, "t = %.2f",t);   //t --> buf1
		lcd1602_show_string(0,0,buf1);//ÏÔʾζÈ
	}	
}


定时器中断

  1. 中断 类型 中断的概念
  2. 中断涉及到的特殊寄存器 在内存里 每个字节的每一位 就像有特殊功能的开关
  3. 中断的触发条件 外部终端 信号的跳变 ;定时器中断是 计数器溢出
  4. 定时器的模式
#include "public.h"
#include "lcd1602.h"
#include <stdio.h> 
#include "ds18b20.h" 

	u8 buf1[16];   
	float t;
	u8 flag = 0;
//¶¨Ê±Æ÷0³õʼ»¯º¯Êý
void time0_init(void)
{
	TMOD|=0X01;//Ñ¡ÔñΪ¶¨Ê±Æ÷0ģʽ£¬¹¤×÷·½Ê½1
	TL0 = 0x00;		//??????
	TH0 = 0x4C;		//??????	
	ET0=1;//´ò¿ª¶¨Ê±Æ÷0ÖжÏÔÊÐí
	EA=1;//´ò¿ª×ÜÖжÏ
	TR0=1;//´ò¿ª¶¨Ê±Æ÷		
}


void time0() interrupt 1 //¶¨Ê±Æ÷0ÖжϺ¯Êý
{
	static u16 i;//¶¨Ò徲̬±äÁ¿i	
	TL0 = 0x00;		//¸ø¶¨Ê±Æ÷¸³³õÖµ£¬¶¨Ê±50ms
	TH0 = 0x4C;	 
	i++;
	if(i==20)
	{
		i=0; 
		flag = 1;
	}						
}

void main()
{	

	
	ds18b20_init();//DS18B20³õʼ»¯
	lcd1602_init();//LCD1602³õʼ»¯
	time0_init();//¶¨Ê±Æ÷0ÖжÏÅäÖÃ

	while(1)
	{ 
		if(flag==1)
		{	 
			flag=0;
			t = ds18b20_read_temperture(); //»ñȡζÈ
			sprintf(buf1, "t = %.2f",t);   //t --> buf1
			lcd1602_show_string(0,0,buf1);//ÏÔʾζÈ
		}
	}

}

	
	

多位数码管扫描(定时器)

//0-9循环显示
#include "reg51.h"

typedef unsigned int uint;	 
typedef unsigned char uchar;

#define duanma	P0	 
//定义独立按键控制脚
sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;

 
uchar duanmas[19]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0,0x40};
uchar s[8]={2,1,18,6,5,18,3,1};
uint h=23, m=59, sec=50;//小时分钟秒
uint t = 0; 
uchar shezhi_wei=-1;
//定时器初始化

uchar i=0;//显示位置

void time0_init(void)
{
	TMOD|=0X01;//选择为定时器0模式,工作方式1
	TL0 = (-2000)%256;		//2ms延时
	TH0 = (-2000)/256;		//	
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
	TR0=1;//打开定时器		
}



/*******************************************************************************
* 函数功能		 : 延时函数,ten_us=1时,大约延时10us
*******************************************************************************/
void delay_10us(uint ten_us)
{
	while(ten_us--);	
}

void delay()
{
	int i,j;
	for(i=0;i<10;i++)
		for(j=0;j<10;j++);			
}
jisuan()
{	
	s[0]=sec%10;
	s[1]=sec/10;
	 
	s[3]=m%10;
	s[4]=m/10; 
	
	s[6]=h%10;
	s[7]=h/10;
}

void time0() interrupt 1 //定时器0中断函数  2ms
{ 
	TL0 = (-2000)%256;		//2ms延时
	TH0 = (-2000)/256;		//		

	duanma = 0x00;//消影 	
	P2 = i<<2;  //显示位置   138译码器 选择哪个数码管 P2.2 P2.3 P2.4三个脚决定 
	if(t<250 && i==shezhi_wei)
		duanma = 0;
	else
		duanma = duanmas[s[i]];//查表得到短码给 P0
	i++;
	if(i==8)
		i=0;
	
	t++;
	if(t==500)//一秒差不多到了
	{
		t=0;
		if(shezhi_wei==-1)
		{
			sec++;
			if(sec==60)
			{
				sec = 0;
				m ++;
				if(m==60)
				{
					m = 0;
					h++;
					if(h==24)
					{
						h=0;
					}
				}
			} 
			jisuan();//将变量的 每一位 分配到s数组 用于显示
		}
	}

}

				
void main()
{	
	P2 = i<<2;  //138译码器 选择哪个数码管 P2.2 P2.3 P2.4三个脚决定
	 
	time0_init();
	jisuan();
	 
	while(1)
	{  
		if(KEY1 == 0)//检测按键K1是否按下   移位
		{
			delay_10us(1000);//消抖
			while(KEY1==0);
			shezhi_wei++;
			if(shezhi_wei==8)
				shezhi_wei=-1;
			if(shezhi_wei==2)
				shezhi_wei++;
			else if(shezhi_wei==5)
				shezhi_wei++;
		}
		if(KEY2 == 0)//检测按键K1是否按下   +1
		{
			delay_10us(1000);//消抖
			while(KEY2==0);
			if(shezhi_wei==0)
			{
				sec++;
				sec%=60;
				jisuan();
			}
			else if(shezhi_wei==1)
			{
				sec+=10;
				sec%=60;
				jisuan();
			}
			else if(shezhi_wei==3)
			{
				m++;
				m%=60;
				jisuan();
			}
			else if(shezhi_wei==4)
			{
				m+=10;
				m%=60;
				jisuan();
			}
			else if(shezhi_wei==6)
			{
				h++;
				h%=24;
				jisuan();
			}
			else if(shezhi_wei==7)
			{
				h+=10;	
				h%=24;
				jisuan();
			}
		}
	}		
}

 

PWM

什么是PWM

脉冲宽度调制。。。

#include "public.h"
#include "lcd1602.h"
#include <stdio.h>  
 
sbit led = P2^0;
//定时器初始化
void time0_init(void)
{
	TMOD|=0X01;// 
	TL0 = 0x48;		// 约200us
	TH0 = 0xFF;		// 
	ET0=1;//´ 
	EA=1;// 
	TR0=1;//´ 
}


void time0() interrupt 1 // 
{
	static u16 i;// 	
	TL0 = 0x48;		// 
	TH0 = 0xFF;		//  
	i++;
	if(i<20)  //i  0-99 之间给占空比
		led = 1;
	else
		led = 0;
	if(i==100)
		i = 0;
}

void main()
{	
 
	time0_init();// 

	while(1)
	{ 
		 
	}

}

	
	

速度控制

#include "public.h"
#include "lcd1602.h"
#include <stdio.h> 
#include "ds18b20.h" 

u8 buf1[16];   
float t;
u8 flag = 0;
u16 zhuansu=0;
u8 mubiaozs= 36;
u8 pwm = 20;
sbit led = P2^0;
//¶¨Ê±Æ÷0³õʼ»¯º¯Êý
void time_init(void)//ÅäÖà ¶¨Ê±Æ÷0 ¼ÆÊýÆ÷1  
{
	TMOD|=0x51;//Ñ¡ÔñΪ¶¨Ê±Æ÷0ģʽ£¬¹¤×÷·½Ê½1
	TL0 = 0x48;		// 
	TH0 = 0xFF;		// 
	
	TL1 = 0x00;		// 
	TH1 = 0x00;		// 
	
	ET0=1;//´ò¿ª¶¨Ê±Æ÷0ÖжÏÔÊÐí
	EA=1;//´ò¿ª×ÜÖжÏ
	TR0=1;//´ò¿ª¶¨Ê±Æ÷0		
	TR1=1;//´ò¿ª¼ÆÊýÆ÷1		
}


void time0() interrupt 1 //¶¨Ê±Æ÷0ÖжϺ¯Êý  200us
{
	static u16 i;//¶¨Ò徲̬±äÁ¿i	
	TL0 = 0x48;		// 
	TH0 = 0xFF;		//  
	i++;
	if(i<pwm)  //i´Ó0-99µ÷½Ú Õ¼¿Õ±È
		led = 1;
	else
		led = 0;
	if(i==100)//20ms 
	{
		i = 0; 
		zhuansu = TH1*256+TL1;//»ñµÃÂö³åÊý
		TH1=0;	//Çå0
		TL1=0;
		flag=1;
		
		//获得速度 与 目标速度 比较 调整 pwm
		if(zhuansu < mubiaozs)
		{
			pwm++;
		}
		else if(zhuansu > mubiaozs)
		{
			pwm--;
		}
		if(pwm>90)//限制pwm
			pwm = 90;
		else if(pwm<0)
			pwm = 0;
			
	}
}

void main()
{	

	 
	lcd1602_init();//LCD1602³õʼ»¯
	time_init();//¶¨Ê±Æ÷0ÖжÏÅäÖÃ

	while(1)
	{  
		if(flag==1)
		{	 
			flag=0;
			sprintf(buf1, "zhuansu = %d",(int)zhuansu);   //ËÙ¶ÈÏÔʾ
			lcd1602_show_string(0,0,buf1);//ÏÔʾζÈ
			
			sprintf(buf1, "pwm = %d",(int)pwm);   //PWMÏÔʾ
			lcd1602_show_string(0,1,buf1);//ÏÔʾPWM
		}
		
	}

}

	
	

红外遥控

#include "public.h"
#include "smg.h"
#include "ired.h"
 
void main()
{	
	u8 ired_buf[3];

	ired_init();//ºìÍâ³õʼ»¯

	while(1)
	{				
		ired_buf[0]=gsmg_code[gired_data[2]/16];//½«¿ØÖÆÂë¸ß4λת»»ÎªÊýÂë¹Ü¶ÎÂë
		ired_buf[1]=gsmg_code[gired_data[2]%16];//½«¿ØÖÆÂëµÍ4λת»»ÎªÊýÂë¹Ü¶ÎÂë
		ired_buf[2]=0X76;//ÏÔʾHµÄ¶ÎÂë
		smg_display(ired_buf,6);	
	}		
}

if(i==100)//20ms 
{
	i = 0; 
	zhuansu = TH1*256+TL1;//»ñµÃÂö³åÊý
	TH1=0;	//Çå0
	TL1=0;
	flag=1;
	
	//获得速度 与 目标速度 比较 调整 pwm
	if(zhuansu < mubiaozs)
	{
		pwm++;
	}
	else if(zhuansu > mubiaozs)
	{
		pwm--;
	}
	if(pwm>90)//限制pwm
		pwm = 90;
	else if(pwm<0)
		pwm = 0;
		
}

}

void main()
{

lcd1602_init();//LCD1602³õʼ»¯
time_init();//¶¨Ê±Æ÷0ÖжÏÅäÖÃ

while(1)
{  
	if(flag==1)
	{	 
		flag=0;
		sprintf(buf1, "zhuansu = %d",(int)zhuansu);   //ËÙ¶ÈÏÔʾ
		lcd1602_show_string(0,0,buf1);//ÏÔʾζÈ
		
		sprintf(buf1, "pwm = %d",(int)pwm);   //PWMÏÔʾ
		lcd1602_show_string(0,1,buf1);//ÏÔʾPWM
	}
	
}

}


# 红外遥控

[外链图片转存中...(img-ltTdETXp-1697851615282)]

~~~c
#include "public.h"
#include "smg.h"
#include "ired.h"
 
void main()
{	
	u8 ired_buf[3];

	ired_init();//ºìÍâ³õʼ»¯

	while(1)
	{				
		ired_buf[0]=gsmg_code[gired_data[2]/16];//½«¿ØÖÆÂë¸ß4λת»»ÎªÊýÂë¹Ü¶ÎÂë
		ired_buf[1]=gsmg_code[gired_data[2]%16];//½«¿ØÖÆÂëµÍ4λת»»ÎªÊýÂë¹Ü¶ÎÂë
		ired_buf[2]=0X76;//ÏÔʾHµÄ¶ÎÂë
		smg_display(ired_buf,6);	
	}		
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值