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单片机_第五节

将一种单片机学精,学透,再转其它单片机(高级单片机)都很容易?

写程序时要画程序流程图

添加89系列的头文件时可以鼠标右键选择InsertInclude<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型单片机实验板原理图右边的LCDENRSWRRD,对应键盘S2S3S4S5,另一端接地

如果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;

}

PPTLESSON5_键盘P5

当键盘按下数码管数字加1显示

因为键按下去的时间很长(与毫秒相比),而语句执行很快,所以在按下去时num++就会执行很多次了,导致松手后不能显示下一个num值,抖动的时间一般为5毫秒,消除抖动的时间一般大于5毫秒,这里用510毫秒,在按下和释放时都要消抖

#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,矩阵键盘也是检测低电平

PPTP7页,检测时依次给横行低电平0并保持住,横行与竖行是线或的关系,当按下时给低电平0,线或后得到低电平0,检测到即可根据P3.0P3.7的值来判断是哪个键被按下

先赋给P30xfe(让单片机的P3.0口输出0),再读回P3口值(这里设为temptemp=P3,用temp&0xf0(这里要看P3口高四位,如果高四位有0则得到的结果应该不是0xf0,说明有键按下),如果temp&0xf0=0xf0说明没有键按下,否则说明有键按下,再扫描一下由temp&0xf0得到是哪个键被按下

扫描时先给P3.00P3.1 P3.2P3.3都给1,读取P3.4P3.7口的数据,如果第一键被按下去,P3.4口读回来就是0P3.5P3.7口都是1,这样对应P3.0P3.7口是0111? 0111,别的键同理,下一次扫描将P3.0口给1,给P3.10,再一一检测,其它同理,发现有任何一个键按下就跳出扫描大循环,退出扫描程序

#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的高四位是1111temp=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;

}

带返回值的函数就返回一个数

一个函数中的变量不要和全局变量的名称一样

调程序就是一点一点调,郭天祥做项目有时一调调一两个星期

课件练习:

数码管前三位显示一个跑表,从000999之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。(用定时器设计表)

我的方法:先做从000999之间以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例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-09 16:26:44  更:2021-10-09 16:28:31 
 
开发: 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-

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