8 位单片机LS2051使用说明
- 格式:pdf
- 大小:929.12 KB
- 文档页数:23
如何使用和检测89C2051单片机AT89C2051 是爱特梅尔(ATMEL 公司AT89 系列的与AT89C51 相比,有良好的延续性,仅减少了存储容量和I/O 端口,其余配置与性能不减,是性能价格比最好的8 位单片机。
1)特性a)指令与MCS-51 100%兼容b) 内带2k 可编程闪速存储器(Flash Memory)c)电可擦写次数:1000 次d)数据保留时间:10 年e)工作电压范围Vcc:2.7-6V f)编程电压:5V g)16位定时器/计数器2 个h)中断源5 个i)可编程串行通道VART j)工作频率:0-24MHZ k)输出口可直接驱动LED 。
l)片内含模拟比较器m)低功耗的闲置和掉电模式n)标准的双列直插(DIP)2O 脚塑封0)15 条可编程双向I/0 端口2)引脚排列AT89C2051 的引脚排列如图1 所示。
图1 AT89C2051 的引脚排列如图2 所示是AT89C2051 的最小应用系统,对一般程序不是很大的场合这种电路是非常简洁方便的。
图2AT89C2051 最小应用系统检测AT89C2051 可用指针式万用表电阻检测管脚(10)(接红表笔)和其他各脚之间的电阻值。
下面给出的是用MF47 万用表Rx1k 档时测出的数据供参考。
红表笔接(10)脚,黑表笔接其余各脚的电阻值:(1)一30OkΩ、(2)一2OkΩ、(3)一2OkΩ、(5)一1OOkΩ、(6)一30OkΩ、(7)一2OkΩ、(8)一2OkΩ、(9)一2OkΩ、(10)一2OkΩ、(11)一2OkΩ、(12)一40kΩ、(13)一40kΩ、(14)-2OkΩ、(15)一16OkΩ、(16)一16OkΩ、(17)一2OkΩ、(18)一。
2.1 AT89C2051单片机及其引脚说明
AT89C2051说明
89C2051是由ATMEL公司推出的一种小型单片机。
95年出现在中国市场。
其主要特点为采用Flash存贮器技术,降低了制造成本,其软件、硬件与MCS-51完全兼容,可以很快被中国广大用户接受,其程序的电可擦写特性,使得开发与试验比较容易。
1 引脚
89C2051共有20条引脚,详见图1.从图中可见,2051继承了8031最重要引脚:P1口共8脚,准双向端口。
P3.0~P3.6共7脚,准双向端口,并且保留了全部的P3的第二功能,如P3.0、P3..1的串行通讯功能,P3.2、P3..3的中断输入功能,P3.4、P3.5的定时器输入功能。
在引脚的驱动能力上面,89C2051具有很强的下拉能力,P1,P3口的下拉能力均
可达到20mA.相比之下,89C51/87C51的端口下拉能力每脚最大
为15mA。
但是限定9脚电流之和小于71mA.这样,引脚的平均
电流只9mA。
89C2051驱动能力的增强,使得它可以直接驱动
LED数码管。
为了增加对模拟量的输入功能,2051在内部构造了一个模拟信
号比较器,其输入端连到P1.0和P1.1口,比较结果存入P3.6
对应寄存器,(P3.6在2051外部无引脚),原理见图2。
对于一些不大复杂的控制电路我们就可以增加少量元件来实
现,例如,对温度的控制,过压的控制等。
图3为测量示意图。
其中,R用于测量门限的调节,IN端接输
入模拟信号。
/*项目名称:基于AT89C2051单片机的多功能时钟定时器功能描述:本设计有4个按键S1,S2,S3,S4。
S1: 调时S2:调分S3:定时开调整S4:定时关调整复合键S3+S4:快捷开/关(启动两路定时开/关)操作说明:1.单片机系统通电后,系统初始时间为00:00,通过S1 调时S2调分校准系统时间。
2.普通定时时间调整:按住S3,再按S1,每按一次普通定时开加1,长按住S1,普通定时开时间“小时”连续加1;用同样的方法调整定时时间“分”。
同理按住S4,再配合S1、S2,调节定时关时间。
3.快捷定时时间调整:按住复合键S3+S4,再按S1,每按一次快捷定时开加1,长按住S1,快捷定时开时间“小时”连续加1,用同样的方法配合S2调整快捷定时关的时间。
说明:快捷定时开/关时间是以小时为单位的。
如快捷定时时间设定为“01:02”,表示启动快捷定时后,相对此时1小时后定时开,2个小时后定时关。
4.两种定时功能的启动:按下复合键S1+S2,释放后立即启动两路定时,当定时开/关时间到时蜂鸣器会鸣叫。
定时开,启动交流外设,第四个数码管的“●”点亮(表示处于监控状态),直到定时关,熄灭。
定时关,切断交流外设。
另外在启动了两路定时功能后,再按一下复合键S1+S2,即可手动关闭两路定时。
5.不起用普通定时:调整普通定时开时间=普通定时关时间。
不起用快捷定时:调整快捷定时开时间=快捷定时关时间。
* **** **** ***** * * * * * * ** * * * * * ** **** * * * ** * * * * * ** * * * * * * ** **** **** ****set set time manualHOUR MIN ON/OFF ON/OFF*/#include <AT89x051.H>#include <intrins.h>/* for the AT89C52 */unsigned char RunFlag,SoftCount,SPSave,ResetFlag;unsigned char sec100,sec,min,hour,flag1,temp,opto;/* above must be defined as register for tiny model */unsigned char i,digit,buffer[4],si,j,ii;int showi;unsigned char onHours,offHours;unsigned char onHour1,onMin1,offHour1,offMin1,onHour2,onMin2,offHour2,offMin2;unsigned char cputick,key,keyold,delay,count1;char convert[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void scanLED();void manualOnOff();void showOnce( );void timeToBuffer();void blink();void offmsd();void keyexe();void keydelay();void comparetime();void main(){ResetFlag = 0x68;opto = 0xff;cputick = 0;hour = 0;min = 0;sec = 0;// keyold = key = 0;RunFlag = 0;SoftCount = 0;flag1 = 0;onHour1 = 6; /* 6:30 turn lamp on */onMin1 = 30;offHour1 = 8; /* 8:30 turn off */offMin1 = 30;onHour2 = 6; /* 6:30 turn lamp on */onMin2 = 30;offHour2 = 8; /* 8:30 turn off */offMin2 = 30;onHours = 0;offHours = 2;count1 = 0;SPSave = SP;cagain:buffer[0] = ~0x40;//0x98;buffer[1] = ~0x40;//0xa1;buffer[2] = ~0x40;//0x89;buffer[3] = ~0x40;//0xc6;buffer[3] &= 0x7f;showOnce();cRESET:EA = 0;for(i = 0;i < 100;i++)for(j = 0;j < 100;j++)_nop_();convert[0] = 0xc0;convert[1] = 0xf9;convert[2] = 0xa4;convert[3] = 0xb0;convert[4] = 0x99;convert[5] = 0x92;convert[6] = 0x82;convert[7] = 0xf8;convert[8] = 0x80;convert[9] = 0x90;keyold = key = 0;ET0 = 1; // or IE |= 0x82; /* set bit EA and Timer0 enable */ TMOD |= 0x01; /* timer 0 run 16 bit counter */TR0 = 1; //or TCON |= 0x10; /* run timer 0 */// serinit(9600); /* must be invoked for tiny model */TH0 = 0xdc;EA = 1;while(1){while ( cputick < 1)scanLED();cputick = 0;/*------------- the following tasks execute every 10ms ------*/if(key){keyold = key;for(i = 0;i < 10; i++){scanLED();}if(keyold != key) key = 0;}// time();timeToBuffer();blink();offmsd();keyexe();keydelay();comparetime();RunFlag &= ~0x10;if((RunFlag & 0x0F) == 0) RunFlag &= ~0x40;/*-----------------------------------------------------------*/}}void timer0int (void) interrupt 1 using 1 {TH0 |= 0xdc; // reload timer 0 with 0DC00Hcputick++;SoftCount++;if(SoftCount == 200){SoftCount = 0;if((RunFlag & 0x10) != 0){// SP = SPSave;// goto cagain;//*#pragma asmMOV DPTR,#?main?cagainPUSH DPLPUSH DPHMOV SP,SPSaveRET#pragma endasm//*/}}{sec100++;if (sec100 >= 100) /* 100 * 10 ms = 1 s */{sec100 = 0;flag1 |= 0x05; /* set bit 0, bit 2 */temp = 50;sec++;if (sec >= 60){sec = 0;flag1 |= 0x02; /* set bit 1 */min++;if (min >= 60){min = 0;hour++;if (hour >= 24){hour = 0;}}*/}}}}/* ****************** change constant below for other X-tal ********/ void scanLED() /* scan 4-digit LED and 4-key switch*/{// unsigned char si,j,ii;ii = 1;digit = 0x08;if(key != 0){key = 0;}elsekeyold = 0;for( si = 0; si < 4; si++) /* 4-DIGIT scanning */{P3 = ~digit & opto; /* send complement[digit] */if(P3_5 == 0 && keyold == 0 && (RunFlag & 0x40) == 0) ;elseP1 = buffer[si]; /* send complement[segment] */for(j = 0; j <30;j++){;}P1 = 0xff; /* off LED */if (P3_4 == 0) /* if key pressed P3.4 became low */{key |= ii; /* save key position to key variable */}ii <<= 1;digit >>= 1; /* next digit */}if(key == 3)RunFlag |= 0x80;}void timeToBuffer(){switch(key){case 2:case 6:case 10:buffer[0] = convert[onMin1%10];buffer[1] = convert[onMin1/10];buffer[2] = convert[onHour1%10];buffer[3] = convert[onHour1/10];break;case 1:case 5:case 9:buffer[0] = convert[offMin1%10];buffer[1] = convert[offMin1/10];buffer[2] = convert[offHour1%10];buffer[3] = convert[offHour1/10];break;case 3:case 7:case 11:// offHours =buffer[0] = convert[offHours%10];buffer[1] = convert[offHours/10];buffer[2] = convert[onHours%10];buffer[3] = convert[onHours/10];break;default:buffer[0] = convert[min%10];buffer[1] = convert[min/10];buffer[2] = convert[hour%10];buffer[3] = convert[hour/10];break;}}void blink(){if((flag1 & 0x04) != 0) /* check bit 2 if set decrement temp until zero */ {temp--;if (temp != 0){buffer[1] &= 0x7f;buffer[2] &= 0x7f;if((RunFlag & 0x40) != 0) buffer[0] &= 0x7f; }else( flag1 &= ~0x04);}}void keyexe(){if (key != 0 || (RunFlag & 0x80) != 0){if ((flag1 & 0x80) == 0) /* within 0.5 sec after 1st pressthe following execution is not allowed */ {flag1 |= 0x80;delay = 30;if((RunFlag & 0x80) != 0){P3 &= 0xF0;if(P3_4 == 1) //test ,if key is free{RunFlag &= 0x7F;P3 |= 0x0F;manualOnOff(); /* service key 0 */return;}P3 |= 0x0F;}switch(key){case (3): /* key position 0 */break;case (4): /* key position 2 */min++;sec = 0;if( min == 60 )min = 0; /* service key 2 */break;case (8): /* key position 3 */hour++;if ( hour== 24)hour = 0;break;case (10): /* key position 3 */onHour1++;if(onHour1 == 24)onHour1 = 0;break;case (6): /* key position 3 */onMin1++;if(onMin1 == 60)onMin1 = 0;break;case (9): /* key position 3 */offHour1++;if(offHour1 == 24)offHour1 = 0;break;case (5): /* key position 3 */offMin1++;if(offMin1 == 60)offMin1 = 0;break;case (7): /* key position 3 */offHours++;if(offHours == 24)offHours = 0;break;case (11): /* key position 3 */onHours++;if(onHours == 24)onHours = 0;break;}}}}void manualOnOff(){//*opto= ~opto | 0x7f; // complement bit 7 which in turn activates P3.7if ((opto & 0x80) == 0 && (RunFlag & 0x20) == 0 ){/*buffer[0] = 0xff;buffer[1] = 0xff;buffer[2] = 0xc8;buffer[3] = 0xA3;*/buffer[0] = 0xff; //buffer[1] = 0xc8; //nbuffer[2] = 0xc1; //ubuffer[3] = 0x0d; //r and start beepif(offHours == 0){opto= ~opto | 0x7f;RunFlag |= 0x20;}RunFlag |= 0x40; //1 monitorRunFlag |= 0x0f;if(onHour1 == offHour1 && onMin1 == offMin1) RunFlag &= ~0x0c;if(onHours == offHours) RunFlag &= ~0x03;if(onHours == 0) RunFlag &= ~0x02;if(0 == offHours) RunFlag &= ~0x01;showOnce();offHour2 = hour + offHours;if(offHour2 > 24) offHour2 -= 24;onHour2 = hour + onHours;if(onHour2 > 24) onHour2 -= 24;}else{if ((opto & 0x80) == 0 ) opto= ~opto | 0x7f;/*buffer[0] = 0xff;buffer[1] = 0x8e;buffer[2] = 0x8e;buffer[3] = 0xA3;*/buffer[0] = ~0xF3; //Pbuffer[1] = 0xC0; //Obuffer[2] = 0x87; //Tbuffer[3] = 0x92; //S//if((RunFlag & 0x40) == 1)showOnce();RunFlag &= ~0x40; //0RunFlag &= 0xD0;}//*/}void showOnce(){// int showi;for(showi=0;showi<3000;showi++){RunFlag &= ~0x10;scanLED();}}void keydelay() //avoid{if ((flag1 & 0x80) !=0){delay--;if(delay == 0)flag1 &= ~0x80;}}void comparetime(){if((flag1 & 0x01) != 0 ){flag1 &= ~0x01;if(onHour1 == offHour1 && onMin1 == offMin1) ;else{if((RunFlag & 0x08) != 0){if(hour == onHour1 && min == onMin1){opto = 0x7f; /* clear P3.7 turning opto on */ RunFlag &= ~0x08;buffer[0] = 0xff;buffer[1] = 0xff;buffer[2] = 0xc8;buffer[3] = 0xA3;buffer[3] &= 0x7f;showOnce();showOnce();showOnce();showOnce();showOnce();}}if((RunFlag & 0x04) != 0){if(hour == offHour1 && min == offMin1){opto = 0xff; /* set bit P3.7 turning opto off */ RunFlag &= ~0x04;buffer[0] = 0xff;buffer[1] = 0x8e;buffer[2] = 0x8e;buffer[3] = 0xA3;showOnce();}}}if(onHours == offHours) ;else{if(onHours == 0);elseif((RunFlag & 0x02) != 0){if(hour == onHour2 && min == onMin2){opto = 0x7f; /* clear P3.7 turning opto on */ RunFlag &= ~0x02;buffer[0] = 0xff;buffer[1] = 0xff;buffer[2] = 0xc8;buffer[3] = 0xA3;showOnce();}}if(offHours == 0) ;elseif((RunFlag & 0x01) != 0){if(hour == offHour2 && min == offMin2){opto = 0xff; /* set bit P3.7 turning opto off */RunFlag &= ~0x01;buffer[0] = 0xff;buffer[1] = 0x8e;buffer[2] = 0x8e;buffer[3] = 0xA3;showOnce();}}}}}void offmsd(){if (buffer[3] == 0xc0) /* if msd = '0' then put blank unstead */ buffer[3] = 0xff;}。
AT89C2051主要性能参数:与MCS-51产品指令系统完全兼容1.2k字节可重擦写闪速存储器2.1000次擦写周期3.2.7—6V的工作电压范围4.全静态操作:OHz—24MHz5.两级加密程序存储器6.128x8字节内部RAM7.15个可编程I/O口线8.两个16位定时/计数器9.6个中断源10.可编程串行UART通道11.可直接驱动LED的输出端口12.内置一个模拟比较器13.低功耗空闲和掉电模式功能特性概述A T89C2051提供以下标准的功能:2k字节Flash闪速存储器,128字节内部RAM,15个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,内置一个精密比较器,片内振荡器及时钟电路。
同时,AT89C2051可降至0HZ的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但振荡器停止工作并禁止其他所有部件工作直到下一个硬件复位。
方框图引脚功能说明:Vcc:电源电压GND: 地P1口:p1口是一组8位双向I/O口,P1.2~P1.7提供内部上拉电阻,P1.0和p1.1内部无上拉电阻,主要考虑他们分别是内部精密比较器的相同输入器(AINO)和反相输入端(AINI),如果需要应在外部接上拉电阻。
P1口输入缓冲器可吸收20mA电流并可直接驱动LED当P1口引脚写入“1”时可作输入端,当引脚P1.2~P1.7用作输入并被外部拉低时,他们将因为内部的上拉电阻位输出电流(In)。
P1口还在flash闪速编程及程序校验时接收代码数据。
P3口:P3口的P3.0~P3.5、P3.7是带有内部上拉电阻的7个双向I/O口。
P3.6没有引出,它作为一个通用的I/O口淡并不可以访问,但可以作为固定输入片内比较器的输出信号,P3.口缓冲器可吸收20mA电流。
当P3口写入“1”时,他们被内部上拉电阻拉高并可作为输入端口。
作为输入端是,被外部拉低的P3口将用上拉电阻输出电流(In)。
PPU-24批量烧录器使用说明PPU-24批量烧录器是我公司为LSX051系列芯片的高速下载而自行研制的辅助工具,最多可同时编程24片相同或不同封装的LSX051;同时该版本批量烧录器自带下载源(52MCU),用户可以将待烧录.BIN文件通过串口下载到下载源,然后下载到目标芯片,使用方法如下。
1.硬件连接烧录前,芯片座正确的插入相应的插孔,在之上装好芯片。
这里有几点需要注意的:1.1 适配器入板的方向:PPU-24批量烧录器可以同时接24个适配器(芯片)进行工作。
用户可根据需要,同时烧录24个以内的芯片。
每个适配器在板上的位置都是任意的。
适配器入板之后,在主板面上都有与之相对应的指示灯,以及相应的器件标号。
正对标号,左上角为PIN1。
如下所示:图1:板面实物图正确的插入DIP和SOP适配器的图如下:图2:SOP适配器(左)、SOP适配器(右)图3:SOP适配器图4:DIP适配器1.2 适配器脚位要对准位置:适配器的插脚要对准相应的插孔。
1.3 每次换芯片之后,检查是否接触良好。
平均施力于芯片座,直到接触牢固。
2.下载PPU-24批量烧录器带有52单片机,作为一个下载源。
这个版本中用的是STC89C52,因此,须用PC的串口,并且要用相应的下载程序。
我们用的是STC-ISP下载软件。
所有芯片的SPI信号都由STC89C52的引脚提供。
下面为52单片机的下载步骤:2.1 生成符合要求的BIN文件。
本公司开发了BIN文件转换的软件,要正确的下载,必须经过这个转换。
A.打开LSX051_CODE软件,双击图表如下:B.选择目标BIN文件,点如下:目标文件就是指用户的程序所生成的BIN文件,只支持BIN文件。
如下:C.选择结果BIN文件,点如下:结果文件是由本公司提供的:选择后就得到:D.转换文件,请点如下图标:转换后的LSX051DL.BIN文件就是所需要的。
注意:转换后的LSX051DL.BIN会把原来的LSX051DL.BIN文件覆盖。
51单片机实验手册一、概述51单片机是一种经典的8位微控制器,具有广泛的应用领域。
本实验手册旨在提供详细的实验指导,帮助初学者快速入门,并为进一步的学习提供基础。
二、实验准备在进行51单片机实验之前,我们需要准备以下材料:1. 一块51单片机开发板2. USB数据线或者串口线3. 电脑及编程软件4. 面包板及对应的连接线5. 红、绿、蓝LED以及相应的电阻三、实验一:LED闪烁LED闪烁是最基础的实验之一,通过控制51单片机的I/O口状态,使LED灯交替亮灭。
1. 连接电路将51单片机的VCC引脚连接到正极,GND引脚连接到负极,将LED的长脚连接到P1.0引脚,短脚连接到GND引脚。
2. 编写程序使用C语言编写如下程序:```c#include <reg52.h>void main() {while(1) {P1 = 0x00; // P1置低电平,LED灯熄灭Delay(1000); // 延时1秒P1 = 0xFF; // P1置高电平,LED灯点亮Delay(1000); // 延时1秒}}void Delay(unsigned int t) {while (t--);}```3. 烧录程序将编写好的程序通过编程软件下载到51单片机中。
4. 运行实验将USB数据线或串口线连接到51单片机开发板和电脑,将开发板上的开关打开,观察LED灯的闪烁情况。
四、实验二:数码管显示通过控制51单片机的I/O口状态,驱动数码管显示数字。
1. 连接电路将51单片机的VCC引脚连接到正极,GND引脚连接到负极,将数码管的A、B、C、D、E、F、G引脚分别连接到P1.0、P1.1、P1.2、P1.3、P1.4、P1.5、P1.6引脚。
2. 编写程序使用C语言编写如下程序:```c#include <reg52.h>unsigned char code segment[] = { // 数码管段码表0x3F, // 数字00x06, // 数字10x5B, // 数字20x4F, // 数字30x66, // 数字40x6D, // 数字50x7D, // 数字60x07, // 数字70x7F, // 数字80x6F // 数字9};void main() {unsigned int i;while(1) {for(i = 0; i < 10; i++) {P1 = segment[i]; // 依次在数码管上显示数字0-9 Delay(1000); // 延时1秒}}}void Delay(unsigned int t) {while (t--);}```3. 烧录程序将编写好的程序通过编程软件下载到51单片机中。
AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
外形及引脚排列如图所示编辑本段主要特性:·与MCS-51 兼容·4K字节可编程闪烁存储器·寿命:1000写/擦循环·数据保留时间:10年·全静态工作:0Hz-24MHz·三级程序存储器锁定·128×8位内部RAM·32可编程I/O线·两个16位定时器/计数器·5个中断源·可编程串行通道·低功耗的闲置和掉电模式·片内振荡器和时钟电路编辑本段VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0 口作为原码输入口,当FIASH 进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
/***************************************///clock.c//单片机电子钟C语言程序XSCLK V1.0//MCU:AT89C2051 晶振频率:12MHZ//编写:舒新生日期:2007-11-23/***************************************///***************************************/#include <at89x51.h> //头文件包含#define uchar unsigned char //宏定义#define uint unsigned int#define ON 0 //定义0为打开#define OFF 1 //定义1为关闭#define LEDBus P1 //定义p1口为数码管段码口sbit MIAO =P1^2; //秒点sbit HOU_S=P3^0; //时十位位选sbit HOU_G=P3^1; //时个位位选sbit MIN_S=P3^2; //分十位位选sbit MIN_G=P3^3; //分个位位选sbit H_KEY=P3^4; //时调整键sbit M_KEY=P3^5; //分调整键bit SHAN; //闪烁标志位uchar second,minute,hour; //定义秒、分、时寄存器uchar code LEDTab[]={0x14,0xd7,0x4c, //数码管段码表0--90x45,0x87,0x25,0x24,0x57,0x04,0x05};void delay(uchar t); //延时函数void init(); //初始化函数void display(); //显示函数void min_tiao(); //分调整函数void hou_tiao(); //时调整函数/***************************************函数名:main功能:主函数说明:入口参数:无返回值:无****************************************/void main(){init(); //调用初始化函数while(1) //主程序循环{if(!H_KEY) hou_tiao(); //如果时调整键按下(为0),调用时调整函数if(!M_KEY) min_tiao(); //如果分调整键按下(为0),调用分调整函数display(); //调用显示函数}}/***************************************函数名:init功能:初始化函数说明:初始化定时器及中断入口参数:无返回值:无***************************************/void init(){TMOD=1;TH0=0X3C;TL0=0XB0; //定时器0模式1,50毫秒ET0=1;TR0=1;EA=1; //开定时器0中断、启动定时器0、开总中断}/***************************************函数名:display功能:显示函数说明:入口参数:无返回值:无***************************************/void display(){LEDBus=LEDTab[minute%10]; //分个位送数码管显示MIAO=SHAN; //秒点闪烁MIN_G=ON; //打开分个位位选delay(1); //显示1毫秒MIN_G=OFF; //关闭分个位位选LEDBus=LEDTab[minute/10]; //分十位送数码管显示MIAO=SHAN; //秒点闪烁MIN_S=ON; //打开分十位位选delay(1); //显示1毫秒MIN_S=OFF; //关闭分十位位选LEDBus=LEDTab[hour%10]; //时个位送数码管显示HOU_G=ON; //打开时个位位选delay(1); //显示1毫秒HOU_G=OFF; //关闭时个位位选if(hour/10) //如果时十位为0,不显示十位数字{LEDBus=LEDTab[hour/10]; //时十位送数码管显示HOU_S=ON; //打开时十位位选delay(1); //显示1毫秒HOU_S=OFF; //关闭时十位位选}}/***************************************函数名:min_tiao功能:分调整说明:入口参数:无返回值:无***************************************/void min_tiao(){while(!M_KEY) display(); //等待分调整键松开second=0;minute++; //秒清零、分加1if(minute==60) minute=0; //如果分等于60,分变0}/***************************************函数名:hou_tiao功能:时调整说明:入口参数:无返回值:无***************************************/void hou_tiao(){while(!H_KEY) display(); //等待时调整键松开second=0;hour++; //秒清零,时加1if(hour==24) hour=0; //如果时等于24,时变0}/***************************************函数名:delay功能:延时函数说明:入口参数:t:延时时间长短返回值:无***************************************/void delay(uchar t){uchar i; //定义变量for(;t>0;t--) //如果t大于0,t减1(外层循环)for(i=124;i>0;i--); //i等于124,如果i大于0,i减1 }/***************************************函数名:timer0功能:定时器0中断函数说明:入口参数:无返回值:无***************************************/void timer0() interrupt 1 //定时器0(中断1){uchar tim1,tim2; //定义临时变量TL0=TL0+0XB0;TH0=0X3C; //重装定时器初值tim1++; //每中断一次tim1加1 if(tim1==10) //中断10(0.5秒){SHAN=!SHAN; //闪烁标志取反tim1=0;tim2++; //tim1清零,tim2加1if(tim2==2) //到了1秒{tim2=0;second++; //tim2清零,秒加1if(second==60) //如果秒到60{second=0;minute++; //秒变0,分加1if(minute==60) //如果分到60{minute=0;hour++; /分变0,时加1if(hour==24) hour=0; //如果时到24,时变0}}}}}/***************************************program end 程序结束***************************************/原理图:。
八入八出继电器工控板带掉电存储简要说明:一、尺寸:长150mmX宽122mmX高25mm二、主要芯片:AT89S52单片机(或者STC89C52)三、工作电压:直流12伏四、单片机标准十针下载接口。
(可使用并口下载线和USB下载线下载)五、特点:1、具有电源指示。
2、八路输入光电隔离引入信号。
3、八路输出光电隔离输出控制继电器。
4、标准的11.0592M晶振。
(便于设置串口波特率)5、具有上电复位和手动复位。
6、支持AT89SXX系列单片机。
7、带有掉电存储功能,芯片24C08。
8、输入八路具有LED指示。
9、输出八路具有LED指示。
10、八路12V继电器控制,控制设备。
11、可控制交流220V/10A一下设备。
(最大控制设备2000W)12、具有串口通信功能(可以上位机控制)。
13、单片机无加密,可插拔更换,带有程序下载口,可随意更改程序。
使用说明:【输入部分标注说明】【输出部分标注说明】【主要器件标注说明】【上位机界面】(提供源代码)【测试程序】实现功能:1、实现输入对输出一对一控制,第一次按下开关,继电器吸合,再次按下继电器断开。
2、实现上位机(计算机)对继电器控制,发送不同的代码,控制对应的继电器(详细内容看程序)。
3、具有掉电存储功能,即,断电后,再恢复通电,继电器输出断电前状态。
/********************************************************************汇诚科技实现功能:此版配套测试程序使用芯片:AT89S52晶振:11.0592MHZ波特率:9600编译环境:Keil作者:zhangxinchun淘宝店:汇诚科技【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!*********************************************************************//********************************************************************单片机与PC机采用9针串口,MAX232通讯,波特率默认为9600.单片机接收PC机发送的十六进制码表如下:01、全开:PC发送0xFF;单片机返回0XFF;02、全关:PC发送0X00;单片机返回0X00;03、第一路开:PC发送0x01;单片机返回0X01;04、第二路开:PC发送0x02;单片机返回0X02;05、第三路开:PC发送0x03;单片机返回0X03;06、第四路开:PC发送0x04;单片机返回0X04;07、第五路开:PC发送0x05;单片机返回0X05;08、第六路开:PC发送0x06;单片机返回0X06;09、第七路开:PC发送0x07;单片机返回0X07;10、第八路开:PC发送0x08;单片机返回0X08;11、第一路关:PC发送0xFE;单片机返回0XFE;12、第二路关:PC发送0xFD;单片机返回0XFD;13、第三路关:PC发送0xFC;单片机返回0XFC;14、第四路关:PC发送0xFB;单片机返回0XFB;15、第五路关:PC发送0xFA;单片机返回0XFA;16、第六路关:PC发送0xF9;单片机返回0XF9;17、第七路关:PC发送0xF8;单片机返回0XF8;18、第八路关:PC发送0xF7;单片机返回0XF7;19、输入状态查询:PC发送0x55;单片机返回输出状态(返回值十六进制);20、输出状态查询:PC发送0xAA;单片机返回输出状态(返回值十六进制);21、输出取反指令:PC发送0X11;单片机返回0x11;*********************************************************************/ #include<reg52.h>#define uchar unsigned char//宏定义无符号字符型#define uint unsigned int//宏定义无符号整型/********************************************************************初始定义*********************************************************************/ uchar sj;//存储数据值bit write=0;//写24C08的标志;uchar dat=0xee;//用于存储单片机接收发送缓冲寄存器SBUF里面的内容/*定义八位出为单片机P2口*/sbit K1=P2^0;sbit K2=P2^1;sbit K3=P2^2;sbit K4=P2^3;sbit K5=P2^4;sbit K6=P2^5;sbit K7=P2^6;sbit K8=P2^7;/*定义八位入为单片机P1口*/sbit IN0=P1^0;sbit IN1=P1^1;sbit IN2=P1^2;sbit IN3=P1^3;sbit IN5=P1^5;sbit IN6=P1^6;sbit IN7=P1^7;/********************************************************************24C08读写驱动程序*********************************************************************/ sbit scl=P3^6;//24c08SCLsbit sda=P3^7;//24c08SDAvoid delay1(uchar x){uint i;for(i=0;i<x;i++);;}void flash(){;;}void x24c08_init()//24c08初始化子程序{scl=1;flash();sda=1;flash();}void start()//启动(I方C)总线{sda=1;flash();scl=1;flash();sda=0;flash();scl=0;flash();}void stop()//停止(I方C)总线{sda=0;flash();scl=1;flash();sda=1;flash();}void writex(uchar j)//写一个字节{uchar i,temp;temp=j;for(i=0;i<8;i++){temp=temp<<1;scl=0;flash();sda=CY;flash();scl=1;flash();}scl=0;flash();sda=1;flash();}uchar readx()//读一个字节{scl=0;flash();sda=1;for(i=0;i<8;i++){flash();scl=1;flash();if(sda==1)j=1;else j=0;k=(k<<1)|j;scl=0;}flash();return(k);}void clock()//(I方C)线时钟{unsigned char i=0;scl=1;flash();while((sda==1)&&(i<255))i++;scl=0;flash();}/********************************************************************从24c08的地址address中读取一个字节数据*********************************************************************/ unsigned char x24c08_read(unsigned char address){unsigned char i;start();writex(0xa0);clock();writex(address);clock();start();writex(0xa1);clock();i=readx();stop();delay1(10);return(i);}/********************************************************************向24c08的address地址中写入一字节数据*********************************************************************/ void x24c08_write(unsigned char address,unsigned char info){EA=0;start();writex(0xa0);clock();writex(address);clock();writex(info);clock();stop();EA=1;delay1(50);}/********************************************************************延时函数*********************************************************************/void delay(uchar t){uchar i,j;for(i=0;i<t;i++){for(j=13;j>0;j--);{;}}}/********************************************************************功能:串口初始化,波特率9600,方式1*********************************************************************/void Init_Com(void){TMOD=0x20;PCON=0x00;SCON=0x50;TH1=0xFd;TL1=0xFd;TR1=1;}/********************************************************************接收数据判断函数*********************************************************************/ chuankou(){switch(dat)//接收数据判断{uchar k;k=10;case0xff:P2=0X00;delay(k);SBUF=dat;dat=0xee;write=1;break;//全开case0x00:P2=0XFF;delay(k);SBUF=dat;dat=0xee;write=1;break;//全关case0x01:K1=0;delay(k);SBUF=dat;dat=0xee;write=1;break;//第一路开case0x02:K2=0;delay(k);SBUF=dat;dat=0xee;write=1;break;//第二路开case0x03:K3=0;delay(k);SBUF=dat;dat=0xee;write=1;break;//第三路开case0x04:K4=0;delay(k);SBUF=dat;dat=0xee;write=1;break;//第四路开case0x05:K5=0;delay(k);SBUF=dat;dat=0xee;write=1;break;//第五路开case0x06:K6=0;delay(k);SBUF=dat;dat=0xee;write=1;break;//第六路开case0x07:K7=0;delay(k);SBUF=dat;dat=0xee;write=1;break;//第七路开case0x08:K8=0;delay(k);SBUF=dat;dat=0xee;write=1;break;//第八路开case0xFE:K1=1;delay(k);SBUF=dat;dat=0xee;write=1;break;//第一路关case0xFD:K2=1;delay(k);SBUF=dat;dat=0xee;write=1;break;//第二路关case0xFC:K3=1;delay(k);SBUF=dat;dat=0xee;write=1;break;//第三路关case0xFB:K4=1;delay(k);SBUF=dat;dat=0xee;write=1;break;//第四路关case0xFA:K5=1;delay(k);SBUF=dat;dat=0xee;write=1;break;//第五路关case0xF9:K6=1;delay(k);SBUF=dat;dat=0xee;write=1;break;//第六路关case0xF8:K7=1;delay(k);SBUF=dat;dat=0xee;write=1;break;//第七路关case0xF7:K8=1;delay(k);SBUF=dat;dat=0xee;write=1;break;//第八路关case0x55:SBUF=P1;delay(k);dat=0xee;break;//读输入口状态case0xAA:SBUF=P2;delay(k);dat=0xee;write=1;break;//读输出口状态case0x11:P2=~P2;delay(k);SBUF=dat;dat=0xee;write=1;break;//输出口取反default:break;//跳出}}/********************************************************************按键函数*********************************************************************/KEY(){uchar k;k=100;if(IN0==0){delay(k);while(!IN0);K8=!K8;write=1;}if(IN1==0){delay(k);while(!IN1);K7=!K7;write=1;}if(IN2==0){delay(k);while(!IN2);K6=!K6;write=1;}if(IN3==0){delay(k);while(!IN3);K5=!K5;write=1;}if(IN4==0){delay(k);while(!IN4);K4=!K4;write=1;}if(IN5==0){delay(k);while(!IN5);K3=!K3;write=1;}if(IN6==0){delay(k);while(!IN6);K2=!K2;write=1;}if(IN7==0){delay(k);while(!IN7);K1=!K1;write=1;}}/********************************************************************主函数*********************************************************************/void main(){Init_Com();//串口初始化x24c08_init();//初始化24C08sj=x24c08_read(2);//读出保存的数据赋于datP2=sj;//将存储的数据赋予P2口while(1){chuankou();//接收数据判断函数if(RI)//扫描判断是否接收到数据,{dat=SBUF;//接收数据SBUF赋与datRI=0;//RI清零。