第一部分
1.经过查阅单片机手册可知定时器0有4种模式,模式0:16位自动重装载模式,模式1:16位不可自动重装载模式,模式2:8位自动重装载模式,模式3不可屏蔽中断16位自动重装载,实时操作系统用节拍定时器。
当晶振为12Mhz时定时器最大为2的16次为65536us,
2.使用运放虚短续断来判断,Ui1这条路的电流可得0.1/10k等于0.00001A,Ui2路的电流为0.2/10k等于0.00002A,经过80k电阻的电流为0.00003A,电压为2.4v,由于运放正极为0电压所以输出为负,输出为-2.4V;
2.1频率为固定时选用带通滤波器,直流电源的滤波电路选用低通滤波器,低通滤波器是低于等于可以通过,高通滤波器是高于等于可以通过,带通滤波器是在范围内可以通过,带阻滤波器是在范围外可以通过。
2.2可用OC门或三态门(ST门)来实现,用OC门实现线与,应同时在输出端口应加一个上拉电阻。
2.3用卡诺图可以化简B非 = C
2.4外部中断0的优先级最大其次定时器0然后外部中断1然后定时器1、串口中断
2.5P0当做外部存储器时是双向8位数据口和低8位地址输出口的复用
2.6第三行是消影的,第四行是位选,第五行是段选。
2.7data是直接寻址的片内存储器,bdata是访问位寻址的片内存储器,xdata是访问外部数据存储器,idata是访问间接寻址的内部RAM
2.8:A错位复位一般为高电平
第二部分
依旧是我们的状态机的思维,有两种状态每个状态通过两个按键去加减,相同时间后触发led闪,很简单,代码如下:
extern unsigned char hour;//时
extern unsigned char min;//分
extern unsigned char sec;//秒
extern uchar ledliang;
uchar clock_hour,clock_min,clock_sec;
uchar num=0;
uint temp=0;
uchar S7 = 1,S6=0;
extern uchar change=0;//记住全局变量要赋初值否则未知值会出现逻辑问题
extern uchar biaozhiwei;
void temp_display()
{
temp = read_ds1802(0);
smg_display(0,18,0);
smg_display(1,18,0);
smg_display(2,18,0);
smg_display(3,18,0);
smg_display(4,18,0);
smg_display(5,temp/10,0);
smg_display(6,temp%10,0);
smg_display(7,12,0);
smg_display(8,12,0);
}
void time_display(void)
{
Read_DS1302_Time();
smg_display(6,sec/16,0);
smg_display(7,sec%16,0);
smg_display(5,17,0);
smg_display(3,min/16,0);
smg_display(4,min%16,0);
smg_display(2,17,0);
smg_display(0,hour/16,0);
smg_display(1,hour%16,0);
while(P33==0)
{
temp_display();
}
if(num==6)
{
S6 = 1;
S7 = 0;
// clock_hour = hour;
// clock_min = min;
// clock_sec = sec;
}
while(clock_hour == hour && clock_min == min && clock_sec == sec)
{
uchar i;uchar a;
for(i=0;i<7;i++)
{
smg_display(i,18,0);
}
a = key_huoqu();
ET1 = 1;
if(ledliang)P00 = 0;
else P00 = 1;
hc573(4);
if(a==4||a==5||a==6||a==7)
{
P0 = 0xff;
hc573(4);
break;
}
}
}
void S7_cufa(void)
{
if(S7 == 1)
{
//在进入调整时间模式时将,时分秒换为十进制的,BCD码转十进制
if(change == 1)
{
if(biaozhiwei)
{
smg_display(1,hour%16,0);
smg_display(0,hour/16,0);
}
else
{
smg_display(1,18,0);
smg_display(0,18,0);
}
}
else
{
smg_display(1,hour%16,0);
smg_display(0,hour/16,0);
}
if(change == 2)
{
if(biaozhiwei)
{
smg_display(3,min/16,0);
smg_display(4,min%16,0);
}
else
{
smg_display(3,18,0);
smg_display(4,18,0);
}
}
else
{
smg_display(3,min/16,0);
smg_display(4,min%16,0);
}
if(change == 3)
{
if(biaozhiwei)
{
smg_display(7,sec%16,0);
smg_display(6,sec/16,0);
}
else
{
smg_display(6,18,0);
smg_display(7,18,0);
}
}
else
{
smg_display(6,sec/16,0);
smg_display(7,sec%16,0);
}
if(change == 0)
{
time_display();
}
if(num==7)
{
change++;if(change == 4)
{
change = 0;//0-2
Set_DS1302_Time();
}
}
if(num == 4&&change!=0)//减
{
min = (min / 16) * 10 + min%16;//BCD码转十进制
sec = (sec / 16) * 10 + sec%16;//BCD码转十进制
hour = (hour / 16) * 10 + hour%16;//BCD码转十进制
if(change==1)hour--;
if(change==2)min--;
if(change==3)sec--;
//if(hour>9||min>9||sec>9)hour=0;
if(hour>=60)hour=23;
if(min>=60)min=59;
if(sec>=60)sec=59;
min = (min / 10)*16 + min % 10;//十进制转BCD码
sec = (sec / 10)*16 + sec % 10;//十进制转BCD码
hour = (hour / 10)*16 + hour % 10;//十进制转BCD码
}
if(num == 5&&change!=0)//+
{
min = (min / 16) * 10 + min%16;//BCD码转十进制
sec = (sec / 16) * 10 + sec%16;//BCD码转十进制
hour = (hour / 16) * 10 + hour%16;//BCD码转十进制
if(change==1)hour++;
if(change==2)min++;
if(change==3)sec++;
if(sec==60)
{
sec=0;
min++;
}
if(min==60)
{
min=0;
hour++;
}
if(hour==24)hour=0;
min = (min / 10)*16 + min % 10;//十进制转BCD码
sec = (sec / 10)*16 + sec % 10;//十进制转BCD码
hour = (hour / 10)*16 + hour % 10;//十进制转BCD码
}
}
}
void S6_cufa(void)
{
if(S6 == 1)
{
//在进入调整时间模式时将,时分秒换为十进制的,BCD码转十进制
if(change == 1)
{
if(biaozhiwei)
{
smg_display(1,clock_hour%16,0);
smg_display(0,clock_hour/16,0);
}
else
{
smg_display(1,18,0);
smg_display(0,18,0);
}
}
else if(change !=0)
{
smg_display(1,clock_hour%16,0);
smg_display(0,clock_hour/16,0);
}
if(change == 2)
{
if(biaozhiwei)
{
smg_display(3,clock_min/16,0);
smg_display(4,clock_min%16,0);
}
else
{
smg_display(3,18,0);
smg_display(4,18,0);
}
}
else if(change !=0)
{
smg_display(3,clock_min/16,0);
smg_display(4,clock_min%16,0);
}
if(change == 3)
{
if(biaozhiwei)
{
smg_display(7,clock_sec%16,0);
smg_display(6,clock_sec/16,0);
}
else
{
smg_display(6,18,0);
smg_display(7,18,0);
}
}
else if(change !=0)
{
smg_display(6,clock_sec/16,0);
smg_display(7,clock_sec%16,0);
}
if(change == 0)
{
time_display();
}
if(num==6)
{
uchar i = 0;
change++;
if(change == 4)
{
change = 0;//0-2
//Set_DS1302_Time();
}
}
if(num == 4&&change!=0)//减
{
clock_min = (clock_min / 16) * 10 + clock_min%16;//BCD码转十进制
clock_sec = (clock_sec / 16) * 10 + clock_sec%16;//BCD码转十进制
clock_hour = (clock_hour / 16) * 10 + clock_hour%16;//BCD码转十进制
if(change==1)clock_hour--;
if(change==2)clock_min--;
if(change==3)clock_sec--;
//if(hour>9||min>9||sec>9)hour=0;
if(clock_hour>=60)clock_hour=23;
if(clock_min>=60)clock_min=59;
if(clock_sec>=60)clock_sec=59;
clock_min = (clock_min / 10)*16 + clock_min % 10;//十进制转BCD码
clock_sec = (clock_sec / 10)*16 + clock_sec % 10;//十进制转BCD码
clock_hour = (clock_hour / 10)*16 + clock_hour % 10;//十进制转BCD码
}
if(num == 5&&change!=0)//+
{
clock_min = (clock_min / 16) * 10 + clock_min%16;//BCD码转十进制
clock_sec = (clock_sec / 16) * 10 + clock_sec%16;//BCD码转十进制
clock_hour = (clock_hour / 16) * 10 + clock_hour%16;//BCD码转十进制
if(change==1)clock_hour++;
if(change==2)clock_min++;
if(change==3)clock_sec++;
if(clock_sec==60)
{
clock_sec=0;
clock_min++;
}
if(clock_min==60)
{
clock_min=0;
clock_hour++;
}
if(clock_hour==24)clock_hour=0;
clock_min = (clock_min / 10)*16 + clock_min % 10;//十进制转BCD码
clock_sec = (clock_sec / 10)*16 + clock_sec % 10;//十进制转BCD码
clock_hour = (clock_hour / 10)*16 + clock_hour % 10;//十进制转BCD码
}
// clock_hour = hour;
// clock_min = min;
// clock_sec = sec;
if(num==7)
{
S6 = 0;
S7 = 1;
}
}
}