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=LRW=LE=高脉冲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=HRW=LE=高脉冲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;i 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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务