#include "reg52.h"
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
sbit INTPUT1=P5^4; //启动信号
sbit DOWN=P3^2; //下降
sbit UP=P3^3; //上升
sbit LED=P5^5; //EEPROM写指示
#define FOSC 11059200UL
#define BRT (65536-FOSC/115200/4)
sfr IAP_TPS = 0xF5;
/************************************/
void UartInit()
{
SCON = 0x5a;
T2L = BRT;
T2H = BRT >> 8;
AUXR = 0x15;
}
/************************************/
void UartSend(char dat)
{
while (!TI);
TI = 0;
SBUF = dat;
}
/************************************/
void IapIdle()
{
IAP_CONTR = 0; // 关闭 IAP 功能
IAP_CMD = 0; // 清除命令寄存器
IAP_TRIG = 0; // 清除触发寄存器
IAP_ADDRH = 0x80; // 将地址设置到非 IAP 区域
IAP_ADDRL = 0;
}
/************************************/
char IapRead(int addr)
{
char dat;
IAP_CONTR = 0x80; // 使能 IAP
IAP_TPS = 12; // 设置擦除等待参数 12MHz
IAP_CMD = 1; // 设置 IAP 读命令
IAP_ADDRL = addr; // 设置 IAP 低地址
IAP_ADDRH = addr >> 8; // 设置 IAP 高地址
IAP_TRIG = 0x5a; // 写触发命令 (0x5a)
IAP_TRIG = 0xa5; // 写触发命令 (0xa5)
_nop_();
dat = IAP_DATA; // 读 IAP 数据
IapIdle(); // 关闭 IAP 功能
return dat;
}
/************************************/
void IapProgram(int addr, char dat)
{
IAP_CONTR = 0x80; // 使能 IAP
IAP_TPS = 12; // 设置擦除等待参数 12MHz
IAP_CMD = 2; // 设置 IAP 写命令
IAP_ADDRL = addr; // 设置 IAP 低地址
IAP_ADDRH = addr >> 8; // 设置 IAP 高地址
IAP_DATA = dat; // 写 IAP 数据
IAP_TRIG = 0x5a; // 写触发命令 (0x5a)
IAP_TRIG = 0xa5; // 写触发命令 (0xa5)
_nop_();
IapIdle(); // 关闭 IAP 功能
}
/************************************/
void IapErase(int addr)
{
IAP_CONTR = 0x80; // 使能 IAP
IAP_TPS = 12; // 设置擦除等待参数 12MHz
IAP_CMD = 3; // 设置 IAP 擦除命令
IAP_ADDRL = addr; // 设置 IAP 低地址
IAP_ADDRH = addr >> 8; // 设置 IAP 高地址
IAP_TRIG = 0x5a; // 写触发命令 (0x5a)
IAP_TRIG = 0xa5; // 写触发命令 (0xa5)
_nop_(); //
IapIdle(); // 关闭 IAP 功能
}
/*-----------(1)延时子程序12MHz 加千百十个显示--------*/
void Delay100ms(uint x) //
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<11000;j++);
}
/*************关所有输出*******************************/
void reset_io()
{
P3M0=0X00;
P3M1=0X00;
P5M0=0X00;
P5M1=0X00;
DOWN=1; //气缸下降
UP=1; //气缸上升
INTPUT1=1; //
}
/************************************/
void main()
{
reset_io();
UP=0; //开上升
DOWN=0; //下降
Delay100ms(20); //延时(10);
UP=1; //开上升
DOWN=1; //下降
Delay100ms(20); //延时(10);
UP=0; //开上升
DOWN=0; //下降
Delay100ms(20); //延时(10);
UP=1; //开上升
DOWN=1; //下降
Delay100ms(20); //延时(10);
UP=0; //开上升
DOWN=0; //下降
Delay100ms(20); //延时(10);
UP=1; //开上升
DOWN=1; //下降
Delay100ms(20); //延时(10);
UP=0; //开上升
DOWN=0; //下降
Delay100ms(20); //延时(10);
UP=1; //开上升
DOWN=1; //下降
Delay100ms(20); //延时(10);
UP=0; //开上升
DOWN=0; //下降
Delay100ms(20); //延时(10);
UP=1; //开上升
DOWN=1; //下降
Delay100ms(20); //延时(10);
UP=0; //开上升
DOWN=0; //下降
Delay100ms(20); //延时(10);
UP=1; //开上升
DOWN=1; //下降
Delay100ms(20); //延时(10);
UartInit();
IapErase(0x1200);
UartSend(IapRead(0x1200));
IapProgram(0x1200, 0x12);
UartSend(IapRead(0x1200));
while (1)
{
UP=0; //开上升
Delay100ms(200); //延时(10);
UP=1; //开上升
Delay100ms(200); //延时(10);
}
}
#include "reg52.h"
#include "intrins.h"
#define FOSC 11059200UL
#define BRT (65536 - FOSC / 115200 / 4)
bit busy;
char wptr;
char rptr;
char buffer[16];
void UartIsr() interrupt 4
{
if (TI)
{
TI = 0;
busy = 0;
}
if (RI)
{
RI = 0;
buffer[wptr++] = SBUF;
wptr &= 0x0f;
}
}
void UartInit()
{
SCON = 0x50;
T2L = BRT;
T2H = BRT >> 8;
AUXR = 0x15;
wptr = 0x00;
rptr = 0x00;
busy = 0;
}
void UartSend(char dat)
{
while (busy);
busy = 1;
SBUF = dat;
}
void UartSendStr(char *p)
{
while (*p)
{
UartSend(*p++);
}
}
void main()
{
P_SW1=0x00; //RXD/P3.0, TXD/P3.1
P3M0=0;
P3M1=0;
P5M0=0;
P5M1=0;
UartInit();
ES = 1;
EA = 1;
UartSendStr("Uart Test !\r\n");
while (1)
{
if (rptr != wptr)
{
UartSend(buffer[rptr++]);
rptr &= 0x0f;
}
}
}
#include "STC8.H"
sbit LED = P3^2;
/*------------发送串口数据----------------*/
void uart1_SendData(unsigned char dat)
{
SBUF = dat;
while (TI == 0);
TI = 0;
}
/*------------发送字符串------------------*/
void uart1_SendDataFrame(unsigned char *pDat)
{
while ((*pDat)!= '\0')
{
uart1_SendData(*pDat++);
}
}
/*
上位机发送0x55,LED亮,上位机发送0xAA,LED灭。
然后下位机收到正确的命令后,作出相对应的相应。
*/
void UartIsr()interrupt 4
{
unsigned char data l_RevDat = 0;
if (RI)
{
RI = 0; //清除RI位
l_RevDat = SBUF;
if (0x55 == l_RevDat)
{
LED = 0;//LED亮
uart1_SendDataFrame("LED已点亮\r\n");
}
else if (0xAA == l_RevDat)
{
LED = 1;//LED灭
uart1_SendDataFrame("LED已熄灭\r\n");
}
else
{
uart1_SendDataFrame("指令错误\r\n");
}
}
}
/************************************/
void main(void)
{
P3M0=0;
P3M1=0;
P5M0=0;
P5M1=0;
//使用内部时钟 烧录软件会帮我们配置好 如不懂 参考前面第3章系统设置学习。
// 烧录软件设置11.0592MHz为系统时钟。以后我们的学习都是这个时钟频率。
P_SW2 |= (1<<7);
CKSEL = 0x00; //选择内部 IRC ( 默认 )
P_SW2 &= ~(1<<7);
//配置端口 对于控制我们系统板的LED,配置准双向口和推挽输出都可以。
//只要是做为输出,我建议全部设置为推挽输出。
/*
PnM1.x PnM0.x Pn.x 口工作模式
0 0 准双向口
0 1 推挽输出
1 0 高阻输入
1 1 开漏输出
*/
P1M1 &= ~(1<<1); P1M0 |=(1<<1); //设置为推挽输出
P_SW2 |= (1<<7);
P1PU = 0x00;//禁止P1端口内部的 3.7K 上拉电阻
P1NCS = 0xFF; //禁止P1端口的施密特触发功能。
P_SW2 &= ~(1<<7);
/*串口1相关配置*/
P_SW1 &= ~(1 << 6);P_SW1 &= ~(1 << 7); //串口 1 功能脚选择位
SCON = 0x50; //模式1 可变波特率8位数据方式
PCON &= 0x3F; //串口 1 的各个模式的波特率都不加倍 无帧错检测功能
AUXR |= (1 << 0); //选择定时器 2 作为波特率发射器
AUXR &= ~(1 << 4);//定时器 2 停止计数,配置完再打开。
AUXR &= ~(1 << 3);//清0则用作定时器
AUXR &= ~(1 << 2);//12T 模式,即 CPU 时钟 12 分频( FOSC/12)
T2L = 0xE8; //12T 模式 9600
T2H = 0xFF;
IP |= (1<<4);//优先级控制
IPH |= (1<<4);
AUXR |= (1 << 4); //启动定时器 2
ES = 1; //使能串口1中断
EA = 1;//总中断打开
LED = 0;//LED灭
while (1)
{
uart1_SendData(100);
uart1_SendDataFrame("adfgss");
}
}
|