您好,欢迎来到钮旅网。
搜索
您的当前位置:首页程序

程序

来源:钮旅网
程序清单 #include #define unsigned int uint #define unsigned char uchar sbit RS=P2^0; sbit WR=P2^1; sbit LCDEN=P2^2; sbit B1=P2^3; sbit B2=P2^4; sbit CLK=P2^5; sbit TLC9CS=P2^6; sbit TLC9OUT=P2^7; sbit A1=P3^2; sbit A2=P3^3; sbit A3=P3^4; sbit WR=P2^1; sbit K1=P1^0; sbit K2=P1^1; sbit K3=P1^2; sbit K4=P1^3; sbit K5=P1^4; sbit K6=P1^5;

sbit K7=P1^6;

sbit K8=P1^7; /*************************************控制频率的串行MAX517的函数*************************************/ /* 起始条件子函数 */ void start0(void) { SDA0 = 1; SCL0 = 1;

_nop_(); SDA0 = 0; _nop_();

} /* 停止条件子函数 */ void stop0(void) { SDA0 = 0; SCL0 = 1; _nop_(); SDA0 = 1; _nop_();

}

/* 应答子函数 */ void ack0(void) { SDA0 = 0; _nop_(); SCL0 = 1; _nop_();

SCL0 = 0;} /* 发送数据子程序ch为要发送的数据 */ void sendda0(uchar ch)

{ uchar BitCounter = 8; //位数控制 uchar tmp; //中间变量控制 do { tmp = ch;

SCL0 = 0;

if ((tmp&0x80)==0x80) //如果最高位是 SDA0 = 1; else

SDA0 = 0; SCL0 = 1;

tmp = ch<<1; //左移 ch = tmp; BitCounter--; } while(BitCounter);

SCL0 = 0;

} /* 串行DA转换子函数 */

void dacout0(uchar ch)

{ start0(); // 发送启动信号 sendda0(0x58); // 发送地址字节 ack0();

sendda0(0x00); // 发送命令字节 ack0();sendda0(ch); // 发送数据字节 ack0();

stop0(); // 结束一次转换 } // 占空比调节程序

/************************************* 控制占空比的串行MAX517的函数 *************************************/ /* 起始条件子函数 */ void start1(void) {

SDA1 = 1; SCL1 = 1; _nop_(); SDA1 = 0;

_nop_(); }

/* 停止条件子函数 */ void stop1(void) {

SDA1 = 0; SCL1 = 1;

_nop_();

SDA1 = 1; _nop_();

} /* 应答子函数 */ void ack1(void) { SDA1 = 0; _nop_(); SCL1 = 1; _nop_();

SCL1 = 0;

} /* 发送数据子程序ch为要发送的数据 */ void sendda1(uchar ch)

{

uchar BitCounter = 8; //位数控制 uchar tmp; //中间变量控制 do {

tmp = ch; SCL1 = 0;

if ((tmp&0x80)==0x80) //如果最高位是 SDA1 = 1; else

SDA1 = 0; SCL1 = 1;

tmp = ch<<1; //左移 ch = tmp; BitCounter--; }

while(BitCounter); SCL1 = 0;

} /* 串行DA转换子函数 */

void dacout1(uchar ch) {

start1(); // 发送启动信号

sendda1(0x58); // 发送地址字节 ack1();

sendda1(0x00); // 发送命令字节 ack1();

sendda1(ch); // 发送数据字节 ack1();

stop1(); // 结束一次转换 } // 波形选择程序

/********************************************************************/ void boxing(uchar boxing) /*波形选择*/ { switch(boxing)

{ case 0:A0=0;A1=1;send_str(0x93 name04 6);break; //正弦波 case 1:A0=0;A1=0;send_str(0x93 name05 6);break; //方波 case 2:A0=1;A1=0;send_str(0x93 name06 6);break; //三角波 case 3:A0=1;A1=0;send_str(0x93 name07 6);break; //矩齿波 case 4:A0=0;A1=0;send_str(0x93 name08 6);break; //脉冲

default:break; } }

// 频段选择程序 /*********************************************************/ void pinduan(uchar pinduan) /*单位控制频段选择函数*/ { switch(pinduan)

{ case 0: Y2 = 0;Y1 = 0;Y0 = 0;send_num(0x85 0 1); break; /*选择100uf电容*/ case 1: Y2 = 0;Y1 = 0;Y0 = 1;send_num(0x85 1 1); break; /*选择10uf电容*/ case 2: Y2 = 0;Y1 = 1;Y0 = 0;send_num(0x85 2 1); break; /*选择1uf电容*/ case 3: Y2 = 0;Y1 = 1;Y0 = 1;send_num(0x85 3 1); break; /*选择0.1uf电容*/ case 4: Y2 = 1;Y1 = 0;Y0 = 0;send_num(0x85 4 1); break; /*选择0.01uf电容*/ case 5: Y2 = 1;Y1 = 0;Y0 = 1;send_num(0x85 5 1); break; /*选择1000pf电容*/ case 6: Y2 = 1;Y1 = 1;Y0 = 0;send_num(0x85 6 1); break; /*选择100pf电容*/ case 7: Y2 = 1;Y1 = 1;Y0 = 1;send_num(0x85 7 1); break; /*选择20pf电容*/ default:break; } } // 键盘扫描程序

/***************************************/ //键盘扫描

uchar keyscan(void) { uchar temp; P1=0xfe;

temp=P1; //读P3 temp=temp&0xf0; delay1ms(25);

if(temp!=0xf0)

{ delay1ms(100); //去抖 if(temp!=0)

{ switch(temp)

{ case 0xe0:num=table[0];flag=1;break; case 0xd0:num=table[1];flag=1;break; case 0xb0:num=table[2];flag=1;break; case 0x70:num=table[3];flag=1;break; } while(temp!=0xf0) { temp=P1;

temp=temp&0xf0; } } } P1=0xfd;

temp=P1; //读P3 temp=temp&0xf0; if(temp!=0xf0) {

delay1ms(50); //去抖 if(temp!=0)

{ switch(temp)

{ case 0xe0:num=table[4];flag=1;break; case 0xd0:num=table[5];flag=1;break; case 0xb0:num=table[6];flag=1;break; case 0x70:num=table[7];flag=1;break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } }

P1=0xfb;

temp=P1; //读P3 temp=temp&0xf0;

if(temp!=0xf0)

{ delay1ms(50); //去抖 if(temp!=0) { switch(temp)

{ case 0xe0:num=table[8];flag=1;break; case 0xd0:num=table[9];flag=1;break; case 0xb0:num=table[10];flag=1;break; case 0x70:num=table[11];flag=1;break; } while(temp!=0xf0) { temp=P1;

temp=temp&0xf0; } } } P1=0xf7;

temp=P1; //读P3 temp=temp&0xf0; if(temp!=0xf0)

{ delay1ms(50); //去抖 if(temp!=0)

{ switch(temp)

{ case 0xe0:num=table[12];break; case 0xd0:num=table[13];break; case 0xb0:num=table[14];break; case 0x70:num=table[15];break; } while(temp!=0xf0) { temp=P1;

temp=temp&0xf0; } } } return (num); }

// 频率显示部分程序

/********频率显示********************/ void display_pinlv(void) { ulong f1 f2; uint f3 f4; if(f<1000) {

f3=(uint)(f);

send_n(0x8b f3 3); wr_data('.');

f4=(uint)(f*1000); f4=f4%1000; send_n(0x8d f4 3);

send_str(0x8f pinlv0 2); }

else if(f>=1000) { f1=(ulong)f/1000; f2=(ulong)f%1000; send_n1(0x8b f1 4); send_n1(0x8d f2 3); send_str(0x8f pinlv0 2); } } void dispaly(uchar key) { switch(key)

{ case 0x01: zhankb=zhankb+1;

if(zhankb>255) zhankb=128;

dacout1(zhankb);

send_n(0x9e zhankb 3);

flag=0;

break;

case 0x02: //占空比加5

zhankb=zhankb+5;

if(zhankb>255) zhankb=128;

dacout1(zhankb);

send_n(0x9e zhankb 3);

flag=0;

break;

case 0x03: //占空比减5

zhankb=zhankb-5;

if(zhankb<0) zhankb=128;

dacout1(zhankb);

send_n(0x9e zhankb 3);

flag=0;

break;

case 0x04: //%50占空比

zhankb=128;

dacout1(zhankb); send_n(0x9e

zhankb 3);

flag=0;

break;

case 0x05: //频段选择

pinduan1++;

if(pinduan1==8) pinduan1=0;

pinduan(pinduan1);

if(pinduan1==0) cf=100.0;

else if(pinduan1==1) cf=10.0;

else if(pinduan1==2) cf=1.0;

else if(pinduan1==3) cf=0.1;

else if(pinduan1==4) cf=0.01;

else if(pinduan1==5) cf=0.001;

else if(pinduan1==6) cf=0.0001;

else if(pinduan1==7) cf=0.00002;

flag=0;

break;

case 0x06: //

频率微调

pinlv++;

if(pinlv==256) pinlv=0;

dacout0(pinlv);

flag=0;

break;

case 0x07: //频率粗调

pinlv=pinlv+10;

if(pinlv==260) pinlv=0;

dacout0(pinlv);

flag=0; www.docin.com南华大学电气工程学院毕业设计 第34页 共42页

case 0x08:

if(pinlv>=0&&pinlv<256) pinlv--; //频率微减

if(pinlv<0)pinlv=255;

break; dacout0(pinlv);

flag=0;

break;

case 0x09: //波形选择

{

boxing1++;

if(boxing1==5) boxing1=0;

if(boxing1>=0&&boxing1<=2)

{

zhankb=128;

dacout1(zhankb);

send_n(0x9e zhankb 3);

}

else if(boxing1==3) //锯齿波

{

zhankb=255;

dacout1(zhankb);

send_n(0x9e zhankb 3); }

else if(boxing1==4) //脉冲 {

zhankb=255;

dacout1(zhankb);

send_n(0x9e zhankb 3);

}

flag=0; }

break; case 0x0a:

Vb=0;

flag=0;

break; }

f=(float)((pinlv/(1382400*cf))*1000000);

if(cf==10.0) {

f=f*1.24;f=f*0.9059;f=f*0.986245; }

else if(cf==1.0) {

f=f*1.3496;f=f*0.9207;f=f*0.993563;

if((f>=20)&&(f<90))

f=f*1.04291; else

f=f*1.03728;

//频率经过多次修正 }

else if(cf==0.1) {

f=f*1.2291;f=f*0.9157;f=f*1.0046;

if((f>=50)&&(f<800))

f=f*1.00627; }

else if(cf==0.01)

{

f=f*1.0948;f=f*1.0059;f=f*1.004845;

if((f>=600)&&(f<10000))

{ f=f*0.986245;f=f*1.013944;

}

else

{

f=f*1.000117;f=f*0.991806; } }

else if(cf==0.001) {

f=f*1.1612;f=f*0.983087;f=f*0.9906;

if((f>=4000)&&(f<100000))

f=f*1.005727;

else

f=f*1.005328; }

else if(cf==0.0001) {

f=f*0.705555;f=f*1.002186;

if((f>=20000)&&(f<600000))

f=f*1.0176;

else

f=f*0.9800; }

else if(cf==0.00002) {

f=f*0.278426;f=f*0.980608; }

display_pinlv();

}

//4.7 LCD128显示程序

/*********************************************/

/*128程序*/

/*检查LCD忙状态 */

/*lcd_busy为1时忙等待。lcd-busy为0时 闲可写指令与数据。 */

/*********************************************************/

bit lcd_busy()

{

bit result;

rs = 0;

wr = 1;

lcden = 1;

delay1ms(5);

result = (bit)(P0&0x80);

lcden = 0;

return(result); }

/********************************************************/

/*写指令数据到LCD */

/*RS=LRW=LE=高脉冲D0-D7=指令码。*/

/*********************************************************/

void wr_com(uchar cmd)

{

while(lcd_busy());

rs = 0;

wr = 0;

lcden = 0;

_nop_();

_nop_();

P0 = cmd; delay1ms(5);

lcden = 1;

delay1ms(5);

lcden = 0; }

/****************************************************/

/*写显示数据到LCD */

/*RS=HRW=LE=高脉冲D0-D7=数据。*/

/*********************************************************/

void wr_data(uchar dat)

{

while(lcd_busy());

rs = 1;

wr = 0;

lcden = 0;

P0 = dat;

delay1ms(5);

lcden = 1;

delay1ms(5);

lcden = 0; }

void clear()

{

wr_com(0x01); //清屏

wr_com(0x34);

wr_com(0x30); }

/********************************************************/

/* LCD初始化设定*/

/*********************************************************/ void init() {

rd = 1; //并口方式

wr_com(0x34); //扩充指令操作

delay1ms(5);

wr_com(0x30); //基本指令操作

delay1ms(5);

wr_com(0x01); //显示开关光标

delay1ms(5);

wr_com(0x06); //

delay1ms(5);

wr_com(0x0c); //清除LCD的显示内容

delay1ms(5); clear(); }

//函数void Send_num(uint addr uint dat)

//功能写入一个数到LCD

void send_num(uint addr unsigned int dat

uchar n) {

uchar i;

bit hz;

wr_com(addr);

if(dat==0) {

for(i=n-1;i>0;i--) wr_data(0x20);

wr_data('0'); }

else {

shujuchuli(dat);

for(i=n;i>0;i--)

{

if((a[i-1]==0)&&hz) wr_data(0x20);

else {wr_data(tab[a[i-1]]);hz=0;} } } }

void send_n(uint addr unsigned int dat uchar n) {

uchar i;

wr_com(addr);

shujuchuli(dat);

for(i=n;i>0;i--)

wr_data(tab[a[i-1]]); }

void send_n1(uint addr ulong dat uchar n) {

uchar i;

wr_com(addr);

shujuchuli(dat);

for(i=n;i>0;i--)

wr_data(tab[a[i-1]]); }

//显示一串数

void send_str(uchar addr uchar code *p uchar count) {

uchar i=0;

wr_com(addr); for(i=0;iwr_data(*p++); } }

void main() {

tmp = 0;

CS = 1; // /CS置高片选无效

IOCLK = 0; // I/O CLK置低

CS = 0; // 片选有效

_nop_(); // 执行一步空指令起到延时至少1.4us的作用

for (count=0;count<8;count++)

{

IOCLK = 1; // I/O CLOCK置高

if (DATAOUT)

tmp++;

tmp = tmp<<1; // 左移一位

IOCLK = 0; // I/O CLOCK置低 }

CS = 1; // /CS置高片选无效

DataResult = tmp;

for(i=0;i<3;i++) // 适当延时超过17us

_nop_();

V=(float)(DataResult*5/256);

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- niushuan.com 版权所有 赣ICP备2024042780号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务