| |
|
开发:
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单片机_第五节 |
将一种单片机学精,学透,再转其它单片机(高级单片机)都很容易? 写程序时要画程序流程图 添加89系列的头文件时可以鼠标右键选择Insert’Include<AT89X52.H>’ 多利用已经写好的程序,比如写好的子函数等 如果子函数B程序体重用到子函数A,A一定要定义在B之前,否则会出错,当然A和B都声明后A可以不用非得定义在B之前 前面介绍过,如果要向P1口、P2口或P3口做输入口(写数据),要先写1(这三个口要输出1),见书P11 第四课的练习第三题:利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,与此同时利用定时器0以500MS速度进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”。到此保持住。 先编写利用定时器0以500MS速度进行流水灯从上至下移动, 再编写数码管,765432到765398,可以后三位变动从432到398 #include<reg52.h>? //52单片机头文件 #include <intrins.h> //包含有左右循环移位子函数的库,_crol_函数 #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};//0x76,0x79,0x38,0x3f,0是HELLO的编码,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; ?????? 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; ??????????????????????????? temp=_crol_(temp,1); ??????????????????????????? P1=temp; ???????????????????? } ????????????? } ?????? else????????????? //否则进行灯闪烁 ????????????? { ???????????????????? if(t0%4==0)? //小灯每200毫秒变化一次 ??????????????????????????? P1=~P1;//小灯闪烁 ???????????????????? if(t0==60)//每次中断是50毫秒,然后t0++,t0==60时是3s ???????????????????? { ??????????????????????????? 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; ?????????????????????????????????? TL0=(65536-50000)%256; ?????????????????????????????????? TR0=1; ?????????????????????????????????? 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); } 在写中断函数时,中断的函数体不要太长,如果函数执行时间超过中断时间就会导致下次中断出错,例如timer1() interrupt 3中如果函数体执行时间超过50毫秒就会出错 一条语句一般是一个机器周期或二个机器周期,加一下就知道。 子函数写在main()函数之前就不要声明 I/0口做输入一直给高电平(书P11),当键盘按下去,按键和连线形成与门,另一端接地为低电平,检测I/0口为低电平就可以判断相应键盘按下。见下图的按键和连线接GND: TX-1C型单片机实验板原理图右边的矩阵键盘,从上到下依次对应3.0口到3.7口,四行对应3.0口到3.3口,四列对应3.4口到3.7口;矩阵键盘右边是独立键盘,分别连接3.4口到3.7口 检测是否有键按下去,比如检测3.4口,先给3.4口一个高电平1,再检测3.4口是否收到0 一个工程中C文件可以有多个,但main函数只能有一个 一个功能用程序实现完再用程序实现另一个功能 前几课都是控制单片机输出,检测键盘是先控制单片机输出高电平再检测单片机的输入,如果是低电平表示有键盘按下,单片机再做相应的响应 独立键盘方式,TX-1C型单片机实验板原理图右边的LCDEN,RS,WR,RD,对应键盘S2、S3、S4和S5,另一端接地 如果P3.4口按下去第一个发光二极管点亮,如果松手关闭: #include<reg52.h> #include<intrins.h>????????????? #define uint unsigned int #define uchar unsigned char sbit key1=P3^4; sbit d1=P1^0; void main() { ?????? P3=0xff;//先给P3口高电平后才能再检测键盘是否按下 ?????? if(key1==0) ????????????? d1=0; ?????? else ????????????? d1=1; } 见PPT 的LESSON5_键盘P5 当键盘按下数码管数字加1显示 因为键按下去的时间很长(与毫秒相比),而语句执行很快,所以在按下去时num++就会执行很多次了,导致松手后不能显示下一个num值,抖动的时间一般为5毫秒,消除抖动的时间一般大于5毫秒,这里用5或10毫秒,在按下和释放时都要消抖 #include<reg52.h> #include<intrins.h>????????????? #define uint unsigned int #define uchar unsigned char sbit key1=P3^4; sbit d1=P1^0; 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,0}; uchar num,temp,num1; void delay(uchar z) { ?????? uchar x,y; ?????? for(x=z;x>0;x--) ????????????? for(y=110;y>0;y--); } void main() { ?????? wela=1; ?????? P0=0xfe; ?????? wela=0;?? ?????? P3=0xff;//先给P3口高电平后才能再检测键盘是否按下 ?????? while(1) ?????? { ????????????? if(key1==0) ????????????? { ???????????????????? delay(10);//键盘消抖,延时10s ???????????????????? if(key1==0)//如果键盘确实被按下,则继续让数码管显示加1 ???????????????????? { ??????????????????????????? d1=0; ??????????????????????????? num++; ??????????????????????????? if(num==10) ?????????????????????????????????? num=0; ???????????????????? } ???????????????????? while(!key1);//键盘是否松手 ???????????????????? delay(10);//键盘消抖,延时10s ???????????????????? while(!key1);//键盘释放消抖 ????????????? } ?????? ?????? else ???????????????????? d1=1; ????????????? dula=1; ????????????? P0=table[num]; ????????????? dula=0;?? ?????? } } 矩阵键盘方式:见PPT 的LESSON5_键盘P6,矩阵键盘也是检测低电平 见PPT的P7页,检测时依次给横行低电平0并保持住,横行与竖行是线或的关系,当按下时给低电平0,线或后得到低电平0,检测到即可根据P3.0到P3.7的值来判断是哪个键被按下 先赋给P3口0xfe(让单片机的P3.0口输出0),再读回P3口值(这里设为temp)temp=P3,用temp&0xf0(这里要看P3口高四位,如果高四位有0则得到的结果应该不是0xf0,说明有键按下),如果temp&0xf0=0xf0说明没有键按下,否则说明有键按下,再扫描一下由temp&0xf0得到是哪个键被按下 扫描时先给P3.0口0,P3.1、 P3.2、P3.3都给1,读取P3.4到P3.7口的数据,如果第一键被按下去,P3.4口读回来就是0,P3.5到P3.7口都是1,这样对应P3.0到P3.7口是0111? 0111,别的键同理,下一次扫描将P3.0口给1,给P3.1口0,再一一检测,其它同理,发现有任何一个键按下就跳出扫描大循环,退出扫描程序 #include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; sbit key1=P3^4;//S2键,对应TX-1C型单片机实验板原理图中的LCDEN uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0}; uchar num,temp,num1; void delay(uint z) { ?????? uint x,y; ?????? for(x=z;x>0;x--) ????????????? for(y=110;y>0;y--); } uchar keyscan(); void display(uchar aa); void main() { ?????? num=17;//程序开始时数码管什么也不显示 ?????? dula=1; ?????? P0=0;//开始让数码管什么也不显 ?????? dula=0; ?????? wela=1; ?????? P0=0xc0; ?????? wela=0; ?????? while(1) ????????????? display(keyscan()); } void display(uchar aa) { ???????????????????? dula=1; ???????????????????? P0=table[aa-1]; ???????????????????? dula=0;????????? } uchar keyscan() { ???????????????????? P3=0xfe; ???????????????????? temp=P3; ???????????????????? temp=temp&0xf0; ???????????????????? while(temp!=0xf0) ??????????????????????????? { ?????????????????????????????????? delay(5); ?????????????????????????????????? temp=P3; ?????????????????????????????????? temp=temp&0xf0; ?????????????????????????????????? while(temp!=0xf0) ?????????????????????????????????? { ????????????????????????????????????????? temp=P3;//temp重新被赋值,才能跳出while(temp!=0xf0)的循环,//如果没有这句就跳不出来,例如当第一个键按下,temp=temp&0xf0=0xe0,进入//while(temp!=0xf0)的循环,temp=0xe0总不等于0xf0,就一直在这个循环里,下面检测松手//的while(temp!=0xf0)循环中,temp=P3,松手后P3的高四位是1111,temp=temp&0xf0=0xf0,//再走到大while循环的判断时,退出循环 switch(temp) ????????????????????????????????????????? { ???????????????????????????????????????????????? case 0xee:num=1; ??????????????????????????????????????????????????????? break; //num赋值后跳出当前switch循环 ???????????????????????????????????????????????? case 0xde:num=2; ??????????????????????????????????????????????????????? break; ???????????????????????????????????????????????? case 0xbe:num=3; ??????????????????????????????????????????????????????? break; ???????????????????????????????????????????????? case 0x7e:num=4; ??????????????????????????????????????????????????????? break; ????????????????????????????????????????? } ?????????????????????????????????? while(temp!=0xf0)//检测是否松手,在上面temp=P3,所以第一次检测//时temp必然!=0xf0,然后进入下面的循环,如果松手temp =0xf0退出循环,否则继续循环 ????????????????????????????????????????? { ???????????????????????????????????????????????? temp=P3; ???????????????????????????????????????????????? temp=temp&0xf0; ????????????????????????????????????????? } ?????????????????????????????????? } ??????????????????????????? } ???????????????????? P3=0xfd; ???????????????????? temp=P3; ???????????????????? temp=temp&0xf0; ???????????????????? while(temp!=0xf0) ??????????????????????????? { ?????????????????????????????????? delay(5); ?????????????????????????????????? temp=P3; ?????????????????????????????????? temp=temp&0xf0; ?????????????????????????????????? while(temp!=0xf0) ?????????????????????????????????? { ????????????????????????????????????????? temp=P3; ??????????????????????????? ?????? ?????? switch(temp) ????????????????????????????????????????? { ???????????????????????????????????????????????? case 0xed:num=5; ??????????????????????????????????????????????????????? break; ???????????????????????????????????????????????? case 0xdd:num=6; ??????????????????????????????????????????????????????? break; ???????????????????????????????????????????????? case 0xbd:num=7; ??????????????????????????????????????????????????????? break; ???????????????????????????????????????????????? case 0x7d:num=8; ??????????????????????????????????????????????????????? break; ????????????????????????????????????????? } ?????????????????????????????????? while(temp!=0xf0) ????????????????????????????????????????? { ???????????????????????????????????????????????? temp=P3; ???????????????????????????????????????????????? temp=temp&0xf0; ????????????????????????????????????????? } ?????????????????????????????????? } ??????????????????????????? } ???????????????????? P3=0xfb; ???????????????????? temp=P3; ???????????????????? temp=temp&0xf0; ???????????????????? while(temp!=0xf0) ??????????????????????????? { ?????????????????????????????????? delay(5); ?????????????????????????????????? temp=P3; ?????????????????????????????????? temp=temp&0xf0; ?????????????????????????????????? while(temp!=0xf0) ?????????????????????????????????? { ????????????????????????????????????????? temp=P3; ?????????????????????????????????? switch(temp) ????????????????????????????????????????? { ???????????????????????????????????????????????? case 0xeb:num=9; ??????????????????????????????????????????????????????? break; ??????????????????????????? ???????????????????? case 0xdb:num=10; ??????????????????????????????????????????????????????? break; ???????????????????????????????????????????????? case 0xbb:num=11; ??????????????????????????????????????????????????????? break; ???????????????????????????????????????????????? case 0x7b:num=12; ??????????????????????????????????????????????????????? break; ????????????????????????????????????????? } ?????????????????????????????????? while(temp!=0xf0) ????????????????????????????????????????? { ???????????????????????????????????????????????? temp=P3; ???????????????????????????????????????????????? temp=temp&0xf0; ????????????????????????????????????????? } ?????????????????????????????????? } ??????????????????????????? } ???????????????????? P3=0xf7; ???????????????????? temp=P3; ???????????????????? temp=temp&0xf0; ???????????????????? while(temp!=0xf0) ??????????????????????????? { ?????????????????????????????????? delay(5); ?????????????????????????????????? temp=P3; ?????????????????????????????????? temp=temp&0xf0; ?????????????????????????????????? while(temp!=0xf0) ?????????????????????????????????? { ????????????????????????????????????????? temp=P3; ?????????????????????????????????? switch(temp) ????????????????????????????????????????? { ???????????????????????????????????????????????? case 0xe7:num=13; ??????????????????????????????????????????????????????? break; ???????????????????????????????????????????????? case 0xd7:num=14; ??????????????????????????????????????????????????????? break; ???????????????????????????????????????????????? case 0xb7:num=15; ?????? ???????????????????????????????????????????????? break; ???????????????????????????????????????????????? case 0x77:num=16; ??????????????????????????????????????????????????????? break; ????????????????????????????????????????? } ?????????????????????????????????? while(temp!=0xf0) ????????????????????????????????????????? { ???????????????????????????????????????????????? temp=P3; ???????????????????????????????????????????????? temp=temp&0xf0; ????????????????????????????????????????? } ?????????????????????????????????? } ??????????????????????????? } return num; } 带返回值的函数就返回一个数 一个函数中的变量不要和全局变量的名称一样 调程序就是一点一点调,郭天祥做项目有时一调调一两个星期 课件练习: 数码管前三位显示一个跑表,从000到999之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。(用定时器设计表): 我的方法:先做从000到999之间以1%秒速度运行,再做当按下一个独立键盘时跑表停止,松开手后跑表继续运行 核心:键盘按下定时器停止,键盘松手定时器重新打开 if(key1==0) ????????????? { ???????????????????? delay(10); ???????????????????? if(key1==0) ???????????????????? {???? ??????????????????????????? TR0=0; ???????????????????? } ????????????? } ????????????? while(!key1) ????????????? { ???????????????????? display(bai,shi,ge); ???????????????????? delay(10); ???????????????????? while(!key1); ????????????? } ????????????? TR0=1; ????????????? display(bai,shi,ge); 正确的是:和键盘按下有关的程序都要放在键盘按下的条件体内? if(key1==0) ???????????????????? {???? ??????????????????????????? TR0=0; ??????????????????????????? while(!key1) ??????????????????????????? { ?????????????????????????????????? delay(10); ?????????????????????????????????? while(!key1) ????????????????????????????????????????? display(bai,shi,ge); ??????????????????????????? } ??????????????????????????? TR0=1; ???????????????????? } 我的程序: #include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; sbit key1=P3^4; uchar ge,shi,bai; 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() { ?????? TMOD=0x01; ?????? TH0=(65536-10000)/256; ?????? TL0=(65536-10000)%256; ?????? EA=1; ?????? ET0=1; ?????? TR0=1; ?????? ge=0; ?????? shi=0; ?????? bai=0; ?????? dula=1; ?????? P0=table[0]; ?????? dula=0; ?????? wela=1; ?????? P0=0xf8; ?????? wela=0; } void display(uchar aa,uchar bb,uchar cc) { ?????? 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); } void main() { ?????? init(); ?????? while(1) ?????? { ????????????? display(bai,shi,ge); ????????????? if(key1==0) ????????????? { ???????????????????? delay(10); ???????????????????? if(key1==0) ???????????????????? {???? ??????????????????????????? TR0=0; ??????????????????????????? while(!key1) ??????????????????????????? { ?????????????????????????????????? delay(10); ?????????????????????????????????? while(!key1) ????????????????????????????????????????? display(bai,shi,ge); ??????????????????????????? } ??????????????????????????? TR0=1; ???????????????????? } ????????????? } ?????? } } void timer0() interrupt 1 { ?????? TH0=(65536-10000)/256; ?????? TL0=(65536-10000)%256; ?????? ge++; ?????? if(ge==10) ?????? { ????????????? ge=0; ????????????? shi++; ????????????? if(shi==10) ????????????? { ???????????????????? shi=0; ???????????????????? bai++; ???????????????????? if(bai==10) ???????????????????? { ??????????????????????????? bai=0; ???????????????????? } ????????????? } ?????? } } 课件的程序: #include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; sbit s2=P3^4; 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 flag,t0,ge,shi,bai; uint shu; void init();???????????? void display(uchar aa,uchar bb,uchar cc); void delay(uint z) { ?????? uint x,y; ?????? for(x=z;x>0;x--) ????????????? for(y=110;y>0;y--); } void main()??? { ?????? init(); ?????? while(1) ?????? { ????????????? display(bai,shi,ge); ????????????? if(s2==0) ????????????? { ???????????????????? delay(10); ???????????????????? if(s2==0) ???????????????????? { ??????????????????????????? TR0=0; ??????????????????????????? while(!s2) ?????????????????????????????????? display(bai,shi,ge); ??????????????????????????? TR0=1; ???????????????????? } ????????????? }??????????? ?????? } } void init()??????? { ?????? TMOD=0x01; ?????? TH0=(65536-10000)/256; ?????? TL0=(65536-10000)%256; ?????? EA=1; ?????? ET0=1; ?????? TR0=1; } void timer0() interrupt 1 { ?????? TH0=(65536-10000)/256; ?????? TL0=(65536-10000)%256; ?????? shu++; ?????? if(shu==1000) ????????????? shu=0; ?????? bai=shu/100; ?????? shi=shu%100/10; ?????? ge=shu%10; ????????????? } void display(uchar aa,uchar bb,uchar cc) { ??????? 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); } 在上题的基础上,用另外三个独立键盘实现按下第一个时计时停止,按下第二个时计时开始,按下第三个是计数值清零从头开始: 我的程序思路:第一步是按下独立键盘第一个时计时停止,第二步是按下独立键盘第二个时计时开始,第三步是按下独立键盘第三个是计数值清零从头开始 我的程序: 注意在键盘按下的程序体中要再显示一下数码管,否则会出现数字丢失,现象是只有最后一个数码管显示,前两个丢失 #include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; sbit key1=P3^4; sbit key2=P3^5; sbit key3=P3^6; sbit key4=P3^7; uchar ge,shi,bai; 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() { ?????? TMOD=0x01; ?????? TH0=(65536-10000)/256; ?????? TL0=(65536-10000)%256; ?????? EA=1; ?????? ET0=1; ?????? TR0=1; ?????? ge=0; ?????? shi=0; ?????? bai=0; ?????? dula=1; ?????? P0=table[0]; ?????? dula=0; ?????? wela=1; ?????? P0=0xf8; ?????? wela=0; } void display(uchar aa,uchar bb,uchar cc) { ?????? 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); } void main() { ?????? init(); ?????? while(1) ?????? { ????????????? display(bai,shi,ge); ????????????? if(key1==0) ????????????? { ???????????????????? delay(10); ???????????????????? if(key1==0) ???????????????????? {???? ??????????????????????????? TR0=0; ??????????????????????????? while(!key1) ??????????????????????????? { ?????????????????????????????????? delay(10); ?????????????????????????????????? while(!key1) ????????????????????????????????????????? display(bai,shi,ge); ??????????????????????????? } ??????????????????????????? TR0=1; ???????????????????? } ????????????? } ????????????? if(key2==0) ????????????? { ???????????????????? delay(10); ???????????????????? if(key2==0) ???????????????????? { ??????????????????????????? TR0=0; ???????????????????? } ???????????????????? while(!key2) ???????????????????? {? ??????????????????????????? display(bai,shi,ge); //注意在键盘按下的程序体中要再显示一下数码管,否则会出现数字丢失,现象是只有最后一个数码管显示,前两个丢失 ??????????????????????????? delay(10); ???????????????????? } ???????????????????? while(!key2); ????????????? } ????????????? if(key3==0) ????????????? { ???????????????????? delay(10); ???????????????????? if(key3==0) ???????????????????? { ??????????????????????????? TR0=1; ???????????????????? } ???????????????????? while(!key3) ???????????????????? { ??????????????????????????? display(bai,shi,ge); ??????????????????????????? delay(10); ???????????????????? } ???????????????????? while(!key3); ????????????? } ????????????? if(key4==0) ????????????? { ???????????????????? delay(10); ???????????????????? if(key4==0) ???????????????????? { ??????????????????????????? ge=0; ??????????????????????????? bai=0; ??????????????????????????? shi=0; ??????????????????????????? TR0=0; ??????????????????????????? TH0=(65536-10000)/256; ??????????????????????????? TL0=(65536-10000)%256; ??????????????????????????? TR0=1; ???????????????????? } ???????????????????? while(!key4) ???????????????????? { ??????????????????????????? display(bai,shi,ge); ??????????????????????????? delay(10); ???????????????????? } ???????????????????? while(!key4); ????????????? } ?????? } } void timer0() interrupt 1 { ?????? TH0=(65536-10000)/256; ?????? TL0=(65536-10000)%256; ?????? ge++; ?????? if(ge==10) ?????? { ????????????? ge=0; ????????????? shi++; ????????????? if(shi==10) ????????????? { ???????????????????? shi=0; ???????????????????? bai++; ???????????????????? if(bai==10) ???????????????????? { ??????????????????????????? bai=0; ???????????????????? } ????????????? } ?????? } } 课件的程序: #include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; sbit s2=P3^4; sbit s3=P3^5; sbit s4=P3^6; sbit s5=P3^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 flag,t0,ge,shi,bai; uint shu; void init();???????????? void display(uchar aa,uchar bb,uchar cc); void delay(uint z) { ?????? uint x,y; ?????? for(x=z;x>0;x--) ????????????? for(y=110;y>0;y--); } void main()??? { ?????? init(); ?????? while(1) ?????? { ????????????? display(bai,shi,ge); ????????????? if(s2==0) ????????????? { ???????????????????? delay(10); ???????????????????? if(s2==0) ???????????????????? { ??????????????????????????? TR0=0; ??????????????????????????? while(!s2) ?????????????????????????????????? display(bai,shi,ge); ??????????????????????????? TR0=1; ???????????????????? } ????????????? } ????????????? if(s3==0) ????????????? { ???????????????????? delay(10); ???????????????????? if(s3==0) ???????????????????? { ??????????????????????????? while(!s2) ?????????????????????????????????? display(bai,shi,ge); ??????????????????????????? TR0=0; ???????????????????? } ????????????? } ????????????? if(s4==0) ????????????? { ???????????????????? delay(10); ???????????????????? if(s4==0) ???????????????????? { ??????????????????????????? while(!s2) ?????????????????????????????????? display(bai,shi,ge); ??????????????????????????? TR0=1; ???????????????????? } ????????????? } ????????????? if(s5==0) ????????????? { ???????????????????? delay(10); ???????????????????? if(s5==0) ???????????????????? { ??????????????????????????? while(!s2) ????????????? ???????????????????? display(bai,shi,ge); ??????????????????????????? shu=0; ???????????????????? } ????????????? }??????????? ?????? } } void init()??????? { ?????? TMOD=0x01; ?????? TH0=(65536-10000)/256; ?????? TL0=(65536-10000)%256; ?????? EA=1; ?????? ET0=1; ?????? TR0=1; } void timer0() interrupt 1 { ?????? TH0=(65536-10000)/256; ?????? TL0=(65536-10000)%256; ?????? shu++; ?????? if(shu==1000) ????????????? shu=0; ?????? bai=shu/100; ?????? shi=shu%100/10; ?????? ge=shu%10; ????????????? } void display(uchar aa,uchar bb,uchar cc) { ??????? 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); } 按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1,第二个显示4...: 我的思路:先做按下第一个键显示1,再依次复制后修改 我的程序: #include<reg52.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,0? }; uint code tablex[]={ 0,1,4,9,16,//写成0,1*1,2*2,3*3,4*4也可以 25,36,49,64, 81,100,121,144, 169,196,225,256 };//注意数组的序号是从0开始的,下面的程序要一一对应 uchar bai,shi,ge; uint num,temp; void delay(uint z) { ?????? uint x,y; ?????? for(x=z;x>0;x--) ????????????? for(y=110;y>0;y--); } void display(uint aa) { ?????? bai=aa/100; ?????? shi=aa%100/10; ?????? ge=aa%10; ?????? 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() { ?????? bai=0; ?????? shi=0; ?????? ge=0; ?????? num=0; ?????? temp=0; ?????? dula=1; ?????? P0=0; ?????? dula=0; ?????? P0=0xff; ?????? wela=1; ?????? P0=0xf8; ?????? wela=0; } uint keyscan() { ?????? P3=0xfe; ?????? temp=P3; ?????? temp=temp&0xf0; ?????? while(temp!=0xf0) ?????? { ????????????? delay(5); ????????????? temp=P3; ????????????? temp=temp&0xf0; ????????????? while(temp!=0xf0) ????????????? { ???????????????????? temp=P3; ???????????????????? switch(temp) ???????????????????? { ??????????????????????????? case 0xee:num=tablex[1]; ?????????????????????????????????? break; ??????????????????????????? case 0xde:num=tablex[2]; ??????????????????????????? ?????? break; ??????????????????????????? case 0xbe:num=tablex[3]; ?????????????????????????????????? break; ??????????????????????????? case 0x7e:num=tablex[4]; ?????????????????????????????????? break; ???????????????????? } ???????????????????? while(temp!=0xf0) ???????????????????? { ??????????????????????????? temp=P3; ??????????????????????????? temp=temp&0xf0; ???????????????????? } ????????????? }??????????? ?????? } ?????? P3=0xfd; ?????? temp=P3; ?????? temp=temp&0xf0; ?????? while(temp!=0xf0) ?????? { ????????????? delay(5); ????????????? temp=P3; ????????????? temp=temp&0xf0; ????????????? while(temp!=0xf0) ????????????? { ???????????????????? temp=P3; ???????????????????? switch(temp) ???????????????????? { ??????????????????????????? case 0xed:num=tablex[5];//复制后修改中,不要忘了修改case后面的值 ?????????????????????????????????? break; ??????????????????????????? case 0xdd:num=tablex[6]; ?????????????????????????????????? break; ??????????????????????????? case 0xbd:num=tablex[7]; ?????????????????????????????????? break; ??????????????????????????? case 0x7d:num=tablex[8]; ?????????????????????????????????? break; ???????????????????? } ???????????????????? while(temp!=0xf0) ???????????????????? { ??????????????????????????? temp=P3; ??????????????????????????? temp=temp&0xf0; ???????????????????? } ????????????? }??????????? ?????? } ?????? P3=0xfb; ?????? temp=P3; ?????? temp=temp&0xf0; ?????? while(temp!=0xf0) ?????? { ????????????? delay(5); ????????????? temp=P3; ????????????? temp=temp&0xf0; ????????????? while(temp!=0xf0) ????????????? { ???????????????????? temp=P3; ???????????????????? switch(temp) ???????????????????? { ??????????????????????????? case 0xeb:num=tablex[9]; ?????????????????????????????????? break; ??????????????????????????? case 0xdb:num=tablex[10]; ?????????????????????????????????? break; ??????????????????????????? case 0xbb:num=tablex[11]; ?????????????????????????????????? break; ??????????????????????????? case 0x7b:num=tablex[12]; ?????????????????????????????????? break; ???????????????????? } ???????????????????? while(temp!=0xf0) ???????????????????? { ??????????????????????????? temp=P3; ??????????????????????????? temp=temp&0xf0; ???????????????????? } ????????????? }??????????? ?????? } ?????? P3=0xf7; ?????? temp=P3; ?????? temp=temp&0xf0; ?????? while(temp!=0xf0) ?????? { ????????????? delay(5); ????????????? temp=P3; ????????????? temp=temp&0xf0; ????????????? while(temp!=0xf0) ????????????? { ???????????????????? temp=P3; ???????????????????? switch(temp) ???????????????????? { ??????????????????????????? case 0xe7:num=tablex[13]; ?????????????????????????????????? break; ??????????????????????????? case 0xd7:num=tablex[14]; ?????????????????????????????????? break; ??????????????????????????? case 0xb7:num=tablex[15]; ?????????????????????????????????? break; ????????????? ????????????? case 0x77:num=tablex[16]; ?????????????????????????????????? break; ???????????????????? } ???????????????????? while(temp!=0xf0) ???????????????????? { ??????????????????????????? temp=P3; ??????????????????????????? temp=temp&0xf0; ???????????????????? } ????????????? }??????????? ?????? } ?????? return num; } void main() { ?????? init(); ?????? while(1) ????????????? display(keyscan()); } 课件的程序: #include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; sbit key1=P3^4; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar temp; uint num,num1; void delay(uint z) { ?????? uint x,y; ?????? for(x=z;x>0;x--) ????????????? for(y=110;y>0;y--); } uint keyscan(); void display(uchar,uchar,uchar); void main() { ?????? dula=1; ?????? P0=0; ?????? dula=0; ?????? wela=1; ?????? P0=0xc0; ?????? wela=0; ?????? while(1) ?????? { ????????????? num1=keyscan(); ????????????? display(num1/100,num1%100/10,num1%10); ?????? } } void display(uchar aa,uchar bb,uchar cc) { ?????? ??????? 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); } uint keyscan() { ?????? P3=0xfe; ?????? temp=P3; ?????? temp=temp&0xf0; ?????? while(temp!=0xf0) ?????? { ????????????? delay(5); ????????????? temp=P3; ????????????? temp=temp&0xf0; ????????????? while(temp!=0xf0) ????????????? { ???????????????????? temp=P3; ????????????? switch(temp) ????????????? { ???????????????????? case 0xee:num=1; ??????????????????????????? break; ???????????????????? case 0xde:num=4; ?????? ???????????????????? break; ???????????????????? case 0xbe:num=9; ??????????????????????????? break; ???????????????????? case 0x7e:num=16; ??????????????????????????? break; ????????????? } ????????????? while(temp!=0xf0) ????????????? { ???????????????????? temp=P3; ???????????????????? temp=temp&0xf0; ????????????? } ????????????? } ?????? } ?????? P3=0xfd; ?????? temp=P3; ?????? temp=temp&0xf0; ?????? while(temp!=0xf0) ?????? { ????????????? delay(5); ????????????? temp=P3; ????????????? temp=temp&0xf0; ????????????? while(temp!=0xf0) ????????????? { ???????????????????? temp=P3; ????????????? switch(temp) ????????????? { ???????????????????? case 0xed:num=25; ??????????????????????????? break; ???????????????????? case 0xdd:num=36; ??????????????????????????? break; ???????????????????? case 0xbd:num=49; ??????????????????????????? break; ???????????????????? case 0x7d:num=64; ??????????????????????????? break; ????????????? } ????????????? while(temp!=0xf0) ????????????? { ???????????????????? temp=P3; ???????????????????? temp=temp&0xf0; ????????????? } ????????????? } ?????? } ?????? P3=0xfb; ?????? temp=P3; ?????? temp=temp&0xf0; ?????? while(temp!=0xf0) ?????? { ????????????? delay(5); ????????????? temp=P3; ????????????? temp=temp&0xf0; ????????????? while(temp!=0xf0) ????????????? { ???????????????????? temp=P3; ????????????? switch(temp) ????????????? { ???????????????????? case 0xeb:num=81; ??????????????????????????? break; ???????????????????? case 0xdb:num=100; ??????????????????????????? break; ???????????????????? case 0xbb:num=121; ??????????????????????????? break; ???????????????????? case 0x7b:num=144; ??????????????????????????? break; ????????????? } ????????????? while(temp!=0xf0) ????????????? { ???????????????????? temp=P3; ???????????????????? temp=temp&0xf0; ????????????? } ????????????? } ?????? } ?????? P3=0xf7; ?????? temp=P3; ?????? temp=temp&0xf0; ?????? while(temp!=0xf0) ?????? { ????????????? delay(5); ????????????? temp=P3; ????????????? temp=temp&0xf0; ????????????? while(temp!=0xf0) ????????????? { ???????????????????? temp=P3; ????????????? switch(temp) ????????????? { ???????????????????? case 0xe7:num=169; ??????????????????????????? break; ???????????????????? case 0xd7:num=196; ??????????????????????????? break; ???????????????????? case 0xb7:num=225; ??????????????????????????? break; ???????????????????? case 0x77:num=256; ??????????????????????????? break; ????????????? } ????????????? while(temp!=0xf0) ????????????? { ???????????????????? temp=P3; ???????????????????? temp=temp&0xf0; ????????????? } ????????????? } ?????? } return num; } |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
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 4:23:38- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |