单片机问题

while (1)是的意思。
就是说单片机执行到这里就结束了,while (1)是给单片机一些事情干。否则单片机就又开始重新了。

51单片机中断详解(上)

一.中断的概念

中断发生

CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理

中断响应和中断服务

CPU暂时中断当前的工作,转去处理事件B

中断返回

待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A

这一过程称为中断

二.中断过程示意图

三.MCS51中断系统的结构

MCS51的中断系统有5个中断源(8052有 6个) ,2个优先级,可实现二级中断嵌套

中断编号 中断名 中断源
0 外部中断0 IE0(P3.2)
1 定时器0溢出中断 TF0
2 外部中断1 IE1(P3.3)
3 定时器1溢出中断 TF1
4 串行口中断 RI

四.中断寄存器

单片机有10个寄存器主要与中断程序的书写控制有关

中断允许控制寄存器IE

定时器控制寄存器TCON

串口控制寄存器SCON

中断优先控制寄存器IP

定时器工作方式控制寄存器TMOD

定时器初值赋予寄存器(TH0/TH1,TL0/TL1)

五.部分寄存器详解

1.中断允许控制寄存器(IE)

EX0:外部中断0允许位;

ET0:定时/计数器T0中断允许位;

EX1:外部中断1允许位;

ET1:定时/计数器T1中断允许位;

ES :串行口中断允许位;

EA :CPU中断允许(总允许)位。

2.定时器/计数器控制寄存器控制寄存器(TCON)

IT0:外部中断0触发方式控制位

当IT0=0时,为电平触发方式(低电平有效)

当IT0=1时,为边沿触发方式(下降沿有效)

IE0:外部中断0中断请求标志位

IT1:外部中断1触发方式控制位

IE1:外部中断1中断请求标志位

TF0:定时/计数器T0溢出中断请求标志位

TF1:定时/计数器T1溢出中断请求标志位

3.串行口控制寄存器(SCON)

RI:串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI。注意,RI必须由软件清除。

TI:串行口发送中断标志位。当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。每发送完一个串行帧,由硬件置位TI。CPU响应中断时,不能自动清除TI,TI必须由软件清除。

4.中断优先级控制寄存器(IP)

PX0:外部中断0优先级设定位

PT0:定时/计数器T0优先级设定位

PX1:外部中断0优先级设定位

PT1:定时/计数器T1优先级设定位

PS :串行口优先级设定位

PT2:定时/计数器T2优先级设定位

六.中断响应条件

中断源有中断请求

此中断源的中断允许位为1

开中断(即EA=1)

51单片机中断详解(下)

一.定时器相关寄存器

工作方式寄存器(TMOD)

该寄存器用于设置定时/计数器的工作方式,低四位用于定时器0,高四位用于定时器1。

GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚INT0/1也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了INT0/1引脚为高电平这一条件。

C/T:定时/计数模式选择位。C/T=0为定时模式;C/T=1为计数模式。

定时器/计数器控制寄存器控制寄存器(TCON)

该寄存器的低4位用于控制外部中断,已在前面介绍,高4位用于控制定时/计数器的启动和中断申请。

TF1:T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。

TR1:T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。

TF0:T0溢出中断请求标志位,其功能与TF1类同。

TR0:T0运行控制位,其功能与TR1类同。

中断允许控制寄存器(IE)

ET0:定时/计数器T0中断允许位;

ET1:定时/计数器T1中断允许位;

EA :CPU中断允许(总允许)位。

二.定时器溢出中断的处理过程

1、设置定时器工作方式

2、为定时器装入初值

3、定时器中断允许位置为1

4、开总中断

5、开定时器,等待产生溢出中断请求

三.实现简单时钟

说明:

1.使用动态数码管显示

2.选择工作方式1,以16位的定时器0进行工作,即TMOD=0x01,中断编号为1;

3.定时50ms,即每隔50ms产生一次中断:

TH0=(65536-50000)/256; //16位定时器的高8位

TL0=(65536-50000)%256; //16位定时器的低8位

具体的时间与单片机的晶振有关,请了解机器周期、指令周期、时钟周期等相关知识。

#include

#define uchar unsigned char

#define uint unsigned int

uchar hour,min,sec;

uchar code wei[8]= {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //共阴极数码管位选编码

uchar code duan[11]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x01}; //共阴极数码管段选编码

void delay(uint z)

{

uint i,j;

for(i=z;i>0;i--)

for(j=110;j>0;j--);

}

void timer0_init()

{

TMOD=0X01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

ET0=1;

TR0=1;

EA=1;

}

void main()

{

uchar i;

timer0_init();

while(1)

{

num[0]=duan[hour/10];

num[1]=duan[hour%10];

num[2]=0x40; //显示一横

num[3]=duan[min/10];

num[4]=duan[min%10];

num[5]=0x40; //显示一横

num[6]=duan[sec/10];

num[7]=duan[sec%10];

for(i=0; i<8; i++) //显示部分

{

P0=wei[i]; //位选

P1=num[i]; //段选

delay(2);

P1=0x00; //消隐

}

}

/*启动定时器后,没次计数溢出就会进入中断服务函数,重新赋初值,再进行计数,来达到定时的效果*/

void timer0() interrupt 1 //定时器中断服务函数

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

t++;

if(hour==24)

hour=0;

if(min==60)

{

hour++;

min=0;

}

if(sec==60)

{

min++;

sec=0;

}

if(t==20)

{

sec++;

t=0;

}

}

原文地址:http://blog.51cto.com/hudamao/2123604

时间: 2024-10-25 20:20:22

单片机问题的相关文章

51单片机之串口通信(三)

51单片机之串口通信(三) 已有 47 次阅读2015-12-29 00:21 |个人分类:51单片机| 单片机, 通信 用串口实现发送和接收同时可操作: 电脑显示结果如图: 源程序: /*项目名称:串口发送接收实验项目内容:串口发送接收同时进行,计算机发送数据给单片机控制P0口,从而控制LED灯的亮灭,单片机发送数据到计算机,计算机显示出来时间:2015年12月23日项目负责人:YUAN*/#include <reg52.h>typedef unsigned char uChar8;type

小学期坑——单片机——铂电阻温度计

我真是给学院的小学期跪了!!! 一周6天扔在实验室!大四了还让不让人好好考研啊!!!这些玩意儿大二大三去搞就行了啊!!! 吐槽完毕.活还是要干的,砖还是要搬的.比起奇葩的电气传动电子的东西真是友好. 队友并没有黄金右手,抽到的题目好魔性. 铂电阻测温度大概是搞个电桥出来当温度传感器通过测电压来搞吧,然而并不会电桥就扔给擅长模电的机智的队友了. 默默揽下码代码的工作.然而我讨厌单片机编程 凸 凸 说得好像会一样== 上位机要求可设置温度上下界,可采集温度并画出波形. 下位机要求能测温,(AD转换)

单片机的非OS的事件驱动

单片机的非OS的事件驱动 Part 1 前言 很多单片机项目恐怕都是没有操作系统的前后台结构,就是main函数里用while无限循环各种任务,中断处理紧急任务.这种结构最简单,上手很容易,可是当项目比较大时,这种结构就不那么适合了,编写代码前你必须非常小心的设计各个模块和全局变量,否则最终会使整个代码结构杂乱无序,不利于维护,而且往往会因为修改了某部分代码而莫名其妙的影响到其他功能,而使调试陷入困境. 改变其中局面的最有效措施当然是引入嵌入式操作系统,但是大多数的操作系统都是付费的(特别是商业项

51单片机模拟PWM调制控制实验

-------------------------------------------- PWM(脉冲宽度调制) 对模拟信号电平进行数字编码的方法 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 设计要求: 由于AT89系列单片机没有PWM控制器,所以

单片机模拟电路接口的一些概念

集电极开路输出的结构如图1所示,右边的那个三极管集电极什么都不接,所以叫做集电极开路:左边的三极管为反相之用,使输入为"0"时,输出也为"0". 对于图 1,当左端的输入为"0"时,前面的三极管截止,所以5v电源通过1k电阻加到右边的三极管上,右边的三极管导通:当左端的输入为"1"时,前面的三极管导通,而后面的三极管截止. 我们将图1简化成图2的样子,很明显可以看出,当开关闭合时,输出直接接地,所以输出电平为0.而当开关断开时

单片机通信的加密和解密

通信,有时候为了保证截获方即使得到了数据包,也不知道内容,所以加密传输即可:但有时候不需要知道数据包的内容,只要知道知道数据包能干嘛即可,比如发指令,此种情况单单对数据包进行加密就不够了. 基础知识: 1.单片机适用的数据加密算法有TEA,经过TEA加密的数据字节数和加密前的一样,只是数据不一样了 2.CRC:一个数据包,根据CRC算法的不同,可以得到不同长度的CRC值:CRC一方面保证数据不会被篡改,另一方面能检测传输过程是否出现错误 假定A为发送方,B为接收方 加密模型1: A:发送:请求临

51单片机中断机制(定时器/计数器)

单片机中断简介 52单片机一共有6个中断源,它们的符号,名称以及各产生的条件分别如下: INT0 - 外部中断0,由P3.2端口线引入,低电平或下降沿引起 INT1 - 外部中断1,由P3.3端口线引入,低电平或下降沿引起 T0    - 定时器/计数器0中断, 由T0计数器计满回零引起 T1    - 定时器/计数器1中断, 由T1计数器计满回零引起 T2    - 定时器/计数器2中断, 由T2计数器计满回零引起 TI/RI - 串行口中断,串行端口完成一帧字符发送/接收后引起 其中T2是5

DIY单片机控制大功率LED最小系统

最近调试用手焊了一块单片机最小系统,实现了按键控制蜂鸣器.数码管.LED等简单的外围电路,虽然很简单,但是从这个过程中学习到了很多东西. 晒个手残焊工电路板,记录一下自己的过程,有时间了再详细记录自己的电路图.代码.以后也动手搞个FPGA的最小系统,刘筱一加油! 图 1 图2

51单片机课程设计:基于DS18B20的温度报警器

51单片机课程设计:基于DS18B20的温度报警器 本程序用于读取DS18B20温度,同时具备报警功能,工程分为3个文件,main.c.temp.c.temp.h,经本人修改部分代码,适用于吉林农业大学51开发板,其他朋友亦可移植到其他型号开发板.工程文件在文章最下方. 1.main.c文件 /*********************************说明****************************************** 本程序用于读取温度检测模块DS18B20数值,并

51单片机课程设计:基于MQ-3的酒精浓度报警器

51单片机课程设计:基于MQ-3的酒精浓度报警器 本程序用于将MQ-3上读取到的模拟信号转换为对应的数字信号,经51单片机处理后,在数码管显示,同时具有报警功能,当检测值高于预警值,蜂鸣器报警.除了可以检测MQ-3酒精浓度模块的AD值,也适用于MQ系列的其他模块,原理基本都相同,都是将读取到的AD值转换为数字信号,程序修改后,如果接线方法正确,可以在吉林农业大学51开发板上完美运行,相关工程文件见最下方附件. /*************************************说明***