‘壹’ 单片机STC15中这一段EEPROM读程序是什么意思读出来的是什么值
是读eeprom里面的数据,0到5是索引,类似数组的下标,至于读出来是什么值还要看放进去的是什么值,不过这个是16位的,数字信号肯定是0或1的,不过这个既然用了左移8位,应该不是用来当开关用的,不然都没必要这么高低位组合,直接读位就好了。航模遥控用的,有可能用来匹配地址码,还有一些遥控设置用的数据,如陀螺什么的。
‘贰’ C51单片机程序
TH0=0xf6;
TL0=0xff;
上两行是定时器/计数器T0的初值,因为T0是16位的,所以用TH0表示高八位,TL0表示低八位
TH1=0xfd;
TL1=0xfd;
T1初值
TMOD=0x21;
定时器/计数器模式控制寄存器如图
GATE=1时,由外部中断引脚INT0、INT1来启动定时器T0、T1
GATE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。
C/T=0时为定时功能,C/T=1时为计数功能
M0、M1——方式选择功能
M1M0工作方式计数器模式TMOD(设置定时器模式)
00方式013位计数器TMOD=0x00
01方式116位计数器TMOD=0x01
10方式2自动重装8位计数器TMOD=0x02
11方式3T0分为2个8位独立计数器,T1为无中断重装8位计数器TMOD=0x03
PCON=0x00;
PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器
WDCON=0x00;清狗
SCON=0x50;
SCON1=0x40;
串口控制寄存器
‘叁’ 基于stc15单片机的串口通信,发送数据用数码管显示(源程序)
#include<reg51.h>
#define uchar unsigned char
uchar code ledtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阳级数码管码表0-9
uchar time,scanled;
uchar disdat[2];
bit flag=0;
void dischg() //显示码转换
{
disdat[0]=s_dat/10; //秒转换
disdat[1]=s_dat%10;
}
void t0isr() interrupt 1 //秒计时
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
if(time>=20)
{
time=0;
s_dat++;
flag=1;
}
}
void t1isr() interrupt 3 //显示控制
{
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
an=1;
P0=0xff; //消隐
an=0;
wei=1;
P0=1<<scanled; //位码
wei=0;
an=1;
P0=disdat[scanled];
an=0;
scanled++;
scanled%=2; //共8位显示
}
main()
{
TMOD=0x21; //定时器0和1都为模式1
TH0=(65536-50000)/256; //定时器0,50毫秒中断一次
TL0=(65536-50000)%256;
TH1=0xfd;
TL1=0xfd;
SCON=0x40;
TR1=1;
TR0=0;
ET0=1;
EA=1;
scanled=0;
time=0;
dischg();
while(1)
{
if(flag)
{
flag=0;
SBUF=s_dat;
while(TI==0);
TI=0;
}
}
}
‘肆’ 以ADC作CMP+的STC15单片机的比较器程序怎样写
我看了一下STC15系列的手册,的确这里语焉不详,说是PIS=1时就可以用ADCIS[2:0]所选中的通道作为比较器同相输入端了,然而查遍手册并无这个位域的相关定义。
就我个人来说,认为这个ADCIS[2:0]有可能指的就是ADC_CONTR寄存器的CHS[2:0]位域。你可以做一下试验:
① 在ADC_POWER=0的情况下,切换CHS[2:0]的值,看看对应的ADC通道有没有作为比较器的同相输入端作用;(理论上我们并不需要ADC模块真的供电工作,只是借用一下其模块前端的多路开关而已)
② 如果不行,就将ADC_POWER=1,看看此时的情况如何。
如果都不行,那就只能咨询STC的技术服务了。
‘伍’ 15单片机编写程序,时钟
#include<reg51.h>
#define uchar unsigned char
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9
unsigned char sec=0,min=0,hour=12,scanled;
unsigned char key,flashbit,mode,time;
unsigned char disdat[6];
sbit led=P1^0;
void delay(unsigned int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void dischg()
{
disdat[0]=sec%10;
disdat[1]=sec/10;
disdat[2]=min%10;
disdat[3]=min/10;
disdat[4]=hour%10;
disdat[5]=hour/10;
}
void flash()
{
switch(flashbit)
{
case 0:break;
case 1:
disdat[4]=0x10;
disdat[5]=0x10;
delay(50);
dischg();
delay(80);
break;
case 2:
disdat[2]=0x10;
disdat[3]=0x10;
delay(50);
dischg();
delay(80);
break;
case 3:
disdat[0]=0x10;
disdat[1]=0x10;
delay(50);
dischg();
delay(80);
break;
default:break;
}
}
void t0isr() interrupt 1//秒计时
{
TH0=0x3c;
TL0=0xb0;
time++;
switch(mode)
{
case 0:
if(time==20)
{
time=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if(min>59)
{
hour++;
if(hour>23)hour=0;
}
}
}
break;
case 1:
if(time==20)
{
time=0;
if(sec>0)sec--;
else if(min>0){sec=59;min--;}
else if(hour>0){sec=59;min=59;hour--;}
else {hour=0;min=0;sec=0;}
}
break;
}
dischg();
}
void t1isr() interrupt 3//显示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case 0:
P2=0x01;
P0=~ledtab[disdat[5]];
break;
case 1:
P2=0x02;
P0=~ledtab[disdat[4]];
break;
case 2:
P2=0x04;
P0=~ledtab[disdat[3]];
break;
case 3:
P2=0x08;
P0=~ledtab[disdat[2]];
break;
case 4:
P2=0x10;
P0=~ledtab[disdat[1]];
break;
case 5:
P2=0x20;
P0=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=6;
}
main()
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TH1=0xec;
TL1=0x78;
EA=1;
TR1=1;
ET0=1;
ET1=1;
sec=55;
min=59;
hour=23;
flashbit=0;
scanled=0;
time=0;
mode=0;
dischg();
while(1)
{
flash();//闪烁
//led=1;
if((P3&0x0f)!=0x0f){
key=P3&0x0f;
while((P3&0x0f)!=0x0f);
led=0;
delay(10);
key|=0xf0;
switch(~key)
{
case 0x01://p3.1选择调时、分、秒
TR0=0;
flashbit+=1;
if(flashbit>3){flashbit=0;TR0=1;}
break;
case 0x02://p3.2调数
if(flashbit==0)break;
if(flashbit==1)
{
hour++;
if(hour>99)hour=0;
}
if(flashbit==2)
{
min++;
if(min>59)min=0;
}
if(flashbit==3)
{
sec++;
if(sec>59)sec=0;
}
break;
case 0x04: //选择正/倒
TR0=0;
mode++;
mode&=0x01;
if(mode==0){sec=0;min=0;hour=0;}
dischg();
break;
case 0x08://启动/暂停
TR0=~TR0;
break;
default:break;
}
}
}
}