这段时间主要学习了单片机的中断、计数器、计时器部分。具体的理论知识在书上已经有了,在此不再赘述。下面就在数码管上显示计数100的计数器的实现:

具体代码如下:

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,bai,shi,ge;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void display(uchar bai,uchar shi,uchar ge);
void delay(uint z);
void init();
void main()
{    
    init();//初始化主程序
    while(1)
    {
        if(aa==20)
          {
            aa=0;
            temp++;
            if(temp==100)
               {
                    temp=0;
               }
            bai=temp/100;
            shi=temp%100/10;
            ge=temp%10;
          }
        display(bai,shi,ge);
    }
}

void delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}

void display(uchar bai,uchar shi,uchar ge)
{
        dula=1;
        P0=table[bai];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfe;
        wela=0;
        delay(1);

        dula=1;
        P0=table[shi];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfd;
        wela=0;
        delay(1);

        dula=1;
        P0=table[ge];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfb;
        wela=0;
        delay(1);
}

void init()
{    
    wela=0;
    dula=0;
    temp=0;
    TMOD=0x01;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    EA=1;
    ET0=1;
    TR0=1;    
}

void timer0() interrupt 1
{
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    aa++;    
}
  1. 对TMOD进行赋值,以确定T0和T1的工作方式。
  2. 计算初值(根据所要定时的时间确定),并将初值写入TH0、TL0和TH1、TL1中。
  3. 中断方式时,对IE赋值,开放中断。
  4. 是TR0或TR1置位,启动定时器/计数器定时或计数。

效果如下:

大三上学期单片机学习心得及笔记

这学期正式开始单片机的正规学习,先从单片机的内部硬件结构入手,基本了解了单片机的架构和寻址方式。汇编语言是学习单片机必不可少的内容,学完汇编其他的单片机可以触类旁通,上手很快。汇编在大二的时候接触过一点,那时感觉很难…….现在也该觉很难(逃。学习的核心是微机的内部构造及其功能。当然,任何单片机最简单的一步就是让流水灯亮起来、跑起来。下面就是最简单的一个程序,重要意义在于汇编程序的书写和理解:

;-----------------------
;---闪烁灯实验----------
;---TangHsiangYu--------
ORG 0000H
LJMP START
ORG 0030H
;初始化
START:MOV SP,#60H;给堆栈指针赋值
MOV P1,0FFH;八位,给灯赋值,全灭
MAIN:CLR P1.7;对后一位置零
CALL DELAY
SETB P1.7;对最后一位置一
CALL DELAY
LJMP MAIN;死循环
DELAY:MOV R0,#250;对R0寄存器赋值
D2: MOV R1,#250
D1: DJNZ R1,D1;小循环
    DJNZ R0,D2;大循环
    RET;子程序返回
    END 

在DELAY函数里循环了250$\times$250次,根据机器周期可以设计出任何时间间隔闪烁。

对应的C语言程序:

#include <reg51.h>
typedef unsigned int uint; 
// #define uint unsigned int 
uint x,y,z;
sbit p = P1^0;
void delay(uint);
void main()
{      
    p = 1;
    delay(1000);
    p = 0;
    while(1);
}
void delay(uint z)
{
    for(x=z;x--;x>0)
        for(y=150;y--;y>0);
}

 

版权声明:本文为txy19981002原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/txy19981002/p/7348937.html