[整理]51单片机和DAC0832输出方波、矩形波和正弦波由液晶1602显示的C语言程序
【免费下载】基于51单片机和DAC0832设计多功能低频函数信号发生器

对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力根通保据过护生管高产线中工敷资艺设料高技试中术卷资,配料不置试仅技卷可术要以是求解指,决机对吊组电顶在气层进设配行备置继进不电行规保空范护载高与中带资负料荷试下卷高问总中题体资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况中卷下,安与要全过加,度强并工看且作护尽下关可都于能可管地以路缩正高小常中故工资障作料高;试中对卷资于连料继接试电管卷保口破护处坏进理范行高围整中,核资或对料者定试对值卷某,弯些审扁异核度常与固高校定中对盒资图位料纸置试,.卷保编工护写况层复进防杂行腐设自跨备动接与处地装理线置,弯高尤曲中其半资要径料避标试免高卷错等调误,试高要方中求案资技,料术编试交写5、卷底重电保。要气护管设设装线备备置敷4高、调动设中电试作技资气高,术料课中并3中试、件资且包卷管中料拒含试路调试绝线验敷试卷动槽方设技作、案技术,管以术来架及避等系免多统不项启必方动要式方高,案中为;资解对料决整试高套卷中启突语动然文过停电程机气中。课高因件中此中资,管料电壁试力薄卷高、电中接气资口设料不备试严进卷等行保问调护题试装,工置合作调理并试利且技用进术管行,线过要敷关求设运电技行力术高保。中护线资装缆料置敷试做设卷到原技准则术确:指灵在导活分。。线对对盒于于处调差,试动当过保不程护同中装电高置压中高回资中路料资交试料叉卷试时技卷,术调应问试采题技用,术金作是属为指隔调发板试电进人机行员一隔,变开需压处要器理在组;事在同前发一掌生线握内槽图部内 纸故,资障强料时电、,回设需路备要须制进同造行时厂外切家部断出电习具源题高高电中中源资资,料料线试试缆卷卷敷试切设验除完报从毕告而,与采要相用进关高行技中检术资查资料和料试检,卷测并主处且要理了保。解护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
单片机矩形波程序

产生矩形波的程序如下:ORG 1100HSTART: MOV DPTR , #7FFFH ;送DAC0832口地址LOOP: MOV A , #dataH ;送高电平数据MOVX @ DPTR , ALCALL DELAYH ;调用延时子程序MOV A , #dataL ;送低电平数据MOVX @ DPTR , ALCALL DELAYL ;调用延时子程序SJMP LOOP产生阶梯波的程序如下:START: MOV A, #00HMOV DPTR, #7FFFH ; 0832 的地址送DPTRMOV R1, #0AH ; 台阶数为10LP: MOVX @DPTR, A ; 送数据至0832ACALL DELAY ; 1 ms延时DJN2 R1, NEXT ; 不到10 台阶转移SJMP START ; 产生下一个周期NEXT: ADD A, #10 ; 台阶增幅SJMP LP ; 产生下一台阶DELAY: MOV 20H, #249 ; 1 ms延时程序AGAIN: NOPNOPDJNZ 20H, AGAIN反向锯齿波程序清单:(使用0832(1))MOV DPTR,#0DFFFHDA1:M OV R6,#80HDA2:MOV A,R6MOVX @DPTR,ADJNZ R6,DA2AJMP DA1正向锯齿波程序清单:DA1:MOV DPTR,#0DFFFHMOV R6,#80HDA2:MOV A,R6MOVX @DPTR,AINC R6CJNE R6,#0FFH,DA2AJMP DA1双向锯齿波程序清单:MOV DPTR,#0DFFFHMOV R6,#00HDA1:MOV A,R6MOVX @DPTR,AINC R6AJMP DA1⑶单路三角波电压输出。
执行下列程序,在0832(1)的双极性端输出0~+5V变化的三角波。
MOV DPTR,#0DFFFHDA1:MOV R6,#80HDA2:MOV A,R6MOVX @DPTR,AINC R6CJNE R6,#0FFH,DA2DA3:DEC R6MOV A,R6MOVX @DPTR,ACJNE R6,#80H,DA3AJMP DA1。
51单片机控制基于1602液晶显示 电子时钟【带闹铃和整点报时】

write_date(week6[num]);
delay1();
}
};
break;
}
}
void display() //显示时间子程序
{
write_week(week);
write_ymd(3,year);
write_ymd(6,months);
write_ymd(9,day);
write_sfm(0,shi);
write_sfm(3,fen);
write_sfm(6,miao);
}
void display_1() //显示闹钟子程序
{
write_week(week_1);
write_ymd(3,year1);
write_ymd(6,months1);
write_ymd(9,day1);
write_sfm(0,shi1);
write_com(0x80+add);
write_date(0x30+sh);
write_date(0x30+ge);
}
void write_week(uchar add) //周几显示
{
switch(add)
{
case 0:{
write_com(0x80+12);//设置数据起始地址
for(num=0;num<3;num++)
{
write_date(week3[num]);
delay1();
}
};
break;
case 4:{
write_com(0x80+12);//设置数据起始地址
for(num=0;num<3;num++)
#51单片机函数信号发生器

基于51单片机的函数信号发生器设计报告队员1姓名:杨颉学号: 2专业:电子信息科学与技术队员2姓名:王鼎鸿学号: 2专业:电子信息科学与技术基于51单片机的函数信号发生器摘要本系统利用单片机AT89C52采用程序设计方法产生锯齿波、三角波、正弦波、方波四种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,能产生10Hz—10kHz的波形。
通过键盘来控制四种波形的类型选择、拨码开关控制频率的变化,并通过液晶屏1602显示其各自的类型以及数值,系统大致包括信号发生部分、数/模转换部分以及液晶显示部分三部分,其中尤其对数/模转换部分和波形产生和变化部分进行详细论述。
关键词:单片机AT89S52、DAC0832、液晶1602目录1. 系统设计1.1 设计要求1.2方案设计与论证1.2方案设计与论证1.2.1 信号发生电路方案论证1.2.2 单片机的选择论证1.2.3 显示方案论证1.2.4 键盘方案论证1.3 总体系统设计1.4 硬件实现及单元电路设计1.4.1 单片机最小系统的设计1.4.2 波形产生模块设计1.4.3 显示模块的设计1.4.4 键盘模块的设计1.5 软件设计流程1.6源程序2. 输出波形的种类与频率的测试2.1 测试仪器及测试说明2.2 测试结果3、附录3.1 参考文献3.2 附图1、系统设计经过考虑,我们确定方案如下:利用AT89C52单片机采用程序设计方法产生锯齿波、三角波、正弦波、方波四种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,通过键盘来控制四种波形的类型选择、频率变化,最终输出显示其各自的类型以及数值。
1.1、设计要求1>、利用单片机采用软件设计方法产生四种波形2)、四种波形可通过键盘选择3)、波形频率可调4)、需显示波形的种类及其频率1.2方案设计与论证1.2.1 信号发生电路方案论证方案一:通过单片机控制D/A,输出四种波形。
dac0832程序

{
updown=0;
i=128; j=0;
while(1)
{
if (P1_1==1)
{
if (P1_0==0) //输出占空比为25%的方波
{
if (j<=40) i=255;//i=255时输出的电压为+5v
else if(j<=160) i=0;//i=0时输出的电压为-5v
P1.1P1.0 = 10Fra bibliotek方波P1.1P1.0 = 11时三角波
需要连接的导线:(1)译码器Y0接DAC0832的CS
(2)P3.6即XWR插孔接DAC0832的WR
(3)8芯的排线连接8排针的P0口和DAC0832的D7-D0
(4)串并转换区的+5v接DAC0832的参考电压Vref插孔*/
#include <reg51.h>
181,175,169,163,158,152,147,143,139,136,133,131,129,128,128,128,
129,130,132,135,138,142,146,151,156,162,168,174,180,186,193,199};
//正弦的数值在128-255之间,所以输出的正弦幅值在0-5v
includeabsacch是c51中绝对地址访问函数的头文件definedaportxbyte0x8000将daport定义为外部io口地址为8000h则74ls138y0有效unsignedcharbitupdown
/*0832各种波型输出演示
P1.1P1.0 = 00时正弦波
P1.1P1.0 = 01时锯齿波
bit updown; //三角波的上升/下降
51单片机函数信号发生器(可编辑修改word版)

基于51单片机的函数信号发生器设计报告队员1姓名:杨颉学号: 2专业:电子信息科学与技术队员2姓名:王鼎鸿学号: 2专业:电子信息科学与技术基于51单片机的函数信号发生器摘要本系统利用单片机AT89C52采用程序设计方法产生锯齿波、三角波、正弦波、方波四种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,能产生10Hz—10kHz的波形。
通过键盘来控制四种波形的类型选择、拨码开关控制频率的变化,并通过液晶屏1602显示其各自的类型以及数值,系统大致包括信号发生部分、数/模转换部分以及液晶显示部分三部分,其中尤其对数/模转换部分和波形产生和变化部分进行详细论述。
关键词:单片机AT89S52、DAC0832、液晶1602目录1.系统设计1.1设计要求1.2方案设计与论证1.2方案设计与论证1.2.1信号发生电路方案论证1.2.2单片机的选择论证1.2.3显示方案论证1.2.4键盘方案论证1.3总体系统设计1.4硬件实现及单元电路设计1.4.1单片机最小系统的设计1.4.2波形产生模块设计1.4.3显示模块的设计1.4.4键盘模块的设计1.5软件设计流程1.6源程序2.输出波形的种类与频率的测试2.1测试仪器及测试说明2.2测试结果3、附录3.1参考文献3.2附图1、系统设计经过考虑,我们确定方案如下:利用AT89C52单片机采用程序设计方法产生锯齿波、三角波、正弦波、方波四种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,通过键盘来控制四种波形的类型选择、频率变化,最终输出显示其各自的类型以及数值。
1.1、设计要求1>、利用单片机采用软件设计方法产生四种波形2)、四种波形可通过键盘选择3)、波形频率可调4)、需显示波形的种类及其频率1.2方案设计与论证1.2.1信号发生电路方案论证方案一:通过单片机控制D/A,输出四种波形。
单片机产生方波、锯齿波、三角波程序
单片机产生方波、锯齿波、三角波程序单片机产生方波、锯齿波、三角波程序单片机产生方波、锯齿波、三角波程序#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 code SinTab[256]={0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x 9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf ,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe 1,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,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0x ef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda ,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xb c,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0 x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x 51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0 x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x 16,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0 x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0 x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x 15,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0 x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x 4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0 x72,0x76,0x79,0x7c,0x80 };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() //锯齿波{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;{P0=i;delay(x);}for(j=0;j<100;j++) {P0=0;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(); //梯形波break; default: fangbo(); }}}。
基于51单片机的液晶LCD1602显示程序源代码(带LCD1602液晶接口电路))
液晶LCD1602显示字符和数字程序源代码/***********************液晶LCD1602测试程序源代码*************************单片机型号:STC15W4K56S4,内部晶振:22.1184M。
功能:液晶LCD1602显示功能测试。
操作说明:液晶LCD1602显示字符和倒计时。
**************************************************************************/#include "stc15.h" //包含头文件stc15.h#include <intrins.h> //包含头文件intrins.h#define Busy 0x80 //LCD忙sbit LCD_D0 = P0^0; //LCD_D0对应P0.0sbit LCD_D1 = P0^1; //LCD_D1对应P0.1sbit LCD_D2 = P0^2; //LCD_D2对应P0.2sbit LCD_D3 = P0^3; //LCD_D3对应P0.3sbit LCD_D4 = P0^4; //LCD_D4对应P0.4sbit LCD_D5 = P0^5; //LCD_D5对应P0.5sbit LCD_D6 = P0^6; //LCD_D6对应P0.6sbit LCD_D7 = P0^7; //LCD_D7对应P0.7sbit LCD_RS = P1^0; //LCD_RS对应P1.0sbit LCD_RW = P1^1; //LCD_RW对应P1.1sbit LCD_EN = P3^4; //LCD_EN对应P3.4void delay(unsigned int t); //delay延时函数void delay_us(unsigned int t); //delay_us延时函数void delay_ms(unsigned int t); //delay_ms延时函数void Delay5Ms(void); //5Ms延时函数void GPIO_1602_Configuration(void); //LCD1602液晶IO口初始化void WriteDataLCD(unsigned char WDLCD); //LCD写数据函数void WriteCommandLCD(unsigned char WCLCD,BuysC); //LCD写命令函数unsigned char ReadDataLCD(void); //LCD读数据函数unsigned char ReadStatusLCD(void); //LCD读状态函数void LCDInit(void); //LCD初始化void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);//LCD显示一个字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);//LCD显示一个字符串unsigned char code welcome[] = {"Hello My Friends"};//液晶LCD1602显示Hello My Friendsunsigned char code countdown[] = {"CountDown: S"};//液晶LCD1602显示CountDown: Svoid delay(unsigned int t) //delay延时函数{while(t--);}void delay_us(unsigned int t) //delay_us延时函数{unsigned char i;while(t--){i=3;while(i--)delay(1);}}void delay_ms(unsigned int t) //delay_ms延时函数{while(t--){delay_us(t);}}void Delay5Ms(void) //5ms延时函数{unsigned int TempCyc = 3552;while(TempCyc--);}void GPIO_1602_Configuration(void) //LCD1602液晶IO口初始化{P0M1 = P3M1&0x00;P0M0 = P3M0&0x00;P1M1 = P3M1&0xfc;P1M0 = P3M0&0xfc;P3M1 = P4M1&0xef;P3M0 = P4M0&0xef;}unsigned char ReadStatusLCD(void) //测试LCD忙碌状态{LCD_D7 = 1; //LCD的D7置1LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 1; //LCD管脚RW设置成高电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 1; //LCD管脚E设置成高电平while(LCD_D7); //检测忙信号return(Busy); //表示当前忙}void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if(BuysC) ReadStatusLCD(); //根据需要检测忙LCD_EN = 0; //LCD管脚E设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 0; //LCD管脚RW设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时P0 = WCLCD; //将数据送入P0口,即写入指令或地址_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void WriteDataLCD(unsigned char WDLCD) //LCD写数据函数{ReadStatusLCD(); //读取LCD状态LCD_EN = 0; //LCD管脚E设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 1; //LCD管脚RS设置成高电平LCD_RW = 0; //LCD管脚RW设置成低电平P0 = WDLCD;//将数据送入P0口,即将数据写入液晶模块_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void LCDInit(void) //LCD初始化{WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);WriteCommandLCD(0x08,1); //关闭显示WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); //显示光标移动设置WriteCommandLCD(0x0C,1); //显示开及光标设置}void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCD(X,0); //这里不检测忙信号,发送地址码WriteDataLCD(DData); //发送数据}void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData){unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>=0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}void main(void){GPIO_1602_Configuration(); //LCD1602液晶IO口初始化delay_ms(10); //延时LCDInit(); //LCD1602初始化delay_ms(10); //延时DisplayListChar(0,0,welcome); //LCD1602显示Hello My Friends delay_ms(10); //延时DisplayListChar(0,1,countdown); //LCD1602显示CountDown: S delay_ms(10); //延时DisplayOneChar(14,1,0x39); //LCD1602显示9delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x38); //LCD1602显示8delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x37); //LCD1602显示7delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x36); //LCD1602显示6delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x35); //LCD1602显示5delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x34); //LCD1602显示4delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x33); //LCD1602显示3delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x32); //LCD1602显示2delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x31); //LCD1602显示1delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x30); //LCD1602显示0delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时while(1){;}}程序源代码是编译通过并在电路板上测试过参考液晶LCD1602接口电路图该程序的实际运行效果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
------------- ------------- 显示频率,幅度可调,可产生四种波形,正弦波,方波,锯齿波,三角波,希望你能喜欢,给你发了一张效果图,喜欢的话别忘了采纳我的回答啊 #include #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,0x60,0x68,0x70,0x78, 0x80,0x88,0x90,0x98,0xa0,0xa8,0xb0,0xb8,0xc0,0xc8,0xd0,0xd8,0xe0,0xe8,0xf0,0xf8,0xff, 0xf8,0xf0,0xe8,0xe0,0xd8,0xd0,0xc8,0xc0,0xb8,0xb0,0xa8,0xa0,0x98,0x90,0x88,0x80, 0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x18,0x10,0x08,0x00}; ------------- ------------- uchar code sine_tab[256]={ //输出电压从0到最大值(正弦波1/4部分) 0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,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,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2, 0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80, //输出电压从0到最小值(正弦波1/4部分) 0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43, 0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16 ,0x15,0x13, 0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00, //输出电压从最小值到0(正弦波1/4部分) 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,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 P1 sbit 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;