1、AT89S52语言常用程序一、闪烁灯#include / sbit gate=P20;/ 定义P2-0口void main(void)unsigned int i,j;while(1)for(i=500;i0;i-)for(j=500;j0;j-);/ 双重循环,延时约1秒gate=!gate;/ 对P-0口取反,控制小灯的亮灭#include #define uint unsigned intsbit gate1=P20; / 定义P2-0口sbit gate2=P21; / 定义P2-1口sbit gate3=P22; / 定义P2-2口sbit gate4=P23; / 定义P2-3口v
2、oid main(void)uint i,j;while(1)for(i=250;i0;i-)for(j=250;j0;j-); / 双重循环,延时约0.2秒 gate1=!gate1; / 对P-0口取反,控制小灯的亮灭 gate2=!gate2; / 对P-1口取反,控制小灯的亮灭 gate3=!gate3; / 对P-2口取反,控制小灯的亮灭 gate4=!gate4; / 对P-3口取反,控制小灯的亮灭#include #include #define unit unsigned int#define uchar unsigned charsbit L0=P20;sbit L1=P21
3、;sbit L2=P22;sbit L3=P23;uchar data BUFFER1=0; /*定时器计数变量*/void main(void)P2=0x0f; / 初始化端口EA=1; IT1=1; ET0=1;TMOD=0x01; /* T0方式1计时0.01秒 */TH0=-5000/256;TL0=-5000%256;TR0=1; /* 开中断,启动定时器 */for (;);/* 定时计数器0的中断服务子程序 */void intserv1(void) interrupt 1 using 1TH0=-5000/256; / 定时器T0的高四位赋值TL0=-5000%256;BUFF
4、ER0=BUFFER0+1; / 定时器T0的低四位赋值if (BUFFER0=100) / 百分秒进位L3=!L3;L2=!L2;L1=!L1;L0=!L0;二、串口的简单测试程序# include void main(void) unsigned char astring;/*在11.0592MHz晶振下,设置串行口9600数据传输率,方式3*/TMOD=0x20; TL1=0xfd;TH1=0xfd; SCON=0xd8;PCON=0x00; /*串口接收字符RI置位,允许串口接收*/ TR1=1;while(1) while(RI=0);RI=0; /*串口接收标志位的软件清零*/as
5、tring=SBUF;三、行列键盘的输入例程#include #include #define uchar unsigned char#define uint unsigned intvoid delays(void);uchar kbscan(void);void main(void)uchar key;while(1) key=kbscan(); /*键扫描函数*/delays(); /*键消抖的延时函数*/ 键消抖的延时函数void delays(void)uchar i;for(i=300;i0;i-);/ kbscan(void) 键扫描函数uchar kbscan(void) uc
6、har sccode,recode;P1=0xf0; /*发全0行扫描码,列线输入*/if(P1&0xf0)!=0xf0) /*若有键按下*/delays(); /*延时去抖动*/if(P1&0xf0)!=0xf0)sccode=0xfe; /*逐行扫描初值*/while(sccode&0x10)!=0)P1=sccode; /*输出行扫描码*/if(P1&0xf0)!=0xf0) /*本行有键按下*/recode=(P1&0xf0)|0x0f;return(sccode)+(recode); /*返回特征字节码*/else sccode=(sccode1)|0x01;/*行扫描码左移一位*/
7、return(0); /*无键按下,返回值为0*/四、锁定键盘的程序#include #include #define uchar unsigned char#define uint unsigned intvoid delays(void);uchar kbscan(void);main() bit CRT; /*密码正确标志,=1密码正确*/ bit PRT; /*密码部分输入标志,=1密码部分输入*/ uchar COUNT; /*计数单元,存放密码正确的位数*/ uchar KEY; /*被按下的键的编码*/ CRT=0; PRT=0; COUNT=0;KEY=kbscan(); /*
8、键扫描函数*/delays(); /*键消抖的延时函数*/ switch (KEY) case 0xb7: /*0键*/ if (CRT) else /*密码不正确时*/ if (PRT) /*部分密码正确时*/ COUNT=COUNT+1; /*密码正确的位数加1*/ if (COUNT=3) /*密码所有位都正确*/ CRT=1; PRT=0; COUNT=0; ; break; case 0x7e: /*1键*/ if (CRT) /*密码正确时的操作内容*/ else /*密码不正确时*/ PRT=0; COUNT=0; ; break; case 0xbe: /*2键*/ if (C
9、RT) /*密码正确时的操作内容*/ else /*密码不正确时*/ if (PRT) /*部分密码正确时,说明密码错误*/ PRT=0; COUNT=0; else /*密码正确位数为0时,说明密码第一位正确*/ PRT=1; COUNT=1; ; break; case 0xd7: /*#键*/ if (CRT) /*密码正确时,锁定键盘*/ CRT=0; PRT=0; COUNT=0; ; break; / 键消抖的延时函数void delays(void)uchar i;for(i=300;i0;i-);/ kbscan(void) 键扫描函数uchar kbscan(void) uc
10、har sccode,recode;P1=0xf0; /*发全0行扫描码,列线输入*/if(P1&0xf0)!=0xf0) /*若有键按下*/delays(); /*延时去抖动*/if(P1&0xf0)!=0xf0)sccode=0xfe; /*逐行扫描初值*/while(sccode&0x10)!=0)P1=sccode; /*输出行扫描码*/if(P1&0xf0)!=0xf0) /*本行有键按下*/recode=(P1&0xf0)|0x0f;return(sccode)+(recode); /*返回特征字节码*/else sccode=(sccode1)|0x01; /*行扫描码左移一位*
11、/return(0); /*无键按下,返回值为0*/ 五、单片机中的多路模拟开关例程#include #include #include #include #define uchar unsigned char#define uint unsigned int#define adch0 XBYTE0x0000sbit P1_3=P13;sbit P1_2=P12;uint ch0datal,ch0datah,i,light;void main(void) EA=1; PT0=1; / 开外中断,并设置定时器; ET0=1; IT0=1;IT1=1; EX0=1;EX1=1;ET2=1; T2C
12、ON=0x08; TMOD=0x21; TH0=0xB9; / 设置定时器的初值; TL0=0xB0; TR0=1; TI=1; ch0datah=0; ch0datal=0; P1_3=0; / 设置控制端口的初值; P1_2=0; while(1) / 等待外部的控制信号;void intsvr1(void) interrupt 1 / 定时器1模拟外部控制信号的进入 TH0=0xB9; TL0=0xB0; TR0=1; light=light+1; if (light1000) P1_3=!P1_3; / MAX333的控制信号取反,工作方式变化; P1_2=!P1_2; light=0
13、; / 标志位显示当前的工作状态; 六、单片机控制的数码管显示#include #include #include #include #define DIGPORT XBYTE 0x8000 /* 定义字位口 */#define WORDPORT XBYTE 0x4000 /* 定义字型口 */#define uchar unsigned char/* 定义共阴极字型编码表(数字09)*/uchar code TABLE=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/ 显示:得到字型和字位口的地址后,向不同的字位送数据,进行数据的显示。/
14、 数码管显示计数值个位uchar digit;uchar disp,delay; / 对计数值取余数main() TMOD=0x60; /* T0方式1计时0.01秒 */ TH1=0; TL1=0; EA=1; ET1=0; TR1=1; /* 开中断,启动定时器 */ for (;) /* 数码管显示计数值低位 */ digit=0x08; disp=TL1%10; DIGPORT=digit; WORDPORT=TABLEdisp; for (delay=0;delay=200;delay+); /显示其它位的数据 七、单片机的数字时钟例程#include #include #defin
15、e unit unsigned int#define uchar unsigned char/*定义字型字位口*/#define DIGPORT XBYTE 0x8000#define WORDPORT XBYTE 0x4000/*定义P1口各管脚*/sbit K0=P10;sbit K1=P11;sbit K2=P12;sbit BEEP=P13;sbit L0=P14;sbit L1=P15;sbit L2=P16;sbit L3=P17;uchar data BUFFER2=0,0; /*显示缓冲区(依次为低位,高位)*/uchar data CLOCK4=0,0,0,0; /*存放时钟
16、时间(依次为百分秒,秒,分和时位)*/uchar data SECOND2=0,0; /*存放秒表时间(依次为百分秒,秒)*/uchar data REVERSE4=0,0,0,0; /*存放倒计时时间(依次为百分秒,秒,分和时位)*/*定义运行状态*/uchar data STATE=0;/*STATE=0,秒表*/*STATE=1,倒计时分调整*/*STATE=2,倒计时小时调整*/*STATE=3,倒计时运行*/*STATE=4 or 7,时钟运行*/*STATE=5,时钟分调整*/*STATE=6,时钟时调整*/bit bdata SND=0; /*秒表START*/bit bdata
17、 RST=0; /*秒表RESET*/bit bdata STP=0; /*倒计时STOP*/*数码管显示编码09,A,-*/uchar code TABLE=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x40;void display(void) uchar i; /*显示缓冲区首址*/ uchar delay; /*显示延时*/ uchar disp; /*显示内容*/ uchar digit; /*定义数码管显示位*/ digit=0x08; for (i=0;i100) disp=BUFFERi%10+10; else
18、 disp=BUFFERi%10; DIGPORT=digit; WORDPORT=TABLEdisp; for (delay=0;delay1; disp=BUFFERi/10; DIGPORT=digit; WORDPORT=TABLEdisp; for (delay=0;delay1; void timer0(void) interrupt 1 using 1 /*重置定时初值*/ TH0=-5000/256; TL0=-5000%256; /*时钟处理*/ CLOCK0=CLOCK0+1; if (CLOCK0=50) & (STATE=4) L0=!L0; if (CLOCK0=10
19、0) if (STATE=4) L0=!L0; CLOCK0=0; CLOCK1=CLOCK1+1; if (CLOCK1=60) CLOCK1=0; CLOCK2=CLOCK2+1; if (CLOCK2=60) CLOCK2=0; CLOCK3=CLOCK3+1; if (CLOCK3=24) CLOCK3=0; void timer2(void) interrupt 5 using 3 TF2=0; TH2=-5000/256; TL2=-5000%256; /*秒表处理*/ if (STATE=0) SECOND0=SECOND0+1; if (SECOND0=50) L1=!L1;
20、if (SECOND0=100) L1=!L1; SECOND0=0; SECOND1=SECOND1+1; if (SECOND1=100) SECOND1=0; /*倒计时处理*/ if (STATE=3) REVERSE0=REVERSE0+1; if (REVERSE0=50) L2=!L2; if (REVERSE0=100) L2=!L2; REVERSE0=0; REVERSE1=REVERSE1+1; if (REVERSE1=60) REVERSE1=00; REVERSE2=REVERSE2-1; if (REVERSE2=0) & (REVERSE3=0) TR2=0;
21、STP=1; BEEP=0; else if (REVERSE2=0xff) REVERSE2=59; REVERSE3=REVERSE3-1; void intsvr1(void) interrupt 2 using 2 if (STATE=5) CLOCK2=CLOCK2+1; if (CLOCK2=60) CLOCK2=0; if (STATE=6) CLOCK3=CLOCK3+1; if (CLOCK3=24) CLOCK3=0; void timer1(void) interrupt 3 using 3 if (STATE=0) if (RST) SECOND0=0; SECOND1
22、=0; L1=1; RST=0; else if (SND) TR2=1; else L1=1; TR2=0; RST=1; SND=!SND; else if (STATE=1) REVERSE2=REVERSE2+1; if (REVERSE2=60) REVERSE2=0; else if (STATE=2) REVERSE3=REVERSE3+1; if (REVERSE3=24) REVERSE3=0; else if (STP) BEEP=1; L2=1; STP=0; else TR2=0; void main(void) uchar stabak; /*上一次程序运行的状态*/
23、 P1=0x0f; EA=1; IT1=1; ET0=1; TMOD=0x61; /*T1方式2计数,T0方式1计时*/ TH0=-5000/256; TL0=-5000%256; TH1=0xff; TL1=0xff; T2CON=0; TH2=-5000/256; TL2=-5000%256; K0=1; K1=1; K2=1; STATE=P1&0x07; stabak=STATE; for (;) switch (STATE) case 0: /*STATE=0,秒表*/ EX1=0; ET1=1; ET2=1; TR1=1; SND=1; L1=1; L0=0; L2=0; SECOND0=0; SECOND1=0; break; case 1: /*STATE=1,倒计时分调整*/ EX1=0; ET1=1; ET2=1; TR1=1; TR2=0; L2=1; L0=0; L1=0; REVERSE0=0; REVERSE1=0; break; case 2: /*STATE=2,倒计时小时调整*/ EX1=0; ET1=1; ET2=1; TR1=1; TR2=0; L2=1; L0=0; L1=0; REVERSE0=0; REVERSE1=0; break;
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2