附录一:系统电路图
11
附录二:硬件电路程序
#include
#define uchar unsigned char #define uint unsigned int
//实际硬件电路源代码
uchar code TABLE2[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极 uint lastday,temp,i,alarmcount,judgealarm,judgetemp,judgeupdate,update; uint second,minute,hour,week,day,month,year;//十六进制
uint Dsecond,Dminute,Dhour,Dweek,Dday,Dmonth,Dyear;//十进制 uint savesecond=100,saveminute=100,savehour=100; //闹钟存储时间 uchar BCD[]={0,0,0,0},swap[]={1,1,1,1,1,1,1};
sbit tempnum=P0^7; sbit TIMERST=P1^0; sbit TIMEIO=P1^1; sbit TIMECLK=P1^2; sbit D4=P1^3; sbit D5=P1^4;
sbit key_sure=P1^5;//调时或确认键 sbit key_inc=P1^6;//调时加键 sbit key_dec=P1^7;//调时减键 sbit sck=P3^0;
sbit alarmclock=P3^1; sbit cs=P3^3;
sbit showtemp=P3^4; sbit showymd=P3^5; sbit clock=P3^6; sbit sio=P3^7;
unsigned char cort=0;//判断第几次按下确认键 bit first_sure=0; //第一次按下确认键 bit second_sure=0;//第二次按下确认键 bit third_sure=0; //第三次按下确认键 bit fourth_sure=0;//第四次按下确认键 bit fifth_sure=0; //第五次按下确认键 bit sixth_sure=0; //第六次按下确认键 bit seventh_sure=0;//第七次按下确认键
//////////////////////////////////////////////////////////////////*温度处理函数*/ int lm71()
12
{
unsigned char data i; int data j,k;
sio=1; cs=0; i=16;
while(i!=0) {
j=j<<1; //将温度值的高位往左移 sck=0;
k=sio; //读温度值的每一位(共16位) j=j|k; //累加温度值的每一位 sck=1; i--; } cs=1; return j; }
//////////////////////////////////////////////////////////////////////////DS1302时间处理函数 //DS1302读写C51源程序
//------------------------------------------------ //打开DS1302
void TimeSpiOpen(void) {
TIMECLK = 0;
TIMERST = 0;//禁止DS1302 TIMEIO = 1;//释放数据总线 TIMERST = 1;//使能DS1302 }
//关闭DS1302
void TimeSpiClose(void) {
TIMERST = 0;//禁止DS1302 TIMEIO = 1;//释放数据总线 TIMECLK = 1; }
//读写DS1302
unsigned char TimeSpiReadWrite(unsigned char val) {
unsigned char data i,j,k;
j= val; //取8位数据 for (i = 8;i > 0; i--) {
TIMECLK = 0; //时钟下降沿输入数据(DS1302读)
13
k=k>>1;
if(TIMEIO) //接收串行数据到CY {
k=k|0x80; }
TIMEIO = j&0x01; //发送串行数据 j=j>>1;
TIMECLK = 1; //时钟上升沿打入数据(DS1302写) TIMEIO = 1; //释放数据总线 }
return k; }
//读DS1302时钟字节
unsigned char TimeByteRead(unsigned char address) {
unsigned char data i;
TimeSpiOpen();//打开DS1302
TimeSpiReadWrite(address);//写入DS1302命令 i = TimeSpiReadWrite(0xff);//读入DS1302数据 TimeSpiClose();//关闭DS1302 return i;//返回数据 }
//写DS1302时钟字节
void TimeByteWrite(unsigned char address, unsigned char val) {
TimeSpiOpen();//打开DS1302
TimeSpiReadWrite(address);//写地址 TimeSpiReadWrite(val);//写数据 TimeSpiClose();//关闭DS1302 }
//使能DS1302写保护
void TimeWriteEnable(void) {
TimeByteWrite(0x07, 0x80); //使能DS1302写保护 }
//开放DS1302写保护
void TimeWrieDisbale(void) {
TimeByteWrite(0x07, 0); //开放DS1302写保护 }
//DS1302工作开始
void TimeWorkStart(void)
14
{
unsigned char val;
val = TimeByteRead(0x81);//读秒数据 val &= 0x7f;//打开晶振
TimeWrieDisbale();//开放DS1302写保护 TimeByteWrite(0x80, val);//打开晶振
TimeByteWrite(0x90, 0xa5);//打开充电二极管 TimeWriteEnable();//使能DS1302写保护 }
//DS1302时间初始化 /*void DS1302Inital(void) {
TimeByteWrite(0x80,0x12); //秒 TimeByteWrite(0x82,0x58); //分 TimeByteWrite(0x84,0x23); //时 TimeByteWrite(0x8a,0x07); //星期 TimeByteWrite(0x86,0x30); //日 TimeByteWrite(0x88,0x04); //月 TimeByteWrite(0x8c,0x10); //年 } */
/////////////////////////////////////////////////////////////////////////////显示函数群 /******************************************* 返回值:BCD数组
*******************************************/ //十六进制转化为BCD码
uchar XCOUNT_INT_BCD(uint temp) { uint div; div=16; BCD[1]=temp/16; BCD[0]=temp; return BCD; }
//十进制转化为BCD码
uchar DCOUNT_INT_BCD(uint temp) { uint div; uchar i; div=1000;
for(i=0;i<=3;i++) { BCD[3-i]=temp/div; temp%=div; div/=10;
15