2019-04-26 22:48:12 qq_44006478 阅读数 94
  • 51单片机综合小项目-第2季第4部分

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

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

欢迎在评论区提出宝贵意见!

设计要求:
将片内RAM从20H开始的连续40个地址内容置为0FEH

汇编源码:

;置数程序设计
;设计要求:将片内RAM从20H开始的连续40个地址内容置为0FEH
		ORG    00H
		MOV    R0,#0D8H			;置位次数设置(256-40=0D8H)
		MOV    R1,#20H			;设置置数开始地址
   SETD:MOV    A,#0FEH			;将累加器A置数
        MOV    @R1,A			;将累加器的内容送入相应地址
		INC    R1				;指向下一个地址
		INC    R0				;次数加1
		CJNE   R0,#00H,SETD		;判断是否达到置位次数?若为否,继续置数
		SJMP   $
		END

C语言源码:

/*
置数程序设计
设计要求:将片内RAM从20H开始的连续40个地址内容置为0FEH
*/
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
void main(void)
{
	uchar i;
	for(i=0;i<40;i++)
	{
		DBYTE[0x20+i]=0xFE;
	}
	while(1);
}

Proteus8.0仿真图
在这里插入图片描述在这里插入图片描述当程序运行完成是,ACC中的内容为FEH,R1中的地址48H,由于源程序中R1的初始值20H,这说明执行了40次(48H-20H=28H=40),20H~40H的单元内容均为FEH,如图所示。

2010-10-15 12:19:00 mckend 阅读数 1307
  • 51单片机综合小项目-第2季第4部分

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

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

IO口控制

方向寄存器 TRISA~TRISAE            比如 TRISB=0x00; //  1为输入,  0为输出  ,  这样就把portB端口全部设为输出

数据寄存器 PORTA~PORTE            比如  PORTB=0x01; // 1为置高,0为置低  ,  这样就把portB1口置高,其它portB口置低

 

 

例:  点灯程序

 

#include<pic.h>

 

__CONFIG (0x3B31);//  pic单片机需要进行寄存器配置,详见手册

 

 void main()

{

   TRISD=0xfe;   //   把RD1端口设为输出

   PORTD=0x01; //  把RD1端口置高

  //RD1=1;         PORTD 和 RD一样的

  while(1);

}

2016-08-26 10:45:17 u012313335 阅读数 1555
  • 51单片机综合小项目-第2季第4部分

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

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

       单片机的跑马灯实验就如同 C 语言的"Hello World!"程序一样,几乎所有单片机试验课程都会介绍到跑马灯试验,简单的跑马灯只需选择P0 - P3口其中一个和8个LED灯连接即可。自动变速跑马灯通过定时器中断的控制能准确控制跑马灯频率。

       对于定时器的中断的工作方式,我们可以建立两个全局的标记,一个在中断里置这个标记,然后就退出。在主程序里检查到这个标记之后,就运行相关的程序。另一个用来控制跑马灯速率,当跑马灯跑完8个LED后,对速率标记减一,使速率加快。


#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
bit delay = 0;
uchar speed = 10;

/*******************************************************************************
* 函数名         : TimerConfiguration()
* 函数功能	 : 配置定时器值
* 输入           : 无
* 输出         	 : 无
*******************************************************************************/
void TimerConfiguration()
{
    TMOD = 0x01; 	 //选择工作方式1
    TH0 = 0x28; 	 //设置初始值
    TL0 = 0x69;
    EA = 1;			 //打开总中断
    ET0 = 1;		 //打开定时器0中断
    TR0 = 1;		 //启动定时器0
}

void main()
{
	uchar mark = 0;		//标记跑马灯是否跑完
	P0 = 0x01;
	TimerConfiguration();
	while(1)
	{
		if(delay)
		{
			delay = 0;
			P0 = _crol_(P0,1);
			mark++;
			if(mark == 8)
			{
				mark = 0;
				speed--;
				if(speed == 0)
					speed = 10;		//每循环显示一次,就调快一次溢出速度
			}
		}
	}	
}

/*******************************************************************************
* 函数名         : Timer0()
* 函数功能       : 定时器0中断函数
* 输入           : 无
* 输出         	 : 无
*******************************************************************************/
void Timer0() interrupt 1
{
	uchar t;
	t++;
	if(t == speed)
	{
		t = 0;
		delay = 1;
	}
}


2014-11-21 20:43:26 pine222 阅读数 664
  • 51单片机综合小项目-第2季第4部分

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

    3411 人正在学习 去看看 朱有鹏
C语言中
EA = 1;  //允许总中断
ES = 1;  //允许串口中断
汇编中可用
SETB  EA  ;允许总中断
SETB  ES  ;允许串口中断

当单片机接收到一帧数据后,RI会置1,向CPU申请中断,若之前有中断允许,则产生了中断,进入中断服务程序。当然,单片机发送完一帧数据,TI也会置1,同样会产生中断!

一般我们在发送数据时要关中断,因为一般你不用在发送时不用处理数据;接收数据时要开中断,以便你在中断服务程序中将接收到的数据进行存储并处理。 

补充:其实,不管你有没有允许中断,上位机(此时即给单片机发送信息的机器)只要给单片机发送数据,单片机就会自动接收数据,并把它放在数据缓冲器SBUF中,如果你之前有允许串行口中断,RI就会置1,向单片机CPU申请中断,并进入中断服务程序,即你问题中的serial()函数,做完这个函数后就会自动返回断点。如果你没有允许中断,便不会产生串行中断。

其实,你的问题有个错误:别的中断都是某个I/O口电平变化产生。这只是外部中断产生条件,不过,你之前也需要用软件允许外部中断。另外,常见的51系列单片机有5个中断源三种中断5:1、外部中断0和1;2、定时器/计数器溢出中断0和1;3、串行口中断。另外,STC51系列还有定时器/计数器T2中断,A/D转换中断,PWM中断,串行中断2等等。你还有什么不懂的可以自己多翻一翻书,学到后面去了你就明白了。

你的问题中那个serial()函数中 P1=SBUF; 是把接收的数据送到并行P1口,然后那条 RI=0;是不可少的,这是用软件清零RI,准备再次接受一帧数据产生中断,如果你没有这条语句,就会进入死循环,出不来了。
2019-11-18 15:07:30 Supremelv 阅读数 152
  • 51单片机综合小项目-第2季第4部分

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

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

51单片机中断使用注意事项

1.例如:
同时使用外部中断0和串口中断的时候,如果没有用到串口中断,一定要将串口中断ES置0,不然当你执行一次外部中断,然后再用串口发送数据(并没有用到串口中断服务程序),就会一直发送数据,这是最为致命的,这个时候外部中断0完全失效。正确代码如下:
`void UartInit(void) //9600bps@11.0592MHz
{
SCON=0x50;
// AUXR1=0x40;
T2L=(65536-(FOSC/4/BAUD));
T2H=(65536-(FOSC/4/BAUD))>>8;
// AUXR=0x14;
// AUXR|=0x01;
AUXR=0x15;
IT0=0;
EX0=1;
// ES=1;
EA=1;
}
void Int0() interrupt 0
{
delay6(1000);
if(K1==0)
{
Hn++;
Si++;
if(Hn>2)
{
Hn=0;
}
if(Si>2)
{
Si=0;
}
}
}
第一次发帖,表述的不是多清楚,总之,就是没用到中断服务程序,就不要把相应的中断打开。(第一次发帖,有点LOW,还请看到此贴的大佬多多指教)

关于单片机的串口

阅读数 366

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