|
#include "reg52.h"
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
sbit INTPUT1=P5^4; //啟動(dòng)信號(hào)
sbit DOWN=P3^2; //下降
sbit UP=P3^3; //上升
sbit LED=P5^5; //EEPROM寫(xiě)指示
#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; // 關(guān)閉 IAP 功能
IAP_CMD = 0; // 清除命令寄存器
IAP_TRIG = 0; // 清除觸發(fā)寄存器
IAP_ADDRH = 0x80; // 將地址設(shè)置到非 IAP 區(qū)域
IAP_ADDRL = 0;
}
/************************************/
char IapRead(int addr)
{
char dat;
IAP_CONTR = 0x80; // 使能 IAP
IAP_TPS = 12; // 設(shè)置擦除等待參數(shù) 12MHz
IAP_CMD = 1; // 設(shè)置 IAP 讀命令
IAP_ADDRL = addr; // 設(shè)置 IAP 低地址
IAP_ADDRH = addr >> 8; // 設(shè)置 IAP 高地址
IAP_TRIG = 0x5a; // 寫(xiě)觸發(fā)命令 (0x5a)
IAP_TRIG = 0xa5; // 寫(xiě)觸發(fā)命令 (0xa5)
_nop_();
dat = IAP_DATA; // 讀 IAP 數(shù)據(jù)
IapIdle(); // 關(guān)閉 IAP 功能
return dat;
}
/************************************/
void IapProgram(int addr, char dat)
{
IAP_CONTR = 0x80; // 使能 IAP
IAP_TPS = 12; // 設(shè)置擦除等待參數(shù) 12MHz
IAP_CMD = 2; // 設(shè)置 IAP 寫(xiě)命令
IAP_ADDRL = addr; // 設(shè)置 IAP 低地址
IAP_ADDRH = addr >> 8; // 設(shè)置 IAP 高地址
IAP_DATA = dat; // 寫(xiě) IAP 數(shù)據(jù)
IAP_TRIG = 0x5a; // 寫(xiě)觸發(fā)命令 (0x5a)
IAP_TRIG = 0xa5; // 寫(xiě)觸發(fā)命令 (0xa5)
_nop_();
IapIdle(); // 關(guān)閉 IAP 功能
}
/************************************/
void IapErase(int addr)
{
IAP_CONTR = 0x80; // 使能 IAP
IAP_TPS = 12; // 設(shè)置擦除等待參數(shù) 12MHz
IAP_CMD = 3; // 設(shè)置 IAP 擦除命令
IAP_ADDRL = addr; // 設(shè)置 IAP 低地址
IAP_ADDRH = addr >> 8; // 設(shè)置 IAP 高地址
IAP_TRIG = 0x5a; // 寫(xiě)觸發(fā)命令 (0x5a)
IAP_TRIG = 0xa5; // 寫(xiě)觸發(fā)命令 (0xa5)
_nop_(); //
IapIdle(); // 關(guān)閉 IAP 功能
}
/*-----------(1)延時(shí)子程序12MHz 加千百十個(gè)顯示--------*/
void Delay100ms(uint x) //
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<11000;j++);
}
/*************關(guān)所有輸出*******************************/
void reset_io()
{
P3M0=0X00;
P3M1=0X00;
P5M0=0X00;
P5M1=0X00;
DOWN=1; //氣缸下降
UP=1; //氣缸上升
INTPUT1=1; //
}
/************************************/
void main()
{
reset_io();
UP=0; //開(kāi)上升
DOWN=0; //下降
Delay100ms(20); //延時(shí)(10);
UP=1; //開(kāi)上升
DOWN=1; //下降
Delay100ms(20); //延時(shí)(10);
UP=0; //開(kāi)上升
DOWN=0; //下降
Delay100ms(20); //延時(shí)(10);
UP=1; //開(kāi)上升
DOWN=1; //下降
Delay100ms(20); //延時(shí)(10);
UP=0; //開(kāi)上升
DOWN=0; //下降
Delay100ms(20); //延時(shí)(10);
UP=1; //開(kāi)上升
DOWN=1; //下降
Delay100ms(20); //延時(shí)(10);
UP=0; //開(kāi)上升
DOWN=0; //下降
Delay100ms(20); //延時(shí)(10);
UP=1; //開(kāi)上升
DOWN=1; //下降
Delay100ms(20); //延時(shí)(10);
UP=0; //開(kāi)上升
DOWN=0; //下降
Delay100ms(20); //延時(shí)(10);
UP=1; //開(kāi)上升
DOWN=1; //下降
Delay100ms(20); //延時(shí)(10);
UP=0; //開(kāi)上升
DOWN=0; //下降
Delay100ms(20); //延時(shí)(10);
UP=1; //開(kāi)上升
DOWN=1; //下降
Delay100ms(20); //延時(shí)(10);
UartInit();
IapErase(0x1200);
UartSend(IapRead(0x1200));
IapProgram(0x1200, 0x12);
UartSend(IapRead(0x1200));
while (1)
{
UP=0; //開(kāi)上升
Delay100ms(200); //延時(shí)(10);
UP=1; //開(kāi)上升
Delay100ms(200); //延時(shí)(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;
/*------------發(fā)送串口數(shù)據(jù)----------------*/
void uart1_SendData(unsigned char dat)
{
SBUF = dat;
while (TI == 0);
TI = 0;
}
/*------------發(fā)送字符串------------------*/
void uart1_SendDataFrame(unsigned char *pDat)
{
while ((*pDat)!= '\0')
{
uart1_SendData(*pDat++);
}
}
/*
上位機(jī)發(fā)送0x55,LED亮,上位機(jī)發(fā)送0xAA,LED滅。
然后下位機(jī)收到正確的命令后,作出相對(duì)應(yīng)的相應(yīng)。
*/
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已點(diǎn)亮\r\n");
}
else if (0xAA == l_RevDat)
{
LED = 1;//LED滅
uart1_SendDataFrame("LED已熄滅\r\n");
}
else
{
uart1_SendDataFrame("指令錯(cuò)誤\r\n");
}
}
}
/************************************/
void main(void)
{
P3M0=0;
P3M1=0;
P5M0=0;
P5M1=0;
//使用內(nèi)部時(shí)鐘 燒錄軟件會(huì)幫我們配置好 如不懂 參考前面第3章系統(tǒng)設(shè)置學(xué)習(xí)。
// 燒錄軟件設(shè)置11.0592MHz為系統(tǒng)時(shí)鐘。以后我們的學(xué)習(xí)都是這個(gè)時(shí)鐘頻率。
P_SW2 |= (1<<7);
CKSEL = 0x00; //選擇內(nèi)部 IRC ( 默認(rèn) )
P_SW2 &= ~(1<<7);
//配置端口 對(duì)于控制我們系統(tǒng)板的LED,配置準(zhǔn)雙向口和推挽輸出都可以。
//只要是做為輸出,我建議全部設(shè)置為推挽輸出。
/*
PnM1.x PnM0.x Pn.x 口工作模式
0 0 準(zhǔn)雙向口
0 1 推挽輸出
1 0 高阻輸入
1 1 開(kāi)漏輸出
*/
P1M1 &= ~(1<<1); P1M0 |=(1<<1); //設(shè)置為推挽輸出
P_SW2 |= (1<<7);
P1PU = 0x00;//禁止P1端口內(nèi)部的 3.7K 上拉電阻
P1NCS = 0xFF; //禁止P1端口的施密特觸發(fā)功能。
P_SW2 &= ~(1<<7);
/*串口1相關(guān)配置*/
P_SW1 &= ~(1 << 6);P_SW1 &= ~(1 << 7); //串口 1 功能腳選擇位
SCON = 0x50; //模式1 可變波特率8位數(shù)據(jù)方式
PCON &= 0x3F; //串口 1 的各個(gè)模式的波特率都不加倍 無(wú)幀錯(cuò)檢測(cè)功能
AUXR |= (1 << 0); //選擇定時(shí)器 2 作為波特率發(fā)射器
AUXR &= ~(1 << 4);//定時(shí)器 2 停止計(jì)數(shù),配置完再打開(kāi)。
AUXR &= ~(1 << 3);//清0則用作定時(shí)器
AUXR &= ~(1 << 2);//12T 模式,即 CPU 時(shí)鐘 12 分頻( FOSC/12)
T2L = 0xE8; //12T 模式 9600
T2H = 0xFF;
IP |= (1<<4);//優(yōu)先級(jí)控制
IPH |= (1<<4);
AUXR |= (1 << 4); //啟動(dòng)定時(shí)器 2
ES = 1; //使能串口1中斷
EA = 1;//總中斷打開(kāi)
LED = 0;//LED滅
while (1)
{
uart1_SendData(100);
uart1_SendDataFrame("adfgss");
}
}
|
評(píng)分
-
查看全部評(píng)分
|