51单片机学习(一)
这段时间主要学习了单片机的中断、计数器、计时器部分。具体的理论知识在书上已经有了,在此不再赘述。下面就在数码管上显示计数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++; }
- 对TMOD进行赋值,以确定T0和T1的工作方式。
- 计算初值(根据所要定时的时间确定),并将初值写入TH0、TL0和TH1、TL1中。
- 中断方式时,对IE赋值,开放中断。
- 是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); }