此代码 在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;
}
}
- 流水灯启动,数码管不动,但是分开测试就会启动
可以把数码管程序过程放到中断函数中
(三)数码管六个灯依次显示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++;
}
动态显示
(四)数码管第一位和第二位显示数字
- 先给一个数,然后分离整数的每个数字
#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--)
}
- 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
- 一、先设计一个流水灯
#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;
}
}
- 二、继续设计数码管数字递减
#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--)
}
注意:
- 进入一次中断函数的时间50ms,