1. 求控制ISD1820的stc89c52单片机程序
#include<reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
//******************定义端口******************//
sbitSS=P1^0;
sbitSCK=P1^1;
sbitMOSI=P1^2;
sbitMISO=P1^3;
sbitPR=P1^4;//PLAY=0;REC=1;
sbitSTOP=P1^5;
sbitAN=P1^6;
sbitLED=P1^7;
//******************定义ISD1700状态寄存器及各标志位******************//
ucharbdataSR0_L;//SR0寄存器低位、高位
ucharbdataSR0_H;
ucharbdataSR1;//SR1寄存器
ucharAPC_L=0,APC_H=0;//APC寄存器
ucharPLAYADDL=0,PLAYADDH=0;//放音指针低位、高位
ucharRECADDL=0,RECADDH=0;//录音指针低位、高位
sbitCMD_ERR=SR0_L^0;//SPI指令无效标志位
sbitFULL=SR0_L^1;//芯片存储空间满标志位
sbitPU=SR0_L^2;//上电标志位
sbitEOM=SR0_L^3;//EOM标志位
sbitINT=SR0_L^4;//操作完成标志位
sbitRDY=SR1^0;//芯片空闲标志位
sbitERASE=SR1^1;//擦除标志位
sbitPLAY=SR1^2;//放音标志位
sbitREC=SR1^3;//录音标志位
//******************定义标志位******************//
ucharbdatafang;
sbitPR_fang=fang^1;//录音、放音标志位,放音=0,录音=1
sbitErase_fang=fang^4;//擦出标志位
sbitSTOP_fang=fang^7;//停止放音标志位
//******************延时μs******************//
voiddelay(uinttime)//延时n微秒
{
while(time!=0)
{
time--;
}
}
//******************延时ms******************//
voiddelayms(uinttime)//延时n毫秒
{
for(time;time>0;time--)
{
TH0=0xfc;
TL0=0x18;
TR0=1;//计数器0启动
while(TF0!=1);//计数溢出处理
TF0=0;
TR0=0;
}
}
//******************CPU初始化******************//
voidcpu_init(void)
{
P1=0xFF;
P2=0xFF;
P3=0xFF;
TMOD=0x01;//定时器初始化,工作于方式1
EA=0;//关中断
fang=0;//标志位归0
LED=1;//关指示灯
}
//******************发送、读回数据******************//
ucharisd_senddata(uchardat)
{
uchari,BUF_ISD=dat;
SS=0;
SCK=1;
delay(4);
for(i=0;i<8;i++)
{
SCK=0;
if((BUF_ISD&0x01)==1)
{
MOSI=1;
}
else
{
MOSI=0;
}
BUF_ISD=BUF_ISD>>1;
if(MISO)
{
BUF_ISD=BUF_ISD|0x80;
}
SCK=1;
delay(6);
}
MOSI=0;
return(BUF_ISD);
}
//******************上电******************//
voidisd_pu(void)
{
isd_senddata(0x01);
isd_senddata(0x00);
SS=1;
delayms(50);
}
//******************停止当前操作******************//
voidisd_stop(void)
{
isd_senddata(0x02);
isd_senddata(0x00);
SS=1;
delayms(50);
}
//******************复位******************//
voidisd_reset(void)
{
isd_senddata(0x03);
isd_senddata(0x00);
SS=1;
}
//******************清除中断******************//
voidisd_clr_int(void)
{
isd_senddata(0x04);
isd_senddata(0x00);
SS=1;
}
//******************读状态寄存器内容******************//
voidisd_rd_status(void)
{
isd_senddata(0x05);
isd_senddata(0x00);
isd_senddata(0x00);
SS=1;
delay(2);
SR0_L=isd_senddata(0x05);
SR0_H=isd_senddata(0x00);
SR1=isd_senddata(0x00);
SS=1;
}
//******************读放音指针******************//
voidisd_rd_playptr(void)
{
isd_senddata(0x06);
isd_senddata(0x00);
isd_senddata(0x00);
isd_senddata(0x00);
SS=1;
delay(2);
SR0_L=isd_senddata(0x06);
SR0_H=isd_senddata(0x00);
PLAYADDL=isd_senddata(0x00);
PLAYADDH=isd_senddata(0x00);
SS=1;
}
//******************下电******************//
voidisd_pd(void)
{
isd_senddata(0x07);
isd_senddata(0x00);
SS=1;
delayms(50);
}
//******************读录音指针******************//
voidisd_rd_recptr(void)
{
isd_senddata(0x08);
isd_senddata(0x00);
isd_senddata(0x00);
isd_senddata(0x00);
SS=1;
delay(2);
SR0_L=isd_senddata(0x08);
SR0_H=isd_senddata(0x00);
RECADDL=isd_senddata(0x00);
RECADDH=isd_senddata(0x00);
SS=1;
}
//******************读芯片ID******************//
ucharisd_devid(uchardeviceNO)
{
isd_senddata(0x09);
isd_senddata(0x00);
isd_senddata(0x00);
SS=1;
delay(2);
isd_senddata(0x09);
isd_senddata(0x00);
deviceNO=isd_senddata(0x00);
SS=1;
return(deviceNO);
}
//******************放音******************//
voidisd_play(void)
{
isd_senddata(0x40);
isd_senddata(0x00);
SS=1;
}
//******************录音******************//
voidisd_rec(void)
{
isd_senddata(0x41);
isd_senddata(0x00);
SS=1;
}
//******************擦除******************//
voidisd_erase(void)
{
isd_senddata(0x42);
isd_senddata(0x00);
SS=1;
}
//******************全部擦出******************//
voidisd_g_erase(void)
{
isd_senddata(0x43);
isd_senddata(0x00);
SS=1;
}
//******************读APC寄存器内容******************//
voidisd_rd_apc(void)
{
isd_senddata(0x44);
isd_senddata(0x00);
isd_senddata(0x00);
isd_senddata(0x00);
SS=1;
delay(2);
SR0_L=isd_senddata(0x44);
SR0_H=isd_senddata(0x00);
APC_L=isd_senddata(0x00);
APC_H=isd_senddata(0x00);
SS=1;
}
//******************写APC寄存器******************//
voidisd_wr_apc2(ucharapcdatl,apcdath)
{
isd_senddata(0x65);
isd_senddata(apcdatl);
isd_senddata(apcdath);
SS=1;
}
//******************将APC寄存器内容写入NVCFG******************//
voidisd_wr_nvcfg(ucharapcdatl,apcdath)
{
isd_senddata(0x46);
isd_senddata(apcdatl);
isd_senddata(apcdath);
SS=1;
}
//******************将NVCFG内容写入APC******************//
voidisd_ld_nvcfg(void)
{
isd_senddata(0x47);
isd_senddata(0x00);
SS=1;
}
//******************快进******************//
voidisd_fwd(void)
{
isd_senddata(0x48);
isd_senddata(0x00);
SS=1;
}
//******************空检查******************//
voidisd_chk_mem(void)
{
isd_senddata(0x49);
isd_senddata(0x00);
SS=1;
}
//******************外部时钟的启用、关闭******************//
voidisd_extclk(void)
{
isd_senddata(0x4a);
isd_senddata(0x00);
SS=1;
}
//******************指定地址放音******************//
voidisd_set_play(ucharsaddl,saddh,eaddl,eaddh)
{
isd_senddata(0x80);
isd_senddata(0x00);
isd_senddata(saddl);
isd_senddata(saddh);
isd_senddata(eaddl);
isd_senddata(eaddh);
isd_senddata(0x00);
SS=1;
}
//******************指定地址录音******************//
voidisd_set_rec(ucharsaddl,saddh,eaddl,eaddh)
{
isd_senddata(0x81);
isd_senddata(0x00);
isd_senddata(saddl);
isd_senddata(saddh);
isd_senddata(eaddl);
isd_senddata(eaddh);
isd_senddata(0x00);
SS=1;
}
//******************指定地址擦除******************//
voidisd_set_erase(ucharsaddl,saddh,eaddl,eaddh)
{
isd_senddata(0x82);
isd_senddata(0x00);
isd_senddata(saddl);
isd_senddata(saddh);
isd_senddata(eaddl);
isd_senddata(eaddh);
isd_senddata(0x00);
SS=1;
}
//******************芯片系统初始化******************//
voidisd_init(void)
{
uchari=2;
SS=1;
SCK=1;
MOSI=0;
do
{
isd_pu();
isd_rd_status();
}while(CMD_ERR||(!PU));
isd_wr_apc2(0x40,0x04);
do
{
isd_rd_status();
}while(RDY==0);
do
{
LED=0;
delayms(300);
LED=1;
delayms(300);
i--;
}while(i>0);
}
//******************isd1700的相关操作******************//
voidisdwork(void)
{
uchari;
switch(fang)
{
case0x00:
{
do
{
isd_rd_status();
}while(RDY==0);
delayms(10);
isd_play();
delayms(2);
LED=0;
do
{
isd_rd_status();
if(STOP==0)
{
delayms(10);
if(STOP==0)
{
LED=1;
isd_clr_int();
isd_stop();
isd_reset();
isd_pd();
isd_init();
return;
}
}
}while(PLAY==1);
LED=1;
isd_clr_int();
do
{
isd_rd_status();
}while(RDY==0);
delayms(10);
isd_fwd();
do
{
isd_rd_status();
}while(RDY==0);
}
break;
case0x02:
{
isd_clr_int();
do
{
isd_rd_status();
}while(RDY==0);
delayms(10);
isd_rec();
delayms(2);
LED=0;
do
{
isd_rd_status();
if(FULL==1)
{
for(i=3;i>0;i--)
{
LED=0;
delayms(300);
LED=1;
delayms(200);
}
}
}while(AN==0);
isd_clr_int();
isd_stop();
LED=1;
}
break;
case0x10:
{
do
{
isd_rd_status();
}while(RDY==0);
delayms(10);
isd_g_erase();
delayms(2);
do
{
isd_rd_status();
}while(RDY==0);
for(i=3;i>0;i--)
{
LED=0;
delayms(300);
LED=1;
delayms(200);
}
}
break;
case0x80:
{
isd_clr_int();
isd_stop();
isd_reset();
isd_pd();
}
break;
}
}
//******************主程序******************//
voidmain(void)
{
uchari;
cpu_init();
delayms(1);
isd_init();
while(1)
{
if(AN==0)
{
delayms(10);
if(AN==0)
{
if(PR==1)
{
PR_fang=1;
}
else
{
PR_fang=0;
}
isdwork();
}
}
if(STOP==0)
{
delayms(10);
if(STOP==0)
{
for(i=100;i>0;i--)
{
if(STOP==1)
{
STOP_fang=1;
isdwork();
isd_init();
break;
}
delayms(30);
}
if(STOP_fang==1)
{
fang=0;
continue;
}
Erase_fang=1;
isdwork();
}
}
}
}
2. 51单片机编写lcd1602显示程序,第一行显示自己的姓名,第二行显示学号
1、首先我们打开Keil μVision编译器,新建一个工程,然后保存在硬盘上的位置,然后选择Atmel-AT89C51单片机为模型,并启动器添加STARTUP.A51文件,然后在当前目录下新建一个C文件,并将其添加入工作路径。
3. 急,请教!请问AT89S52系列单片机C程序怎么实现这种功能。
首先定义一个全局变量 什么类型都可以 初始化为1 如 Int a=1;在你“动一下保护装置的行程”的动作后肯定会调用行程函数,在行程函数里将这个全局变量a置0,然后下降按钮动作后调用的函数前面加上判断条件if(a),在上升按钮的执行函数里加上 a=1;不就OK了么
4. 80C51单片机的STB端口和CHK端口是指哪一个啊
STB和CHK是信号状态,你可以向两个单片机的接口发送这些信号,然后通过中断处理程序进行操作的
5. 怎样用51单片机检测频率例如怎样辨别频率小于10Hz,怎样有大于等于10Hz
方案1: 不用定时中断,可以用定时器计数方式吧? 用外部中断,测量下降沿(或上升沿)和下一个下降沿(或上升沿)之间的时间间隔(用定时器计数更精确,如果频率很高也可以用软件模拟的方式 做一个计数), 软件结构:在下降沿中断的同时,保存当前计数值,计数清零并重新启动计数器(如上,既可以是定时器计数,也可以软件计数), 算得计数的时间 + 中断响应的时间 就是T(周期) 倒数 就是频率了
方案2:做一个循环,每次判断电平是否变化否则就 计数+1 如果跳变就保存计数值 做下一次准备 这样测量的值是一个周期内的固定电平的宽度值,如果占空比不是50%或固定的话 就
方案3:改动下方案2,判断的时候同时判断是否由低变高这样是测定一个周期
方案4:使用定时中断,定时为1s,此时计算电平出现变化的次数(最好外部中断计数,不影响其他操作),这样算出的就是频率值,也是最准确的一种测试方法。
6. 单片机CJNE A, 40H, CHK是什么意思
拍片机上面的这个意思好像是型号不一样,所以的话它的功能按键也是各不相同的。