51單片機程序參考大全
讓流水燈來回流一次,蜂鳴器響一次 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) ;
}
最後更新:2017-04-03 19:06:48 上一篇:
愛上多線程——重複初始化問題
下一篇:
2KB內存單片機上實現彩屏GUI控件庫