AT89C52单片机BH1415F调频台的控制设计

控制/MCU

1878人已加入

描述

BH1415F调频台控制C程序 使用keilC51 通过调试

//使用AT89C52单片机,12MHz晶振,用共阳四位LED数码管

//P0口输出段码,P2口扫描

//#pragmaSRC(d:aa.asm)

#include“reg52.h”

#include“intrins.h”//_nop_();延时函数用

#defineDisdataP0//段码输出口

#definedisCANP2//扫描口

#definekeyioP1//键盘接口

#defineucharunsignedchar

#defineuintunsignedint

sbitDA=P3^0;//数据输出

sbitCK=P3^1;//时钟

sbitCE=P3^2;//片选

sbitDIN=P0^7;//LED小数点控制

sbitmonolamp=P3^3;//立体声指示灯

uinth;//延时参量

AT89C52单片机

//

//扫描段码表

ucharcodedis_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};

/*共阳LED段码表“0”“1”“2”“3”“4”“5”“6”“7”“8”“9”“不亮”“-”*/

ucharcodescan_con[4]={0xfe,0xfd,0xfb,0xf7};//列扫描控制字

uintdataf_data={0x00},f_data1;//频率数据,数据运算时暂存用

uchardatadisplay[4]={0x00,0x00,0x00,0x00};//显示单元数据,共4个数据

ucharbdatacondata=0x08;//1415控制字高5位,开机为立体声状态

sbitmono=condata^3;//单声道/立体声控制位

uchardataconcommand[2],keytemp;//合成后的2个控制字,键值存放

//

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

//

//

/***********11微秒延时函数**********/

//

voiddelay(uintt)

{

for(;t》0;t--);

}

//

/***********LED显示动态扫描函数**********/

scan()

{

chark;

for(k=0;k《4;k++)//四位LED扫描控制

{

Disdata=dis_7[display[k]];

if(k==1){DIN=0;}

discan=scan_con[k];delay(90);discan=0xff;

}

}

//

//

/***********频率数据转换为显示用BCD码函数**********/

turn_bcd()

{

display[3]=f_data/1000;if(display[3]==0){display[3]=10;}//最高位为0时不显示

f_data1=f_data%1000;

display[2]=f_data1/100;//求显示十位数

f_data1=f_data1%100;

display[1]=f_data1/10;//求显示个位数

display[0]=f_data1%10;//求显示小数位

}

/***********控制字合成函数**********/

command()

{

concommand[1]=f_data/256;

concommand[0]=f_data%256;

concommand[1]=concommand[1]+condata;

}

/***********写入1个字节函数**********/

write(ucharval)

{

uchari;

CE=1;

for(i=8;i》0;i--)

{

DA=val&0x01;//

_nop_();_nop_();_nop_();_nop_();

CK=1;

_nop_();_nop_();_nop_();_nop_();

CK=0;

val=val/2;

}

CE=0;

}

/***********控制字写入1415函数**********/

w_1415()

{

write(concommand[0]);

write(concommand[1]);

}

//

//*************频率涮新*****************//

fup()

{

turn_bcd();//显示BCD码转换

command();//合成控制字

w_1415();//写入1415

}

//

/***********查键函数**********/

read_key()

{

keyio=0xf0;

keytemp=(~keyio)&0xf0;

if(keytemp!=0)

{

keytemp=keyio;

keyio=0x0f;

keytemp=keytemp|keyio;

while(((~keyio)&0x0f)!=0);//

switch(keytemp)

{

case238:{f_data++;if(f_data》1099){f_data=1099;}fup();break;}//加0.1MHZ

case222:{f_data--;if(f_data《800){f_data=800;}fup();break;}//减0.1MHZ

case190:{mono=~mono;if(mono){monolamp=0;}elsemonolamp=1;fup();break;}//立体声/单声道转换

case126:{f_data=1090;fup();break;}//预置109.0MHZ

case237:{f_data=1070;fup();break;}//预置107.0MHZ

case221:{f_data=1050;fup();break;}//预置105.0MHZ

case189:{f_data=1030;fup();break;}//预置103.0MHZ

case125:{f_data=1000;fup();break;}//预置100.0MHZ

case235:{f_data=970;fup();break;}//预置97.0MHZ

case219:{f_data=950;fup();break;}//预置95.0MHZ

case187:{f_data=930;fup();break;}//预置93.0MHZ

case123:{f_data=900;fup();break;}//预置90.0MHZ

case231:{f_data=870;fup();break;}//预置87.0MHZ

case215:{f_data=850;fup();break;}//预置85.0MHZ

case183:{f_data=830;fup();break;}//预置83.0MHZ

case119:{f_data=800;fup();break;}//预置80.0MHZ

default:{break;}//

}

}

keyio=0xff;

}

//

//

//

/**************主函数****************/

main()

{

Disdata=0xff;//初始化端口

discan=0xff;

keyio=0xff;

DA=0;//bh1415禁止

CK=0;//

CE=0;//

for(h=0;h《4;h++){display[h]=8;}//开机显示“8888”

for(h=0;h《500;h++)

{scan();}//开机显示“8888”2秒

f_data=1000;//预置1000MHZ

monolamp=0;//开机立体声灯点亮

fup();//频率送入BH1415

while(1)

{

read_key();//查键按纽

scan();//显示4ms

}

}

//

//*********************结束**************************//

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分