#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");
}
}
|