·中断:AT89C52 共有6 个中断向量:两个外中断(INT0 和INT1),3 个定时器中断(定时
器0、1、2)和串行口中断。这些中断源可通过分别设置专用寄存器IE 的置位或清0 来控制每一个中断的允许或禁止。IE 也有一个总禁止位EA,它能控制所有中断的允许或禁止。注意表5 中的IE.6 为保留位,在AT89C51 中IE.5 也是保留位。程序员不应将“1”写入这些位,它们是将来AT89 系列产品作为扩展用的。定时器2 的中断是由T2CON 中的TF2 和EXF2 逻辑或产生的,当转向中断服务程序时,这些标志位不能被硬件清除,事实上,服务程序需确定是TF2 或EXF2 产生中断,而由软件清除中断标志位。定时器0 和定时器1 的标志位TF0 和TF1 在定时器溢出那个机器周期的S5P2 状态置位,而会在下一个机器周期才查询到该中断标志。然而,定时器2 的标志位TF2 在定时器溢出的那个机器周期的S2P2 状态置位,并在同一个机器周期内查询到该标志。
·时钟振荡器:AT89C52 中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1 和
XTAL2 分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器,振荡电路参见图10。外接石英晶(或陶瓷谐振器)及电容C1、C2 接在放大器的反馈回路中构成并联振荡电路。 对外接电容C1、C2 虽然没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程序及温度稳定性,如果石英晶体,我们推荐电容使用30pF±10pF,而如使用陶瓷谐振器建议选择40pF±10F。用户也可以采用外部时钟。采用外部时钟的电路,这种情况下,外部时钟脉冲接到XTAL1 端,即内部时钟发生器的输入端,XTAL2 则悬空。由于外部时钟信号是通过一个2 分频触发器后作为内部时钟信号的,所以对外部时钟信号的占空比没有特殊要求,但最小高电平持续时间和最大的低电平持续时间应符合产品技术条件的要求。
·空闲节电模式:在空闲工作模式状态, CPU 自身处于睡眠状态而所有片内的外设仍保持激活
状态,这种方式由软件产生。此时,同时将片内RAM 和所有特殊功能寄存器的内容冻结。空闲模式可由任何允许的中断请求或硬件复位终止。由硬件复位终止空闲状态只需两个机器周期有效复位信号,在此状态下,片内硬件禁止访问内部RAM,但可以访问端口引脚,当用复位终止空闲方式时,为避免可能对端口产生意外写入,激活空闲模式的那条指令后一条指令不应是一条对端口或外部存储器的写入指令。
·掉电模式:在掉电模式下,振荡器停止工作,进入掉电模式的指令是最后一条被执行的指令,
片内RAM 和特殊功能寄存器的内容在终止掉电模式前被冻结。退出掉电模式的唯一方法是硬件复位,复位后将重新定义全部特殊功能寄存器,但不改变RAM中的内容,在Vcc恢复到正常工作电平前,复位应无效,且必须保持一定时间以使振荡器重启动并稳定工作。
·Flash存储器的编程:AT89C52单片机内部有8k字节的Flash PEROM,这个Flash 存储阵列出厂时已处于擦除状态(即所有存储单元的内容均为FFH),用户随时可对其进行编程。编程接口可接收高电压(+12V)或低电压(Vcc)的允许编程信号。低电压编程模式适合于用户在线编程系统,而高电压编程模式可与通用EPROM 编程器兼容。AT89C52 单片机中,有些属于低电压编程方式,而有些则是高电压编程方式,用户可从芯片上的型号和读取芯片内的签名字节获得该信息。AT89C52 的程序存储器阵列是采用字节写入方式编程的,每次写入一个字节,要对整个芯片内的PEROM 程序存储器写入一个非空字节,必须使用片擦除的方式将整个存储器的内容清除。
·编程方法:编程前,设置好地址、数据及控制信号, AT89C52 编程方法如下:
a. 在地址线上加上要编程单元的地址信号。 b. 在数据线上加上要写入的数据字节。 c. 激活相应的控制信号。
6
d. 在高电压编程方式时,将EA/Vpp 端加上+12V 编程电压。
e. 每对Flash 存储阵列写入一个字节或每写入一个程序加密位,加上一个ALE/PRO编程
脉冲。每个字节写入周期是自身定时的,通常约为1.5ms。重复1—5 步骤,改变编程单元的地址和写入的数据,直到全部文件编程结束。
·数据查询:AT89C52 单片机用Data Palling 表示一个写周期结束为特征,在一个写周期中,
如需读取最后写入的一个字节,则读出的数据的最高位(P0.7)是原来写入字节最高位的反码。写周期完成后,所输出的数据是有效的数据,即可进入下一个字节的写周期,写周期开始后,Data Palling 可能随时有效。
·Ready/Busy:字节编程的进度可通过“RDY/BSY 输出信号监测,编程期间,ALE 变为高电平
“H”后,P3.4(RDY/BSY)端电平被拉低,表示正在编程状态(忙状态)。编程完成后,P3.4 变为高电平表示准备就绪状态。
2、LG2841结构图:
3、排阻:所谓排阻就是若干个参数完全相同的电阻,它们的一个引脚都连到一起,
作为公共引脚。其余引脚正常引出。所以如果一个排阻是由n个电阻构成的,那么它就有n+1只引脚,一般来说,最左边的那个是公共引脚。它在排阻上一般用一个色点标出来。排阻一般应用在数字电路上,比如:作为某个并行口的上拉或者下拉电阻用。使用排阻比用若干只固定电阻更方便。 排阻有a型和b型的区别。
a型排阻的引脚总是奇数的。它的左端有一个公共端(用白色的圆点表示),常见的排阻有4、7、8个电阻,所以引脚共有5或8或9个。
B型排阻的引脚总是偶数的。它没有公共端,常见的排阻有4个电阻,所以引脚共有8个。
排阻的阻值读法如下:“103”表示:10kΩ,“510”表示:51Ω。如所用的排阻是330Ω。
四、单元电路设计: 1、电源部分:
7
2、单片机部分: 3、开关控制部分:
8
五、软件方案设计:
/*程控定时开关*/
/*包含库函数 */
#include
unsigned char led[]={0,0,0,0};/*将四个LED定义成一个数组,用来显示时、分和秒 */ char code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; unsigned int counter;/* counter作为定时器中断次数的计数器*/
unsigned char n,w=0,flag=0,flag1=0,flag2=0; /*n为闪烁次数计数器,w为显示位计数器,flag为设置按键计数器,flag1和flag2均为延时消抖计数器*/ unsigned char K1_on=0,K2_on=0; 态寄存器*/
unsigned char h_data=0,m_data=0,s_data=0;/*时钟的时、分、秒计数器*/
unsigned char hdata1_on=0,mdata1_on=3, hdata2_on=0,mdata2_on=7; /*开关1和开关2的开启时间寄存器*/
unsigned char hdata1_off=0,mdata1_off=5,hdata2_off=0,mdata2_off=9;/*开关1和开关2的关断时间寄存器*/
void display(void); /*申明显示子程序*/
void delay(unsigned int j) /*定义可变延时子程序*/
{
unsigned int i; }
for(i=0;i /*K1_on和K2_on分别为开关1和开关2的开启和关断状 /*七段数码,高电平有效 ,顺序为.gfedcba*/ void load_LED(unsigned char H,unsigned char M) /*定义将实际时间代码装LED显示区的子程序,作用是将个位和十位分离开*/ { led[0]=H/10; /*led[0]装时的十位*/ led[1]=H; /*led[1]装时的个位*/ led[3]=M; /*led[3]装分的个位*/ led[2]=M/10; /*led[2]装分的十位*/ } unsigned char H1_set(unsigned char H1) { H1=(H1/10+1)*10+H1;if(H1>23){H1=H1;};return H1;} /*定义时的十位加1函数*/ unsigned char H0_set(unsigned char H0) { if(H0==3&&H0/10==2) H0=H0/10*10;else H0=H0+1+H0/10*10;return H0;} /*定义时的个位加1函数*/ unsigned char M1_set(unsigned char M1) { M1=(M1/10+1)*10+M1;if(M1>=60){M1=M1;};return M1;} /*定义分的十位加1函数*/ unsigned char M0_set(unsigned char M0) { if(M0==9) M0=M0/10*10;else M0=M0+1+M0/10*10;return M0;} /*定义分的个位加1函数*/ void display(void) /*定义显示子程序*/ { /*char code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};/*定义0~9的 9 LED显示段码数组,0x00为不显示(消隐)*/ char code tv[]={0xfe,0xfd,0xfb,0xf7}; /*定义位码数组,用于控制显示码送到哪个LED*/ unsigned char k,i; switch(flag) /*根据设置所处的模式显示时钟*/ { case 0: {load_LED(h_data, m_data);break;} /*显示时钟*/ } { if(flag) /*如果处在设置模式,则对设置位进行闪烁显示*/ { if(n>180) /*每送显示180次则进行一次闪烁*/ { i=led[k]; /*将该LED位需要显示的数存于i中*/ P0=num[10]; /*该LED位不显示(短时消隐),P2=tv[k]; /*送需要显示的LED位码*/ delay(10); /*短时消隐延时,有利于显示位的切 10 case 1: {load_LED(h_data, m_data);break;} /*显示修改时钟设置*/ case 2: {load_LED(hdata1_on, mdata1_on);break;} /*显示设置开关1开启时间设case 3: {load_LED(hdata1_off, mdata1_off);break;} /*显示设置开关1关断时间设case 4: {load_LED(hdata2_on, mdata2_on);break;} /*显示设置开关2开启时间case 5: {load_LED(hdata2_off, mdata2_off);break;} /*显示设置开关2关断时间case 6: {load_LED(hdata1_on, mdata1_on);break;} /*显示设置开关1设置好的case 7: {load_LED(hdata1_off, mdata1_off);break;} /*显示设置开关1设置好的关case 8: {load_LED(hdata2_on, mdata2_on);break;} /*显示设置开关2设置好 置*/ 置*/ 设置*/ 设置*/ 开启时间*/ 断时间*/ 的开启时间*/ case 9: {load_LED(hdata2_off, mdata2_off);break;} /*显示设置开关2设置好的关default:{P1=0xFF;load_LED(h_data, m_data);break;} /*其它情况下,显示时钟*/ n++; /*n用来对显示的次数进行计数,以便控制对需要设置的位进行闪烁*/ 断时间*/ for(k=0;k<4;k++) /*以下为控制被设置位闪烁的程序语句*/ n=0; if(k==w) /*如果送显示的位是正准备调整的位,则需要闪烁显示,以 { if(n<90) /*以下语句是将LED的七段码送P0口,前90次显 下两句是控制闪烁显示*/ 示*/ 送消隐段码*/ 换*/ 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库基于51单片机的低成本多路程控定时插座设计与制作 - 图文(2)在线全文阅读。
相关推荐: