📄 hello.c.huzm.c
字号:
//*******************************************************************
//***此程序为调试通过的源程序
//***由南京赛博电子有限公司提供
//***文件名:sy0606.C***//
//***是51系例单片机的最小系统
//***有AT89S51/52的在线下载功能
//***IIC总线芯片为24C02,记存密码
//*******************************************************************
#include"at89x52.h"
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define nop _nop_() /* 定义空操作指令 */
#define VAR P1
//uchar dispbuf_huzm[9]; /*显示值存放阵列*/
sbit rs=P2^2; /*LCD模块用*/
sbit rw=P2^1; /*LCD模块用*/
sbit enable=P2^0; /*LCD模块用*/
sbit SCL=P3^4; /*24C01 CSL接脚=89C51 T0 P3.4*/
sbit SDA=P3^5; /*24C01 SDA接脚=89C51 T1 P3.5*/
sbit en =P2^7; /*DTLED-6显示芯片使能端*/
sbit dout=P2^6; /*DTLED-6显示芯片数据读入端*/
sbit clk=P2^5; /*DTLED-6显示芯片/时钟芯片DS1302时钟输入端*/
sbit DINOUT=P2^4; /*DS1302时钟芯片数据输入输出端*/
sbit RST=P2^3; /*DS1302芯片复位起始端*/
bit FLAG0=0; /*位标号FLAG0=1键盘扫描回应*/
bit FLAG1=1; /*位标号20H.1比较密码回应旗号*/
bit FLAG2=1; /*位标号FLAG2=0时,进入键盘操作*/
bit FLAG3=1; /*位标号FLAG3=0时,键盘操作*/
bit FLAG4=0; /*位标号FLAG4=0时,键盘操作*/
bit FLAG5=0; /*位标号FLAG5=1时,存储*键按下*/
bit TSendAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no); /* 向有子地址器件写入6字节数据函数 */
bit TRcvAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no); /* 向有子地址器件读取6字节数据函数 */
bit acknow; /* 应答标志位 acknow=1 表示正常响应 acknow=0 表示未响应 */
static const char tab[16]={0x01,0x02,0x03,0x0c, /*键盘码00,01,02,03,*/
0x04,0x05,0x06,0x0d, /*键盘码04,05,06,07,*/
0x07,0x08,0x09,0x0e, /*键盘码08,09,0a,0b,*/
0x0a,0x00,0x0b,0x0f};/*键盘码0c,0d,0e,0f*/
//static const char tab1[6]={0x01,0x01,0x01,0x01,0x01,0x01};/*内定密码"888888"*/
uchar char1[]="Syber Nanjing.Co";
uchar char2[]="Password:";
uchar dispbuf[9]; /*显示值存放阵列*/
uchar clocktmp[3]; /*显示值存放阵列*/
uchar bufdata[9];
uchar buf_rec_com1;
uchar bufuart[6]; /*串口接收值存放阵列*/
uchar buf_rec_com1; //huzm
uchar rec_comm1_len=0; //huzm
uchar a1=0,clockbak,b1=100,stand=0,m=0,busy,count=10;
char ww=0,ptr=0,ptr1=0; /*PTR键盘扫描指标,ptr1显示器扫描指标*/
void delay (unsigned int value) /*延时副程式*/
{
while (value!=0) value--; /*10US延时*/
}
void Enable(uchar c);
void Write1(char *c1);
void Write2(char c2);
void Write3(void); /* 显示密码字符串 */
void Initial(); /*LCD模块初始化*/
void send_to_Led_a(void); /*串行发送到DTLED-6副程式*/
void BCD(void); /*BCD码转换副程式*/
void scan(void); /*键盘扫描副程式*/
void clear(void); /*清除按键存放/显示器阵列dispbuf[]副副程式*/
void open(void); /*开门比较密码副程式*/
void read24c02(); /*读24c02的存储值*/
void write24c02(); /*写24c02的存储值*/
void IICSAVE(void); /*设定密码并存入buft[]阵列副程式*/
void disp(void); /*显示存放在dispbuf[]阵列的密码副程式*/
void send_to_Comm1(void); /*串口serial发送副程式*/
void rserial(void); /*串口serial接收副程式*/
void temp(void);
void Rd1302st(void); /*读时钟芯片DS1302*/
void Rd1302(void); /*读时钟芯片DS1302*/
void Wr1302(void); /*写时钟芯片DS1302*/
void Start(); /* 起动总线函数 */
void Stop(); /* 结束总线函数 */
void SendByte(uchar c); /* 8951发数据或地址给8583 字节数据发送函数 */
uchar RcvByte(); /* 8951从24C01读数据字节数据接收函数 */
void Ack(bit a); /* 主机8951应答子函数 */
void xch(void); /*宣告按键存放/显示器阵列dispbuf[]右键滚入副程式*/
void wxb1(void); /*0~9计数,秒*/
void wxb2(void); /*0~9计数,分*/
void wxb3(void); /*0~9计数,时*/
void save_clocks(void); /*按显示时间更改时钟*/
void speekclose(void);
void LCD_disple(void); /*液晶显示*/
/***********************************************************************/
void Rec_com1_intr () interrupt 4 using 1 //串行口中断副程式
{
uchar v,i=0;
while(RI!=1); /*接收完成否*/
{
RI=0;
v=SBUF; /*接收的数据存入C*/
//buf_rec_com1=SBUF;//huzm
#if 1
if(v==0xa0) /*是否是识别码"A0"*/
{while(RI!=1); /*接收完成否*/
bufuart[i]=v;
for(i=1;i<7;i++)
{while(RI!=1); /*接收完成否*/
bufuart[i]=SBUF; /*接收的数据存入C*/
RI=0; /*清除接收完成标志位RI*/
}
}
else delay(10);
#endif
//delay(10);//huzm
send_to_Comm1();
RI=0;
}
send_to_Led_a();//huzm
/*
dispbuf[0]=bufuart[6];
dispbuf[1]=bufuart[5];
dispbuf[2]=bufuart[4];
dispbuf[3]=bufuart[3];
dispbuf[4]=bufuart[2];
dispbuf[5]=bufuart[1];
*/
} /*返回主程式*/
main() /*主程式*/
{
TMOD=0x11; /*TIMER0工作在案MODE1,16位定时器*/
/*TIMER1工作在MODE2,自动重新装载模式*/
/*方式寄存器TMOD___________________________*/
/*| 定时器1 | 定时器1 |*/
/*| GATE|C/T| M1 | M0 | GATE|C/T| M1 | M0 |*/
/*|___________________|___________________|*/
TH1=256-(28800/9600); /*设定传输波特率9600,晶体振荡器=11.059Mhz*/
/*|波特率9600时|SMOD=0|C/T=0|模式=2|自动载入TH1=FD|*/
/*|波特率4800时|SMOD=0|C/T=0|模式=2|自动载入TH1=FA|*/
/*|波特率2400时|SMOD=0|C/T=0|模式=2|自动载入TH1=F4|*/
/*|波特率1200时|SMOD=0|C/T=0|模式=2|自动载入TH1=E8|*/
TH0=(65536-3000)/256; /*设定每隔3000us中断扫描一次数码管*/
TL0=(65536-3000)%256;
TR0=0; /*启动TEMER0*/
// T2MOD=0x02; /*定时器2工作在输出模式*/
T2CON=0x38; /*定时器2工作控制寄存器T2CON_________________*/
/*| TF2|EXF2|RCLK|TCLK|EXEN2|TR2|C/T2|CP/RL2|*/
/*|___________________|_____________________|*/
TL2=0xfd; /*设定传输波特率9600,晶体振荡器=11.059Mhz*/
TH2=0xff; /*设定传输波特率9600,晶体振荡器=11.059Mhz*/
RCAP2L=0xdc; /*设定传输波特率9600,晶体振荡器=11.059Mhz*/
RCAP2H=0xff; /*设定传输波特率9600,晶体振荡器=11.059Mhz*/
TH2=256-(28800/9600); /*设定传输波特率9600,晶体振荡器=11.059Mhz*/
/*|波特率9600时|SMOD=0|C/T=0|模式=2|自动载入TH1=FD|*/
/*|波特率4800时|SMOD=0|C/T=0|模式=2|自动载入TH1=FA|*/
/*|波特率2400时|SMOD=0|C/T=0|模式=2|自动载入TH1=F4|*/
/*|波特率1200时|SMOD=0|C/T=0|模式=2|自动载入TH1=E8|*/
TR2=1; /*启动TEMER2*/
SCON=0x50; /*设定UART工作在MODE3模式,可传送和接收数据 REN=1*/
/*串列控制寄存器SCON_______________________*/
/*| 7 6 5 4 | 3 2 1 0 |*/
/*| SM0| SM1| SM2| REN| TB8| RB8| TI | RI |*/
/*|___________________|___________________|*/
IE=0;
// IE=0x9f; /*8是允许中断,a是TIMER0,TIMER1中断致能位*/
/*| 7 6 5 4 | 3 2 1 0 |*/
/*| EA | | ET2| ES | ET1| EX1| ET0| EX0|*/
/*|___________________|___________________|*/
IP=0x10; /*中断优先级寄存器IP_______________________*/
/*| | | PT2| PS | PT1| PX1| PT0| PX0|*/
/*|___________________|___________________|*/
read24c02(); /*呼叫读取密码存放在DATE1[]副程式*/
dispbuf[0]=0x03; /*小数点位*/
dispbuf[7]=0x01; /*ID号码*/
dispbuf[8]=0x01; /*蜂鸣器设定开/二次分频*/
Rd1302st(); /*读时钟芯片DS1302*/
//LCD_disple(); /*液晶显示*/
P1=0xff;
while(1)
{
#if 1
//scan(); //呼叫键盘扫描副程式有按FLAG0会为1
/*
if(FLAG0==1)
{
temp(); //判断有按键输入否?
}
else
*/
{
//FLAG4=FLAG5=0;
//if(FLAG2==1)
{
Rd1302(); /*读时钟芯片DS1302*/
if(dispbuf[1]!=clockbak) /*秒加一*/
{
clockbak=dispbuf[1];
//send_to_Led_a(); /*串行发送到DTLED-6副程式*/
//send_to_Comm1(); //宣告串口serial发送副程式
}
}
}
#endif
//Rec_com1_intr();//huzm
//send_to_Comm1();
}
}
/*********************************************************************/
//串行发送DTLED-6显示
//dispbuf0-dispbuf1-dispbuf2-dispbuf3-dispbuf4-dispbuf5-dispbuf6-dispbuf7-dispbuf8
// 小数点 - 数码管1- 数码管2- 数码管3- 数码管4- 数码管5- 数码管6-ID识别码-BZ识别码
//00000xxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx-0000xxxx
//小数点=1~6,其它为不显示
//数码管1-6=0~15,
//ID识别码=0~15
//BZ识别码=BZ.3为蜂鸣输出控制位,0=关闭,1=打开
// BZ0~2为蜂鸣频率输出设定为,000=不分频, 最高频率输出=4800Hz;
// 001=一次分频,频率输出=4800/ 2 =2400Hz;
// 010=二次分频,频率输出=4800/ 4 =1200Hz;
// 011=三次分频,频率输出=4800/ 8 =600Hz;
// 100=四次分频,频率输出=4800/ 16=300Hz;
// 101=五次分频,频率输出=4800/ 32=150Hz;
// 110=六次分频,频率输出=4800/ 64=75Hz;
// 111=七次分频,频率输出=4800/128=38Hz;
//======================================================================
void send_to_Led_a(void) /*串行发送DTLED-6显示副程式*/
{
char ts0,i,j;
clk=0;
en=0;
delay(10);
for(j=0;j<9;j++)
{
ts0=dispbuf[j];
for(i=0;i<4;i++) /*发小数点码8,4,2,1*/
{
clk=1;
ts0=ts0<<1;
if(AC==1)
dout=1;
else dout=0;
clk=0;
nop;
delay(3);
}
}
en=1;
} /*返回主程式*/
/***********************************************************************/
// 设定 字符型LCD模块, 使用DB0--DB7,显示两行,
// 使用5*7字型 显示器要显示 光标要显示但不闪烁 */
//======================================================================
void LCD_disple() /*液晶显示*/
{
#if 0
//delay(8000);//huzm
delay(1000);
Initial();
Enable(0x80); /* 从第1行第1列开始显示 */
Write1(char1); /* 显示第1行字符串 */
Enable(0xc0); /* 从第2行第1列开始显示 */
Write1(char2); /* 显示第2行字符串 */
Enable(0xc9); /* 从第2行第1列开始显示 */
Write3(); /* 显示第2行字符串 */
#endif
}
//======================================================================
void Initial() /*LCD模块初始化*/
{
Enable(0x01); /*清除显示*/
delay(300); /*清除需大于1.64ms*/
Enable(0x38); /*LCD功能设定,8位元数据传送,2行显示*/
Enable(0x0f); /*屏幕设定,游标ON,游标闪烁*/
Enable(0x06); /*加一状态,游标向右移*/
}
//======================================================================
void Write1(char *c1)
{while(*c1!=0)
{Write2(*c1);
c1++;
}
}
//======================================================================
void Write3(void)
{uchar i=6;
while(i>0)
{ P1=bufdata[i]|0x30;
rs=1;rw=0;
enable=1;
delay(2);
enable=0;
i--;
}
}
//======================================================================
void Write2(char c2)
{P1=c2;
rs=1;rw=0;enable=1;
delay(2);
enable=0;
}
//======================================================================
void Enable(uchar c)
{
P1=c;
rs=0;rw=0;enable=1;
delay(2);
enable=0;
}
/***********************************************************************/
void temp(void)
{ FLAG2=0;
if(tab[ptr]==0x0e)
{disp(); /*如果是按“C”则呼叫显示密码DISP*/
dispbuf[0]=0x03; /*小数点位*/
}
else /*否则往下执行*/
{
switch(tab[ptr]) /*是则测试ptr键盘扫描计数器指标至TAB[]取到的键盘码*/
{
case 0x0a:
write24c02(); /*是否按“*”是则呼叫设定密码SET*/
clear(); /*是否按“#”是则呼叫清除显示器CLEAR*/
break; /*跳出此循环*/
case 0x0b:
clear(); /*是否按“#”是则呼叫清除显示器CLEAR*/
break; /*跳出此循环*/
case 0x0c: /*是否按“A”,未规划键待用户自己定义*/
FLAG2=1; P3_6=1;
dispbuf[0]=0x03; /*小数点位*/
break; /*跳出此循环*/
case 0x0d: /*是否按“B”,未规划键待用户自己定义*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -