📄 mcs51-项目开发经典.c
字号:
//=================================================================================================
// 项目名:MCS51-项目开发经典
// 硬件文件名:51Studay.DDB
// 程序组目录名:MCS51-项目开发经典
// 开始时间:2007年5月21日
// 完成时间:2007年6月10日
//-------------------------------------------------------------------------------------------------
// 程序中用到哪些C51标准函数,就需要把该函数对应的头文件包含进来
//-------------------------------------------------------------------------------------------------
#include <intrins.h>
#include <string.h>
#include <absacc.h>
#include <reg52.h>
//-------------------------------------------------------------------------------------------------
// 为提高书写效率做以下宏定义
//-------------------------------------------------------------------------------------------------
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define CLOSE 1
#define OPEN 0
//-------------------------------------------------------------------------------------------------
// 蜂鸣器输出、节点信号输入、电平信号输入操控位宏定义
//-------------------------------------------------------------------------------------------------
sbit FM_OUT =P1^4;
sbit BIT_IN =P1^6;
sbit VOLT_IN =P1^5;
//-------------------------------------------------------------------------------------------------
// HD7279操控位及指令宏定义
//-------------------------------------------------------------------------------------------------
sbit CS_7279 = P1^0;
sbit CLK_7279 = P1^1;
sbit DATA_7279= P1^2;
sbit KEY_7279 = P1^3;
// HD7279指令宏定义:不带数据的纯指令
#define HD7279_RESET 0xa4 //复位,相当于重新上电
#define HD7279_TEST 0xbf //测试,点亮全部LED并闪烁
#define HD7279_RL 0xa1 //左移1位
#define HD7279_RR 0xa0 //右移1位
#define HD7279_RLC 0xa3 //循环左移
#define HD7279_RRC 0xa2 //循环右移
// HD7279指令宏定义:带有数据的指令
#define HD7279_DECODE0 0x80 //译码方式0
#define HD7279_DECODE1 0xc8 //译码方式1
#define HD7279_UNDECODE 0x90 //译码方式2: 不译码
#define HD7279_FLASH 0x88 //闪烁指令,后跟8位数据 D8|D7|D6|D5|D4|D3|D2|D1,某位置0则该位闪烁
#define HD7279_HIDE 0x98 //消隐指令,后跟8位数据 D8|D7|D6|D5|D4|D3|D2|D1,某位置0则该位消隐
#define HD7279_SEGON 0xe0 //单段亮
#define HD7279_SEGOFF 0xc0 //单段灭
#define HD7279_READ_KEY 0x15 //读按键代码,读出的数值对应按下的键,无键按下时数值为0xff.
//-------------------------------------------------------------------------------------------------
// 步进电机控制器L297操控位宏定义
//-------------------------------------------------------------------------------------------------
sbit RST_L297 =P1^3;//L297复位
sbit HF_L297 =P1^4;//半步、全步选择
sbit CLK_L297 =P1^5;//步进时钟
sbit CW_L297 =P1^6;//方向控制选择
sbit E_L297 =P1^7;//L297使能
//-------------------------------------------------------------------------------------------------
// 直流电机操控位宏定义
//-------------------------------------------------------------------------------------------------
sbit TURN_Z_DCMOTOR=P1^2;//直流电机正转控制位
sbit TURN_F_DCMOTOR=P1^0;//直流电机反转控制位
sbit PWM_DCMOTOR =P1^1;//直流电机PWM调速控制位
//-------------------------------------------------------------------------------------------------
// DA芯片TLC5617操控位宏定义
//-------------------------------------------------------------------------------------------------
sbit SCLK_TL5617=P1^6;
sbit DIN_TL5617 =P1^7;
sbit CS_TL5617 =P1^5;
//-------------------------------------------------------------------------------------------------
// AD芯片TLC2543操控位宏定义
//-------------------------------------------------------------------------------------------------
sbit EOC_2543 =P1^0;
sbit CLK_2543 =P1^1;
sbit DIN_2543 =P1^2;
sbit DOUT_2543=P1^3;
sbit CS_2543 =P1^4;
//-------------------------------------------------------------------------------------------------
// 串并转换芯片74HC595操控位宏定义
//-------------------------------------------------------------------------------------------------
sbit SER_DATA_74HC595=P2^7; //74HC595串行数据输入端
sbit CP_LA_74HC595 =P2^6; //74HC595寄存器数据移入锁存器的时钟
sbit CP_SR_74HC595 =P2^5; //74HC595串行数据移入寄存器的时钟
//-------------------------------------------------------------------------------------------------
// I2C总线器件操控位宏定义,24C02存储器和SD2000时钟共用同一I2C总线
//-------------------------------------------------------------------------------------------------
sbit SDA =P3^7; //I2C数据线,注意双向端口在输入和输出时的设置切换
sbit SCL =P3^6; //I2C时钟线
//-------------------------------------------------------------------------------------------------
// SPI总线器件93C46操控位宏定义
//-------------------------------------------------------------------------------------------------
sbit CS_93C46 =P3^2;
sbit SK_93C46 =P3^3;
sbit DI_93C46 =P3^4;
sbit DO_93C46 =P3^5;
//-------------------------------------------------------------------------------------------------
// 液晶模块12232C-3操控位宏定义,液晶模块内部驱动器为ST7920
//-------------------------------------------------------------------------------------------------
sbit CS_ST7920 =P2^0; //
sbit STD_ST7920 =P2^1; //
sbit SCLK_ST7920=P2^2; //
sbit LCM_LED =P2^3; //
sbit cs =P2^0; //
sbit std =P2^1; //
sbit sclk =P2^2; //
#define x 0x80
#define y 0x80
#define comm 0
#define dat 1
sbit rs = P2^0; //H=data; L=command;
sbit rw = P2^1; //H=read; L=write;
sbit e = P2^2; //input enable;
sbit busy = P0^7; //lcd busy bit
uchar code tab1[]={"沈阳单片机开发!" //第一行显示内容
"WWW.SYMCUKF.COM"};//第二行显示内容
uchar code tab3[]={"沈阳鑫研电子Co." //第一行显示内容
"TEL:13066554250"};//第二行显示内容
uchar code Picture_kfjd[]={//图像lcm_pic_kfjd.bmp,宽度x高度=128x32
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x30, 0x70, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00,
0x7F, 0xFF, 0xFF, 0xF0, 0x38, 0x70, 0x78, 0x00, 0x60, 0xFF, 0xFF, 0x80, 0x03, 0x87, 0x00, 0x00,
0x7F, 0xFF, 0xFF, 0xF0, 0x38, 0x70, 0x3E, 0x00, 0xE0, 0x7F, 0xFF, 0x80, 0x03, 0x87, 0x80, 0x00,
0x1F, 0xF8, 0xFF, 0x80, 0x70, 0xF0, 0x0F, 0x00, 0xE0, 0x00, 0x7F, 0x80, 0x0F, 0xEF, 0xC0, 0x00,
0x07, 0xC0, 0x1F, 0x00, 0x70, 0xF0, 0x07, 0xC0, 0xC0, 0x00, 0x3F, 0x01, 0xFF, 0xFF, 0xFE, 0x00,
0x07, 0x80, 0x0F, 0x00, 0x79, 0xFC, 0x01, 0xC1, 0xC0, 0x00, 0x1E, 0x01, 0xFF, 0xFF, 0xFE, 0x00,
0x07, 0x80, 0x0E, 0x00, 0xFF, 0xFF, 0xFF, 0xE1, 0xC7, 0x00, 0x3C, 0x01, 0xE7, 0xCF, 0xDE, 0x00,
0x03, 0x80, 0x0E, 0x00, 0xFF, 0xFF, 0xFF, 0xF1, 0xC6, 0x00, 0x7C, 0x01, 0xC3, 0x87, 0x8E, 0x00,
0x03, 0x80, 0x0E, 0x00, 0x0F, 0xFC, 0x00, 0x03, 0xCE, 0x01, 0xFC, 0x01, 0x83, 0x87, 0x06, 0x00,
0x07, 0x80, 0x0E, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xFC, 0x03, 0xFE, 0x01, 0x83, 0x83, 0x06, 0x00,
0x07, 0x80, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0x07, 0xFC, 0x0F, 0xFE, 0x01, 0x83, 0x87, 0x06, 0x00,
0x07, 0xC0, 0x1F, 0x00, 0x03, 0xFE, 0x00, 0x03, 0xF8, 0x1F, 0xFF, 0x01, 0xC7, 0xC7, 0x8E, 0x00,
0x1F, 0xF0, 0x7F, 0x80, 0x03, 0xFF, 0xFF, 0xC0, 0x78, 0x7C, 0x07, 0x81, 0xFF, 0xFF, 0xFE, 0x00,
0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0x80, 0x71, 0xF0, 0x01, 0xC1, 0xFF, 0xFF, 0xFE, 0x00,
0xFF, 0xFF, 0xFF, 0xF8, 0x07, 0xF8, 0x3F, 0x80, 0x73, 0xC0, 0x00, 0xE1, 0xEF, 0xEF, 0xFE, 0x00,
0x1F, 0xF8, 0xFF, 0xC0, 0x07, 0xF0, 0x1F, 0x00, 0xF3, 0x80, 0x00, 0xE1, 0xC7, 0x87, 0x8E, 0x00,
0x0F, 0xC0, 0x1F, 0x80, 0x0F, 0xF0, 0x0F, 0x00, 0xF0, 0xFF, 0xFF, 0x83, 0x83, 0x87, 0x07, 0x00,
0x07, 0xC0, 0x0F, 0x00, 0x0E, 0x78, 0x0E, 0x01, 0xFF, 0xFF, 0xFF, 0x83, 0x83, 0x83, 0x07, 0x00,
0x03, 0x80, 0x0E, 0x00, 0x1C, 0x3C, 0x1E, 0x03, 0xFF, 0x03, 0xF0, 0x03, 0x83, 0x87, 0x07, 0x00,
0x03, 0x80, 0x06, 0x00, 0x1C, 0x1E, 0x3C, 0x03, 0xFE, 0x01, 0xE0, 0x03, 0xC7, 0xC7, 0x8F, 0x80,
0x03, 0x00, 0x06, 0x00, 0x38, 0x1F, 0xFC, 0x00, 0x00, 0x01, 0xE0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0,
0x03, 0x00, 0x06, 0x00, 0x38, 0x1F, 0xF8, 0x00, 0x01, 0x81, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0,
0x07, 0x00, 0x06, 0x00, 0x70, 0x1F, 0xF8, 0x00, 0x03, 0x81, 0xC0, 0x00, 0x07, 0x01, 0x00, 0x00,
0x07, 0x00, 0x06, 0x00, 0xE0, 0x1F, 0xF8, 0x00, 0x0F, 0x81, 0xE0, 0x00, 0x0F, 0x03, 0xC0, 0x00,
0x0E, 0x00, 0x06, 0x00, 0xE0, 0x3F, 0xFC, 0x00, 0x3E, 0x01, 0xE0, 0x00, 0x3E, 0x01, 0xF0, 0x00,
0x1E, 0x00, 0x06, 0x01, 0xC0, 0x7F, 0xFE, 0x00, 0xF8, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x7C, 0x00,
0x3C, 0x00, 0x06, 0x03, 0x83, 0xFF, 0xFF, 0x87, 0xE0, 0x1F, 0xFE, 0x03, 0xF0, 0x00, 0x1F, 0x00,
0x78, 0x00, 0x06, 0x01, 0x1F, 0xE0, 0x07, 0xE7, 0x83, 0xFF, 0xFF, 0xEF, 0xC0, 0x00, 0x07, 0x80,
0x70, 0x00, 0x06, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x01, 0xFF, 0xFF, 0xC6, 0x00, 0x00, 0x03, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
//=================================================================================================
#define TEST_74HC595 1
#define TEST_24C02 2
#define TEST_93C46 3
#define SET_SD2000 4
#define READ_SD2000 5
#define TEST_18B20 6
#define TEST_HD7279 7
#define TEST_BIT_IO 8
#define TEST_TLC2543 9
#define TEST_TLC5617 10
#define TEST_PWM_DA 11
#define TEST_L297 12
#define TEST_DC_MOTOR 13
#define TEST_LCM 14
//-------------------------------------------------------------------------------------------------
// 操作时钟芯片SD2000需要的全局变量
//-------------------------------------------------------------------------------------------------
uchar bdata bit_byte;//定义可位操作的字节
sbit bit_byte_7=bit_byte^7;
sbit bit_byte_6=bit_byte^6;
sbit bit_byte_5=bit_byte^5;
sbit bit_byte_4=bit_byte^4;
sbit bit_byte_3=bit_byte^3;
sbit bit_byte_2=bit_byte^2;
sbit bit_byte_1=bit_byte^1;
sbit bit_byte_0=bit_byte^0;
uchar idata year; //SD2000-年
uchar idata month; //SD2000-月
uchar idata date; //SD2000-日
uchar idata week; //SD2000-星期
uchar idata hour; //SD2000-时
uchar idata minute;//SD2000-分
uchar idata second;//SD2000-秒
//-------------------------------------------------------------------------------------------------
// 操作UART串口相关的全局变量
//-------------------------------------------------------------------------------------------------
uchar idata uart_buffer[40];//串口接收缓冲区,可接收字符串的最大长度为40
uchar uart_buffer_address;//串口接收缓冲区地址计数器
bit uart_receive_start; //串口接收启动
bit uart_receive_ok; //串口接收(UART0)中断里已接收完整消息标志
//-------------------------------------------------------------------------------------------------
// 键盘扫描相关的全局变量
//-------------------------------------------------------------------------------------------------
uchar key_value_previous;
uchar key_press_counter;
uchar key_value_main;
//-------------------------------------------------------------------------------------------------
uchar t1_delay_time;//50毫秒计数器累加变量,在T2中断里累加
bit i2c_response_signal;//I2C总线应答信号
uint idata temporary_data[10];//临时数据
uchar idata test_command;//存储串口接收的测试命令
uchar idata weizhi;
uchar idata lcm_control_mode;//液晶控制方式选择
uint motor_speed_delay;
//-------------------------------------------------------------------------------------------------
// 函数声明
//-------------------------------------------------------------------------------------------------
void init_cpu(void);
void ctrl_74hc595(uchar led_display_data);
void HD7279_LongDelay(void);
void HD7279_ShortDelay(void);
void HD7279_SendByte(uchar out_byte);
uchar HD7279_ReceiveByte(void);
uchar HD7279_GetKey(void);
void HD7279_ShowData(uchar Position,uchar ShowData,bit Have_DP);
void HD7279_Initial(void);
void TLC5617_Write(uchar mode,uint udata);
uint ad2543_measure(uchar chunnel_select);
void i2c_delay(void);
void i2c_start(void);
void i2c_stop(void);
void i2c_send8bit(uchar shu);
uchar i2c_read8bit(void);
void i2c_ack(void);
void sendbyte_24c02(uchar data_addr,uchar data_write);
uchar readbyte_24c02(uchar data_addr);
uchar reverse_byte_hl(uchar clock_data);
void set_sd2000(void);
void read_sd2000_ys(void);
void uart_byte_out(uchar uart_data_out);
void uart_string_out(char * char_array);
void uart_data_decimalist_out(uint data_to_out);
void uart_newline(uchar newline_number);
void uart_space(uchar space_number);
void START_93C46();
void END_93C46();
void SEND_DATA_93C46(unsigned int op_data,unsigned char num);
uint READ_93C46(uchar address);
uchar WRITE_93C46(uchar address,uint op_data);
uchar ERASE(uchar address);
uchar ERAL();
uchar WRAL(uint op_data);
void dc_motor_z(void);
void dc_motor_f(void);
void dc_motor_stop(void);
uchar change_bcd_to_hex(uchar shu);
uchar change_hex_to_bcd(uchar shu);
uchar change_askii_to_hex(uchar askii);
uchar change_hex_to_askii(uchar data_hex);
void get_data(uchar * how_much_data);
char * strstr(char * haystack, char * needle);
void init_lcd (void);
void chinese_or_character_display (uchar code *chn);
void image_display (uchar code *img);
//void lattice_display (uchar data1,uchar data2);
//void reverse_display (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl);
void lcm_clear_ram (void);
void write_lcd_8 (uchar dat_comm,uchar content);
void write_lcd_3 (uchar dat_comm,uchar content);
void write_lcd(uchar dat_comm,uchar content);
void check_busy (void);
void delay (uint us);
void delay1 (uint ms);
//=================================================================================================
//===================== ================================================
//===================== 主程序 ================================================
//===================== ================================================
//=================================================================================================
void main (void)
{ uchar i;
uint wqy1,wqy2;
uchar old_second;
uint da_out_data;
uint ad_mesure_data;
float ad_total;
uchar * uart_receive_data;
init_cpu();
init_lcd ();
wqyloop:
//-------------------------------------------------------------------------------------------------
//-------------------- 判断串口接收缓冲区数据包,获得调试指令 -------------------------
//-------------------------------------------------------------------------------------------------
if(uart_receive_ok == 1)//如果串口接收了一个完整的且符合格式的数据包,则进入
{
for(t1_delay_time=0;t1_delay_time<2;);//延时100毫秒
ES = 0;//禁止uart0中断
uart_newline(1);//换行
for(i=0; i<strlen(uart_buffer); i++)//通过串口回传收到的命令字符串
{uart_byte_out(uart_buffer[i]);}
uart_newline(1);//换行
//----------------------------------------------------------
if(strstr(uart_buffer, "@TEST-74HC595#") != NULL)
{test_command =TEST_74HC595;
}
else if(strstr(uart_buffer, "@TEST-24C02#") != NULL)
{test_command =TEST_24C02;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -