郭天祥单片机编程100例程序及随笔3——定时器编程

2019-04-15 12:28发布

1.五个知识点:     1.1设置中断的流程:
        1.1.1主函数设置初始化         1.1.2中断服务程序(由用户自己编写),设置要做的事情,但不可以放太多。
    1.2主函数的设置(定时器初始化)
        举例:
void main() { TMOD = 0x01; TH0 = (65536-46082)/256; TL0 = (65536-46082)%256; EA = 1; ET0 = 1; TR0 = 1; }     或者使用void init_interrupt(){}也可以,不一定要直接放在总程序里面。     设置流程如下:
    
注:关于TMOD:
    1.3中断子函数         需要跟着时间改变而进行改变的对象,都要用定器去辅助实现他们。
        可由用户自己设置,格式如下:
            void 函数名 interrupt m [using n]
        说明:interrupt m的m为中断号。using n 的n的意思大概是当有紧急的事情需要cpu处理时,现有程序可以存入指定的寄存器组,猜测这个n是寄存器组号。
        在中断服务程序中,一定要记得重装初值,否则每次计时的时间就会不对。
    1.4 uchar与uint的区别
        uchar是无符号整型,8Bit,最大到255.也可以写作 u8;
        uint是16bit最大到65535.也可以写作 u16;
        一般数字较小采用uchar来定义,可以节省空间。
    1.5 数码管分位显示可以采用延时函数。
        例如:             
void display(shi,ge) { wela = 1; P0 = 0xfe; wela = 0; P0 = 0xff; dula = 1; P0 = table[ge]; dula = 0; delay(); wela = 1; P0 = 0xfd; wela = 0; P0 = 0xff; dula = 1; P0 = table[shi]; dula = 0; delay(); } 2.中断关练习程序如下: 利用定时器0工作方式1,在实验板上实现第一个发光管以1s亮灭闪烁。 #include #define uchar unsigned char uchar num; sbit led1 = P1^0; void main() { TMOD = 0x01; TH0 = (65536-46082)/256; TL0 = (65536-46082)%256; EA = 1; ET0 = 1; TR0 = 1; WHILE(1);//等待中断服务程序的到来 } void Timer_0() interrupt 1 { TH0 = (65536-46082)/256; TL0 = (65536-46082)%256; num++; if(num == 20) { num = 0; led1 = ~led1; } } 用定时器0的方式1实现第一个发光二极管以200ms间隔闪烁,用定时器1的方式1实现数码管的前两位59s循环计时。 在定时器中做改变发光管状态和数值大小的事情。也就是说,需要跟着时间改变而进行改变的对象,都要用定器去辅助实现他们。 #include #define uchar unsigned char uchar num,i,shi,ge,j,m,n; sbit led1 = P1^0; void delay(); uchar code table[] = { 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71 }; sbit wela = P2^7; sbit dula = P2^6; void main() { TMOD = 0x11; TH0 = (65536-)/256; TL0 = (65536-)%256; TH1 = (65536-)/256; TL1 = (65536-)%256; EA = 1; ET0 = 1; ET1 = 1; TR0 = 1; TR1 = 1; while(1) { display(a,b); } } void display(shi,ge) { wela = 1; P0 = 0xfe; wela = 0; P0 = 0xff; dula = 1; P0 = table[ge]; dula = 0; delay(); wela = 1; P0 = 0xfd; wela = 0; P0 = 0xff; dula = 1; P0 = table[shi]; dula = 0; delay(); } void Timer_0() interrupt 1 { TH0 = (65536-45872)/256; TL0 = (65536-45872)%256; j++; if(j==4) { j = 0; led1 = ~led1; } } void Timer_1() inetrrupt 4 { TH1 = (65536-45872)/256; TL1 = (65536-45872)%256; i++; if(i==20) { i=0; num++; if(num==60) num=0; shi = num/10; ge = num%10; } } void delay() { for(m=5;m>0,m--) for(n=110;n>0;n--); }