51学习第四天--.跟着郭老师学:程序逐渐加入模块化练习--1从流水灯1s闪烁流动--2再加数码管1~F--3.显示数码管六个灯依次显示123456--再逐渐的加入各种功能,一步一步,可训练思维!

此代码  在word中书写,不具备直接应用价值,只可观看学习。

 

四、前期习题练习:

(一).流水灯1s闪烁流动

#include<reg52.h>

#include “instrins.h//左移函数头文件

#define uchar  unsigned char//这是宏定义,以后再用char直接输入ucahr不用再声明!

#defne uint unsigned int

 uchar=temp;//定义一个八位的变量

void delay(uint z);//主函数调用子函数,先声明函数,有参数的函数!

void main()

{

temp=0xfe;//0xfe即:1111 1110把P1口定义

P1=temp;//先使p1口亮

while(1)//进入循环

{

temp=_crol_(temp,1);//调用左移函数:第一位是移动的变量,第二位是移动的位置个数

delay(1000);//可以设置参数  1000大概是1ms  前期测试的

P1=temp;//再把变量赋给P1

}

}

void delay(uint z)//这是一个延时函数控制x,y可以控制延时时间!带参数!

{

uint x,y;

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

        for(y=z;y>0;y--)

}

(二)接上面(一)加数码管1~F显示加计时器

#include<reg52.h>

#include “instrins.h//左移函数头文件

#define uchar  unsigned char//这是宏定义,以后再用char直接输入ucahr不用再声明!

#defne uint unsigned int

void delay(uint z);//声明延迟函数

sbit  dula=p2^6;

sbit  wela=p2^7;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,//0011111(0)00000110(1)01011011(2)共阴极:1亮dp gfedcba八位,是单个数码管!

 

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

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

0x39,0x5e,0x79,0x71,};

void main()

{//加计时器

num=0://定义变量

aa=0;

TMOD=1;//确定T0和TI的工作方式,或者0x01无论是十六进制还是十进制都是二进制存进去

THO=(65536-50000)/256;//计算初值 2^16=65536,2^8=256

TLO=(65536-50000%256);//

EA=1;//开总中断

ET0=1//开定时器中断

TRO=1;//计时器置0

temp=0xfe;//0xfe即:1111 1110把P1口定义

P1=temp;//先使p1口亮,这是流水灯

dula=1;

P0=table[0];//这是数码管

dula=0;

wela=1

P0=0xc0;

wela=0;

while(1)//进入大循环

{

//这是流水灯

delay(1000);//可以设置参数  1000大概是1ms  前期测试的

temp=_crol_(temp,1);//调用左移函数:第一位是移动的变量,第二位是移动的位置个数

P1=temp;//再把变量赋给P1

//这是数码管

if (aa==40)//就是判断中断函数是否到2秒了,20次是1秒

{

aa=0

num++;//此时就是1 初始值

if (num===16)//刷新数码管数据

  num=0

dula=1;

P0=table[num];

dula=0;

}数码管和流水灯放一起会产生延迟

}

}

void delay(uint z)//这是一个延时函数控制x,y可以控制延时时间!带参数!

{

uint x,y;

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

        for(y=z;y>0;y--)

void  timer0() interrupt  1

{

THO=(65536-50000)/256;

TLO=(65536-50000)%256;

aa++;

//这是数码管,放到中断程序这就可以正常显示额

if (aa==40)//就是判断中断函数是否到2秒了,20次是1秒

{

aa=0;

num++;//此时就是1 初始值

if (num===16)//刷新数码管数据

  num=0;

dula=1;

P0=table[num];

dula=0;

}

}

  1. 流水灯启动,数码管不动,但是分开测试就会启动

可以把数码管程序过程放到中断函数中

(三)数码管六个灯依次显示123456

#include<reg52.h>

#include “instrins.h//左移函数头文件

#define uchar  unsigned char//这是宏定义,以后再用char直接输入ucahr不用再声明!

#defne uint unsigned int

sbit  dula=p2^6;

sbit  wela=p2^7;

uchar numdu,numwe,aa;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,//0011111(0)00000110(1)01011011(2)共阴极:1亮dp gfedcba八位,是单个数码管!使用在段选中,显示什么数字

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

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

0x39,0x5e,0x79,0x71,};

uchar code tablewe[]={

0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//这是六个数码管,显示第几个,使用在位选中分别是123456

void main()

{//加计时器

numdu=0://定义变量

numwe=0;

aa=0;

TMOD=1;//确定T0和TI的工作方式,或者0x01无论是十六进制还是十进制都是二进制存进去

THO=(65536-50000)/256;//计算初值 2^16=65536,2^8=256

TLO=(65536-50000%256);//

EA=1;//开总中断  

ET0=1//开定时器中断

TRO=1;//计时器置0   计时开始!

temp=0xfe;//0xfe即:1111 1110把P1口定义

P1=temp;//先使p1口亮,这是流水灯

while(1)//进入大循环

{

//这是数码管

if (aa==20)//就是判断中断函数是否到1秒了,20次是1秒=1000ms

{

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  //中断函数

{

THO=(65536-50000)/256;

TLO=(65536-50000)%256;

aa++;

}

动态显示

(四)数码管第一位和第二位显示数字

  1. 先给一个数,然后分离整数的每个数字

#include<reg52.h>

#define uchar  unsigned char//这是宏定义,以后再用char直接输入ucahr不用再声明!

#defne uint unsigned int

sbit  dula=p2^6;

sbit  wela=p2^7;

uchar  numdu,temp,shi , ge;;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,//0011111(0)00000110(1)01011011(2)共阴极:1亮dp gfedcba八位,是单个数码管!

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

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

0x39,0x5e,0x79,0x71,};

void delay(uint z);//延迟函数声明

void main()

{

temp=12;//这个数字可以修改25,35,24,就显示这个数

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)//让亮5ms

 

dula=1;

P0=table[ge];//确定亮什么数字,

dula=0;

wela=1;

P0=0xfd;//第一个灯亮

wela=0;

delay (5)//让亮5ms

 

}

}

}

void delay(uint z)//这是一个延时函数控制x,y可以控制延时时间!带参数!

{

uint x,y;

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

       for(y=z;y>0;y--)

}

 

  1. char  范围250

显示三位数字

同样也是分离出每个数字

方法1

#include<reg52.h>

#define uchar  unsigned char//这是宏定义,以后再用char直接输入ucahr不用再声明!

#defne uint unsigned int

sbit  dula=p2^6;

sbit  wela=p2^7;

uchar  numdu,temp,shi , ge,bai;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,//0011111(0)00000110(1)01011011(2)共阴极:1亮dp gfedcba八位,是单个数码管!

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

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

0x39,0x5e,0x79,0x71,};

void delay(uint z);//延迟函数声明

void main()

{

temp=12;//这个数字可以修改25,35,24,就显示这个数

numdu=0;

while(1)//进入大循环

{

shi=temp%100/10;

ge=temp%10;

bai=temp/100;

 

dula=1;

P0=table[bai];//确定亮什么数字,

dula=0;

wela=1;

P0=0xfe;//第1个灯亮

wela=0;

delay (5)//让亮5ms

 

dula=1;

P0=table[shi];//确定亮什么数字,

dula=0;

wela=1;

P0=0xfd;//第2个灯亮

wela=0;

delay (5)//让亮5ms

 

dula=1;

P0=table[ge];//确定亮什么数字,

dula=0;

wela=1;

P0=0xfb;//第3个灯亮

wela=0;

delay (5)//让亮5ms

 

}

}

}

void delay(uint z)//这是一个延时函数控制x,y可以控制延时时间!带参数!

{

uint x,y;

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

       for(y=z;y>0;y--)

}

方法2

可以定义个子函数display函数,其实和上面方法1一样

#include<reg52.h>

#define uchar  unsigned char//这是宏定义,以后再用char直接输入ucahr不用再声明!

#defne uint unsigned int

sbit  dula=p2^6;

sbit  wela=p2^7;

uchar  numdu,temp,shi , ge,bai;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,//0011111(0)00000110(1)01011011(2)共阴极:1亮dp gfedcba八位,是单个数码管!

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

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

0x39,0x5e,0x79,0x71,};

void delay(uint z);//延迟函数声明

void display(char bai, char shi , cahr ge);//显示函数声明

void main()

{

temp=152;

numdu=0;

shi=temp%100/10;

ge=temp%10;

bai=temp/100;

while(1)

{

display(bai;shi;ge)

}

}

void delay(uint z)//这是一个延时函数控制x,y可以控制延时时间!带参数!

{

uint x,y;

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

       for(y=z;y>0;y--)

}

 

void display(char bai, char shi , cahr ge)//显示几位里面定义几位

{

 

dula=1;

P0=table[bai];//确定亮什么数字,

dula=0;

wela=1;

P0=0xfe;//第1个灯亮

wela=0;

delay (5)//让亮5ms

 

dula=1;

P0=table[shi];//确定亮什么数字,

dula=0;

wela=1;

P0=0xfd;//第2个灯亮

wela=0;

delay (5)//让亮5ms

 

dula=1;

P0=table[ge];//确定亮什么数字,

dula=0;

wela=1;

P0=0xfb;//第3个灯亮

wela=0;

delay (5)//让亮5ms

}

(五)每隔一秒加1显示数字1~100

#include<reg52.h>

#define uchar  unsigned char//这是宏定义,以后再用char直接输入ucahr不用再声明!

#defne uint unsigned int

sbit  dula=p2^6;//定义两个锁存器

sbit  wela=p2^7;

uchar  temp,shi , ge,bai ,aa;

uchar code table[]={

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

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

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

0x39,0x5e,0x79,0x71,}; //0011111(0)00000110(1)01011011(2)共阴极:1亮dp gfedcba八位,是数码管显示表!显示数字是几!!!

void delay(uint z);//延迟函数声明

void display(char bai, char shi , cahr ge);//显示函数声明

void  init(); //初始化函数声明(计时器)

void main()

{

 init(  )  //初始化子函数

while(1)

{//进来之后先判断是不是到1秒了,不然就继续显示了

if (aa==20)//判断是否到一秒,利用中断函数

aa=0;//aa清零一定要,到1ms之后,要重新来计时

temp++;

if (temp==100)//定义数值范围

    {

temp=0;//清零

}

shi=temp%100/10;//先分离数  才能用显示函数

ge=temp%10;

bai=temp/100;

 

display(bai; shi; ge)//显示函数 baishige

}

}

void delay(uint z)//这是一个延时函数控制x,y可以控制延时时间!带参数!

{

uint x,y;

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

       for(y=z;y>0;y--)

}

void display(char bai, char shi , cahr ge)//显示函数,显示几位里面定义几位

{

dula=1;

P0=table[bai];//确定亮什么数字,

dula=0; //送百位数字

P0=0xff;//消隐,就是其他三位数码管隐隐约约显示!在位选之前,使灯都灭。1111 1111高电平

wela=1;

P0=0xfe;//第1个灯亮

wela=0;送位选通百位灯

delay (5)//让亮5ms  这个时间短的话也会错,没有也会错

 

dula=1;

P0=table[shi];//确定亮什么数字,

dula=0;

P0=0xff;//消异,在位选之前,使灯都灭。

wela=1;

P0=0xfd;//第2个灯亮

wela=0;

delay (5)//让亮5ms

 

dula=1;

P0=table[ge];//确定亮什么数字,

dula=0;

P0=0xff;//消异,在位选之前,使灯都灭。

wela=1;

P0=0xfb;//第3个灯亮

wela=0;

delay (5)//让亮5ms

}

void  init()    //初始化函数,(计时器函数)对一些变量初始化,然后在主函数中直接调用就可以

{

temp=0;

dula=0;

wela=0;//位选段选清0

TMOD=1;//第一步:确定T0和TI的工作方式,或者0x01/0000 0001即方式1,无论是十六进制还是十进制都是二进制存进去

THO=(65536-50000)/256;//第二步:计算初值 2^16=65536,2^8=256

TLO=(65536-50000%256);//

EA=1;//第三步:开总中断  

ET0=1//第四步;开定时器中断

TRO=1;//第五步:启动计时器置0   计时开始!

}

void  timer0() interrupt  1  //定时器中断函数 (定时和中断一起使用)

{

THO=(65536-50000)/256;//50000就是50ms  产生一次中断

TLO=(65536-50000)%256;

aa++;

}

 

(五)老师的题目

利用动态扫描和定时器1在数码管上显示从765432开始以1/10秒的速度往下递减到765398并且保持此数,与此同时利用定时器0以500ms速度进行流水灯从上至下移动,当数码管数减到停止时,流水灯也停止然后开始闪烁,3秒后用t0计时,流水灯全部关闭,数码管显示hello

  1. 一、先设计一个流水灯

#include<reg52.h>

#include “instrins.h//左移函数头文件

#define uchar  unsigned char//这是宏定义,以后再用char直接输入ucahr不用再声明!

#defne uint unsigned int

 uchar=temp;//定义一个八位的变量

uchar=t0;

void delay(uint z);//主函数调用子函数,先声明函数,有参数的函数!

void  init();

void main()

{

//temp=0xfe;//0xfe即:1111 1110把P1口定义

//P1=temp;//先使p1口亮   用下面的初始化函数

 init()  //调用初始化函数就是对一些变量初始化

while(1)//进入循环

{

}

}

void  init()    //初始化函数,(计时器函数)对一些变量初始化,然后在主函数中直接调用就可以

{

//定义一些基本参数变量

temp=0xfe;//0xfe即:1111 1110把P1口定义

P1=temp;//先使p1口亮

//定义定时器变量

TMOD=0x11;//定时器:第一步:确定T0和TI的工作方式,00010001即都是方式1

THO=(65536-50000)/256;//第二步:计算初值 2^16=65536,2^8=256

TLO=(65536-50000%256);//

EA=1;//第三步:开总中断  

ET0=1//第四步;开定时器中断,用哪个中断开那个

TRO=1;//第五步:启动计时器置0   计时开始!

}

void  timer0() interrupt  1  //定时器中断函数 (定时和中断一起使用)

{

THO=(65536-50000)/256;//50000就是50ms  产生一次中断

TLO=(65536-50000)%256;

t0++;

if (t0==10)//0.5s = 10x50ms=500ms

{

t0=0;

temp=_crol_(temp,1);//调用左移函数:第一位是移动的变量,第二位是移动的位置个数

P1=temp;

}

}

  1. 二、继续设计数码管数字递减

#include<reg52.h>

#include “instrins.h//左移函数头文件

#define uchar  unsigned char//这是宏定义,以后再用char直接输入ucahr不用再声明!

#defne uint unsigned int

 uchar=temp;//定义一个八位的变量

uchar=t0,t1;

uint shu;//因为char256  所以用int

sbit  dula=p2^6;//定义两个锁存器

sbit  wela=p2^7;

uchar  temp,shi ,aa ,bb,cc, ge,bai ,aa,flag;

uchar code table[]={

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

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

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

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

0x76,0x79,0x38,0x3f,0(0表示灭,都是低电平)  HELLO

}; //0011111(0)00000110(1)01011011(2)共阴极:1亮dp gfedcba八位,是数码管显示表!显示数字是几!!!

void delay(uint z);//延迟函数声明,主函数调用子函数,先声明函数,有参数的函数!如果函数题放在void main()之前就不用声明!!!

void display(char bai, char shi , cahr ge);//显示函数声明

void  init(); //初始化函数声明(计时器)

void main()

{

//temp=0xfe;//0xfe即:1111 1110把P1口定义

//P1=temp;//先使p1口亮   用下面的初始化函数

 init()  //调用初始化函数就是对一些变量初始化

while(1)//进入循环

{

if(flag1!=1)

display(7,6,5,bai,shi,ge );//一直调用就行

else

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

}

}

void  init()    //初始化函数,(计时器函数)对一些变量初始化,然后在主函数中直接调用就可以

{

//定义一些基本参数变量

temp=0xfe;//0xfe即:1111 1110把P1口定义

P1=temp;//先使p1口亮

shu=432;

//定义定时器变量

TMOD=0x11;//定时器:第一步:确定T0和TI的工作方式,00010001即都是方式1

THO=(65536-50000)/256;//第二步:T0计算初值 2^16=65536,2^8=256

TLO=(65536-50000%256);//

TH1=(65536-50000)/256;//第二步:T1计算初值 2^16=65536,2^8=256

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

EA=1;//第三步:开总中断  

ET0=1//第四步;开定时器中断,用哪个中断开那个

ET1=1;

TRO=1;//第五步:启动计时器置0   计时开始!

TRO=1;

}

void  timer0() interrupt  1  //定时器0的中断函数,控制流水灯 (定时和中断一起使用)

{

THO=(65536-50000)/256;//50000就是50ms  产生一次中断

TLO=(65536-50000)%256;

t0++;

if (flag!=1)

{

if (t0==10)//0.5s = 10x50ms=500ms

{

t0=0;

temp=_crol_(temp,1);//调用左移函数:第一位是移动的变量,第二位是移动的位置个数

P1=temp;

}

}

else

{

if(to%4==0)//设计流水灯闪烁,每200ms闪烁一次求余是0

P1=~P1;//取反 ,刚才是全灭 ,这时候全亮且闪烁

if(t0==60)//是否到3s

{

TRO=0;//关闭中断

P1=0Xff;//全部关闭流水灯

flag1=1

}

}

}

void  timer1() interrupt  3  //定时器1的中断函数 (定时和中断一起使用)

{

TH1=(65536-50000)/256;//50000就是50ms  产生一次中断

TL1=(65536-50000)%256;

t1++;

if (t1==2)//0.1s = 2x50ms=100ms  数字递减1/10s

{

t1=0;

shu--;

shi=temp%100/10;//先分离数  才能用显示函数

ge=temp%10;

bai=temp/100;

if(shu==398)

{

TR0=0;

(设计流水灯闪烁:

P1=0Xff;//全灭,重新调用T0计时器

THO=(65536-50000)/256;//50000就是50ms  产生一次中断

TLO=(65536-50000)%256;

flag=1;//标志位进行流水灯闪烁

to=0

 

 

TR1=0;//关闭计时器

}

}

}

void display(char aa,char bb,char cc,char bai, char shi , cahr ge)//显示函数,显示几位里面定义几位

{

dula=1;

P0=table[aa];//确定亮什么数字,

dula=0; //送百位数字

P0=0xff;//消隐,就是其他三位数码管隐隐约约显示!在位选之前,使灯都灭。1111 1111高电平

wela=1;

P0=0xfe;//第1个灯亮 1111 1110

wela=0;送位选通

delay (5)//让亮5ms  这个时间短的话也会错,没有也会错

dula=1;

P0=table[bb];//确定亮什么数字,

dula=0; //送百位数字

P0=0xff;//消隐,就是其他三位数码管隐隐约约显示!在位选之前,使灯都灭。1111 1111高电平

wela=1;

P0=0xfd;//第2个灯亮 1111 1101

wela=0;送位选通百位灯

delay (5)//让亮5ms  这个时间短的话也会错,没有也会错

 

dula=1;

P0=table[cc];//确定亮什么数字,

dula=0; //送百位数字\

P0=0xff;//消隐,就是其他三位数码管隐隐约约显示!在位选之前,使灯都灭。1111 1111高电平

wela=1;

P0=0xfb;//第3个灯亮 1111 1011

wela=0;送位选通百位灯

delay (5)//让亮5ms  这个时间短的话也会错,没有也会错

 

dula=1;

P0=table[bai];//确定亮什么数字,

dula=0; //送百位数字

P0=0xff;//消隐,就是其他三位数码管隐隐约约显示!在位选之前,使灯都灭。1111 1111高电平

wela=1;

P0=0xf7;//第4个灯亮 1111 1011

wela=0;送位选通百位灯

delay (5)//让亮5ms  这个时间短的话也会错,没有也会错

 

dula=1;

P0=table[shi];//确定亮什么数字,

dula=0;

P0=0xff;//消异,在位选之前,使灯都灭。

wela=1;

P0=0xef;//第5个灯亮1110 1111

wela=0;

delay (5)//让亮5ms

 

dula=1;

P0=table[ge];//确定亮什么数字,

dula=0;

P0=0xff;//消异,在位选之前,使灯都灭。

wela=1;

P0=0xdf;//第6个灯亮1101 1111

wela=0;

delay (5)//让亮5ms

}

void delay(uint z)//这是一个延时函数控制x,y可以控制延时时间!带参数!

{

uint x,y;

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

       for(y=z;y>0;y--)

}

注意:

  1. 进入一次中断函数的时间50ms,

 

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值