让流水灯来回流一次,蜂鸣器响一次 001
#include<reg52.h>
#include <intrins.h>
sbit P10=P1^2;
sbit SPK=P1^2;
#define uint unsigned int
#define uchar unsigned char
unsigned int temp;
void yanshi() ;
void fengmq();
void delay(unsigned int cnt)
{
while(--cnt);
}
void main()
{
int i;
temp=0xfe;
P1=temp;
while(1)
{
for(i=0;i<8;i++)
{
yanshi();
temp=_crol_(temp,1);
P1=temp ;
}
for(i=0;i<8;i++)
{
yanshi();
temp=_crol_(temp,-1);
P1=temp ;
}
fengmq();
yanshi();
}
}
void fengmq()
{
while(1)
{
int i;
for(i=0;i<200;i++)
{
delay(80);
SPK=!SPK;
}
}
}
void yanshi()
{
uint x,y;
for(x=120;x>0;x--)
for(y=50;y>0;y--) ;
}
数码管动态显示(顺) 002
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
void yanshi();
unsigned char code dofly[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsigned char code seg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮,即位码
/*------------------------------------------------
延时子程序
------------------------------------------------*/
void main()
{
unsigned char i,j;
while(1)
{
P0=dofly[i++];//取显示数据,段码
{
if(16==i) //检测8位扫描完全?
i=0;
}
P2=seg[j++]; //取位码
{
if(j==8)
j=0;
}
yanshi() ; //扫描间隙延时,时间太长会闪烁,太短会造成重影,这里使用长时间方便了解显示原理
}
}
void yanshi()
{
int x,y;
for(x=120;x>0;x--)
for(y=500;y>0;y--) ; 如果将500改为0;将if(16==i) 改为8,将静态显示
}
数码管动态显示(倒) 003
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
void yanshi();
unsigned char code dofly[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsigned char code seg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮,即位码
/*------------------------------------------------
延时子程序
------------------------------------------------*/
void main()
{
unsigned char i,j;
i=15;
while(1)
{
P0=dofly[i--];
{
if(i==-1) //如果是i<0,不行
i=15;
}
P2=seg[j++];
{
if(j==8)
j=0;
}
yanshi();
}
}
void yanshi()
{
int x,y;
for(x=120;x>0;x--)
for(y=500;y>0;y--) ; // 如果将500改为0;将if(16==i) 改为8,将静态显示
}
数码管显示HELLO
#include<reg52.h>
void yanshi();
/*unsigned char code dofly[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; */
unsigned char code dofly[]={0x76,0x79,0x38,0x38,0x3F};
unsigned char code seg[]={0,1,2,3,4,5,6,7};
void main()
{
unsigned char i,j;
i=0;
while(1)
{
P0=dofly[i++];
{
if(i==5)
i=0;
}
P2=seg[j++];
{
if(j==5)
j=0;
}
yanshi();
}
}
void yanshi()
{
int x,y;
for(x=120;x>0;x--)
for(y= 00;y>0;y--);
}
外部中断0
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
void yanshi();
unsigned char i,j;
unsigned char code dofly[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsigned char code seg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮,即位码
void main()
{
EA=1; //全局中断开
EX0=1; //外部中断0开
IT0=0; //0电平触发,1边沿触发
while(1)
{
P1=0xFF; //让所有的灯灭
P0=dofly[i++];//取显示数据,段码
{
if(16==i) //检测8位扫描完全?
i=0;
}
P2=seg[j++]; //取位码
{
if(j==8)
j=0;
}
yanshi() ; //扫描间隙延时,时间太长会闪烁,太短会造成重影,这里使用长时间方便了解显示原理
}
}
void yanshi()
{
int x,y;
for(x=120;x>0;x--)
for(y=50;y>0;y--) ; // 如果将500改为0;将if(16==i) 改为8,将静态显示
}
void zhongduan( ) interrupt 0 using 1
{
P1=0x00; //P3.2口有低电平时亮
yanshi(); //此处不能是while(1),否则不能跳出循环
}
外部中断1
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
void yanshi();
unsigned char i,j;
unsigned char code dofly[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsigned char code seg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮,即位码
void main()
{
EA=1; //全局中断开
EX1=1; //外部中断1开
IT1=0; //0电平触发,1边沿触发
while(1)
{
P1=0xFF; //让所有的灯灭
P0=dofly[i++];//取显示数据,段码
{
if(16==i) //检测8位扫描完全?
i=0;
}
P2=seg[j++]; //取位码
{
if(j==8)
j=0;
}
yanshi() ; //扫描间隙延时,时间太长会闪烁,太短会造成重影,这里使用长时间方便了解显示原理
}
}
void yanshi()
{
int x,y;
for(x=120;x>0;x--)
for(y=50;y>0;y--) ; // 如果将500改为0;将if(16==i) 改为8,将静态显示
}
void zhongduan( ) interrupt 2
{
P1=0x00; //P3.3口有低电平时亮
yanshi(); //此处不能是while(1),否则不能跳出循环
}
定时器延时1秒,数码管加1右移003
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
void yanshi();
unsigned char i,j,tt;
unsigned char code dofly[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsigned char code seg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮,即位码
void main()
{
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //设置定时50毫秒
EA=1; //全局中断开
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
P0=0x00;
P2=0x00;
while(1)
{
if(tt==4) //前面是50毫秒,50*4=200毫秒,如果是tt==20;则为1000毫秒,即1秒
{
tt=0;
P1=0xFF; //让所有的灯灭
P0=dofly[i++];//取显示数据,段码
{
if(16==i) //检测8位扫描完全
i=0;
}
P2=seg[j++]; //取位码
{
if(j==8)
j=0;
}
// yanshi() ; //扫描间隙延时,时间太长会闪烁,太短会造成重影,这里使用长时间方便了解显示原理
}
}
}
/*void yanshi() //定时器情况下,延时无用
{
int x,y;
for(x=120;x>0;x--)
for(y=50;y>0;y--) ; // 如果将500改为0;将if(16==i) 改为8,将静态显示
} */
void zhongduan( ) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //设置定时50毫秒
tt++;
}
灯闪一次,数码管加1右移一次
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
void yanshi();
unsigned char i,j,tt;
unsigned char code