- 1、本文档共41页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1 用AT89S51的P1口做输出口,编写程序,从P1.1引脚输出周期为500Hz的方波 3.源程序编写 编写的源程序如下: 2.分析任务 4.程序调试与电路仿真 2.分析任务 2.分析任务 程序执行后可以在示波器上显示以下波形: 任务2 简易数显频率计数器的设计 任务说明 2.分析任务 电路组成: 2.分析任务 要使8位数码管显示实现动态显示,实际上就是通过P2口输出控制信号轮流选通数码管,共阳型数码管公共端为高电平方可选通,因此要求P2口由P2.0到P2.7依次输出高电平,然后在数码管段码控制端口P0按照一定规律送出要显示的数字0~9。 2.分析任务 2.分析任务 在计数器工作方式下,加至外部引脚的待测信号发生从1到0的跳变时计数器加1。外部输入在每个机器周期被采样一次,这样检测一次从1到0的跳变至少需要2个机器周期(24个振荡周期),所以最大计数速率为时钟频率的1/24(使用12 MHz时钟时,最大计数速率为500 kHz),也就是说使用12 MHz时钟的AT89S51单片机设计的频率计数器系统,所测的信号的频率不能大于500 kHz,若大于则必须通过分频器分频才能测试,而本次任务的要求是对0~300KHz的信号进行测量,所以可以直接进行。 2.分析任务 利用AT89S51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数。设置定时器?0?工作在定时方式1,定时1S,并产生方波信号从P1.1引脚输出。设置定时器?1?工作在计数方式1,对输入脉冲进行计数,溢出产生中断。将定时器?1中断定义为优先。由于16位二进制加法计数器的最大计数值为?65535,1S之内可能会产生多次溢出,所以需要在中断处理程序里对中断次数进行计数。1S到后,将中断次数和计数器里的计数值取出进行综合数据处理,处理后的数据送显示。 2.分析任务 由于定时器T0工作在定时方式时最大的定时时间大约为65ms,若要定时1S,可以采用定时20ms,中断50次来完成1s的定时。对于定时20ms来说,用定时器方式1可实现。 机器周期为: Tp=12/晶振频率=12/12MHz=1μS 计数初值为: X=2n-TC=216-20000=45536=B1E0H 故TH0=B1H,TL0= E0H。 3. 源程序编写 //plj7-2.c #includereg51.h #include stdio.h #define uchar unsigned char uchar display_code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff}; //定义数组存放显示数据的编码 uchar display_data[8]={0,0,0,0,0,0,0,0}; //定义数组存放显示数据的各位 uchar c1,b1; sbit P1_1=P1^1; void delay(void) //延时 { uchar i; for(i=500;i0;i--); } void display() //显示程序 { uchar i,k; k=0x01; for(i=0;i8;i++) { P2=0; P0=display_code[display_data[i]]; P2=k; k=k1; 3. 源程序编写 delay(); } P2=0; } void convert() //转换程序 { uchar i,f2; long f,f1,k; f=c1*65536+TH1*256+TL1 ; f1=f-f%10; //此变量是为了让八位LED的高位为0时不显示而设置 for(i=7;i0;i--) //此循环将计数值转换为显示数组,从高位到低位依次存放在 //display_data[0]至display_data[7] {display_data[i]=f%10; f=f/10; } display_data[0]=f; k=1e7; //从这开始到本子程序结束的语句完成让八位LED的高位为0时不显示 for(i=0;i7;i++) {f2=f1/k; if(f2==0) { display_data[i]=10; k=k/10; } } } 3. 源程序编写 void timer1(void) interrupt 3 //定时器1中断服务程序 { c1++; } void timer0(void) interrupt 1 //定时器0中断服务程序 { TH0=0xb1; //装入时间常数 TL0=0xe0; P1_1=!P1_1; //P1.1
文档评论(0)