write_date(table2[a]); delay(40); } for(a=0;a<16;a++) { write_com(0x18); //左移 delay1(600); } while(1); }
32. 本程序为定时器的基本驱动示例,定时器工作于方式1。下载程序后,隔三秒钟,第一个发光二极管被点亮.
#include
#define uint unsigned int uint pp;
sbit led=P1^0;
void main() { TMOD=0x01; //模式设置,00000001,可见采用的是定时器0,工作与模式1(M1=0,M0=1)。 TR0=1; //打开定时器 TH0=0Xff; //定时器设置,每隔100微秒发起一次中断。 TL0=0Xa4; ET0=1; //开定时器0中断 EA=1; //开总中断 while(1) { if(pp==30000) //时隔3s后,led被点亮。 led=0; } }
void time0() interrupt 1 { TH0=0Xff; TL0=0Xa4; pp++; }
33. 本程序提供一些常用定时器计时的具体参数。用的是定时器0工作于方式1。且只针对11.0592MHz的晶振。 #include
void InitTimer0(void) {
TMOD = 0x01;
TH0 = 0xFF; //延时100微秒 TL0 = 0xA4;
/******************************************************************* TH0 = 0xFC;//延时1ms,请在中断处理函数中,重新装入该数值。 TL0 = 0x6;
********************************************************************
TH0 = 0xDC;//延时10ms,请在中断处理函数中,重新装入该数值 TL0 = 0x00;
********************************************************************/ EA = 1; ET0 = 1; TR0 = 1; }
void main(void) {
InitTimer0(); }
void Timer0Interrupt(void) interrupt 1 {
TH0 = 0x0FF; //这只是100微秒所对应的参数,若为其他秒数,请 TL0 = 0x0A4; //在次更该相应参数,如上面所示。 }
34. 本程序为计数器的基本驱动示例,计数器工作于方式1。 对按键S2按下的次数进行计数,当计数记到3时,第一个发光二极管被点亮。 #include
#define uint unsigned int //uint pp;
sbit led=P1^0; sbit s2=P3^4;
void main() { TMOD=0x05; //模式设置,00000001,可见采用的是定时器0,工作与模式1(M1=0,M0=1)。 TR0=1; //打开计数器 ET0=1; //开计数器0中断 EA=1; //开总中断 while(1) { if(TL0==3) //当计数为3时,led被点亮。当然,由于有按键抖动,故有时未按三下S2,灯已经亮了。 led=0; } } /*
void time0() interrupt 1 { pp++; } */
35. 本程序延时用定时器的方法产生相互间隔的一频率为1KH的方波与高电平信号。KH方波持续期间,会驱动蜂鸣器发出响声,高电平持续期间,蜂鸣器不会发出声音。这样,二者相互穿插的结果就产生了断断续续的“滴滴”声。 #include
#define uint unsigned int uint aa;
unsigned char pp; bit close;
sbit didi=P2^3;
void main() { TMOD=0x01; //模式设置,00000001,可见采用的是定时器0,工作与模式1(M1=0,M0=1)。 TR0=1; //打开定时器 TH0=0xff;//计时器每隔100微秒(0.1ms)发起一次中断。 TL0=0x9c;//产生频率为1000HZ的声音信号。 ET0=1; //开定时器0中断 EA=1; //开总中断 while(1) {
if(pp==10) { pp=0; if(!close) didi=~didi; //频率为1KH的音频信号 aa++; } if(aa==200) { didi=1; close=1; //方波音频信号持续时间为200*10*100us=0.2s } if(aa==300) //滴滴声的周期为300*10*100us=0.3s { close=0; aa=0; } } }
void time0() interrupt 1 { TH0=0xff; TL0=0x9c; pp++; }
36.50秒计时
#include
#define uchar unsigned char
sbit dula=P2^6; sbit wela=P2^7;
unsigned char j,k,c1,c0,m,n=255; unsigned char pp; unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(unsigned char i) {
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display(uchar a,uchar b) {
P0=table[a]; dula=1; dula=0;
P0=0xef; wela=1; wela=0; delay(5);
P0=table[b]; dula=1; dula=0;
P0=0xdf; wela=1; wela=0; delay(5); }
void main() { TMOD=0x01; //模式设置,00000001,可见采用的是定时器0,工作与模式1(M1=0,M0=1)。 TR0=1; //打开定时器 TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。 TL0=(65536-46080)%6;//46080的来历,为50000*11.0592/12 ET0=1; //开定时器0中断 EA=1; //开总中断 while(1) { if(pp==20) { pp=0; m++; n--; P1=n;//闪烁灯 if(m==60) { m=0; //若到了60s,则归零 } } c0=m; //取出当前描述的个
位与十位 c1=m/10; display(c1,c0); //显示 } }
void time0() interrupt 1 {TH0=(65536-46080)/256; TL0=(65536-46080)%6; pp++; }
37.定时器产生方波 #include
#define uint unsigned int uint pp;
sbit pwm=P1^0;
void main() { TMOD=0x01; //模式设置,00000001,可见采用的是定时器0,工作与模式1(M1=0,M0=1)。 TR0=1; //打开定时器 TH0=0Xff; //定时器设置,每隔100微秒发起一次中断。 TL0=0Xa4; ET0=1; //开定时器0中断 EA=1; //开总中断 while(1) { if(pp<=2) pwm=1; else pwm=0; if(pp==10) pp=0; } }
void time0() interrupt 1 { TH0=0Xff; TL0=0Xa4; pp++; }
38秒表
#include
#define uchar unsigned char
sbit dula=P2^6; sbit wela=P2^7; sbit beep=P2^3; sbit lcden=P3^4; sbit rs=P3^5;
unsigned char halt,j,k,a1,a0,b1,b0,c1,c0,s,f,m,n=255; unsigned int pp; unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(unsigned char i) {
for(j=i;j>0;j--)
for(k=125;k>0;k--); }
void display(uchar shi2,uchar shi1,uchar fen2,uchar fen1,uchar miao2,uchar miao1) {
dula=0;
P0=table[shi2]; dula=1; dula=0;
wela=0; P0=0xfe; wela=1; wela=0; delay(5);
P0=table[shi1]|0x80; dula=1; dula=0;
P0=0xfd; wela=1; wela=0; delay(5);
P0=table[fen2]; dula=1; dula=0;
P0=0xfb; wela=1; wela=0; delay(5);
P0=table[fen1]|0x80; dula=1; dula=0;
P0=0xf7; wela=1; wela=0; delay(5);
P0=table[miao2]; dula=1; dula=0;
P0=0xef; wela=1; wela=0; delay(5);
P0=table[miao1]; dula=1; dula=0;
P0=0xdf; wela=1; wela=0; delay(5); }
void keyscan() { if(lcden==0) delay(10); if(lcden==0) { halt=1; } if(rs==0) halt=0; }
void main()
{ TMOD=0x01; TR0=1; TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。 TL0=(65536-46080)%6;//46080的来历,为50000*11.0592/12 ET0=1; EA=1; while(1) { keyscan(); if(halt==0) { TR0=1; if(pp==20) { pp=0; m++; n--; P1=n;//闪烁灯 if(m==60) { m=0; f++; if(f==60) { f=0; s++; if(s==99) { s=0; } } } } a0=s; a1=s/10; b0=f; b1=f/10; c0=m; c1=m/10; display(a1,a0,b1,b0,c1,c0); } else TR0=0; display(a1,a0,b1,b0,c1,c0); } }
void time0() interrupt 1 {TH0=(65536-46080)/256; TL0=(65536-46080)%6; pp++; }
39. do while
#include
sbit beep=P2^3; sbit led=P1^0;
void delay(unsigned int i) //一个延时程序。 { unsigned int j; char k; for(j=i;j>0;j--) for(k=200;k>0;k--); }
void main() { char cishu; do //当程序执行到此处,先无条件执行循环体一次。 { beep=~beep; //每循环一次,beep与led所代表的管脚电平都会取反。 led=~led; //由于次数最大值为9,初值为0,故共取了十次反,故蜂鸣器会响五下,led会闪五次 cishu++; delay(5000); } while(cishu<10);//执行循环体的条件是cishu<10,若变量不满足该表达式,则跳过。 //注意while括弧后面有一分号。 while(1); }
41 数组
#include
unsigned char code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //分别使某一位LED点亮的P1口电平分布数组。
void delay() { unsigned int p,q; for(p=100;p>0;p--) for(q=100;q>0;q--); }
void main() { char m; //每个变量在使用前,必须要加以声明。 while(1) //下面的代码无限循环,效果便是led一遍遍的闪烁。 { P1=table[m];//这就是数组的调用方法,m值为几,即调用数组第几个值(数组中数值的编号从0开始) m++;//改变此m值,便可调用到数组中不同的值。开始时m=0,调用到值0xfe。从而点亮第一个数码管。(HJ-3G上,为低电平点亮LED,高电平熄灭LED) if(m==7)//由于led只有八位,而m是从0开始取值的,故当m=7时,应将其归零。 m=0; delay(); }} 42.for
#include
void delay(unsigned int i) //一个延时程序。 { unsigned int j; char k; for(j=i;j>0;j--) for(k=200;k>0;k--); }
void main() { char cishu; for(cishu=0;cishu<10;cishu++)//第一个表达式为给变量赋初值,第二个为判断标准 //若为真,则执行下面的指令,否则将跳过大括弧中的指令 //第三句为更改变量值的指令。 {
beep=~beep; //每执行一次,beep与led
所代表的管脚电平都会取反。 led=~led; //由于共取了十次反,故蜂鸣器会响五下,led会闪五次 delay(5000); } while(1); }
43.switch
#include