基于AT89C51的C语言使用常识.doc_第1页
基于AT89C51的C语言使用常识.doc_第2页
基于AT89C51的C语言使用常识.doc_第3页
基于AT89C51的C语言使用常识.doc_第4页
基于AT89C51的C语言使用常识.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-编程常识+常见元件使用常识-1.AT89C51的P0口内部无上拉电阻,使用时必须接上拉电阻,但P1,P2,P3内部有上拉电阻,所以使用时不需加上拉电阻2.基于AT89C51的c语言在使用中断时仿真图中必须接上中断接口且开关电路要加驱动电路,常见开关驱动电路有三种:(1)与门(2)二极管(3)反相器(例子参见文件)附:注意设置扫键时间3.数码管在使用时,在仿真图中直接连,不用加驱动,但在protel99se原理图中必须加驱动电路4.数码管显示分为静态显示和动态显示,其中静态显示指把数码管所有口都接上AT89C51上I/O口,使用时只要把值赋给相应口就行,而动态显示是指把相同的口接在同一个口上,显示时必须使用位选信号来控制显示哪一个数码管,并通过延时程序来利用人眼的暂留效应显示所需的数字5.定时器和中断在使用时必须先初始化,即进行设置6.仿真图中线的连接可以采用不连线连接,即用相同的端口号7.C语言与中断关系:两者是通过共有的参数来联系的(c语言不能调用中断,但可以通过参数来控制中断;中断可以调用c语言子函数,也可以使用其变量)8.对于含有中断以及汇编语言的混合编程,其中中断不参与编译,汇编语言本身已是汇编语言,所以也不参与编译,所以这两个如果发生错误根本查不出来9.中断格式为void TINT() interrupt 1 using 1,其中interrupt 1为中断方式,using 1为寄存器组。AT89C51的中断方式有5种,分别为interrupt 0(外部中断0,)interrupt 1(定时器T0中断),interrupt 2(外部中断1),interrupt 3(定时器T1中断),interrupt 4(串行口中断),其中常用的是前三个,定时器中断用interrupt 0,外部中断最多用两个,即interrupt 0和interrupt 2;寄存器组有4个,分别为bank 0,bank 1,bank 2,bank 3,其中主函数默认使用bank 0,剩下的可以被其它使用,默认情况下认为不能在同一寄存器组10.AT89C51的1s延时子程序:(1)硬件方法:使用中断实现程序为:void main(void) TMOD=0x01; /16位定时模式TH0=(65536-50000) 8; TL0=(65536-50000) & 255;TR0=1; ET0=1; EA=1; while(1) ; void timer0(void) interrupt 1 using 1/T0中断TH0=0x3C;TL0=0xB0;/定时计数初值count+;/中断溢出一次count+1if(count=20)Timer-;count=0; /中断次计数,count回,倒计时时间(2) 软件方法:a.使用NOP,但只适应于短暂延时,如10us延时子程序:void Delay10us( ) _NOP_( );_NOP_( );_NOP_( );_NOP_( );_NOP_( );_NOP_( );Delay10us( )函数中共用了6个_NOP_( )语句,每个语句执行时间为1 s。主函数调用Delay10us( )时,先执行一个LCALL指令(2 s),然后执行6个_NOP_( )语句(6 s),最后执行了一个RET指令(2 s),所以执行上述函数时共需要10 s。b.使用自增自减程序为:voidrelay(uintms)uinti,j;for(i=ms;i0;i-)for(j=110;j0;j-);(3)使用汇编语言:在C51中嵌套汇编程序段实现延时 在C51中通过预处理指令#pragma asm和#pragma endasm可以嵌套汇编语言语句。用户编写的汇编语言紧跟在#pragma asm之后,在#pragma endasm之前结束。如:#pragma asm汇编语言程序段#pragma endasm具体方法参见:延时子程序算法详解11. 定时器附初值方法:a.TH0=(65536-5000)/256,TL0=(65536-5000)%256 b.TH0=(65536-50000) 8,TL0=(65536-50000) & 255(左移八位即除以28,另外28-1的结果所有8位数都为1)12. 常见显示器件:a.led灯 b.led数码管 c.lcd液晶显示器13. Led灯的几种情况:(1) 正常点亮(2) 按一下点亮,再按一下灭掉程序如下:#include #define uint unsigned int uint num,m,n; sbit key=P14; /将S1位定义为P1.4引脚 sbit LED=P10; /void delay(uint tt); void main(void) LED=1; / P2=0x00; while(1) if(!key) /消抖 num+; while(!key) / 空指令等待下次按键 if(num%2=1) /判断奇偶 LED=0; else LED=1; (3) 每1s亮一次:将1s分成两个50ms,用count控制条件:例子代码(交通灯):#define uchar unsigned char#include/*变量、控制位定义*/uchar code table10=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90;/09段选码uchar code table128=0xF7,0xFE,0xF7,0xFE,0xBF,0xFE,0xBF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFE,0xF7,0xFE,0xF7,0xFE,0xBF,0xFE,0xBF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFE,0xFE,0xFE;/*各种状态下红绿灯段选码,状态(0-3):EW绿灯,SN红灯;状态(4-7):EW黄灯亮,SN红灯;状态(8-11):EW黄灯灭,SN红灯;状态(12-15):EW红灯,SN绿灯;状态(16-19):EW红灯,SN黄灯亮;状态(20-23):EW红灯,SN黄灯灭;状态(24-27):EWSN全红灯*/uchar EW=30,SN=30,EW1=30,SN1=30;/初始化交通灯时间uchar count;/计时中断次数uchari,j;/循环控制变量/*数码管显示子程序*/void Display(uchar j)/j控制显示table中连续位的起始点char h,l;if(j11)/根据状态判定时间h=Time_EW/10;/EW通行时间十位l=Time_EW%10;/EW通行时间个位else if(j23)h=Time_SN/10;/SN通行时间十位l=Time_SN%10;/SN通行时间个位for(i=0;i3)/状态:EW绿灯,SN红灯j=0;Display(j);/调用显示函数while(Time_EW0)/状态-3:EW黄灯闪烁if(count3)/状态:EW红灯,SN绿灯j=12;Display(j);while(Time_SN0)/状态-6:SN黄灯闪烁j=16;if(count10)/状态:SN黄灯亮Display(j);else/状态:SN黄灯灭j=20;Display(j);EW=EW1;/重置EW初始时间/*主程序*/main()TMOD=0x01;/定时器工作方

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论