📄 main.c
字号:
/*
**************************************************************************************
** 工程名 : AT89S52大夹
** 创建日期 :2008.11.4
** 说明 :本程序只供参考,因时间问题没有对本程序进行认真测试, 只是觉得很久没有用过51而写的程序,请不要转载
主函数部分未加整理
** 联系 : 广西民族大学 06自动化 覃启溪 dongxixiaonanbi@163.com
**************************************************************************************
*/
#include <at89x52.h>
#include <intrins.h>
#include "lcd_51.h"
#include "delay_51.h"
#include "24c64.h"
#include "key.h"
//#include "adc0832.h"
#define uchar unsigned char
#define uint unsigned int
//adc0832部分
uchar ReadAdc0832( uchar channel ) reentrant;
//ADC0832端口定义
#define ADC0832_SCK_H P1_1 = 1
#define ADC0832_SCK_L P1_1 = 0
#define ADC0832_DIDO_H P1_2 = 1
#define ADC0832_DIDO_L P1_2 = 0
#define ADC0832_DIDO P1_2
#define ADC0832_CS_H P1_0 = 1
#define ADC0832_CS_L P1_0 = 0
//按键部分
uchar sure = 0;
uchar model = 0;
uchar add_b = 0;
uint add_p = 0x0000;
//串口部分
//uchar flag44 = 0;
//uchar flagadc0832 = 0;
//uchar flag24c64 = 0;
//uchar flagshumaguang = 0;
uchar flagwhole = 5;
//uchar flagno = 1;
uchar flagfillallow = 0;
uchar flagsendmessage44 = 0;
uchar flagsendmessageadc0832 = 0;
uchar flagsendmessageshumaguang = 0;
uchar flagsendmessage24c64 = 0;
uchar flagdoing24c64 = 0;
//波特率宏定义
#define RELOAD_COUNT 0xfd; //SMOD=1, crystal=11.0592, baud= 19200
//#define RELOAD_COUNT 0xFa //SMOD=1, crystal=11.0592, baud= 9600
//#define RELOAD_COUNT 0xf4 //SMOD=1, crystal=11.0592, baud= 4800
//#define RELOAD_COUNT 0xe8 //SMOD=1, crystal=11.0592, baud= 2400
//缓冲区
#define Rec_Max 9 //定义最大值
#define COMRECSIZE 16 //定义缓冲区大小
uchar Rec_buf[COMRECSIZE];
uchar *Point2Rec_buf; //定义指向数组Rec_buf的指针
uchar Rec_n = 0; //接收字节个数初始化为0
uchar RecFullFlag = 0; //接收满标志初始化为0
//-----------------------------------------------------串口部分接口函数--------------------------------------------------
/*
********************************************************************
** 函数名:串口初始化函数
** 例子 : UART_Init();
**
********************************************************************
*/
void UART_Init( void )
{
SCON |= 0x50; //串口工作方式1, 波特率可变, 波特率由T1决定, 允许接收位REN = 1. 无奇偶校验位
PCON |= 0x80; //波特率加倍
TMOD |= 0x20; //T1, 8位自动, 方式2, 之所以选择工作方式2是因为它有自动加载功能,可以避免程序反复装入初值引起的误差
TH1 = RELOAD_COUNT; //赋初值高8位TH RELOAD_COUNT由前宏定义
TL1 = RELOAD_COUNT; //赋初值低8位TH
ES = 1; //开串口中断
ET1 = 0; //禁止T1中断允许, 以免产生不必要的中断带来的频率误差
TR1 = 1; //打开T1
//EA = 1; //注意, 还没有打开全局中断
}
//串口接收中断服务程序
void serial_INT4( void ) interrupt 4
{
if( RI )
{
RI = 0; //硬件置位,软件清零
if( flagdoing24c64 == 0 )
{
switch( SBUF )
{
case '1':
{
//4*4
flagwhole = 1;
flagsendmessage44 = 1;
LCD_write_string( 1, 0, " made by hebei " );
LCD_write_string( 2, 0, " TEST 4*4 --> 0 " );
} break;
case '2':
{
//ADC
flagwhole = 2;
flagsendmessageadc0832 = 1;
LCD_write_string( 1, 0, " made by hebei " );
LCD_write_string( 2, 1, "TEST ADC--> " );
} break;
case '3':
{
//shumaguang
flagwhole = 3;
flagsendmessageshumaguang = 1;
LCD_write_string( 1, 0, " made by hebei " );
LCD_write_string( 2, 0, "TEST shumaguang " );
} break;
case '4':
{
//24C64
flagwhole = 4;
flagsendmessage24c64 = 1;
LCD_write_string( 1, 1, "0000 >0 is " ); //
LCD_write_string( 2, 0, " ");
} break;
case '5':
{
//结束
flagwhole = 5;
LCD_write_string( 1, 0, " made by hebei " );
LCD_write_string( 2, 0, " NO TEST " );
} break;
}
}
if( flagdoing24c64 == 1 )
{
if( flagfillallow == 1 )
{
Rec_buf[Rec_n++] = SBUF;
if( Rec_n == Rec_Max )
RecFullFlag = 1;
}
}
}
return;
}
/*
********************************************************************
** 函数名:串口发送一个字符
** 例子 : UART_Sendstr( 'a' );
**
** 说明 : UART_SendCh(10); //
** UART_SendCh(13); //回车换行
********************************************************************
*/
void UART_SendCh( uchar Tmp_char )
{
TI = 0;
SBUF = Tmp_char;
while( !TI )
{;}
}
/*
********************************************************************
** 函数名:串口发送字符串函数
** 例子 : UART_Sendstr( "how are you?" );
**
********************************************************************
*/
void UART_SendStr( uchar *str )
{
ES=0; //disable uart0 interrupt;
while( *str )
{
TI = 0;
SBUF = ( *str );
++str;
while( !TI )
{;} //waitting for sending finished.
}
TI=0;
ES=1;
}
//-----------------------------------------------------串口部分接口函数结束--------------------------------------------------
//-----------------------------------------------------外部中断0部分接口函数(24c64按键)--------------------------------------------------
//外中断初始化
void Int0init( void )
{
EX0 = 1; //允许外中断0
IT0 = 1; //边沿触发
}
//
void modelchang( void )
{
model++;
model %= 3; //model在0-2之间
switch( model )
{
case 0: LCD_write_char( 1, 0, ' ' ); LCD_write_char( 1, 6, ' ' ); break;
case 1: LCD_write_char( 1, 0, '>' ); LCD_write_char( 1, 6, ' ' ); break;
case 2: LCD_write_char( 1, 0, ' ' ); LCD_write_char( 1, 6, '>' ); break;
default: break;
}
}
//
void add( void )
{
uint k = add_p;
switch( model )
{
case 1:
add_p++;
add_p %= 0x000A;
LCD_write_char( 1, 4, ( add_p & 0x000f ) + 0x30 ); break;
case 2:
add_b %= Rec_Max;
LCD_write_char( 1, 7, ( add_b & 0x000f ) + 0x30 );
LCD_write_char( 1, 12, I2cReadDataFromAddr( 0xa0, k + add_b ) ); //从24C64里面读数据
add_b++;
break;
default : break;
}
}
//确定
void ok( void )
{
sure = 1;
}
//外中断0服务程序
void int0_int( void ) interrupt 0
{
EA = 0; //禁止再次外中断
if( ( P3 & 0x3c ) != 0x3c )
{
delay_nms( 20 ); //去除抖动
if( ( ( P3 & 0x3c ) != 0x3c ) )
{
switch( P3 & 0x3c )
{
//模式
case 0x30 : modelchang(); break;
//加
case 0x28 : add(); break;
//确定
case 0x18 : ok(); break;
default : break;
}
}
}
EA = 1; //打开外中断
}
//-----------------------------------------------------外部中断0部分接口函数结束--------------------------------------------------
//-----------------------------------------------------芯片74HC595以及74HC139部分接口函数(数码管)--------------------------------------------------
//595端口定义
#define HC595_SHCP_H P0_0 = 1
#define HC595_SHCP_L P0_0 = 0
#define HC595_DS_H P0_1 = 1
#define HC595_DS_L P0_1 = 0
#define HC595_STCP_H P0_2 = 1
#define HC595_STCP_L P0_2 = 0
//139端口定义
#define HC139A_H P0_3 = 1
#define HC139A_L P0_3 = 0
#define HC139B_H P0_4 = 1
#define HC139B_L P0_4 = 0
//共阳a-7 b-6 c-5 d-4 e-3 f-2 g-1 h-0
uchar code Atab[] = //注意,此处要定义为code
{
0x03,/*0*/
0x9F,/*1*/
0x25,/*2*/
0x0D,/*3*/
0x99,/*4*/
0x49,/*5*/
0x41,/*6*/
0x1F,/*7*/
0x01,/*8*/
0x09,/*9*/
};
//139译码
void HC139_Sendbyte( uchar senddata )
{
switch( senddata )
{
case 0: HC139A_L; HC139B_L; break;
case 1: HC139A_H; HC139B_L; break;
case 2: HC139A_L; HC139B_H; break;
case 3: HC139A_H; HC139B_H; break;
default: break;
}
}
/**********************************
** 函数作用:向595发送一个字节数据的低n位
** 入口参数:要写的字节 senddata
** 返回值 : 无
***********************************/
void HC595_Send( uchar Btemp )
{
uchar i;
for( i = 0; i < 8; i++ )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -