让流水灯来回流一次,蜂鸣器响一次 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 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==20) //前面是50毫秒,50*4=200毫秒,如果是tt==20;则为1000毫秒,即1秒
{
tt=0;
P1=0x00;
P0=dofly[i++];//取显示数据,段码
{
if(16==i) //检测8位扫描完全
i=0;
}
P2=seg[j++]; //取位码
{
if(j==8)
j=0;
}
}
}
}
void zhongduan( ) interrupt 1
{
P1=0xff;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //设置定时50毫秒
tt++;
}
P1输出1秒的方波,即灯亮一秒灭一秒
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
void yanshi();
unsigned char i,j,tt;
void main()
{
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //设置定时50毫秒
EA=1; //全局中断开
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
P1=0xff;
while(1)
{
if(tt==20)
{
tt=0;
P1=~P1;
}
}
}
void zhongduan( ) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //设置定时50毫秒
tt++;
}
数码管偶数时灯亮,奇数时灯灭
#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==20) //前面是50毫秒,50*4=200毫秒,如果是tt==20;则为1000毫秒,即1秒
{
tt=0;
P1=~P1;
P0=dofly[i++];//取显示数据,段码
{
if(16==i) //检测8位扫描完全
i=0;
}
P2=seg[j++]; //取位码
{
if(j==8)
j=0;
}
}
}
}
void zhongduan( ) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //设置定时50毫秒
tt++;
}
键盘防抖
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0};
unsigned char code seg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮,即位码
sbit d1=P1^0;
sbit k1=P3^4;
uchar num;
void delay(uint);
void main()
{
P2=0x01;
P3=0xff;
while(1)
{
if(k1==0)
{
delay(10);
if(k1==0)
{
d1=0;
num++;
if(num==10) num=0;
}
while(!k1);
delay(10);
while(!k1);
}
else d1=1;
P0=table[num];
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
独立键盘显示数字
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define uchar unsigned char
#define uint unsigned int
unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
uchar keyscan(void);//键盘扫描
void delay(uint i); //演示程序
void main()
{
uchar key;
P0=0x00;
P2=0x01; //1数码管亮 按相应的按键,会显示按键上的字符
while(1)
{
key=keyscan(); //调用键盘扫描,
switch(key)
{
case 0x7e:P0=dofly[0];break;//0 按下相应的键显示相对应的码值
case 0x7d:P0=dofly[1];break;//1
case 0x7b:P0=dofly[2];break;//2
case 0x77:P0=dofly[3];break;//3
case 0xbe:P0=dofly[4];break;//4
case 0xbd:P0=dofly[5];break;//5
case 0xbb:P0=dofly[6];break;//6
case 0xb7:P0=dofly[7];break;//7
case 0xde:P0=dofly[8];break;//8
case 0xdd:P0=dofly[9];break;//9
case 0xdb:P0=dofly[10];break;//a
case 0xd7:P0=dofly[11];break;//b
case 0xee:P0=dofly[12];break;//c
case 0xed:P0=dofly[13];break;//d
case 0xeb:P0=dofly[14];break;//e
case 0xe7:P0=dofly[15];break;//f
}
}
}
uchar keyscan(void) //键盘扫描函数,使用行列反转扫描法
{
uchar cord_h,cord_l;//行列值中间变量
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}
return(0xff); //返回该值
}
void delay(uint i) //延时函数
{
while(i--);
}
独立键盘显示数字
/*-----------------------------------------------
名称:矩阵键盘
日期:2009.5
修改:无
内容:通过反转法循环扫描矩阵键盘,并通过数码管显示数据
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define uchar unsigned char
#define uint unsigned int
unsigned char code seg[]={0,1,2,3,4,5,6,7};
unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
/*------------------------------------------------
函数声明
------------------------------------------------*/
uchar keyscan(void);//键盘扫描
void delay(uint i); //演示程序
/*------------------------------------------------
主函数
------------------------------------------------*/
void main()
{
uchar key;
uint j;
P0=0x00;
while(1)
{
key=keyscan(); //调用键盘扫描,
switch(key)
{
case 0x7e:P0=dofly[0];break;//0 按下相应的键显示相对应的码值
case 0xbe:P0=dofly[1];break;//1
case 0xde:P0=dofly[2];break;//2
case 0xee:P0=dofly[3];break;//3
case 0x7d:P0=dofly[4];break;//4
case 0xbd:P0=dofly[5];break;//5
case 0xdd:P0=dofly[6];break;//6
case 0xed:P0=dofly[7];break;//7
case 0x7b:P0=dofly[8];break;//8
case 0xbb:P0=dofly[9];break;//9
case 0xdb:P0=dofly[10];break;//a
case 0xeb:P0=dofly[11];break;//b
case 0x77:P0=dofly[12];break;//c
case 0xb7:P0=dofly[13];break;//d
case 0xd7:P0=dofly[14];break;//e
case 0xe7:P0=dofly[15];break;//f
}
P2=seg[j++];
{
if(j==8)
j=0;
}
delay(100);
}
}
/*------------------------------------------------
键盘扫描程序
------------------------------------------------*/
uchar keyscan(void) //键盘扫描函数,使用行列反转扫描法
{
uchar cord_h,cord_l;//行列值中间变量
P3=0xf0; //行线输出全为0
cord_h=P3&0xf0; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0xf0; //读入列线值
P3=cord_h|0x0f; //输出当前列线值
cord_l=P3&0x0f; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}
// return(0x00); //返回该值
}
/*------------------------------------------------
延时程序
------------------------------------------------*/
void delay(uint i) //延时函数
{
while(i--);
}
矩阵键盘,按一次灯闪一次004
/*-----------------------------------------------
名称:矩阵键盘
日期:2009.5
修改:无
内容:通过反转法循环扫描矩阵键盘,并通过数码管显示数据
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define uchar unsigned char
#define uint unsigned int
unsigned char code seg[]={0,1,2,3,4,5,6,7};
unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
/*------------------------------------------------
函数声明
------------------------------------------------*/
uchar keyscan(void);//键盘扫描
void delay(uint i); //演示程序
/*------------------------------------------------
主函数
------------------------------------------------*/
void main()
{
uchar key;
uint j;
P0=0x00;
P1=0xff;
while(1)
{
key=keyscan(); //调用键盘扫描,
{
switch(key)
{
case 0x7e:P0=dofly[0],P1=0x00;;break;//0 按下相应的键显示相对应的码值
case 0xbe:P0=dofly[1],P1=0x00;break;//1
case 0xde:P0=dofly[2],P1=0x00;break;//2
case 0xee:P0=dofly[3],P1=0x00;break;//3
case 0x7d:P0=dofly[4],P1=0x00;break;//4
case 0xbd:P0=dofly[5],P1=0x00;break;//5
case 0xdd:P0=dofly[6],P1=0x00;break;//6
case 0xed:P0=dofly[7],P1=0x00;break;//7
case 0x7b:P0=dofly[8],P1=0x00;break;//8
case 0xbb:P0=dofly[9],P1=0x00;break;//9
case 0xdb:P0=dofly[10],P1=0x00;break;//a
case 0xeb:P0=dofly[11],P1=0x00;break;//b
case 0x77:P0=dofly[12],P1=0x00;break;//c
case 0xb7:P0=dofly[13],P1=0x00;break;//d
case 0xd7:P0=dofly[14],P1=0x00;break;//e
case 0xe7:P0=dofly[15],P1=0x00;break;//f
}
P2=seg[j++];
{
if(j==8)
j=0;
}
delay(100);
}
}
}
/*------------------------------------------------
键盘扫描程序
------------------------------------------------*/
uchar keyscan(void) //键盘扫描函数,使用行列反转扫描法
{
uchar cord_h,cord_l;//行列值中间变量
P3=0xf0; //行线输出全为0
P1=0xff;
cord_h=P3&0xf0; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0xf0; //读入列线值
P3=cord_h|0x0f; //输出当前列线值
cord_l=P3&0x0f; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}
// return(0x00); //返回该值
}
/*------------------------------------------------
延时程序
------------------------------------------------*/
void delay(uint i) //延时函数
{
while(i--);
}
PWM调节发光二极管的亮度
/*-----------------------------------------------
名称:PWM 调光
日期:2009.5
修改:无
内容:1、学习目的:利用定时器产生PWM,了解原理和使用方法
2、硬件要求:LED灯 定时器
3、试验现象:LED灯由亮到灭,由灭到亮逐步变化,也就是调光现象
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit LED = P1^2; //定义LED灯,通过LED显示调光效果
unsigned char CYCLE; //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 0.1ms
unsigned char PWM_ON ;//定义高电平时间
/******************************************************************/
/* 延时函数 */
/******************************************************************/
void delay(unsigned int cnt)
{
while(--cnt);
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
main()
{
bit Flag;
TMOD |=0x01; //定时器设置 0.1ms in 12M crystal
TH0=(65536-100)/256;
TL0=(65536-100)%256; //定时0.1mS
IE= 0x82; //打开中断
TR0=1;
CYCLE = 10; // 时间可以调整 这个是10调整 8位PWM就是256步
while(!Flag)
{
delay(20000); //延时时间,从一个亮度到下一个亮度的间隔时间,速度快就能看到连续效果
PWM_ON++; //这个使用较长延时,以便能看清楚变化过程
if(PWM_ON == CYCLE)
{ //这个里可以添加其他程序 如到最亮时候控制设备
Flag=1;
}
}
while(Flag) //亮度递减 同上,是个相反的过程
{
delay(20000);
PWM_ON--;
if(PWM_ON == 0)
{
Flag=0;
}
}
}
/******************************************************************/
/* 定时器中断函数 */
/******************************************************************/
void tim(void) interrupt 1 using 1
{
static unsigned char count;
TH0=(65536-100)/256;
TL0=(65536-100)%256; //定时0.1mS
if (count==PWM_ON)
{
LED = 1; //灯灭
}
count++;
if(count == CYCLE)
{
count=0;
if(PWM_ON!=0) //如果左右时间是0 保持原来状态
LED = 0; //灯亮
}
}
八位数计数器
#include<reg52.h>
code unsigned char tab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9
unsigned char ge ; //定义个位
unsigned char shi ;//定义十位
unsigned char bai ;
unsigned char qian ;
unsigned char wan ;
unsigned char shiwan ;
unsigned char baiwan ;
unsigned char qianwan ;
void delay(unsigned int cnt)
{
while(--cnt);
}
void main()
{
TMOD |=0x01;//定时器设置 10ms in 12M crystal,工作在模式1,16位定时
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
IE= 0x82; //打开中断
TR0=1; //打开定时开关
while(1)
{
P0=ge;
P2=7;
delay(30); //短暂延时
P0=shi;
P2=6;
delay(30); //短暂延时
P0=bai;
P2=5;
delay(30);
P0=qian;
P2=4;
delay(30);
P0=wan;
P2=3;
delay(30); //短暂延时
P0=shiwan;
P2=2;
delay(30); //短暂延时
P0=baiwan;
P2=1;
delay(30);
P0=qianwan;
P2=0;
delay(30);
}
}
void tim(void) interrupt 1
{
unsigned long second,count;
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
count++;
if (count==5) //100x10ms=1S,大致延时时间
{
count=0;
second++; //秒加1
if(second==100000000)
second=0;
ge=tab[second%10];
shi=tab[second%1000000%1000000%100000%10000%1000%100/10];
bai=tab[second%1000000%1000000%100000%10000%1000/100] ;
qian=tab[second%1000000%1000000%100000%10000/1000] ;
wan=tab[second%1000000%1000000%100000/10000];
shiwan=tab[second%1000000%1000000/100000];
baiwan=tab[second%1000000/1000000];
qianwan=tab[second/10000000];
}
}
四位数计数器
#include<reg52.h>
code unsigned char tab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9
unsigned char ge ; //定义个位
unsigned char shi ;//定义十位
unsigned char bai ;
unsigned char qian ;
unsigned char wan ;
unsigned char shiwan ;
unsigned char baiwan ;
unsigned char qianwan ;
void delay(unsigned int cnt)
{
while(--cnt);
}
void main()
{
TMOD |=0x01;//定时器设置 10ms in 12M crystal,工作在模式1,16位定时
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
IE= 0x82; //打开中断
TR0=1; //打开定时开关
while(1)
{
P0=ge;
P2=3;
delay(10); //短暂延时
P0=shi;
P2=2;
delay(10); //短暂延时
P0=bai;
P2=1;
delay(10);
P0=qian;
P2=0;
delay(10);
}
}
void tim(void) interrupt 1
{
unsigned long second,count;
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
count++;
if (count==100) //100x10ms=1S,大致延时时间
{
count=0;
second++; //秒加1
if(second==10000)
second=0;
ge=tab[second%10];
shi=tab[second%1000%100/10];
bai=tab[second%1000/100] ;
qian=tab[second/1000 ] ;
}
}
9999倒计数
/*-----------------------------------------------
名称:99秒倒计时器
日期:2009.5
修改:无
内容:通过定时器倒计时
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
code unsigned char tab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9
unsigned char Dis_qainwei;
unsigned char Dis_baiwei;
unsigned char Dis_Shiwei;//定义十位
unsigned char Dis_Gewei; //定义个位
/******************************************************************/
/* 延时函数 */
/******************************************************************/
void delay(unsigned int cnt)
{
while(--cnt);
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
main()
{
TMOD |=0x01;//定时器设置 10ms in 12M crystal,工作在模式1,16位定时
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
IE= 0x82; //打开中断
TR0=1; //打开定时开关
while(1)
{
P0=Dis_qainwei;
P2=0;
delay(300);
P0=Dis_baiwei;
P2=1;
delay(300);
P0=Dis_Shiwei;
P2=2;
delay(300);
P0=Dis_Gewei;
P2=3;
delay(300);
}
}
/******************************************************************/
/* 定时器中断函数 */
/******************************************************************/
void tim(void) interrupt 1 using 1
{
static unsigned long second=9999,count; //初值99 static相当重要,否则不能减数
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if (count==10)
{
count=0;
second--;//秒减1
if(second==0)
second=9999;
Dis_qainwei=tab[second/1000] ;
Dis_baiwei=tab[second%1000/100] ;
Dis_Shiwei=tab[second%1000%100/10];//十位显示值处理
Dis_Gewei=tab[second%10]; //个位显示处理
}
}
数字时钟
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define uchar unsigned char
#define uint unsigned int
static unsigned char count;
code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9
uchar smg[8]; //定义缓冲区
uint minute=30,hour=12,second; //定义并且初始化值 12:30:00
void delay(unsigned int cnt)
{
while(--cnt);
}
void display( )
{
smg[0]=tab[hour/10]; //显示小时
smg[1]=tab[hour%10];
smg[2]=0x40; //显示"-"
smg[3]=tab[minute/10]; //显示分钟
smg[4]=tab[minute%10];
smg[5]=0x40; //显示"-"
smg[6]=tab[second/10]; //显示秒
smg[7]=tab[second%10];
}
void main()
{
uchar i;
TMOD |=0x01; //定时器0 10ms in 12M crystal 用于计时
TH0=0xd8; //初值
TL0=0xf0;
ET0=1;
TR0=1;
EA =1;
display();
while(1)
{
for(i=0;i<8;i++) //显示时间
{
P0=smg[i];
P2=i;
delay(100);
}
if (count==100)
{
count=0;
second++; display(); //秒加1
if(second==60)
{
second=0;
minute++; //分加1
if(minute==60)
{
minute=0;
hour++; //时加1
if(hour==24)
hour=0;
}
}
}
display();
}
}
void timer() interrupt 1
{
TH0=0xd8; //重新赋值
TL0=0xf0;
count++;
}
交通灯 //经典啊
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
#define ulang unsigned lang
static unsigned char count;
code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9
uchar smg[8]; //定义缓冲区
uint we,ns,h,j;
int aaa();
int bbb();
int eee();
void delay(unsigned int cnt)
{
while(--cnt);
}
void display( )
{
smg[0]=tab[we/10];
smg[1]=tab[we%10];
smg[2]=0x00;
smg[3]=0x00;
smg[4]=0x00;
smg[5]=0x00;
smg[6]=tab[ns/10];
smg[7]=tab[ns%10];
}
void main()
{
uchar i;
TMOD |=0x01; //定时器0 10ms in 12M crystal 用于计时
TH0=0xd8; //初值
TL0=0xf0;
ET0=1;
TR0=1;
EA =1;
display();
while(1)
{
for(i=0;i<8;i++) //显示函数
{
P0=smg[i];
P2=i;
delay(100);
}
ccc();
display( );
}
}
void timer() interrupt 1
{
TH0=0xd8; //重新赋值
TL0=0xf0;
count++;
}
int aaa()
{
if(j<25)
{
if(j==1) { we=30,ns=25; }
ns--;
we--;
P1=0xde;
return 0; }
if(25<=j<30)
{
if(j==26) { ns=5; }
P1=0xee;
ns--;
we--;
return 0; }
}
int bbb()
{
if(h<25)
{
if(h==1) { we=25,ns=30; }
ns--;
we--;
P1=0xf3;
return 0; }
if(25<=h<30)
{
if(h==26) { we=5; }
P1=0xf5;
ns--;
we--;
return 0; }
}
int eee()
{
j=0;
h=0;
return 0;
}
int ccc()
{
if (count==100)
{
count=0;
j++;
if ( (j>30)&&(j!=61)) { h++; bbb(); return 0; }
if(j==61) { eee(); return 0;}
aaa(); return 0;
}
}
1602可调时分秒
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define uchar unsigned char
#define uint unsigned int
static uchar count,j,s1num;
char shi,fen,miao;
sbit RS = P2^4; //Pin4
sbit RW = P2^5; //Pin5
sbit E = P2^6; //Pin6
sbit s1=P3^0; //矩阵键盘分离出独立键盘
sbit s2=P3^1;
sbit s3=P3^2;
sbit rd=P3^7;
uchar code table1[]=" 2013-7-30 MON ";
uchar code table2[]=" 00:00:00 ";
/******************************************************************/
/* 延时函数 */
/******************************************************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/******************************************************************/
/* 写入命令函数 */
/******************************************************************/
void WriteCommand(unsigned char c)
{
delay(5);//操作前短暂延时,保证信号稳定
E=0;
RS=0;
RW=0;
delay(5);
E=1;
P0=c;
E=0;
}
/******************************************************************/
/* 写入数据函数 */
/******************************************************************/
void WriteData(unsigned char c)
{
delay(5); //操作前短暂延时,保证信号稳定
E=0;
RS=1;
RW=0;
delay(5);
E=1;
P0=c;
E=0;
RS=0;
}
/******************************************************************/
/* 初始化函数 */
/******************************************************************/
void InitLcd()
{
//delay(15);
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x06); //显示光标移动位置
WriteCommand(0x0c); //显示开及光标设置
WriteCommand(0x01); //显示清屏
// fen=59; //测试用
// miao=53;
// shi=23;
delay(15);
WriteCommand(0x80); //显示第一行
for(j=0;j<16;j++)
{
WriteData(table1[j]);
delay(5);
}
WriteCommand(0x80+0x40); //显示第二行
for(j=0;j<16;j++)
{
WriteData(table2[j]);
delay(5);
}
}
/******************************************************************/
/* 时分秒显示 */
/******************************************************************/
void writesfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
WriteCommand(0x80+0x40+add);
WriteData(0x30+shi);
WriteData(0x30+ge);
}
/******************************************************************/
/* 键盘功能函数 */
/******************************************************************/
void keysan()
{
rd=0;
if(s1==0)
{
delay(5);
if(s1==0)
{
s1num++;
while(!s1);
if(s1num==1)
{
TR0=0;
WriteCommand(0x80+0x40+10);
WriteCommand(0x0f); //显示光标
}
}
if(s1num==2)
{
WriteCommand(0x80+0x40+7);
}
if(s1num==3)
{
WriteCommand(0x80+0x40+4);
}
if(s1num==4)
{
s1num=0;
WriteCommand(0x0c); //光标不闪烁
TR0=1;
}
}
if(s1num!=0) //s1抬起时完成加减操作
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
if(s1num==1)
{
miao++;
if(miao==60)
miao=0;
writesfm(10,miao);
WriteCommand(0x80+0x40+10);
}
if(s1num==2)
{
fen++;
if(fen==60)
fen=0;
writesfm(7,fen);
WriteCommand(0x80+0x40+7);
}
if(s1num==3)
{
shi++;
if(shi==24)
shi=0;
writesfm(4,shi);
WriteCommand(0x80+0x40+4);
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
if(s1num==1)
{
miao--;
if(miao==-1)
miao=59;
writesfm(10,miao);
WriteCommand(0x80+0x40+10);
}
if(s1num==2)
{
fen--;
if(fen==-1)
fen=59;
writesfm(7,fen);
WriteCommand(0x80+0x40+7);
}
if(s1num==3)
{
shi--;
if(shi==-1)
shi=23;
writesfm(4,shi);
WriteCommand(0x80+0x40+4);
}
}
}
}
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
void main(void)
{
TMOD=0x01; //定时器0 10ms in 12M crystal 用于计时
TH0=(65536-50000)/256; //初值
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
EA =1;
InitLcd(); //初始化LCD,送初值
while(1)
{
keysan();
if(count==10)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
writesfm(4,shi) ;
}
writesfm(7,fen) ;
}
writesfm(10,miao) ;
}
}
}
void timer0() interrupt 1 //定时器中断0
{
TH0=(65536-50000)/256; //初值
TL0=(65536-50000)%256;
count++;
}