⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hello.c.loc.c

📁 uart,mcu,linux,embedded soc
💻 C
📖 第 1 页 / 共 3 页
字号:
#if 0
#include <REG52.H>                /* special function register declarations   */
                                  /* for the intended 8051 derivative         */

#include <stdio.h>                /* prototype declarations for I/O functions */


#ifdef MONITOR51                         /* Debugging with Monitor-51 needs   */
char code reserve [3] _at_ 0x23;         /* space for serial interrupt if     */
#endif                                   /* Stop Exection with Serial Intr.   */
                                         /* is enabled                        */


/*------------------------------------------------
The main C function.  Program execution starts
here after stack initialization.
------------------------------------------------*/
void main (void) {

/*------------------------------------------------
Setup the serial port for 1200 baud at 16MHz.
------------------------------------------------*/
#ifndef MONITOR51
    SCON  = 0x50;		        /* SCON: mode 1, 8-bit UART, enable rcvr      */
    TMOD |= 0x20;               /* TMOD: timer 1, mode 2, 8-bit reload        */
    TH1   = 221;                /* TH1:  reload value for 1200 baud @ 16MHz   */
    TR1   = 1;                  /* TR1:  timer 1 run                          */
    TI    = 1;                  /* TI:   set TI to send first char of UART    */
#endif

/*------------------------------------------------
Note that an embedded program never exits (because
there is no operating system to return to).  It
must loop and execute forever.
------------------------------------------------*/
  while (1) {
    P1 ^= 0x01;     		    /* Toggle P1.0 each time we print */
    printf ("Hello World\n");   /* Print "Hello World" */
  }
}

#endif

#if 1

//*******************************************************************
//***此程序为调试通过的源程序
//***由南京赛博电子有限公司提供
//***文件名: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
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 bufuart[6];			/*串口接收值存放阵列*/
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 tsled(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 tserial(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);				/*液晶显示*/
/***********************************************************************/
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)
	{
	scan();    	 		/*呼叫键盘扫描副程式有按FLAG0会为1*/
	if(FLAG0==1) 
		{
		temp();			/*判断有按键输入否?*/
		}
	else
		{FLAG4=FLAG5=0;
		if(FLAG2==1)
			{
			Rd1302();				/*读时钟芯片DS1302*/
			if(dispbuf[1]!=clockbak)	/*秒加一*/	
		    	{
		    	clockbak=dispbuf[1];
		    	tsled();		/*串行发送到DTLED-6副程式*/	
				tserial();		/*宣告串口serial发送副程式*/	
				}
			}
		}
	}
}
/*********************************************************************/

//串行发送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 tsled(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()					/*液晶显示*/
{   
	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行字符串 */
}
//======================================================================
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”,未规划键待用户自己定义*/	
                     break;		/*跳出此循环*/
          case 0x0e:			/*是否按“C”,已侦测过*/	
               	read24c02();	/*呼叫读取密码存放在DATE1[]副程式*/
                     break;		/*跳出此循环*/                    
          case 0x0f: 
          		open();			/*是否按“D”,是则呼比较密码开门副程式*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -