2013-08-04 17:32:52 czjsky818 阅读数 11871
  • 51单片机综合小项目-第2季第4部分

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

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

STC51单片机一般是通过串口线下载程序到MCU。但是,有时候单片机放在作品上,串口线不够长,不方便下载,或者频繁拔插单片机,也不方便。

本方法,通过笔记本蓝牙,蓝牙串口模块HC-05,即可实现STC51单片机无线下载程序到MCU。


需要以下准备:

  1. 有蓝牙模块的笔记本。

  2. 蓝牙串口模块HC-05

  3. STC51单片机

  4. STC-ISP V6.53(只要能任意选择COM口的都行。)

  5. USB转串口模块


第一步:

 打开笔记本蓝牙模块。首先你要确定你有蓝牙模块和装好相应的驱动,这里我就不详细展开了。不同笔记本打开方式不同。我的联想Y笔记本如图1:


第二步:

将USB转串口和HC-05的VCC,GND,相连,TXD接RXD,RXD接TXD。将USB转串口模块插入笔记本。此时HC-05指示灯应该是快速闪烁。

如上图,点击添加设备,搜索到HC-05后连接,输入设备的配对码 1234 ,如图2,


然后就连接成功,在 控制面板\硬件和声音\设备和打印机 里便可以看到HC-05了。在HC-05上右键,属性,硬件,便可以看到COM口号,COM28,如图3。



第三步:

将HC-05模块的PIO11置高(我买的模块有个按键),上电,模块便进入AT命令响应模式。此时HC-05指示灯应该是慢速地闪烁。

此时可以打开任意串口助手软件,如STC-ISP的串口助手,设置波特率38400,数据位8位,停止位1位,无校验位,无流控制。

串口发送字符: AT(后面要加个回车键,我之前不知道,以为没进入AT模式),成功则返回OK。

接下来设置HC-05工作模式:波特率9600,数据位8位,停止位1位,偶校验,无流控制。串口发送字符:AT+UART=9600,0,2

然后就可以关闭串口了。



第四步:

将HC-05插到单片机上,还是一样,VCC,GND,相连,TXD接RXD,RXD接TXD。

硬件部分就完成了。


第五步:

在单片机程序中加入ISP.c,ISP.h,在程序开关调用函数 UARTInit(); 实现STC51单片机的ISP。

/******************************************************************************
* 文    件: ISP.c
* 原作者: 李锋源
* 修  改: ZhnJa 
* 创建日期: 2011-7-15
* 修改日期: 2013-8-01
* 说 明: 原文件为阿土开发板的Driver.c,提取出来的ISP下载程序。
******************************************************************************/

#include "ISP.h"
#include "STC12C5A60S2.h"
#include <intrins.h> 

#ifdef	Self_Define_ISP_Download			//如果有自定义ISP下载功能
unsigned char bufptr;
code unsigned char passward[]={ICPCODE};
unsigned char buf[sizeof(passward)*2];		//静态串口缓冲区
#endif
 
/******************************************************************************
*                               UART初始化            
*描    述:串口初始化函数, 通常是在使用串口前调用本函数来进行初始化, 通常是在
*          main函数中调用。
*入口参数:无
*返    回:无
*注    意:串口使用的是中断模式
******************************************************************************/
void UARTInit(void)
{
	#define Fclk 11059200UL	//晶振 11.059M 不可以写成11059200
	#define BitRate 9600UL	//9600b/s
	unsigned char i;
	unsigned int j;
#ifdef	Self_Define_ISP_Download   //自定义下载使用到
	bufptr = 0;
	for( i=0; i<sizeof(buf); i++)
	{
		buf[i] = 0;
	}
#endif
	EA=0; 							//暂时关闭中断
	TMOD &= 0x0F;
	TMOD |=0x20;    				//定时器1工作在模式2,自动重装模式
	SCON=0x50;     					//串口工作在模式1
	TH1=256-(Fclk/(BitRate*12*16)); //计算定时器重装值
	TL1=256-(Fclk/(BitRate*12*16));
	PCON|=0x80;    					//串口波特率加倍
   // ES=1;         				//串行中断允许
	TR1=1;        					//启动定时器1
	REN=1;        					//允许接收 
	EA=1;         					//允许中断 

  	for(i=0;i<8;i++)			 	//短暂延时判断有无ISP下载命令
	{	
	 	for(j=0;j<40000;j++)
		{
		 	if(RI)
			{
				RI = 0;
				IAP_CONTR = 0x60;	 //复位到IAP
			}
		}
	}
	ES=1;         					//串行中断允许
}


/******************************************************************************
*                               延时1s函数            
*描    述:延时1s函数,在UartInit()调用供ISP延时。
*入口参数:无
*返    回:无
*注    意:
******************************************************************************/
void delay1s(void)
{
 	unsigned char i,j,k;
	for(i=0;i<200;i++)
	{
	 	for(j=0;j<200;j++)
		{
			k = 10;
			while(k--);
		}
	}
}
/******************************************************************************
*                           发送一个字符            
*描    述:向串口发送一个字符。
*入口参数:要发送的字符
*返    回:无
*注    意:
******************************************************************************/
void SendByte(unsigned char c)	 
{
    SBUF = c;
    while(!TI);
    TI = 0;
}
/******************************************************************************
*                          发送一个字符串            
*描    述:向串口发送一个字符串
*入口参数:*s要发送的字符串
*返    回:无
*注    意:
******************************************************************************/
void SendStr(char *s)			
{
	while(*s)
	{
		SendByte(*s++);
	}
}

/******************************************************************************
*                               串口0中断            
*描    述:串口0(UART0)中断。
*入口参数:无
*返    回:无
*注    意:
******************************************************************************/
void UartISR(void) interrupt 4
{
#ifdef Self_Define_ISP_Download
	
	unsigned char ptScr,ptDst;
	if(RI)
	{
		RI = 0;				//清标志位
		buf[bufptr] = SBUF;
		ptScr = bufptr;	
		if(bufptr==sizeof(buf))
		{
			bufptr = 0;
		}
		else
		{
			bufptr++;
		}
		while(buf[ptScr] == passward[ptDst])
		{
			if(ptScr == 0)
			{
				ptScr = sizeof(buf)-1;
			}
			else
			{
				ptScr--;
			}
			if(ptDst == 0)
			{
			//	reset();
			delay1s();            
			//复位前提示程序
			IAP_CONTR = 0x60;	 	//复位到IAP
			}
			else
			{
				ptDst--;
			}	
		}
		//用户程序开始
		
		
		//用户程序结束
	}//End if(RI) 
	if(TI)							//发送完成
	{		   	
	 	TI = 0;						//清标志位
	}
#else		   						//如果不使用自定义ISP下载程序
	if(RI)
	{
		RI = 0;
	}
	else
	{
	 	TI = 0;
	}
#endif
}

/*======================End Of File====================*/

/******************************************************************************
* 文    件: ISP.h
* 原作者: 李锋源
* 修  改: ZhnJa 
* 创建日期: 2011-7-15
* 修改日期: 2013-8-01
******************************************************************************/
#ifndef	__ISP_H__
#define __ISP_H__

#include "STC12C5A60S2.h"
//系统配置
#define Self_Define_ISP_Download			//ISP下载
#define ICPCODE		0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF
#define FOSC	11059000UL
#define T100HZ  (FOSC/12/100)


//函数声明

//串口
void UARTInit(void);
void UARTInit(void);

void SendByte(unsigned char c);
void SendStr(char *s);

void delay1s(void);


#endif

第六步:

先用普通的正常下载方式将包含有ISP功能的程序下载到STC51单片机上。

打开STC-ISP(V6.53),设置如图,点击发送自定义下载命令即可实现远程下载。

补充:最高,最低波特率要设置为9600



说明1:
ISP,即In-System Programming,在线编程。
具有ISP功能的单片机芯片,可以通过简单的下载线直接在电路板上给芯片写入或者擦除程序,并且支持在线调试。
说明2:
须先下载一次有ISP功能的程序到单片机,之后才能实现冷启动下载程序,即ISP功能。

2019-01-11 06:33:32 qq_37504214 阅读数 1017
  • 51单片机综合小项目-第2季第4部分

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

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

基于51单片机的蓝牙小车制作历程【新手向

前言

在自己摸索了一段时间的单片机之后,要开始做很基础的新手玩意了,说是蓝牙小车就像“点亮你的第一个LED灯”一样基础,然而还是遇到了很多问题。。。
一开始还觉得蓝牙太low了,想直接玩WiFi模块,然而遇到了不可描述的阻力,可能我后期解决了会再发博客吧【挠头

探索阶段的程序

就是去网上也找了很多制作小车相关的东西,最初的测试用的控制代码如下:

#include <reg52.h>
//输入指令的端口		//按钮1,2,3依次从左到右排列【正极一起接在VCC上
sbit con1 = P2^0;
sbit con2 = P2^1;
sbit con3 = P2^2;
//控制轮子的输出端口	//端口1,2控制左轮;3,4控制右轮
sbit mot1 = P1^0;
sbit mot2 = P1^1;
sbit mot3 = P1^2;
sbit mot4 = P1^3;

#define Moto P1

typedef unsigned char uc;
typedef unsigned int ui;

void main()
{
	P2 = 0x00;//判断之前先关闭输出【保证不按按钮时小车不跑
	while (1)
	{ 
		Moto = 0;//每次判断之前先初始化轮子的输出口
		//对按钮的判断和对轮子的控制
		if (con1==1&&con3==1)	//按住两边的按钮前进
		{
			mot1 = 1;
			mot3 = 1;
		}
		else if (con1==1)		//按左边的按钮左转
		{
			mot3 = 1;
		}
		else if (con3==1)		//按右边的按钮右转
		{
			mot1 = 1;
		}
		else if (con2==1)		//按中间的按钮后退
		{
			mot2 = 1;
			mot4 = 1;
		}
	}
}

然而直接接小马达是驱动不了的,单片机的端口只负责输出“信号”,高电平也高不到哪里去。
所以给新手尝试阶段一个建议:两边的输出(就是那两个控制马达的输出口),一边接两个反接的LED灯;
ps:注意要那种反向断电的LED,我以前也不知道居然还有反向通电的LED灯。
然后前面两个灯亮代表正转,后面两个灯亮代表反转,这样做用来测试自己的小程序还是很好用哒。

连接蓝牙模块

蓝牙小车最基础的首先是一个蓝牙模块,这个东西有很多种,这里我就说我使用的HC-06蓝牙模块,出来的四个脚基本上就是这样的;
在这里插入图片描述
RXD连51单片机系统版上的TXD,TXD连RXD;
VCC接VCC或者5V;
【我试的都可以
GND就找一个GND插上;
然后通电,蓝牙模块上的红灯会一直闪;
用手机下载APP“蓝牙串口SPP”这个APP可以自定义按键的名字和各种功能,很好用;
接下来打开蓝牙找到一个叫做“HC-06”的蓝牙连接一下,连接上以后你会发现蓝牙模块的红灯不闪了。

还需要一个 L298N 步进电机模块,之后会说
但是在做出可以跑的小车之前你还缺一步,就是写一个通过蓝牙控制输出的程序
蓝牙小车的代码如下:
其实控制不是很难,难得是乱七八糟的内部资源的使用
我也不是很理解内部资源,但是我知道封装好的三个函数的功能,大家可以放心食用
能完全看懂上面那一块代码的,相信都能看懂下面的代码,即使不清楚具体的功能,大概也明白哪些是可以自己改动的吧
在使用的过程中只需要修改一下“Cont”函数中的输入输出即可。

#include <reg52.h>
#include <intrins.h>

typedef unsigned char uc;
typedef unsigned int ui;
#define Moto P1
uc Com;

void Init();		//初始化程函数
void Send(uc a);	//发送字符函数
void Cont();		//接收指令函数

void main()
{
	Init();
	while (1)
	{ 
		if (RI==1)
		{
			RI = 0;
			Com = SBUF;
			Cont();
		}
	}
}

void Init()
{
	ES=0;
	SCON = 0x50;
	TMOD = 0x20;
	TH1=TL1=0xFD;
	PCON &= 0x7f;
	TR1 = 1;
	TI=0;
	RI=0;
	ES=1;
	Moto = 0x00;
}
   
void Send(uc a)
{
	TI=0;
	SBUF=a;
	while (TI==0) ;
	TI=0;
} 

void Cont()
{
	switch(Com)
	{
		case '5':
			Moto = 0x00;		//0000 0000 停止
			Send(Com);
			break;
		case '2':
			Moto = 0x0d;		//0000 0101	前进
			Send(Com);
			break;
		case '4':
			Moto = 0x05;		//0000 1101	左转
			Send(Com);
			break;
		case '6':
			Moto = 0x07;		//0000 0111	右转
			Send(Com);
			break;
		case '8':
			Moto = 0x0a;		//0000 1010	后退
			Send(Com);
			break;
		default:
			Moto = 0x00;
			Send(Com);
		}
}

控制方面的事宜也说一下吧【虽然很简单,
在这里插入图片描述 在这里插入图片描述
基本上就是这样,一个普通的键盘一样的输出,然后在程序里定义功能即可。

供电

你以为这样就可以跑了吗,然而还有一个很可怕的坑——电源。
我因为想自己组装各种零件,所以学习单片机的时候一直用的是最小系统板,单片机用的是STC89C52RC
这里仔细的说一下连线:
蓝牙模块前文已经说过了;
因为程序里用的是 P1^0 ~P1^3 因此这四个脚依次接到 L298N 的“逻辑输入口” IN1 ~IN4;
L298N 的电源部分,中间的口直接接单片机系统板的GND,供电用左边的“12V”直接接到5V单片机系统板的口就可以了;

我之前遇到的坑就是 L298N 的5V接单片机的5V结果不能供电,我以为是单片机供电不够,又直接连电池,就是单片机用电源线供电,电机模块用电池供电,结果还是不行;
于是乎我就考虑接12V的口,然后我就很强势的串联了八节电池,还没有电池盒,自己用大泡沫做了个电池盒,连上了以后成功供电,但是OUT口不能驱动电机转动,很绝望;
后来直接把12V的口接在单片机的5V输出上,居然可以了。。。一脸懵逼?电压够么???
再之后尝试用电池当电源(毕竟小车要乱跑嘛),然后又是被卡了好久最后发现六节电池不能用,四节电池才可以正常使用

最后用四节电池给单片机供电就可以连接蓝牙开始飙车辣owo

最后

总之这些就是我在自学单片机做蓝牙小车的过程中遇到的一些坑,网上那些人做的博客大多就是直接一坨代码扔给你,硬件部分讲的很少,个人觉得对新手很不友善,所以我做好以后就想发个博客把我觉得当初遇到的困难给大家说一下,程序网上一搜一大堆,重要的是硬件部分有一些不理解的地方,就是这样。

2019-04-01 17:18:05 qq_41865502 阅读数 934
  • 51单片机综合小项目-第2季第4部分

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

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

在这里插入图片描述

蓝牙模块:HC05
波特率:9600
校验位:无
停止位:1

HC05与电脑的蓝牙配对后生成传入传出两个COM口,使用传出COM口

蓝牙与单片机接线:
5V–5V
GND–GND
TX–3.0
RX–3.1

第一次需要用常规方式将下方代码写入

main.c
#include <reg52.h>
#include “stc_isp_download.h”

sbit LED = P0^0;

void main()
{
Init_Iap_Download();
LED = 1;
while (1)
{
LED = 0;
}
}

stc_isp_download.c
#include “stc_isp_download.h”

void Init_Iap_Download()
{
TMOD=0X20;
SM0=0;
SM1=1;
REN=1;
TH1=0XFD;
TL1=0XFD; //波特率 9600
TR1=1; //校验位 无
EA=1; //停止位 1
ES=1;
}
void Rceive()interrupt 4
{
unsigned char i=0;
unsigned int j,k;

if(TI==1)
{
	TI=0;
}
else
{
	RI=0;
	i=SBUF;
	if(i==Download_command)
	{
		for(j=1000;j>0;j--)
		for(k=123;k>0;k--);
		Iap_Download =0x60;
	}
}

}

stc_isp_download.h
#ifndef stc_isp_download
#define stc_isp_download

#include <reg52.h>
#define Download_command 0xf1 //功能码
sfr Iap_Download=0xE7;//软复位地址
void Init_Iap_Download();

#endif

2018-05-02 22:11:29 dok12 阅读数 10658
  • 51单片机综合小项目-第2季第4部分

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

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

打算利用蓝牙芯片HC06实现手机和单片机之间的简单通信。工具包括淘宝上淘的stc单片机实验板一块,hc-06蓝牙模块一个,杜邦线,win7电脑一部,安卓手机一部,相关软件:单片机小精灵,串口通讯助手,keil以及单片机烧录软件,蓝牙通讯软件APP。软件基本上都是免安装直接运行的。

工作流程简单总结下为以下3步:
1.利用单片机小精灵软件,做好烧录程序,确定波特率应该设置为2400
2.hc-06蓝牙模块进入AT模式,串口通讯助手成功将蓝牙模块波特率设置为2400
3.将烧录程序通过keil编译成功后烧录至单片机实验板上,手机上安装好APP,设置完成后运行,确定成功。

步骤(2)见


https://blog.csdn.net/dok12/article/details/80152239
步骤(3)见
https://blog.csdn.net/dok12/article/details/801730

本篇先介绍步骤1。工具,单片机小精灵软件,免安装,直接运行。

打开单片机小精灵软件,选择串口波特率选项。必须选择好晶振和波特率。其他选项,c语言还是汇编,是否串口中断,波特率加倍,允许接收都自己决定。
因为淘宝买到的单片机实验板是12M晶振,蓝牙模块的默认波特率是9600。所以一开始输入这两项数据。
结果发现误差太大,必须修改。晶振改不了,只好改波特率了。
修改波特率为2400后误差控制在千分之一点六,效果不错,得到了一个C语言的串口通信基本框架了。

根据这个框架做了个C语言程序,目标是对单片机实现蓝牙通讯,实现不同的单片机流水灯效果,并且得到回复数字8。
#include <reg51.h>
unsigned char k;
void InitUART(void)
{
    TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xF3;
    TL1 = 0xF3;
    PCON = 0x00;
    EA = 1;
    ES = 1;
    TR1 = 1;
}
/*******延时函数*************/
void delay(unsigned int i)
{
    unsigned char j;
    for(i; i > 0; i--)   
        for(j = 255; j > 0; j--);
}
void main(void)
{	k=0;
    InitUART();
	while  (1){
	if(k==1)
	{P1=0xff;delay(500);P1=0x00;delay(500);}
	else if (k==2)
	{P1=0x01;delay(500);P1=0xfe;delay(500);}
	else 
	{P1=0x02;delay(500);P1=0xfd;delay(500);}
	}
}
void SendOneByte(unsigned char c)
{
    SBUF = c;
    while(!TI);
    TI = 0;
}

void UARTInterrupt(void) interrupt 4
{
    if(RI)
    {
        RI = 0;
        //add your code here!
		k++;
		if(k>2)k=0;
		SendOneByte(8);
    }
    else
        TI = 0;
}






2018-05-19 22:37:03 Prediction_185 阅读数 2379
  • 51单片机综合小项目-第2季第4部分

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

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

蓝牙舵机篇  

引语  本系列博客将分为三篇来讲解,第一篇讲解如何通过HC-05蓝牙模块控制舵机,第二篇会介绍HC-SR04超声波模块的测距程序,第三篇会将两者组装在一起。


最终目的:通过手机连接蓝牙向单片机发送信号,单片机收到信号后向舵机发送pwm信号,让舵机达到相应的角度。

实现效果需要达到的目标:

1.会使用HC-05蓝牙模块,了解51单片机的串口通信。

2.会用51单片机输出pwm波控制舵机,并校正舵机的误差。

材料:51单片机最小系统、HC-05蓝牙模块、舵机、杜邦线、数据传输线。

51单片机最小系统:如图:


HC-05


如上图所示为蓝牙模块与51单片机的连接方式

那么如何让手机控制单片机呢?

这里我们需要下载一个app,如图


我们可以在聊天栏中,向单片机发送信息,手机将信息分解为ASCII码发给单片机。单片机接受到的也是ASCII码,因此在下面的程序中的case语句中是以16进制来分情况的。

舵机:我们这里所使用的是SG-90舵机 如图


将舵机的橙线连接到P1.2接口

              红线连接到VCC口

              棕色连接到GND

想要控制舵机,那么我们就需要一个周期T = 20ms,高电平的时间(t)等于0.5ms-2.5ms之间的这样一个信号。 
以下是高电平持续的时间(t)与舵机的关系。


t = 0.5ms——————-舵机会转动 0 ° 
t = 1.0ms——————-舵机会转动 45° 
t = 1.5ms——————-舵机会转动 90° 
t = 2.0ms——————-舵机会转动 135° 

t = 2.5ms——————-舵机会转动180° 

但是在实际的应用中,我发现每一个舵机都存在误差,也就是说输出对应空占比的pwm信号,舵机不会精确地转动到相应的度数。因此我将在下面的程序中加以校正。

以下是代码

#include <AT89x51.H>//注意这里的头文件为 <AT89x51.H>

#define SEH_PWM P1_2//舵机PWM口定义

unsigned char SEH_count=5;
unsigned char count=0;


unsigned char T0RH = 0xff;  //T0重载值的高字节
unsigned char T0RL = 0xa3;  //T0重载值的低字节
unsigned char RxdByte = 0;  //串口接收到的字节

void ConfigTimer0();
void ConfigUART(unsigned int baud);

void PWM(unsigned char x)
{
	SEH_count=x;
}

void main()
{
    EA = 1;       //使能总中断
;
    ConfigTimer0();   //配置T0定时1ms
    ConfigUART(9600);  //配置波特率为9600
    
    while (1)
    {  
					switch(RxdByte)
				{
					case 0x31:{
											PWM(5);//手机向单片机发送‘0’,舵机转到0度    
										};break;
					case 0x32:{
										PWM(10);//手机向单片机发送‘1’,舵机转到45度  
										};break;
					case 0x33:{
										PWM(15);//手机向单片机发送‘2’,舵机转到90度  
										};break;
					case 0x34:{
										PWM(20);//手机向单片机发送‘3’,舵机转到135度  
										};break;
					case 0x35:{
										PWM(25);//手机向单片机发送‘4’,舵机转到180度  
										};break;
					case 0x36:{
										;//														
										};break;
					case 0x37:{
									   ;//																
										};break;
					case 0x38:;break;
				}
    }
}
/* 配置并启动T0,ms-T0定时时间 */
void ConfigTimer0()
{
  


    TMOD &= 0xF0;   //清零T0的控制位
    TMOD |= 0x01;   //配置T0为模式1
    TH0 = T0RH;     //加载T0重载值
    TL0 = T0RL;
    ET0 = 1;        //使能T0中断
    TR0 = 1;        //启动T0
}
/* 串口配置函数,baud-通信波特率 */
void ConfigUART(unsigned int baud)
{
    SCON  = 0x50;  //配置串口为模式1
    TMOD &= 0x0F;  //清零T1的控制位
    TMOD |= 0x20;  //配置T1为模式2
    TH1 = 256 - (11059200/12/32)/baud;  //计算T1重载值
    TL1 = TH1;     //初值等于重载值
    ET1 = 0;       //禁止T1中断
    ES  = 1;       //使能串口中断
    TR1 = 1;       //启动T1
}

/* T0中断服务函数,完成LED扫描 */
void InterruptTimer0() interrupt 1
{
    TH0 = T0RH;  //重新加载重载值
    TL0 = T0RL;
	  if(count <= SEH_count) 
    {
     
        SEH_PWM = 1;
    }
    else
    {
        SEH_PWM = 0;
    }

    
    count++;
    if (count >= 200) 
    {
        count = 0;
			
    }
	
}
/* UART中断服务函数 */
void InterruptUART() interrupt 4
{
    if (RI)  //接收到字节
    {
        RI = 0;  //手动清零接收中断标志位
        RxdByte = SBUF;  //接收到的数据保存到接收字节变量中
        SBUF = RxdByte;  //接收到的数据又直接发回,叫作-"echo",
                         //用以提示用户输入的信息是否已正确接收
    }
    if (TI)  //字节发送完毕
    {
        TI = 0;  //手动清零发送中断标志位
    }
}

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