学习51单片机开发板(2)

2019-01-27 18:39

{

unsigned int x,y; for(x=z;x>0;x--)

for(y=110;y>0;y--); }

void main() {

wela=1; //打开位选 P0=0xc0; wela=0;

while(1) {

for(num=0;num<16;num++) {

dula=1;

P0=table[num]; dula=0;

delay(1000); } } }

简单的总结一下目前为止的心得:最大疑问就是,比如说:为什么P2或者是P2^6就能控制数码管或者发光二极管等等,这些疑问,其实可以通过仔细观察电路图的引脚就能够知道。以数码管的静态显示为例,通过P2^6=1,打开锁存器的使能端,接着为P0置数(这是为通过此锁存器选择数码管)。位选好了之后就是段选,同样的,通过P2^7=1,打开另一个锁存器的使能端,接着为P0置数(这是为通过此锁存器让数码管具体显示示数)。

中断

#include sbit dula=P2^6; sbit wela=P2^7; sbit d1=P1^0;

unsigned char num;

unsigned char code table[]={ 0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};

void delay(unsigned int z) {

unsigned int x,y; for(x=z;x>0;x--)

for(y=110;y>0;y--); }

void main() {

num=0; tt=0;

EA=1; //开总中断 EX0=1; //开外部中断0 //IT0=1;

/*中断打开必须同时满足三个条件,中断源有中断请求;此中断源的中断允许位为1,cpu打开中断(EA=1)。*/

/*外部中断0有两种触发方式,电平触发(IT0=0)和边沿触发(IT0=1)(默认的情况为电平触发)*/

/*那么怎么知道在什么条件下触发了中断呢?例如此题,因为设置为外部中断0,所以,触发的条件是P3^2=0*/

wela=1; //打开位选 P0=0xc0; wela=0;

while(1) {

for(num=0;num<16;num++) {

dula=1;

P0=table[num]; dula=0;

delay(1000); } } }

void exter0() interrupt0 //中断服务程序,没有返回值 {

d1=0; }

注意:外部中断的触发方式的选择,如上例,触发方式选择的是电平触发方式,当触发中断时,P3^2=0.有发光二极管亮,但是此时主程序不走了; 若将IT0=1(边沿触发),则此时发光二极管一闪,然后主程序继续运行。

定时器/计数器中断

#include sbit dula=P2^6; sbit wela=P2^7; sbit d1=P1^0;

unsigned char num,tt;

unsigned char code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};

void delay(unsigned int z) {

unsigned int x,y; for(x=z;x>0;x--)

for(y=110;y>0;y--); }

void main() { num=0;

tt=0;

TMOD=0x01;//设置定时器0位工作方式1

TH0=(65536-50000)/256; //定时器0的计数器寄存器的高8位 TL0=(65536-50000)%6; //定时器0的计数器寄存器的低8位 /*定时50ms,且50ms一到,触发中断*/

}

void exter0() interrupt 1 //中断服务程序,没有返回值 {

TH0=(65536-50000)/256; TL0=(65536-50000)%6; tt++;

/*因为我们到定时1s,所以要中断20次*/ }

注意:这里我有一个疑问,定时器的触发是什么呢?

目前的答案貌似是这样的:当执行到语句if(tt==20),此时计算机必须要查询tt的值,用来判断。所以正是此时进入中断程序的。

EA=1; //开总中断

ET0=1; //开定时器中断 TR0=1; //启动定时器0

wela=1; //打开位选 P0=0xc0; wela=0; dula=1; P0=0x3f; dula=0;

while(1) {

if(tt==20) {

tt=0; num++;

dula=1;

P0=table[num]; dula=0;

//delay(1000); } }

发光二极管循环点亮,并且,利用定时器中断使数码管每隔

2s点亮

#include #include sbit dula=P2^6; //控制段选 sbit wela=P2^7; //控制位选 unsigned char num,aa;

unsigned char code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};

unsigned char temp;

void delay(unsigned int z) {

unsigned int x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }

void main() { num=0; aa=0; temp=0xfe; P1=temp; wela=1; P0=0xc0; wela=0; dula=1; P0=table[num]; TMOD=0x01;//设置定时器0位工作方式1 TH0=(65536-50000)/256; TL0=(65536-50000)%6; /*定时50ms,且50ms一到,触发中断*/ EA=1; //开总中断 ET0=1; //开定时器中断


学习51单片机开发板(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:会计基础易错

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: