========================== 一 =========================
/**
* 利用用定时器中断闪烁LED
*/
#include <reg52.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
// 10个LED
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
// 定义开关. 低电平有效.
sbit K1 = P3^2;// 按键K1,INT1是外中断1的引入口
sbit
sbit K3 = P3^4;
sbit K4 = P3^5;
uchar t = 250; // 计数器溢出次数.
void main( void )
{
TMOD = 0x01; // 定时器1,16位工作方式
TR1 = 1; // 启动定时器1
ET1 = 1; // 打开定时器1中断
//EX1 = 1; // 打开外中断1
// TCON = 0x00;
EA = 1; // 打开总中断
while( 1 )
{
;// 主程序在这里就不断自循环,实际应用中,这里是做主要工作
}
}
/**
* 定时器1中断. 定时器1一直在不断自加. 当溢出时, 该中断函数
* 会被执行, 该中断函数再一次置0
*/
void timer1( void ) interrupt 3 // 定时器1中断是3号
{
TF1 = 0; // 定时器1溢出标志位.
// 写入定时器1初始值0x0006
TH1 = 0x00;
TL1 = 0x06;
if((t--) == 0)
{
P10 = ~P10; // 反转LED灯的亮灭
t = 250;
}
}
总结:
网上诸多搞MCU的前辈说51里头, 中断, 定时/计数器, 串口通信是三个硬骨头. 啃过去了就算51芯片登堂窥奥了. 果不其然, 的确是需要下一番功夫, 和之前的内容相比, 中断跟定时/计数器的确灵活和重要.
无甚好总结的了, 翻书.. . .
=============================== 二 ==================================
/**
* 利用定时器中断实现跑马灯.
*/
#include <stdio.h>
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
// 10个LED
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
// 定义开关. 低电平有效.
sbit K1 = P3^2;// 按键K1,INT1是外中断1的引入口
sbit
sbit K3 = P3^4;
sbit K4 = P3^5;
uchar ledp[8] = {0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00};
uchar i=0, t=50;// i记录P1口取哪个数据填P1. t表示计数器溢出51次才换下个花式
void main( void )
{
TMOD = 0x01; // 定时器0,16位工作方式
TR0 = 1; // 启动定时器0
ET0 = 1; // 打开定时器0