| |
|
开发:
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范围内,因为temp是uchar型,是0到256) 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=1,P0口的数据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]数组的起始值的序号是从0到5 ????????????? 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并保持显示此数,与此同时利用定时器0以500MS速度进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”。到此保持住 我的方法:分成2块,第一块分成2部分:先利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,再利用定时器0以500MS速度进行流水灯从上至下移动;第二块是流水灯也停止然后全部开始闪烁,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;//如果这里不将one到six换成HELLO,走到上面的//display(one,two,three,four,five,six),只会将原来的one到six的765398再次显示出来 ?????????????????????????????????? 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;//观察到765432到765398的高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例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |