单片机产生可调方波(c语言)
89C51单片机设计多功能低频函数信号发生器,能产生方波、正弦波、三角波等信号波形

波形发生器是一种常用的信号源,广泛地应用于电子电路、自动控制系统和教学实验等领域。
本次课程设计使用的AT89S51 单片机构成的发生器可产生锯齿波、三角波、正弦波等多种波形,波形的周期可以用程序改变,并可根据需要选择单极性输出或双极性输出,具有线路简单、结构紧凑等优点。
在本设计的基础上,加上按钮控制和LED显示器,则可通过按钮设定所需要的波形频率,并在LED上显示频率、幅值电压,波形可用示波器显示。
二、系统设计波形发生器原理方框图如下所示。
波形的产生是通过AT89S51 执行某一波形发生程序,向D/A转换器的输入端按一定的规律发生数据,从而在D/A转换电路的输出端得到相应的电压波形。
在AT89S51的P2口接5个按扭,通过软件编程来选择各种波形、幅值电压和频率,另有3个P2口管脚接TEC6122芯片,以驱动数码管显示电压幅值和频率,每种波形对应一个按钮。
此方案的有点是电路原理比较简单,实现起来比较容易。
缺点是,采样频率由单片机内部产生故使整个系统的频率降低。
1、波形发生器技术指标1)波形:方波、正弦波、锯齿波;2)幅值电压:1V、2V、3V、4V、5V;3)频率:10HZ、20HZ、50HZ、100HZ、200HZ、500HZ、1KHZ;2、操作设计1)上电后,系统初始化,数码显示6个…-‟,等待输入设置命令。
2)按钮分别控制“幅值”、“频率”、“方波”、“正弦波”、“锯齿波”。
3)“幅值“键初始值是1V,随后再次按下依次增长1V,到达5V后在按就回到1V。
4)“频率“键初始值是10HZ,随后在按下依次为20HZ、50HZ、100HZ、200HZ、500HZ、1000HZ循环。
三、硬件设计本系统由单片机、显示接口电路,波形转换(D/A)电路和电源等四部分构成。
电路图2附在后1、单片机电路功能:形成扫描码,键值识别、键处理、参数设置;形成显示段码;产生定时中断;形成波形的数字编码,并输出到D/A接口电路和显示驱动电路。
单片机c语言程序设计---DA转换实验报告

单片机c语言程序设计---D/A转换实验报告课程名称:单片机c语言设计实验类型:设计型实验实验项目名称: D/A转换实验一、实验目的和要求1.掌握数模转换的概念2.掌握D/A转换芯片DAC0832的功能及特点,掌握与单片机的接口3.掌握D/A转换芯片DAC0832的c语言编程实例二、实验内容和原理实验1.信号发生器功能:使用DAC0832用作信号发生器,编写产生锯齿波、三角波和方波的程序。
本次项目中,DAC0832采用单缓冲单极性的线选法接线方式,其选通地址为7FFFH。
(1)硬件设计使用P1口接3个独立的按键S01、S02、S03,当按下S01时输出锯齿波,按下S02时输出三角波,当按下S03时输出方波。
电路原理图如下仿真所需元器件(2)proteus仿真通过Keil编译后,利用protues软件进行仿真。
在protues ISIS 编译环境中绘制仿真电路图,将编译好的“xxx.hex”文件加入AT89C51。
启动仿真,观察仿真结果。
三、实验要求:1.完成信号发生器实验。
具体包括绘制仿真电路图、编写c源程序、进行仿真并观察仿真结果,需要保存原理图截图,保存c源程序,总结观察的仿真结果。
完成思考题。
四、操作方法与实验步骤1.按照硬件设计在protues上按照所给硬件设计绘制电路图。
2.在keil上进行编译后生成“xxx.hex”文件。
3.编译好的“xxx.hex”文件加入AT89C51。
启动仿真,观察仿真结果。
五、实验结果与分析void main(){while(1){while( K01==0 ) //生成锯齿波{for(cDigital=0;cDigital<=250;cDigital++){TransformData(cDigital);//进行数模转换}}while( K02==0 ) //生成三角波{for(cDigital=0;cDigital<=250;cDigital++){TransformData(cDigital);//进行数模转换}for(cDigital=250;cDigital>=0;cDigital--){TransformData(cDigital);//进行数模转换}}while( K03==0 ) //生成方波{TransformData(0);//进行数模转换Delay(500);TransformData(250);//进行数模转换Delay(500);}}}六、讨论和心得。
单片机产生可调方波(c语言)

用单片机产生频率可调的方波信号。
输出方波的频率范围为1Hz-200Hz,频率误差比小于0.5%。
要求用“增加”、“减小”2个按钮改变方波给定频率,按钮每按下一次,给定频率改变的步进步长为1Hz,当按钮持续按下的时间超过2秒后,给定频率以10 次/秒的速度连续增加(减少),输出方波的频率要求在数码管上显示。
用输出方波控制一个发光二极管的显示,用示波器观察方波波形。
开机默认输出频率为5Hz。
3.5.1模块1:系统设计(1)分析任务要求,写出系统整体设计思路任务分析:方波信号的产生实质上就是在定时器溢出中断次数达到规定次数时,将输出I/O管脚的状态取反。
由于频率范围最高为200Hz,即每个周期为5ms(占空比1:1,即高电平2.5ms,低电平2.5 ms),因此,定时器可以工作在8位自动装载的工作模式。
涉及以下几个方面的问题:按键的扫描、功能键的处理、计时功能以及数码管动态扫描显示等。
问题的难点在按键连续按下超过2S的计时问题,如何实现计时功能。
系统的整体思路:主程序在初始化变量和寄存器之后,扫描按键,根据按键的情况执行相应的功能,然后在数码显示频率的值,显示完成后再回到按键扫描,如此反复执行。
中断程序负责方波的产生、按键连续按下超过2S后频率值以10Hz/s递增(递减)。
(2)选择单片机型号和所需外围器件型号,设计单片机硬件电路原理图采用MCS51系列单片机At89S51作为主控制器,外围电路器件包括数码管驱动、独立式键盘、方波脉冲输出以及发光二极管的显示等。
数码管驱动采用2个四联共阴极数码管显示,由于单片机驱动能力有限,采用74HC244作为数码管的驱动。
在74HC244的7段码输出线上串联100欧姆电阻起限流作用。
独立式按键使用上提拉电路与电源连接,在没有键按下时,输出高电平。
发光二极管串联500欧姆电阻再接到电源上,当输入为低电平时,发光二极管导通发光。
图3-14 方波信号发生器的硬件电路原理图(3)分析软件任务要求,写出程序设计思路,分配单片机内部资源,画出程序流程图软件任务要求包括按键扫描、定时器的控制、按键连续按下的判断和计时、数码管的动态显示。
通过串口控制单片机输出方波

else{
b2=0;}
}
if(b3!=1)
{
if(b2==0){
if(Temp==0x3A)
{
i2=0x00;
i1=0x00;
f2=0x00;
f1=0x00;
b1=0;
}
else {
uchar data led_lighten_bit=0 ; /*LED灯点亮标志位0-7*/
void init() /* 串口定时器外部中断初始化 */
{
TMOD = 0x21;
TH1 = 0xfd;
TL1 = 0xfd; /* 9600 */
TR1 = 1;
b1=1;
i2=i2*0x0a;
i1=Temp-0x30;
i2=i2+i1;
i3=i2;
SBUF=Temp;
}
}
else{
if(Temp==0x3A)
{ i2=0x00;
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
SCON = 0x50; /* 工作在方式1*/
EA = 1; /*开总中断*/
}
/*-----------------------------------------------
51-单片机和DAC0832输出方波、矩形波和正弦波由液晶1602显示的C语言程序

显示频率,幅度可调,可产生四种波形,正弦波,方波,锯齿波,三角波,希望你能喜欢,给你发了一张效果图,喜欢的话别忘了采纳我的回答啊#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define DAdata P0 //DA数据端口sbit DA_S1= P2^0; // 控制DAC0832的8位输入寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存sbit DA_S2= P2^1; // 控制DAC0832的8位DAC寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存sbit key= P3^2;uchar wavecount; //'抽点'计数uchar THtemp,TLtemp;//传递频率的中间变量uchar judge=1; //在方波输出函数中用于简单判别作用uchar waveform; //当其为0、1、2时,分别代表三种波uchar code freq_unit[3]={10,50,200}; //三种波的频率单位uchar idata wavefreq[3]={1,1,1}; //给每种波定义一个数组单元,用于存放单位频率的个数uchar code lcd_hang1[]={"Sine Wave " "Triangle Wave " "Square Wave " "Select Wave: " "press No.1 key! "};uchar idata lcd_hang2[16]={"f= Hz "};uchar code waveTH[]={0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xec,0xf6,0xf9,0xfb,0xfc,0xfc,0xfd,0xfd,0xfd,0xfe};uchar code waveTL[]={0x06,0x8a,0x10,0x4e,0x78,0x93,0xa8,0xb3,0xbe,0xc6, //正弦波频率调整中间值0xac,0xde,0x48,0x7a,0x99,0xaf,0xbb,0xc8,0xd0,0xde, //三角波频率调整中间值0x88,0x50,0x90,0x32,0x34,0xbe,0x4a,0xa3,0xe5,0x2c};/**************************************************************************************** *********/uchar code triangle_tab[]={ //每隔数字8,采取一次0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x 60,0x68,0x70,0x78,0x80,0x88,0x90,0x98,0xa0,0xa8,0xb0,0xb8,0xc0,0xc8,0xd0,0xd8,0x e0,0xe8,0xf0,0xf8,0xff,0xf8,0xf0,0xe8,0xe0,0xd8,0xd0,0xc8,0xc0,0xb8,0xb0,0xa8,0xa0,0x9 8,0x90,0x88,0x80,0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x 18,0x10,0x08,0x00};uchar code sine_tab[256]={//输出电压从0到最大值(正弦波1/4部分)0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa 5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd ,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd, 0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,//输出电压从最大值到0(正弦波1/4部分)0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7 ,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0x d6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9 c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,//输出电压从0到最小值(正弦波1/4部分)0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5 a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x 22,0x20,0x1e,0x1c,0x1a,0x18,0x16 ,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x 03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,//输出电压从最小值到0(正弦波1/4部分)0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x 06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15 ,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x 29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x 63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80};void delay(uchar z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void triangle_out() //三角波输出{DAdata=triangle_tab[wavecount++];if(wavecount>64) wavecount=0;DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器void sine_out() //正弦波输出{DAdata=sine_tab[wavecount++];DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器}void square_out() //方波输出{judge=~judge;if(judge==1) DAdata=0xff;else DAdata=0x00;DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器}/************1602液晶的相关函数*************/#define lcd_ports P1sbit rs=P2^2;sbit rw=P2^3;sbit lcden=P2^4;void write_com(uchar com){rs=0; //置零,表示写指令lcden=0;lcd_ports=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date){rs=1; //置1,表示写数据(在指令所指的地方写数据)lcden=0;lcd_ports=date;delay(5);lcden=1;delay(5);lcden=0;void disp_lcd(uchar addr,uchar *temp1){uchar num;write_com(addr);delay(1); //延时一会儿???for(num=0;num<16;num++){write_date(temp1[num]);//或者这样写write_date(*(temp1+num));delay(1);}}void init_lcd(){//uchar num;lcden=0; //可有可无???rw=0; //初始化一定要设置为零,表示写数据write_com(0x38); //使液晶显示点阵,为下面做准备write_com(0x0c); //初始设置write_com(0x06); //初始设置write_com(0x01); //清零write_com(0x80); //使指针指向第一行第一格disp_lcd(0x80,&lcd_hang1[3*16]); //在第一行显示disp_lcd(0xc0,&lcd_hang1[4*16]); //在第二行显示}/********************1602液晶函数声明结束*********************/ void main(){uchar i=0;DA_S2=0; //使DAC寄存器处于直通状态DAdata=0;DA_S1=1; //关闭8位输入寄存器init_lcd();waveform=0;TMOD=0x01; //设置定时器0为16位工作方式IT0=1; //设置外部中断0为下降沿触发ET0=1; //开定时器中断EX0=1;EA=1;while(1){//DAout(0xff); //可输出TTL波形//DAout(0x80);//T_temp=32;}}void timer0() interrupt 1{TH0=THtemp;TL0=TLtemp;if(waveform==0) sine_out();else if(waveform==1) triangle_out();else if(waveform==2) square_out();}void key_int0() interrupt 0{uchar keytemp;uint total_freq; //总频率EA=0; TR0=0; //关总中断与定时器delay(5); //延时够吗???if(key==0) //确实有按键按下而引发中断{keytemp=P3&0xf0; //获取P3口高四位的值switch(keytemp){case 0xe0: //选择波形waveform++;if(waveform>2) waveform=0;break;case 0xd0: //频率按规定单位依次增加wavefreq[waveform]++;if(wavefreq[waveform]>10) wavefreq[waveform]=1; // /*这边要用“>10”,因为它比“=11”可靠break;case 0xb0: //频率按规定单位依次衰减wavefreq[waveform]--;if(wavefreq[waveform]<1) wavefreq[waveform]=10; //这边要用“<1”,因为它比“=0”可靠性更高break;case 0x70: //TTL输出DA_S2=1; //使DAC寄存器关闭break;}THtemp=waveTH[waveform*10+(wavefreq[waveform]-1)]; //方括号中选取第几个数后,并把该值赋给T_tempTLtemp=waveTL[waveform*10+(wavefreq[waveform]-1)];total_freq= wavefreq[waveform] * freq_unit[waveform]; //求输出频率(个数*单位)lcd_hang2[5]=total_freq%10+0x30; //在液晶中显示个位,(0x30 在液晶显示中表示数字0)total_freq/=10; lcd_hang2[4]=total_freq%10+0x30; //在液晶中显示时十位total_freq/=10; lcd_hang2[3]=total_freq%10+0x30; //在液晶中显示时百位total_freq/=10; lcd_hang2[2]=total_freq%10+0x30; //在液晶中显示时千位disp_lcd(0x80,&lcd_hang1[waveform*16]); //在第一行显示disp_lcd(0xc0,lcd_hang2); //在第二行显示}wavecount=0; //'抽点'计数清零while(!key);EA=1; TR0=1; //开启总中断与定时器}。
用单片机产生方波、锯齿波、三角波、梯形波,频率可调

用单片机产生方波、锯齿波、三角波、梯形波,频率可调2010年06月22日星期二 09:25#include<reg51.h>#define uchar unsigned char#define uint unsigned intunsigned char x=0,m=0,y=128;sbit WR_DA=P2^1;sbit CS_DA=P2^0;//DA与单片机的接口sbit S0=P3^0; //波形选择,每次按下将产生不同的波形sbit S1=P3^1; //频率减sbit S2=P3^2; //频率加sbit S3=P3^3; //调节方波的占空比uchar codeSinTab[256]={0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa 5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe 9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0x e9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb 1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0 x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0 x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0 x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08, 0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0 x80 };void delayms(uint t){uint i;while(t--){for (i=0;i<125;i++);//对于11.0592M时钟,约延时1ms}}void delay(uint t){uint i;for (i=t;i>0;i--);}void time0_init(){TMOD|=0x01; //定时器设置16位TH0=-50000/256;TL0=-50000%256;//初始化值ET0=1;TR0=1;EA=1;}void time0_int(void) interrupt 1{TR0=0;//关闭定时器TH0=-50000/256;TL0=-50000%256;//重装初值if(S0==0){delayms(10);//按键消抖if(S0==0) m++;while(!S0);//松手检测}if(S1==0)delayms(10);if(S1==0) x=x+1; while(!S1);//松手检测}if(S2==0){delayms(10);if(S2==0) x=x-1; while(!S2);//松手检测}if(S3==0){delayms(10);if(S3==0) y=y+5; while(!S3);//松手检测}if(y>254) y=0;if(m>5) m=0;if(x>50) x=0;TR0=1;//启动定时器}void fangbo() //方波{uchar i,j;j=255-y;CS_DA=0;WR_DA=0;for(i=y;i>0;i--){P0=0;delay(x);}while(j--){P0=255;delay(x);}void juchi() //锯齿波{uchar i;CS_DA=0;WR_DA=0;for(i=255;i>0;i--){P0=i;delay(x);}}void sanjiao() //三角波{uchar i;CS_DA=0;WR_DA=0;for(i=0;i<255;i++){P0=i;delay(x);}while(i--){P0=i;delay(x);}}void tixing() //梯形波{uchar i=255,j,k;CS_DA=0;WR_DA=0;while(i--){P0=i;delay(x);}for(j=0;j<100;j++){delay(x);}for(k=0;k<255;k++) {P0=k;delay(x);}}void sin() //正弦波{uchar a;CS_DA=0;WR_DA=0;for(a=0;a<255;a++) {P0=SinTab[a]; delay(x);}}main(){time0_init();while(1){switch(m){case 0:fangbo(); //方波break;case 1:juchi(); //锯齿波break;case 2:sanjiao(); //三角波break;case 3:sin(); //正弦波break;case 4:tixing(); //梯形波default: fangbo(); }}}。
用单片机制作465kc方波发生器

用单片机AT89S52制作465KC方波发生器用单片机制作465KC中频方波发生器是一项很好的实验,也是一项有一定实用价值的小制作。
它可以研究体验AT89S52在定时器T2下的可编程时钟输出,还可充当中频信号源。
用单片机at89s52中的定时器T2输出465KC方波的线路如下图。
C1C2465KC方波由(管脚1)p.1发射。
在收音机中波段的930KC和1395KC可分别接收到它的二次、三次谐波,感知到电磁波发射的存在,这样在要求不高的情况下可代替中频信号发生器,也是at89S52定时器T2的一项功能检测和功能实现的实验。
此项实验硬件连线如上图。
其特殊的要求只是要将管脚1,即p.1端用一根长些的导线与地相连。
没有接线的管脚空置即可。
它的汇编程序如下:T2CON EQU 0C8HT2MOD EQU 0C9HRCAP2L EQU 0CAHRCAP2H EQU 0CBHTR2 BIT 0CAHORG 0000HNOPNOPSTART:ss: DJNZ R1,ss ;MOV SP,#60H ; stackCLR EA ; 关中断MOV T2CON,#00000000B ; C/T2=0 T2为内部计时MOV T2MOD,#00000010B ; T2OE=1 允许输出MOV RCAP2L,#0EFH ; FFEF=65519 fre:475kcMOV RCAP2H,#0FFHSETB TR2 ; 启动T2定时LOOP:jmp LOOPEND程序中,控制寄存器设置为:T2CON全部置:0。
其中T2CO.2=0表示定时功能,因时钟输出要求用定时功能。
T2MOD=00000010B,其中T2MOD.2=1表示允许T2输出时钟方波。
重载寄存器RCAP2L=EFH,RCAP2H=FFH。
表示十进制的65519,用于设定输出频率。
输出时钟频率计算方法如下:设:X=65519。
输出时钟频率=震荡频率/[4X(65536-X)]当选择震荡频率为:31,620,000赫兹的石英晶振时,输出时钟方波的频率为465KC。
单片机方波程序课程设计

单片机方波程序课程设计一、课程目标知识目标:1. 学生能理解单片机方波程序的基本原理,掌握方波信号的产生方法。
2. 学生能描述单片机中断系统的作用,了解其在方波程序中的应用。
3. 学生了解单片机定时器/计数器的工作原理,并掌握其配置方法。
技能目标:1. 学生能运用C语言编写简单的单片机方波程序,实现方波信号的产生。
2. 学生能通过调试程序,优化方波信号的频率和占空比。
3. 学生能运用所学知识解决实际应用问题,提高编程实践能力。
情感态度价值观目标:1. 学生培养对单片机编程的兴趣,激发学习主动性和创新精神。
2. 学生在小组合作中,培养团队协作意识和沟通能力。
3. 学生通过实际操作,体验编程带来的成就感,增强自信心。
分析课程性质、学生特点和教学要求:本课程为单片机方波程序设计,旨在让学生掌握单片机编程的基本方法,培养实际编程能力。
学生为初中生,具备一定的电子知识和编程基础,但对单片机编程尚属初学阶段。
教学要求注重实践操作,结合理论知识,引导学生动手实践,提高编程技能。
课程目标分解:1. 知识目标:通过讲解和演示,让学生了解单片机方波程序的基本原理和方法。
2. 技能目标:通过上机实践,让学生动手编写和调试方波程序,掌握编程技巧。
3. 情感态度价值观目标:通过小组合作、成果展示等环节,培养学生团队协作、沟通能力和自信心。
二、教学内容1. 单片机基本原理回顾:引导学生复习单片机的组成、工作原理,重点掌握CPU、内存、I/O口等基本部件。
2. 中断系统原理:讲解中断的概念、中断系统的组成,以方波程序设计为例,分析中断在程序中的应用。
3. 定时器/计数器:详细讲解定时器/计数器的工作原理,配置方法,以及其在方波信号产生中的应用。
4. C语言编程基础:回顾C语言基本语法,强调指针、数组、循环、分支等在单片机编程中的应用。
5. 方波程序设计:结合教材,讲解方波信号的产生原理,指导学生编写和调试方波程序。
6. 实践操作:安排上机实践,让学生动手编写、调试方波程序,并根据实际需求优化程序。
c2000出方波例程

c2000出方波例程C2000出方波例程方波是一种特殊的波形,其波形由高电平和低电平交替组成,高低电平之间的切换非常迅速。
C2000是一种微控制器,具有强大的计算和控制能力,可以用于生成方波信号。
在C2000中生成方波信号的方法有多种,下面将介绍一种常用的例程。
我们需要设置C2000的时钟和IO口。
时钟用于控制信号的频率,IO口用于输出方波信号。
在C2000中,时钟和IO口的设置通过配置寄存器来实现。
接下来,我们需要编写一段程序来生成方波信号。
首先,我们需要定义一个循环变量,用于控制方波的周期。
然后,在每个周期内,我们需要将IO口的电平设置为高电平或低电平,以实现方波的交替。
在C2000中,设置IO口电平可以通过写入特定的值到IO口寄存器来实现。
具体来说,将寄存器的某一位设置为1表示将对应IO 口的电平设置为高电平,将该位设置为0表示将对应IO口的电平设置为低电平。
在生成方波信号的过程中,我们需要不断改变IO口的电平,以实现高低电平的交替。
因此,我们需要使用一个循环来不断改变IO口的电平。
在每个周期内,我们可以通过设置一个计数器来控制方波的频率。
具体来说,我们可以设定一个计数器的初始值,并在每次循环中对计数器进行减一操作。
当计数器的值减到零时,表示一个周期结束,我们需要改变IO口的电平,并将计数器重置为初始值。
通过不断改变IO口的电平,并控制计数器的值,我们就可以在C2000上生成方波信号了。
除了生成方波信号,C2000还可以通过其他方式实现更复杂的波形生成,例如正弦波、三角波等。
不同的波形生成方法有不同的实现方式,但基本原理是相似的。
总结起来,C2000可以通过设置时钟和IO口,以及编写相应的程序,来生成方波信号。
生成方波信号的原理是通过控制IO口的电平和计数器的值,使得电平在高低之间交替变化。
通过灵活运用C2000的功能,我们可以实现各种不同频率和占空比的方波信号。
希望通过本文的介绍,读者对C2000生成方波信号的原理有所了解,并能够灵活运用C2000的功能来实现自己的应用。
单片机方波发生器实验报告

单片机方波发生器实验报告实验报告,单片机方波发生器。
实验目的:本实验旨在通过单片机实现方波发生器电路,了解方波发生器的工作原理,并掌握单片机的IO口控制。
实验器材:1. 单片机(如STC89C52)。
2. 电源。
3. 适配器。
4. 电阻、电容。
5. 示波器。
6. 连接线。
实验原理:方波发生器是一种能够产生方波信号的电路或设备。
在本实验中,我们将通过单片机的IO口控制来实现方波信号的产生。
单片机作为控制核心,通过对IO口的高低电平控制,可以实现方波信号的产生。
通过改变IO口的输出频率和占空比,可以产生不同频率和占空比的方波信号。
实验步骤:1. 连接电路,按照电路图连接单片机、电源、电阻、电容和示波器。
2. 编写程序,使用C语言或汇编语言编写单片机控制程序,配置IO口的输出模式和控制方波的频率和占空比。
3. 烧录程序,将编写好的程序通过编程器烧录到单片机中。
4. 实验验证,连接示波器,观察输出的方波信号的频率和占空比是否符合预期。
实验结果与分析:经过实验验证,我们成功实现了单片机方波发生器电路。
通过改变程序中的参数,我们可以得到不同频率和占空比的方波信号。
通过示波器观察,我们可以清晰地看到产生的方波信号波形,验证了实验的成功。
实验总结:通过本次实验,我们深入了解了方波发生器的原理和单片机的IO口控制。
掌握了单片机方波发生器的设计和实现方法,提高了我们对单片机应用的理解和实践能力。
同时,实验中也加深了我们对方波信号的理解,对信号发生器的应用有了更深入的认识。
以上就是本次单片机方波发生器实验的实验报告,希望能对你有所帮助。
基于单片机的方波发生器设计

2、方案的设计与选择
本设计用到一个AT89C52微处理器,2个按键9C52用到两个定时器,定时器0和定时器1。其
中定时器0工作在定时方式1下,决定方波频率;
定时器1工作在定时方式1下,用来设定占空比。
2、方案的设计与选择
按键1控制方波信号频率。按下按键1时,进行频率的调 节,占空比不变。1键按下时,频率增加10Hz。频率最 大值为300Hz,当频率大于最大值时,重新赋值为50Hz。
5、实验结果仿真
2) 按下按键 1 调节方波频率。方波波形频率 不断增加,而占空比依然为 50%未变。
5、实验结果仿真
3) 重新在初始状态下进行仿真。 按下按键 3 调节方波占空比, 方波波形的占空比发生变化, 而频率未变。
6
结果分析
在本次设计中, 方波信号发生器的频率和占空比都 独立可调。 输出方波信号的占空比范围为 0%— 100%,调节精度为 10%;频率范围为 50Hz— 300Hz,调节精度为 10Hz。频率和占空比之间的 调节彼此独立。 进行频率调节时, 每次可以增加 10Hz,超过 300Hz输出为 50Hz 的方波;进行占 空比调节时,每次可增加10%,超出 100%时输出 占空为 0%方波。
4、软件设计
方波发生器的软件设计包括: 主程序 延时子程序 系统初始化程序 键盘中断子程序 定时器中断子程序
4.1 主程序
主程序包括系统初始化,和一个死循环系统。当有中断请求信号
产生时,跳出循环, 执行中断程序。
void main(void)
{ inti(); //系统初始化 while(1) {} }
基于单片机方波发生器设计
定时器、计数器产生方波实验

实验三定时器计数器实验一、实验目的:1、掌握单片机定时器的工作原理,体会定时器的使用特点。
2、进一步掌握中断的技术编程方法和特点。
3、体会用定时器中断扫描键盘,以提高CPU的效率。
二、实验仪器:1、proteus软件2、keil软件三、实验内容:1、在P1.0脚上输出某周期(具体周期可以自选)的方波,方波的周期和定时器的工作方式自选,单片机的频率可以设为12MHZ或6MHZ,并根据自己选定的上述三者的值,给出初值的计算。
1)初值计算:(例如:某周期的方波需要定时器产生连续的定时信号,可选用T0方式2或T1方式,自动装入参数的8位定时方式。
单片机的主频为11.0592MHz,定时器初始值应为:256-0.25×1000×11.0592/12=26=1AH)①方波周期为1ms,晶振频率为6MH定时器初始值:机器周期=2us设装入初值为X,则:(2^16-X)*(2*10^(-6))=5*10^(-4)解得X为:X=65286,即X=0xFF06;②方波周期为200us,晶振频率为12MH定时器初始值:机器周期=1us设装入初值为X,则:(2^8-X)*(1*10^(-6))=100*10^(-6)解得X为:X=156,即X=0x9c。
2)程序:①/*****方波产生程序1:*****//***参数如下:***//*方波周期:1ms/*定时器方式:方式1/*晶振频率:6MH/*************************/ORG 0000H ;程序运行入口RESET: AJMP MAIN ;跳向主程序入口ORG 000BH ;T0中断入口AJMP IT0P ;转入T0中断处理程序ORG 0100H ;主程序入口MAIN: MOV SP,#80H ;设堆栈指针MOV TMOD,#01H ;设置T0为方式1定时ACALL PT0M0 ;调用定时器初始化程序HERE: AJMP HERE ;等待中断PT0M0: MOV TL0,#06H ;计数初值低8位MOV TH0,#0FFH ;计数初值高8位SETB ET0 ;T0中断允许SETB EA ;总中断允许SETB TR0 ;启动T0IT0P: MOV TL0,#06H ;T0中断子程序,重装初值低8位 MOV TH0,#0FFH ;重装初值高8位CPL P1.0 ;P1.0状态取反RETI ;中断返回END ;汇编终止命令②/*****方波产生程序2:*****//***参数如下:***//*方波周期:200us/*定时器方式:方式2/*晶振频率:12MH/*************************/ORG 0000H ;程序运行入口RESET: AJMP MAIN ;跳向主程序入口ORG 000BH ;T0中断入口AJMP IT0P ;转入T0中断处理程序ORG 0100H ;主程序入口MAIN: MOV SP,#80H ;设堆栈指针MOV TMOD,#02H ;设置T0为方式1定时ACALL PT0M0 ;调用定时器初始化程序HERE: AJMP HERE ;等待中断PT0M0: MOV TL0,#9CH ;计数初值低8位MOV TH0,#9CH ;计数初值高8位SETB ET0 ;T0中断允许SETB EA ;总中断允许SETB TR0 ;启动T0IT0P: MOV TL0,#9CH ;T0中断子程序,重装初值低8位 MOV TH0,#9CH ;重装初值高8位CPL P1.0 ;P1.0状态取反RETI ;中断返回END ;汇编终止命令运行程序,用示波器观察波形的脉宽和周期。
基于单片机的波形发生器(C语言)

单片机原理及接口技术课程设计报告设计题目:波形发生器学号:*********姓名:**指导教师:孙**信息与电气工程学院二零一五年六月波形发生器设计波形发生器作为一种常用的信号源,是现代测试领域内应用最为广泛的通用仪器之一。
在研制、生产、测试和维修各种电子元件、部件以及整机设备时,都学要有信号源,由它产生不同频率不同波形的电压、电流信号并加到被测器件或设备上,用其他仪器观察、测量被测仪器的输出响应,以分析确定它们的性能参数。
信号发生器是电子测量领域中最基本、应用最广泛的一类电子仪器。
它可以产生多种波形信号,如正弦波,三角波,方波等,因而广泛用于通信、雷达、导航、宇航等领域。
本系统利用单片机AT89C51采用程序设计方法产生锯齿波、正弦波、三角波三种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,通过键盘来控制三种波形的类型选择、频率变化,并通过LED显示其各自的周期。
本次关于产生不同低频信号的信号源的设计方案,不仅在理论和实践上都能满足实验的要求,而且具有很强的可行性。
该信号源的特点是:体积小、价格低廉、性能稳定、实现方便、功能齐全。
1. 设计任务结合实际情况,基于AT89C51单片机设计一个波形发生器。
该系统应满足的功能要求为:(1) 产生三种波形(三角波、锯齿波、正弦波);(2) 按键选择波形,加减键选择频率;(3) 在示波器中显示三种波形;(4) 在六位数码管上显示周期;主要硬件设备:单片机实验开发系统、AT89C51单片机、DAC数模转换芯电路、六位数码管(LED)、矩阵键盘、8155芯片、示波器。
2. 整体方案设计波形发生器系统以AT89C51单片机作为整个系统的控制核心,应用其强大的接口功能,构成整个波形发生器系统。
利用 AT89S52 单片机构造多功能信号发生器,可产生正弦波,方波,三角波,锯齿波四种波形,通过 C 语言对单片机的编程即可产生相应的波形信号,并可以通过键盘进行各种功能的转换和信号频率的控制,当输出的数字信号通过数模转换成模拟信号也就得到所需要的信号波形,通过运算放大器的放大输出波形,同时让显示器显示输出的波形信息。
应用单片机制作可调超低频方波信号源及程序设计

2006年第34期・23・NO ・34・20062002年1月1日,莆田市医疗保险信息管理系统(以下简称莆田市医保系统)正式启动运行。
目前莆田市医保系统已正常运转了三年多,得到了广大参保职工的一致好评,获得了莆田市第十届科技进步奖二等奖。
随着医疗制度改革的不断深入,建立规范的现代化医疗保险体系、提高医院的信息化建设成为当务之急。
全市各级医保定点医疗机构的信息化建设正如火如荼地进行。
医院信息管理系统(以下简称医院系统)的实施,加强了医疗质量管理,有助于实现优质服务,有利于医疗保险制度的深化改革。
如何通过接口软件,实现医保系统与医院系统安全高效的连接,是医疗保险制度改革中面临的一个重要问题。
一个安全有效的接口软件,不但方便了群众,也避免了双重投资,具有一定的社会效益和经济效益。
1莆田市医保系统简介莆田市医保系统是一套以IC卡为载体,以城域网为主干,以现代化通讯方式为网络联通手段,以客户机/服务器模式为处理模式,采用小型机、ORACLE 大型数据库的大型计算机信息管理网络系统。
该系统依靠计算机系统的强大数据处理能力,强化医疗保险管理,为全市十几万参保职工提供高效优质的服务。
客户机软件采用POWERBUILDER 编写,界面美观实用,操作方便,深得用户的好评。
整个系统采用两台美国IBM 公司RS/6000H85小型机,一台网络服务器,两台测试服务器,采用集群技术。
两台小型机共享一个磁盘阵列,采用双机热备份,保证数据安全可靠。
小型机安装AIX UNIX4.3操作系统,数据库采用ORACIE 8.0.1.5,后台脚本利用ORACLE8PL/SQL 编写。
全市的参保数据集中管理,所有的数据都是实时信息,便于对医保基金进行有效的管理,也能随时对定点医疗机构进行监督管理。
整个网络采用TCP/IP 协议作为网络互连协议。
远程网经中心路由器通过64Kbps 的DDN 专线与医院端路由器相连。
另外是利用普通电话网以拨号方式进入中心与服务器相连。
最新单片机课程设计---占空比可调的方波发生器

单片机课程设计---占空比可调的方波发生器东 北 石 油 大 学课 程 设 计2011年 7 月 22日课 程 单片机课程设计 题 目 占空比可调的方波发生器 院 系 电气信息工程学院测控系 专业班级 测控08-02 学生姓名 项鸿雁 学生学号 080601240201 指导教师 路敬祎(讲师)、段志伟(讲师)东北石油大学课程设计任务书课程单片机课程设计题目占空比可调的方波发生器专业测控技术与仪器姓名项鸿雁学号 080601240201一、任务设计一款基于AT89C51单片机的占空比可调的方波发生器,实现方波发生器占空比可调。
二、设计要求[1] 通过电位器产生电压,控制占空比可调的方波。
[2] 通过对AT89C51单片机的编程,实现占空比可调的方波发生器。
[3] 写出详细的设计报告。
[4] 给出全部电路和源程序。
三、参考资料[1] 李正发.电工电子技术基础实验[M].北京:科学出版社,2005.110-115.[2] 李群芳,张士军,黄建.单片微型计算机与接口技术(第2版)[M].北京:电子工业出版社.2005.68-76.[3] 周永金.模拟电子技术与应用[J].西安:陕西国防学院电子教研室.2005.34-56.[4] 朱志伟,刘湘云.单片机及嵌入式系统的应用[J].北京:北京航空航天大学出版社,2010.(06).[5] 张毅刚.单片机原理及应用[M].高等教育出版社.2003:160-190.完成期限 2011.7.13 至 2011.7.22指导教师路敬祎(讲师)、段志伟(讲师)专业负责人曹广华2011年 7月 13 日目录第1章绪论 (1)1.1 占空比可调的方波发生器概述 (1)1.2占空比可调的信号发生器技术状况 (1)1.2.1中断技术 (1)1.2.2 定时器技术 (1)1.3 本设计任务 (1)第2章总体方案论证与设计 02.1 方案设计与选择 02.2总体硬件组成框图 0第3章系统硬件设计 03.1 AT89C51芯片介绍 03.2 LED显示电路设计 03.3时钟电路的设计 (1)图3-3 时钟电路 (1)3.4按键接口电路 (1)3.5复位电路 (1)第4章系统的软件设计 (1)4.1主程序设计 (1)4.2定时器中断子程序 (1)图4-3定时器1中断流程图 (1)4.3按键及显示子程序设计 (1)第5章系统调试与测试结果分析 (1)5.1使用的仪器仪表 (1)5.2系统调试 (1)5.2.1软件调试 (1)5.2.2仿真调试 (1)5.3 测试结果 (1)结论 0参考文献 0附录1 程序 (1)附录2 仿真效果图 0第1章绪论信号发生器是为进行电子测量提供符合一定技术要求的电信号的设备。
基于51单片机的方波发生程序

基于51单片机的方波发生程序这是一个最简单的程序,在定时器的控制下由p1.0 脚发出500 赫兹的方波要求:6MHz 的晶振,P1.0 引脚产生500Hz 的方波代码如下:#includereg52.hsbit P1_0=P1;void int_X_T(){IE=0x82;TMOD=0x01;TH0=(65536- 500)/256;TL0=(65536-500)%256;TR0=1;?? ??}void int_x() interrupt 1{TH0=(65536-500)/256;TL0=(65536-500)??%256;P1_0=!P1_0;}voidmain()??{int_X_T();while(1);}---------------------------------------------------------------------------------------------------------------------------还有一个程序://用中断方式控制定时器方式1(16 位定时器),完成1s 的脉冲,1S 亮,1S 灭,P0 口控制LED //#includereg52.h#define uchar unsigned char#define uint unsigned intsbit d0=P0;uint num,a,b;void main(){EA=1;ET0=1;TR0=1;//或者是TCON=0X10// 定时器0 工作//TMOD=0X01;///这是设置定时器的工作方式:定时器0 的方式1//TH0=0X3C;TL0=0XB0;//给定时器放初值//PT0=1;while(1){if(num==4000){d0=!d0;num=0;}}}void timer0() interrupt 1{TH0=0X3C;TL0=0XB0;// 中断定时器方式1 定时,当定时到时,TF0 溢出标志自动清零,//同时定时器的计数器计满自动清零,如果不加,则计时时间变化num++;}tips:感谢大家的阅读,本文由我司收集整编。
51单片机数字方波发生

51单片机数字方波发生一、引言数字方波发生器是一种常用的信号源,可以产生占空比可调的方波信号。
在许多应用中,如电机控制、音频信号处理等,都需要用到数字方波发生器。
本文将介绍如何使用51单片机实现数字方波发生器。
二、硬件电路设计为了实现数字方波发生器,我们需要一个51单片机、一个比较器和两个电阻。
比较器的输入端接单片机的输出端口,输出端接电阻后接地。
比较器的参考电压可以通过另一个电阻接到单片机的另一个端口。
这样,当单片机输出高电平时,比较器输出高电平,此时方波的一个周期开始;当单片机输出低电平时,比较器输出低电平,此时方波的一个周期结束。
通过调整单片机输出高电平和低电平的时间,就可以得到占空比可调的方波信号。
三、软件设计在软件设计方面,我们需要使用单片机的定时器功能来产生可调占空比的方波信号。
具体来说,我们可以将定时器的计数器清零,然后在每个机器周期内递增计数器的值。
当计数器的值达到预设值时,将定时器的输出置高电平;当计数器的值达到另一个预设值时,将定时器的输出置低电平。
通过调整两个预设值的大小,就可以得到占空比可调的方波信号。
四、实验结果与分析我们使用一个常用的51单片机STC89C52进行了实验,得到了占空比可调的方波信号。
实验结果表明,当计数器的值达到一定大小时,定时器的输出开始出现抖动现象。
为了解决这个问题,我们可以使用软件滤波算法对定时器的输出进行滤波处理,以得到更加稳定的方波信号。
五、结论本文介绍了一种使用51单片机实现数字方波发生器的方法。
通过调整单片机输出高电平和低电平的时间以及定时器的计数器值,可以得到占空比可调的方波信号。
这种方法具有简单、可靠、成本低等优点,可以广泛应用于各种数字信号处理场合。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用单片机产生频率可调的方波信号。
输出方波的频率范围为1Hz-200Hz,频率误差比小于0.5%。
要求用“增加”、“减小”2个按钮改变方波给定频率,按钮每按下一次,给定频率改变的步进步长为1Hz,当按钮持续按下的时间超过2秒后,给定频率以10 次/秒的速度连续增加(减少),输出方波的频率要求在数码管上显示。
用输出方波控制一个发光二极管的显示,用示波器观察方波波形。
开机默认输出频率为5Hz。
3.5.1模块1:系统设计(1)分析任务要求,写出系统整体设计思路任务分析:方波信号的产生实质上就是在定时器溢出中断次数达到规定次数时,将输出I/O管脚的状态取反。
由于频率范围最高为200Hz,即每个周期为5ms(占空比1:1,即高电平2.5ms,低电平2.5 ms),因此,定时器可以工作在8位自动装载的工作模式。
涉及以下几个方面的问题:按键的扫描、功能键的处理、计时功能以及数码管动态扫描显示等。
问题的难点在按键连续按下超过2S的计时问题,如何实现计时功能。
系统的整体思路:主程序在初始化变量和寄存器之后,扫描按键,根据按键的情况执行相应的功能,然后在数码显示频率的值,显示完成后再回到按键扫描,如此反复执行。
中断程序负责方波的产生、按键连续按下超过2S后频率值以10Hz/s递增(递减)。
(2)选择单片机型号和所需外围器件型号,设计单片机硬件电路原理图采用MCS51系列单片机At89S51作为主控制器,外围电路器件包括数码管驱动、独立式键盘、方波脉冲输出以及发光二极管的显示等。
数码管驱动采用2个四联共阴极数码管显示,由于单片机驱动能力有限,采用74HC244作为数码管的驱动。
在74HC244的7段码输出线上串联100欧姆电阻起限流作用。
独立式按键使用上提拉电路与电源连接,在没有键按下时,输出高电平。
发光二极管串联500欧姆电阻再接到电源上,当输入为低电平时,发光二极管导通发光。
图3-14 方波信号发生器的硬件电路原理图(3)分析软件任务要求,写出程序设计思路,分配单片机内部资源,画出程序流程图软件任务要求包括按键扫描、定时器的控制、按键连续按下的判断和计时、数码管的动态显示。
程序设计思路:根据定时器溢出的时间,将频率值换算为定时器溢出的次数(T1_over_num)。
使用变量(T1_cnt)暂存定时器T1的溢出次数,当达到规定的次数(T1_over_num)时,将输出管脚的状态取反达到方波的产生。
主程序采用查询的方式实现按键的扫描和数码管的显示,中断服务程序实现方波的产生和连续按键的计时功能。
单片机内部资源分配:定时器T1用来实现方波的产生和连续按键的计时功能,内部变量的定义:hz_shu:设定的频率数;T1_over_num: 根据设定频率计算后的定时器溢出的次数值;T1_cnt:定时器溢出次数;sec_over_num: 计时1s的定时器溢出的次数;second:连续按键的计时;state_val:连续按下的标志0=按键已经弹起;1=按键一直按下;led_seg_code:0-9数字的数码管7段码。
主程序和中断服务程序如图3-15,3-16所示。
图3-15 主程序的流程图(4)设计系统软件调试方案、硬件调试方案及软硬件联合调试方案软件调试方案:伟福软件中,在“文件\新建文件”中,新建C语言源程序文件,编写相应的程序。
在“文件\新建项目”的菜单中,新建项目并将C语言源程序文件包括在项目文件中。
在“项目\编译”菜单中将C源文件编译,检查语法错误及逻辑错误。
在编译成功后,产生以“*.hex”和“*.bin”后缀的目标文件。
硬件调试方案:在设计平台中,将单片机的P1.0-P1.1分别与2个独立式键盘通过插线连接起来,将P3.0与脉冲输出连接起来。
在伟福中将程序文件编译成目标文件后,将下载线安装在实验平台上,运行“MCU下载程序”,选择相应的flash 数据文件,点击“编程”按钮,将程序文件下载到单片机的Flash中。
然后,上电重新启动单片机,检查所编写的程序是否达到题目的要求,是否全面完整地完成试题的内容。
3.5.2 模块2:程序设计//晶振:12M T1-计时250微秒溢出中断一次;P1.0,P1.1 为增加、减少键P3.0输出方波/*变量的定义:hz_shu: 设定的频率数T1_over_num: 根据设定频率计算后的,定时器溢的出次数值T1_cnt: 定时器计数溢出数sec_over_num: 计算1s内的计数second: 连续按键的计时state_val: 连续按下的标志0=按键已经弹起;1=按键一直按下去led_seg_code:数码管7段码*/#include "reg51.h"#include "math.h"sbit pulse_out=P3^0;//-------------------unsigned char data hz_shu,second,key_val,key_val_old;unsigned int data sec_over_num;unsigned int data T1_cnt,T1_over_num;unsigned char data state_val;char code led_seg_code[10]={0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //led_seg_code[0-9]代表0-9的7段码//------------------------void delay(unsigned int i)//延时{ while(--i);}//------------------------unsigned char scan_key(){ unsigned char i,k;i=P1;if (i==0xff){ k=255; } //无键按下else //有键按下{ delay(10); //延时去抖动if(i!=P1){k=255;}else{ switch (i){ case 0xfe: k=0; break; //case 0xfd: k=1; break;}}}return k;}//----------------void led_show(){unsigned char i;i=hz_shu%10; //显示个位P0=led_seg_code[i];P2=0xfe;delay(10);i=hz_shu%100/10; //显示十位P0=led_seg_code[i];P2=0xfd;delay(10);i=hz_shu%1000/100; //显示百位P0=led_seg_code[i];P2=0xfb;delay(10);}//--------------------------unsigned int get_T1_over_num(unsigned char p) //p为频率数{unsigned int *k,h;double f;f=(double)p; //转化为浮点数f=0.5/f; //半个周期的时间f=f/0.00025; //中断溢出数=f/0.00025;h=f; //取整//四舍五入if (modf(f,k)>=0.5){ h=h+1; }return h;}/* C51有专门的库文件MATH.H,里面有个函数它是这样定义的extern float modf(float x, float *ip);调用它之后,整数部分被放入*ip, 小数部分作为返回值。
*///------------------------------------void timer1() interrupt 3 //T1中断{ T1_cnt++;if(T1_cnt>T1_over_num) //半周期的计数到达{ T1_cnt=0;pulse_out=!pulse_out; //反复取反,产生方波}if(state_val==1)//连续按键{ if (sec_over_num<4000) //计时未到1s{ sec_over_num++; }else //计时到1s时,执行else的代码{ sec_over_num=0;if(second<2) //当超过2秒,second一直为2,直到松开按键{second++;} //连续按下键少于2秒时,second继续增1。
else //连续按下键2秒,以10次/秒的速度连续增加{ TR1=0;switch (key_val){ case 0: if(hz_shu<190){ hz_shu=hz_shu+10;} //增10Hz/秒else{ hz_shu=200; }T1_over_num=get_T1_over_num(hz_shu);break;case 1: if(hz_shu>10){ hz_shu=hz_shu-10; } //减10/秒else{ hz_shu=1;}T1_over_num=get_T1_over_num(hz_shu);break;}TR1=1;}}}}//-------------------------main(){pulse_out=0; //初始化各变量hz_shu=5;T1_cnt=0;state_val=0;second=0;sec_over_num=0;T1_over_num=get_T1_over_num(hz_shu);//初始化51的寄存器TMOD=0x20;//用T1计时8位自动装载定时模式,T0计数p3.4的脉冲数TH1=0x6; //250微秒溢出一次; 250(256-x)*12/12 -> x=6TL1=0x6; //200Hz的半周期为2.5毫秒,要溢出中断10次EA=1; //开中断ET1=1;TR1=1; //定时器T1while(1){ key_val=scan_key(); //扫描按键if (key_val!=key_val_old){ //说明有键按下或弹起key_val_old=key_val;if (key_val!=255){ //说明键按下state_val=0; //清除连续按键标志sec_over_num=0;switch (key_val){ case 0: //增1键hz_shu++;T1_over_num=get_T1_over_num(hz_shu);break;case 1: //减1键if(hz_shu>=2){hz_shu--;}else{hz_shu=1;}T1_over_num=get_T1_over_num(hz_shu);break;}}else //说明键弹起{ state_val=0; second=0;}}else //一直按下或弹起{ if (key_val!=255){ state_val=1; //连续按键}else{state_val=0;} //没有按键按下,一直处于弹起状态}led_show(); //数码管显示,动态扫描}}//----方波发生器-----------------。