信号发生器程序.docx
- 文档编号:8325127
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:22
- 大小:19.50KB
信号发生器程序.docx
《信号发生器程序.docx》由会员分享,可在线阅读,更多相关《信号发生器程序.docx(22页珍藏版)》请在冰豆网上搜索。
信号发生器程序
system_inc.h
#ifndef__SYSTEM_INC_H
#define__SYSTEM_INC_H
//键值宏定义
#defineKEY_MODE0x01
#defineKEY_SETTING0x02
#defineKEY_OK0x04
#defineKEY_CANCEL0x08
#defineKEY_ADD0x10
#defineKEY_DEC0x20
#defineKEY_OUTEN0x80
//波形编号宏定义
#defineSINE_WAVE0
#defineTRIA_WAVE1
#defineRECT_WAVE2
//参数范围宏定义
#defineFREQ_MAX700
#defineFREQ_MIN2
#defineVPP_MAX35
#defineVPP_MIN1
#defineDUTYRATIO_MAX99
#defineDUTYRATIO_MIN1
//条件编译开关定义
//#define_OTHERWAVE
#ifdef_OTHERWAVE
#defineSAWT_WAVE3
#endif
//包含头文件
#include
#include"1602.h"
#include"key.h"
#include"tlc5615.h"
#include"menu.h"
#include"wave.h"
#endif
main.c--------------------------------------------------------------------------------------
#include"system_inc.h"
unsignedchardot_num;
/*****************************************************************************/
voidTIM0_Init(void)
{
TCCR0=0x01;//00000000
TCNT0=0x00;
OCR0=0x9B;
TIMSK|=(1<<1);//TIM0比较匹配中断使能
//TCCR0|=0x05;
TCCR0&=~0x07;
}
/*****************************************************************************/
voidTIM16_Init()
{
TCCR1A=0x00;//00000000
TCCR1B=0x08;//00001000
TCNT1=0x00;
//OCR1A=0x04F4;//1KHz15.8750us
TIMSK|=(1<<4);//OCIE1A中断使能
//TCCR1B|=0x01;//00000001
TCCR1B&=~0x07;
}
/*****************************************************************************/
intmain()
{
SetVpp=10;
SetFreq=100;
SetDutyRatio=50;
LCD_init();
//TIM0_Init();
TLC5615_Init();
TIM16_Init();
KEY_Init();
TIM16_WirteOCR(SetFreq,Wave_OutEn);
VppValue_Calcu(SetVpp,Sine_Code);
asm("sei");
TLC5615_WriteData(0);
Wave_SelectMenu(Wave_ID);
while
(1)
{
Wave_BuildRunning();
}
}
/*****************************************************************************/
//定时器1比较匹配中断服务程序
#pragmavector=TIMER1_COMPA_vect
__interruptvoidTimer1_Interrupt(void)
{
dot_num++;
if(dot_num>63)dot_num=0;
TLC5615_WriteData(Out_DACValue[dot_num]);
}
1602.c--------------------------------------------------------------------------------------
#include"1602.h"
#include
/*****************************************************************************/#defineBIT(x)(1<<(x))
#definenBIT(x)(0<<(x))
//数据寄存器
#defineLCD_Data_PPORTA
#defineLCD_Data_DDDRA
#defineLCD_Data_IPINA
//控制管脚
#defineRS_Bit5
#defineRW_Bit6
#defineEN_Bit7
#defineLCD_EN_PPORTC
#defineLCD_EN_DDDRC
#defineLCD_RS_PPORTC
#defineLCD_RS_DDDRC
#defineLCD_RW_PPORTC
#defineLCD_RW_DDDRC
#defineLCD_EN_Set()LCD_EN_P|=BIT(EN_Bit);
#defineLCD_EN_Reset()LCD_EN_P&=~BIT(EN_Bit);
#defineLCD_RS_Set()LCD_RS_P|=BIT(RS_Bit);
#defineLCD_RS_Reset()LCD_RS_P&=~BIT(RS_Bit);
#defineLCD_RW_Set()LCD_RW_P|=BIT(RW_Bit);
#defineLCD_RW_Reset()LCD_RW_P&=~BIT(RW_Bit);
//液晶操作指令
#definescreen_clear0x01
#definecursor_on0x0e
#definecursor_off0x0c
#definecursor_flash0x0d
#definescreen_moveL0x07
/*****************************************************************************/voiddelay_1ms(void)
{
unsignedinti;
for(i=0;i<1600;i++);
}
/*****************************************************************************/voiddelay_nms(unsignedintms)
{
unsignedinti;
for(i=0;i } /*****************************************************************************/voidLCD_busy(void) { LCD_Data_D&=~BIT(7);//D7位为输入 LCD_RS_Reset();//RS=0 LCD_RW_Set();//RW=1 LCD_EN_Set();//E=1 asm("nop"); asm("nop"); while(LCD_Data_I&0x80);//检查DB7是否为0 LCD_EN_Reset();//E=0 LCD_Data_D|=BIT(7);//D7位为输出 } /*****************************************************************************/voidLCD_write_com(unsignedcharcom,unsignedcharbusy_en) { if(busy_en)LCD_busy();//是否检查忙信号 LCD_RS_Reset();//RS=0 LCD_RW_Reset();//RW=0 //LCD_EN_Reset();//E=0 LCD_EN_Set();//E=1 LCD_Data_P=com;//写数据 asm("nop"); LCD_EN_Reset();//E=0 } /*****************************************************************************/voidLCD_write_dat(unsignedchardat) { LCD_busy();//检查忙信号 LCD_RS_Set();//RS=1 LCD_RW_Reset();//RW=0 //LCD_EN_Reset();//E=0 LCD_EN_Set();//E=1 LCD_Data_P=dat;//写数据 asm("nop"); LCD_EN_Reset();//E=0 } /*****************************************************************************/voidLCD_init(void) { //端口初始化 LCD_Data_D=0xff; LCD_EN_D|=BIT(EN_Bit); LCD_RS_D|=BIT(RS_Bit); LCD_RW_D|=BIT(RW_Bit); //液晶初始化 delay_nms(20); LCD_write_com(0x38,0); delay_nms(10); LCD_write_com(0x38,0); delay_nms(10); LCD_write_com(0x38,0); delay_nms(10); LCD_write_com(0x38,1);//显示模式设置 LCD_write_com(0x08,1);//显示关闭 LCD_write_com(0x01,1);//显示清屏 LCD_write_com(0x06,1);//显示光标移动设置 LCD_write_com(0x0c,1);//显示开及光标不显示 LCD_write_com(0x80,1);//初始化数据指针 } /*****************************************************************************/voidLCD_ctrl(unsignedcharcommod) { asm("nop"); LCD_write_com(commod,1); asm("nop"); } /*****************************************************************************/voidLCD_set_addr(unsignedchary,unsignedcharx) { if(y==1) LCD_write_com(0x80+x-1,1);//设置第一行地址指针 elseif(y==2) LCD_write_com(0x80+0x40+x-1,1);//设置第二行地址指针 } /*****************************************************************************/voidLCD_printchar(unsignedchary,unsignedcharx,unsignedcharword) { //设置显示位置 if(y==1) LCD_write_com(0x80+x-1,1); elseif(y==2) LCD_write_com(0x80+0x40+x-1,1); //打印一个字符 LCD_write_dat(word); } /*****************************************************************************/voidLCD_printstring(unsignedchary,unsignedcharx,unsignedchar*str) { //设置显示位置 LCD_set_addr(y,x); //打印数据 while(*str! ='\0') LCD_write_dat(*str++); } /*****************************************************************************/voidLCD_printvalue(unsignedchary,unsignedx,unsignedinttmp,unsignedcharlen) { unsignedinti; unsignedcharvalue[5]; //设置显示位置 if(y==1) LCD_write_com(0x80+x-1,1); elseif(y==2) LCD_write_com(0x80+0x40+x-1,1); //分离数据 value[0]=tmp/10000+0x30; value[1]=tmp%10000/1000+0x30; value[2]=tmp%1000/100+0x30; value[3]=tmp%100/10+0x30; value[4]=tmp%10+0x30; //打印数据 for(i=(5-len);i<5;i++) { LCD_write_dat(value[i]); } } /*****************************************************************************/ voidLCD_ShowData(unsignedchary,unsignedx,unsignedintdata,unsignedchar*string, unsignedcharcleanlen,unsignedcharflag) { unsignedinti; unsignedcharfiLCD_RStplace=0;//数据首位数值标志,0为0,非0? unsignedcharvalue[5]; LCD_set_addr(y,x); for(i=0;i { LCD_write_dat(0x20); } LCD_set_addr(y,x); if(data==0) { LCD_write_dat(0x30); } else { //分离数据 value[0]=data/10000+0x30; value[1]=data%10000/1000+0x30; value[2]=data%1000/100+0x30; value[3]=data%100/10+0x30; value[4]=data%10+0x30; //打印数据 if((data<10)&&(flag==1)) { LCD_write_dat(0x30); LCD_write_dat(0x2E); LCD_write_dat(value[4]); } else { for(i=0;i<5;i++) { if((value[i]==0x30)&&(fiLCD_RStplace==0))continue; LCD_write_dat(value[i]); if(flag) { if(i==3) LCD_write_dat(0x2E); } fiLCD_RStplace=1; } } } while(*string! ='\0') { LCD_write_dat(*string++); } } 1602.h-------------------------------------------------------------------------------------- #ifndef__1602_H #define__1602_H voiddelay_1ms(void); voiddelay_nms(unsignedintms); voidLCD_busy(void); voidLCD_write_com(unsignedcharcom,unsignedcharbusy_en); voidLCD_write_dat(unsignedchardat); voidLCD_init(void); voidLCD_ctrl(unsignedcharcommod); voidLCD_set_addr(unsignedchary,unsignedcharx); voidLCD_printchar(unsignedchary,unsignedcharx,unsignedcharword); voidLCD_printstring(unsignedchary,unsignedcharx,unsignedchar*str); voidLCD_printvalue(unsignedchary,unsignedx,unsignedinttmp,unsignedcharlen); voidLCD_ShowData(unsignedchary,unsignedx,unsignedintdata,unsignedchar*string,unsignedcharcleanlen,unsignedcharflag); #endif key.c---------------------------------------------------------------------------------------- #include"system_inc.h" #defineKEY_PORTPIND #defineKEY_DDRDDRD /*****************************************************************************/ externvoidKEY_Init() { KEY_DDR&=~0xBF; } /*****************************************************************************/ externunsignedcharKEY_Scan(unsignedchar*Cont) { unsignedcharTrg; unsignedcharReadData=KEY_PORT; ReadData^=0xff; Trg=ReadData&(ReadData^(*Cont)); *Cont=ReadData; return(unsignedchar)(Trg&0xBF); } key.h---------------------------------------------------------------------------------------- #ifndef__KEY_H #define__KEY_H externvoidKEY_Init(); externunsignedcharKEY_Scan(unsignedchar*Cont); #endif menu.c------------------------------------------------------------------------------------- #include"system_inc.h" unsignedcharWave_ID=0; unsignedcharWave_OutEn=0; unsignedcharSet_Addr[7]={0xC0,0xC2,0xCB,0xCC,0xCD}; unsignedcharParameter_Tmp[7]; /*****************************************************************************/ voidWave_SelectMenu(unsignedcharWave_ID) { LCD_write_com(0x01,1);//显示清屏 switch(Wave_ID) { caseSINE_WAVE: LCD_printstring(1,1,"SINE"); VppValue_Calcu(SetVpp,Sine_Code); break; caseTRIA_WAVE: LCD_printstring(1,1,"TRIA"); VppValue_Calcu(SetVpp,Tria_Code); break; caseRECT_WAVE: LCD_printstring(1,1,"RECT"); VppValue_Calcu(SetVpp,Rect_Code); break; caseSAWT_WAVE: LCD_printstring(1,1,"SAWT"); VppValue_Calcu(SetVpp,Sawt_Code); break; } //Wave_ReInit(Wave_OutEn); if(Wave_OutEn) LCD_printstring(1,6,"ENABLE"); else LCD_printstring(1,6,"DISENA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信号发生器 程序