IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 郭天祥的10天学会51单片机_第四节 -> 正文阅读

[嵌入式]郭天祥的10天学会51单片机_第四节

发光二极管依次点亮:

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

uchar temp;

void delay(uint z);

void main()

{????

?????? temp=0xfe;//第一个发光二极管点亮

?????? P1=temp;

?????? while(1)

?????? {

????????????? delay(1000);

????????????? temp=_crol_(temp,1);//_crol_是左移函数

????????????? P1=temp;

?????? }

}

void delay(uint z)

{

?????? uint x,y;

?????? for(x=z;x>0;x--)

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

}

发光二极管依次点亮的同时数码管显示:

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

uchar temp,aa,num;

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 delay(uint z);

void main()

{

?????? num=0;??

?????? aa=0;

?????? TMOD=0x01;//步骤1,对TMOD赋值,以确定T0和T1的工作方式

?????? TH0=(65536-50000)/256;//步骤2,计算初值,并将其写入TH0、TL0或TH1、TL1

?????? TL0=(65536-50000)%256;

?????? EA=1;//开总中断

?????? ET0=1;//开定时器0中断

?????? TR0=1;//启动定时器0

?????? temp=0xfe;//第一个发光二极管点亮

?????? P1=temp;

?????? dula=1;

?????? P0=table[0];

?????? dula=0;

?????? wela=1;

?????? P0=0xea;//所有数码管全亮

?????? wela=0;

?????? while(1)

?????? {

????????????? delay(1000);

????????????? temp=_crol_(temp,1);//_crol_是左移函数

????????????? P1=temp;

????????????? /*if(aa==40)//之所以把数码管显示的这段程序放到中断程序中是因为在上面的//delay(1000)的延时1s的时间内,很可能由定时器控制的计数器加到aa==40,导致下面的程//序不能执行,造成错误

???????????????????? {

??????????????????????????? aa=0;

??????????????????????????? num++;

??????????????????????????? if(num==16)

?????????????????????????????????? num=0;

??????????????????????????? dula=1;

??????????????????????????? P0=table[num];

??????????????????????????? dula=0;

???????????????????? }*/

?????? }

}

void delay(uint z)

{

?????? uint x,y;

?????? for(x=z;x>0;x--)

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

}

void timer0() interrupt 1//有时后面加"using 0(1,2,3)",表示第几组工作寄存器,共四组,见书//P12和P16

{

?????? TH0=(65536-50000)/256;

?????? TL0=(65536-50000)%256;???

?????? aa++;

?????? if(aa==40)

???????????????????? {

??????????????????????????? aa=0;

??????????????????????????? num++;

??????????????????????????? if(num==16)

?????????????????????????????????? num=0;

??????????????????????????? dula=1;

??????????????????????????? P0=table[num];

??????????????????????????? dula=0;

???????????????????? }

}

位选编码依次选中第一数码管,第二个数码管一直到第六个数码管:fe,fd,fb,f7,ef,df

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

uchar temp,aa,numdu,numwe;

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};

uchar code tablewe[]={

0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//数码管的位选编码,依次从第一个数码管到第六个数码管

void main()

{

?????? numdu=0;

?????? numwe=0;

?????? aa=0;

?????? TMOD=0x01;

?????? TH0=(65536-50000)/256;

?????? TL0=(65536-50000)%256;

?????? EA=1;

?????? ET0=1;

?????? TR0=1;

?????? while(1)

?????? {

????????????? if(aa==20)

????????????? {????

???????????????????? aa=0;

???????????????????? numdu++;

???????????????????? if(numdu==7)

??????????????????????????? numdu=1;

???????????????????? dula=1;

???????????????????? P0=table[numdu];

???????????????????? dula=0;

???????????????????? wela=1;

???????????????????? P0=tablewe[numwe];

???????????????????? wela=0;

???????????????????? numwe++;

???????????????????? if(numwe==6)

??????????????????????????? numwe=0;

????????????? }

?????? }

}

void timer0() interrupt 1

{

?????? TH0=(65536-50000)/256;

?????? TL0=(65536-50000)%256;

?????? aa++;?????

}

数码管动态显示:当定时器的中断时间很短时,数码管扫描很快,数码管交替更换很快,人的肉眼就会看见几个数码管同时显示

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

uchar temp,aa,numdu,numwe;

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};

uchar code tablewe[]={

0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

void main()

{

?????? numdu=0;

?????? numwe=0;

?????? aa=0;

?????? TMOD=0x01;

?????? TH0=(65536-5000)/256;

?????? TL0=(65536-5000)%256;

?????? EA=1;

?????? ET0=1;

?????? TR0=1;

?????? while(1)

?????? {

????????????? if(aa==1)

????????????? {????

???????????????????? aa=0;

???????????????????? numdu++;

???????????????????? if(numdu==7)

??????????????????????????? numdu=1;

???????????????????? dula=1;

???????????????????? P0=table[numdu];

???????????????????? dula=0;

???????????????????? wela=1;

???????????????????? P0=tablewe[numwe];

???????????????????? wela=0;

???????????????????? numwe++;

???????????????????? if(numwe==6)

??????????????????????????? numwe=0;

????????????? }

?????? }

}

void timer0() interrupt 1

{

?????? TH0=(65536-5000)/256;

?????? TL0=(65536-5000)%256;

?????? aa++;?????

}

显示一个十位十进制数,通过设置temp,如果显示百位十进制数就要定义一个bai(256范围内,因为tempuchar型,是0256)

Bai= temp/100;

shi=temp%100/10;

ge=temp%10;

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

uchar temp,numdu,shi,ge;//当显示大于255的数字时,要将temp定义成uint型,因为uchar 型//即unsigned char型,范围在0~255之间

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 delay(uint z);

void main()

{????

?????? temp=12;

?????? numdu=0;

?????? while(1)

?????? {

????????????? shi=temp/10;

????????????? ge=temp%10;

????????????? dula=1;

????????????? P0=table[shi];

????????????? dula=0;

????????????? wela=1;

????????????? P0=0xfe;

????????????? wela=0;

????????????? delay(5);

????????????? dula=1;

????????????? P0=table[ge];

????????????? dula=0;

????????????? wela=1;

????????????? P0=0xfd;

????????????? wela=0;

????????????? delay(5);

?????? }

}

void delay(uint z)

{

?????? uint x,y;

?????? for(x=z;x>0;x--)

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

}

利用子函数显示一个百位数:

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

uchar bai,shi,ge;

uint temp;

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 delay(uint z);

void display(uchar,uchar,uchar);

void main()

{????

?????? temp=456;

?????? bai=temp/100;

?????? shi=temp%100/10;

?????? ge=temp%10;?????????????????????

?????? while(1)

?????? {

????????????? 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;

????????????? wela=1;

????????????? P0=0xfe;

????????????? wela=0;

????????????? delay(5);

????????????? dula=1;

????????????? P0=table[shi];

????????????? dula=0;

????????????? wela=1;

????????????? P0=0xfd;

????????????? wela=0;

????????????? delay(5);

????????????? dula=1;

????????????? P0=table[ge];

????????????? dula=0;

????????????? wela=1;

????????????? P0=0xfb;

????????????? wela=0;

????????????? delay(5);

??????

}

0显示到99,隔一秒加一次:

#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)//一次中断是50(50000)ms,(a=20)20次就是1s

????????????? ? {

???????????????????? 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;//因为如果没有这句,段选数据送完后P0=table[bai],下面的位选打开//wela=1P0口的数据P0=table[bai]送到下面的位选,导致数码管还没正式送位选P0=0xfe

//就直接显示数字P0=table[bai],导致错误

//P0=table[bai]会传给下面的位选导致后面几个数码管也可能亮

????????????? //P0=0xff作用是让所有数码管都不用,即消隐

????????????? wela=1;

????????????? P0=0xfe;

????????????? wela=0;

????????????? delay(1);//delay(1)是延时1ms,如果时间长了就可能影响中断的程序

????????????? //因为中断程序时间范围内,如果延时超过中断时间就会影响中断程序

????????????? dula=1;

????????????? P0=table[shi];

????????????? dula=0;

????????????? P0=0xff;//道理同上

????????????? wela=1;

????????????? P0=0xfd;

????????????? wela=0;

????????????? delay(1);//如果没有延时P0=0xfd会很快的传给下面的段选,导致错误

????????????? 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++;?????

}

课件练习:

利用动态扫描方法在六位数码管上显示出稳定的654321:

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

sbit dula=P2^6;

sbit wela=P2^7;

uchar dunum;

char wenum;//uchar类型的是不能为负数的,这里的wela是要有负的部分数字

uchar code dutable[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71

};

uchar code wetable[]={

0xfe,0xfd,0xfb,0xf7,0xef,0xdf

};

void delay(uint z)

{

?????? uchar x,y;

?????? for(x=z;x>0;x--)

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

}

void init()

{

?????? dunum=0;

?????? wenum=5;

?????? dula=0;

?????? wela=0;

}

void main()

{

?????? init();

?????? while(1)

?????? {

????????????? dunum++;

????????????? if(dunum==7)

???????????????????? dunum=1;

????????????? dula=1;

????????????? P0=dutable[dunum];

????????????? dula=0;

????????????? P0=0xff;//这句程序的后面要是加上delay(5),各个数码管会变化很多数字

????????????? wela=1;

????????????? P0=wetable[wenum];

????????????? wela=0;

????????????? wenum--;

????????????? if(wenum==-1)

???????????????????? wenum=5;// wetable[wenum]数组的起始值的序号是从05

????????????? delay(5);

?????? }

}

课件的程序:

#include<reg52.h>? //52单片机头文件

#include <intrins.h> //包含有左右循环移位子函数的库

#define uint unsigned int??? //宏定义

#define uchar unsigned char? //宏定义

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,uchar,uchar,uchar,uchar,uchar); //函数声明

void delay(uint);

void main()

{

?????? while(1)

?????? {

????????????? display(6,5,4,3,2,1);???????? //始终显示

?????? }

}

void display(uchar one,uchar two,uchar three,uchar four,uchar five,uchar six)

{

??????? dula=1;

????????????? P0=table[one];?? //送段数据

????????????? dula=0;

????????????? P0=0xff;??????? //送位数据前关闭所有显示,防止打开位选锁存后段选数据通过位选//锁存器

????????????? wela=1;

????????????? P0=0xfe;

????????????? wela=0;

????????????? delay(1);

????????????? dula=1;

????????????? P0=table[two];

????????????? dula=0;

????????????? P0=0xff;

????????????? wela=1;

????????????? P0=0xfd;

????????????? wela=0;

????????????? delay(1);

????????????? dula=1;

????????????? P0=table[three];

????????????? dula=0;

????????????? P0=0xff;

????????????? wela=1;

????????????? P0=0xfb;

????????????? wela=0;

????????????? delay(1);

????????????? dula=1;

????????????? P0=table[four];

????????????? dula=0;

????????????? P0=0xff;

????????????? wela=1;

????????????? P0=0xf7;

????????????? wela=0;

????????????? delay(1);

????????????? dula=1;

????????????? P0=table[five];

????????????? dula=0;

????????????? P0=0xff;

????????????? wela=1;

????????????? P0=0xef;

????????????? wela=0;

????????????? delay(1);

????????????? dula=1;

????????????? P0=table[six];

????????????? dula=0;

????????????? P0=0xff;

?????? ?????? wela=1;

????????????? P0=0xdf;

????????????? wela=0;

????????????? delay(1);

}

void delay(uint z)?????? //延时子函数

{

?????? uint x,y;

?????? for(x=z;x>0;x--)

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

}

用动态扫描方法和定时器1在数码管的前三位显示出秒表,精确到1%秒,即后两位显示1%秒,一直循环下去:

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

uchar aa,bb,bai,shi,ge,shii;

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 delay(uchar z)

{

?????? uchar x,y;

?????? for(x=z;x>0;x--)

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

}

void init()

{

?????? aa=0;

?????? bb=0;

?????? bai=0;

?????? shi=0;

?????? ge=0;

?????? shii=0;

?????? TMOD=0x11;

?????? TH0=(65536-50000)/256;

?????? TL0=(65536-50000)%256;

?????? EA=1;

?????? ET0=1;

?????? TR0=1;

?????? //TMOD=0x10;

?????? TH1=(65536-10000)/256;

?????? TL1=(65536-10000)%256;

?????? //EA=1;

?????? ET1=1;

?????? TR1=1;

?????? dula=1;

?????? P0=table[0];

?????? dula=0;

?????? P0=0xff;

?????? wela=1;

?????? P0=0xc8;

?????? wela=0;

}

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 displayy(uchar shii,uchar bb)

{

?????? dula=1;

?????? P0=table[shii];

?????? dula=0;

?????? P0=0xff;

?????? wela=1;

?????? P0=0xef;

?????? wela=0;??

?????? delay(1);

?????? dula=1;

?????? P0=table[bb];

?????? dula=0;

?????? P0=0xff;

?????? wela=1;

?????? P0=0xdf;

?????? wela=0;??

?????? delay(1);

}

void main()

{

?????? init();

?????? while(1)

?????? {

????????????? if(aa==20)

????????????? {

???????????????????? aa=0;

???????????????????? ge++;

???????????????????? if(ge==10)

???????????????????? {

??????????????????????????? ge=0;

??????????????????????????? shi++;

??????????????????????????? if(shi==6)

??????????????????????????? {

?????????????????????????????????? shi=0;

?????????????????????????????????? bai++;

?????????????????????????????????? if(bai==10)

????????????????????????????????????????? bai=0;

??????????????????????????? }

???????????????????? }

????????????? }

????????????? display(bai,shi,ge);

????????????? if(bb==10)

????????????? {

???????????????????? bb=0;

???????????????????? shii++;

???????????????????? if(shii==10)

??????????????????????????? shii=0;

????????????? }

????????????? displayy(shii,bb);

?????? }

}

void inter0() interrupt 1

{

?????? TH0=(65536-50000)/256;

?????? TL0=(65536-50000)%256;

?????? aa++;

}

void inter1() interrupt 3

{

?????? TH1=(65536-10000)/256;

?????? TL1=(65536-10000)%256;

?????? bb++;

}

对于题目:用动态扫描方法和定时器1在数码管的前三位显示出秒表,精确到1%秒,即后两位显示1%秒,一直循环下去

我的方法:

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

uchar bai,shi,ge;

uint aa;

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 delay(uint z)

{

?????? uchar x,y;

?????? for(x=z;x>0;x--)

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

}

void init()

{

?????? aa=0;

?????? bai=0;

?????? shi=0;

?????? ge=0;

?????? TMOD=0x10;

?????? TH1=(65536-10000)/256;

?????? TL1=(65536-10000)%256;

?????? EA=1;

?????? ET1=1;

?????? TR1=1;

/*??? dula=1;

?????? P0=table[0];

?????? dula=0;

?????? P0=0xff;

?????? wela=1;

?????? P0=0xf8;

?????? wela=0;*/

}

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 main()

{

?????? init();

?????? while(1)

?????? {

????????????? display(bai,shi,ge); //显示函数要放在while(1)中,让display(bai,shi,ge)时刻显示,如//果放在中断函数中,只有中断时才会显示,在数码管上就显示不很亮,甚至亮度很弱

?????? }

}

void inter1() interrupt 3

{

?????? TH1=(65536-10000)/256;

?????? TL1=(65536-10000)%256;

?????? aa++;?????

}

利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,与此同时利用定时器0500MS速度进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”。到此保持住

我的方法:分成2块,第一块分成2部分:先利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,再利用定时器0500MS速度进行流水灯从上至下移动;第二块是流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”

对于“直至765398并保持显示此数”,程序里关闭定时器1即可实现

#include<reg52.h>

#include<intrins.h>?????????????

#define uint unsigned int

#define uchar unsigned char

#define ulong unsigned long int

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,

0x76,0x79,0x38,0x3f,0//为了显示HELLO,这里添加几个码,什么也不显示的码是0

};???

sbit dula=P2^6;

sbit wela=P2^7;

uchar one,two,three,four,five,six,aa,bb,kk,dd,ee,flag;

ulong temp;//注意temp的值里有765432

void delay(uint z)

{

?????? uchar x,y;

?????? for(x=z;x>0;x--)

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

}

void display(uchar one,uchar two,uchar three,uchar four,uchar five,uchar six)//显示函数单提出来

{

?????? dula=1;

?????? P0=table[one];

?????? dula=0;

?????? P0=0xff;

?????? wela=1;

?????? P0=0xfe;

?????? wela=0;??

?????? delay(1);//延时不能少,少了延时下面的数字送过来就会出现叠加

?????? dula=1;

?????? P0=table[two];

?????? dula=0;

?????? P0=0xff;

?????? wela=1;

?????? P0=0xfd;

?????? wela=0;

?????? delay(1);

?????? dula=1;

?????? P0=table[three];

?????? dula=0;

?????? P0=0xff;

?????? wela=1;

?????? P0=0xfb;

?????? wela=0;

?????? delay(1);

?????? dula=1;

?????? P0=table[four];

?????? dula=0;

?????? P0=0xff;

?????? wela=1;

?????? P0=0xf7;

?????? wela=0;

?????? delay(1);

?????? dula=1;

?????? P0=table[five];

?????? dula=0;

?????? P0=0xff;

?????? wela=1;

?????? P0=0xef;

?????? wela=0;

?????? delay(1);

?????? dula=1;

?????? P0=table[six];

?????? dula=0;

?????? P0=0xff;

?????? wela=1;

?????? P0=0xdf;

?????? wela=0;

?????? delay(1);

}

void init()

{

?????? TMOD=0x11;

?????? TH0=(65536-50000)/256;

?????? TL0=(65536-50000)%256;

?????? TH1=(65536-50000)/256;

?????? TL1=(65536-50000)%256;

?????? EA=1;

?????? ET0=1;

?????? ET1=1;

?????? TR0=1;

?????? TR1=1;

??????

?????? ee=0xff;//ee为了控制发光二极管给P1口送数而设置的

?????? flag=0;//flag为标志位,为了判断是否到了765398

?????? kk=0xfe; //为了控制发光二极管流水灯给P1口送数

?????? P1=kk;

?????? temp=765432;

?????? display(7,6,5,4,3,2);//显示初始值765432

}

void main()

{

?????? init();

??????

?????? while(1)

?????? {

????????????? display(one,two,three,four,five,six);//在主函数中才能不间断显示,在中断中会间断显//

????????????? if(bb==10)

????????????? {????

???????????????????? if(temp==765398)

??????????????????????????? flag=1;?????????? //当需要判断时多多利用标志位flag

???????????????????? if(flag==0)

?????? ????????????? {

??????????????????????????? bb=0;

??????????????????????????? kk=_crol_(kk,1);???

??????????????????????????? P1=kk;

???????????????????? }

???????????????????? if(flag==1)

???????????????????? {

??????????????????????????? bb=0;

??????????????????????????? dd++;

??????????????????????????? if(dd==6)//定时3s后显示HELLO

??????????????????????????? {

?????????????????????????????????? dd=0;

?????????????????????????????????? TR0=0;

?????????????????????????????????? P1=0xff;

?????????????????????????????????? one=16;

?????????????????????????????????? two=17;

?????????????????????????????????? three=18;

?????????????????????????????????? four=18;

?????????????????????????????????? five=19;

?????????????????????????????????? six=20;//如果这里不将onesix换成HELLO,走到上面的//display(one,two,three,four,five,six),只会将原来的onesix765398再次显示出来

?????????????????????????????????? display(one,two,three,four,five,six);

??????????????????????????? }

??????????????????????????? else

??????????????????????????? {

?????????????????????????????????? ee=~ee;

?????????????????????????????????? P1=ee;//全体发光二极管闪烁

??????????????????????????? }

???????????????????? }

????????????? }

?????? }

}

void exter1() interrupt 3

{

?????? TH1=(65536-50000)/256;

?????? TL1=(65536-50000)%256;

?????? aa++;

?????? if(aa==2)

?????? {

????????????? aa=0;

????????????? temp--;

????????????? if(temp==765398)

????????????? {

???????????????????? TR1=0;//temp==765398时,关断定时器1,就不再扫描

???????????????????? bb=0;

????????????? }

????????????? one=temp/100000;//分离出temp

????????????? two=temp%100000/10000;

????????????? three=temp%10000/1000;

????????????? four=temp%1000/100;

????????????? five=temp%100/10;

????????????? six=temp%10;

?????? }

}

void exter0() interrupt 1

{

?????? TH0=(65536-50000)/256;

?????? TL0=(65536-50000)%256;

?????? bb++;?????

}

课件的程序:在中断函数中,比如下面的中断0的中断时间是50ms,那么中断0中的函数的处理时间不要超过50ms,如果超过中断的时间,下一次中断到来时这次中断还没处理完,就会把下一次中断丢失;一个单周期指令是1us,一个双周期指令是2us,中断0才几条指令,总共也几微妙,远远小于50ms,所以不影响下一次中断;在中断中写一些利于方便计算和观察的程序就行

#include<reg52.h>? //52单片机头文件

#include <intrins.h> //包含有左右循环移位子函数的库

#define uint unsigned int??? //宏定义

#define uchar unsigned char? //宏定义

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,

0x76,0x79,0x38,0x3f,0};

uchar temp,t0,t1,bai,shi,ge,flag,flag1;

uint shu;

void init();????????????? //函数声明

void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge);

void delay(uint z)? ???//延时子函数

{

?????? uint x,y;

?????? for(x=z;x>0;x--)

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

}

void main()????????? //主函数

{

?????? init();

?????? while(1)

?????? {

????????????? if(flag1!=1)?? //如果flagi不再等于1则显示数据

???????????????????? display(7,6,5,bai,shi,ge);

????????????? else

???????????????????? display(16,17,18,18,19,20);?? ? //否则显示hello

?????? }

}

void init()?? ???????//初始化函数

{

?????? shu=432;//观察到765432765398的高3位都是765,不用参与分离程序,简化程序

?????? temp=0xfe;

?????? P1=temp;

?????? TMOD=0x11;

?????? TH0=(65536-50000)/256;? //定时器初始化

?????? TL0=(65536-50000)%256;

?????? TH1=(65536-50000)/256;

?????? TL1=(65536-50000)%256;

?????? EA=1;

?????? ET0=1;

?????? ET1=1;

?????? TR0=1;

?????? TR1=1;

}

void timer0() interrupt 1?? //定时器0中断

{

?????? TH0=(65536-50000)/256;

?????? TL0=(65536-50000)%256;

?????? t0++;

?????? if(flag!=1)????????? //flag不等于1时进行流水灯

????????????? {

????????????? if(t0==10)

???????????????????? {

??????????????????????????? t0=1;//这里程序应该是t0=0

??????????????????????????? temp=_crol_(temp,1);

??????????????????????????? P1=temp;

???????????????????? }

????????????? }

?????? else????????????? //否则进行灯闪烁

????????????? {

???????????????????? if(t0%4==0)? //小灯每200毫秒变化一次

??????????????????????????? P1=~P1;

???????????????????? if(t0==60)

???????????????????? {

??????????????????????????? TR0=0;?? //3秒后关闭定时器0,关闭灯,并置flag=1

??????????????????????????? P1=0xff;

??????????????????????????? flag1=1;

???????????????????? }

????????????? }????

}

void timer1() interrupt 3? //定时器1中断函数

{

?????? TH1=(65536-50000)/256;

?????? TL1=(65536-50000)%256;

?????? t1++;

?????? if(t1==2)

????????????? {

???????????????????? t1=0;

????????????? ?????? shu--;

???????????????????? bai=shu/100;

???????????????????? shi=shu%100/10;

???????????????????? ge=shu%10;

???????????????????? if(shu==398)?? //当到398时把原来T0中的数清除,重新加裁初值让小灯闪烁

??????????????????????????? {

?????????????????????????????????? TR0=0;

?????????????????????????????????? TH0=(65536-50000)/256;//还原定时器0,里面的数据此时会有一个数,//这里要还原一下

?????????????????????????????????? TL0=(65536-50000)%256;

?????????????????????????????????? TR0=1;//再重新启动定时器0

?????????????????????????????????? flag=1;

?????????????????????????????????? t0=0;

?????????????????????????????????? P1=0xff;

?????????????????????????????????? TR1=0;

??????????????????????????? }????

????????????? }????

}

void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge) //显示子函数

{

??????? ?????? dula=1;

????????????? P0=table[aa];

????????????? dula=0;

????????????? P0=0xff;

????????????? wela=1;

????????????? P0=0xfe;

????????????? wela=0;

????????????? delay(1);

??? ?????? ???? dula=1;

????????????? P0=table[bb];

????????????? dula=0;

????????????? P0=0xff;

????????????? wela=1;

????????????? P0=0xfd;

????????????? wela=0;

????????????? delay(1);

????? ?????????? dula=1;

????????????? P0=table[cc];

????????????? dula=0;

????????????? P0=0xff;

????????????? wela=1;

????????????? P0=0xfb;

????????????? wela=0;

????????????? delay(1);

??????? ?????? dula=1;

????????????? P0=table[bai];

????????????? dula=0;

????????????? P0=0xff;

????????????? wela=1;

????????????? P0=0xf7;

????????????? wela=0;

????????????? delay(1);

????????????? dula=1;

????????????? P0=table[shi];

????????????? dula=0;

????????????? P0=0xff;

????????????? wela=1;

????????????? P0=0xef;

????????????? wela=0;

????????????? delay(1);

????????????? dula=1;

????????????? P0=table[ge];

????????????? dula=0;

????????????? P0=0xff;

????????????? wela=1;

????????????? P0=0xdf;

????????????? wela=0;

????????????? delay(1);

}

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-04 13:00:11  更:2021-10-04 13:01:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:25:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码