欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STC15W408AS單片機串口通訊帶串口移植功能+ADC采集+定時器+EEPROM綜合程序
[打印本頁]
作者:
zhangxinchun
時間:
2023-7-11 13:07
標題:
STC15W408AS單片機串口通訊帶串口移植功能+ADC采集+定時器+EEPROM綜合程序
【聲明】此程序僅用于學習與參考!
*********************************************************************/
#include<STC15W408AS.h>
#include<math.h> //計算小數點的頭文件
#include <intrins.h> //用nop函數延時的頭文件
#define uchar unsigned char//宏定義無符號字符型
#define uint unsigned int //宏定義無符號整型
/*數據類型定義*/
typedef signed char int8;
typedef signed int int16;
typedef signed long int32;
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
#define S1_S0 0x40 //P_SW3.6
#define S1_S1 0x80 //P_SW3.7
#define ENABLE_IAP 0x83 //系統工作時鐘<12MHz 時,對IAP_CONTR 寄存器設置此值
#define CMD_IDLE 0
#define CMD_READ 1
#define CMD_PROGRAM 2
#define CMD_ERASE 3
#define ENABLE_IAP 0x83//SYSCLK<12MH
#define IAP_ADDRESS 0x0000 //存儲地址
#define FOSC 11059200L
#define BAUD 9600
#define ADC_POWER 0x80 //ADC電源控制位
#define ADC_FLAG 0x10 //ADC完成標志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540個時鐘
#define ADC_SPEEDL 0x20 //360個時鐘
#define ADC_SPEEDH 0x40 //180個時鐘
#define ADC_SPEEDHH 0x60 //90個時鐘
uint AD_H=0,AD_L=0,AD_Dat=0;
/*定義遙控引腳*/
sbit IN1 = P1^2; /*下*/
sbit IN2 = P1^3; /*上*/
sbit IN3 = P1^4; /*西*/
sbit IN4 = P1^5; /*東*/
sbit IN5 = P1^6; /*北*/
sbit IN6 = P1^7; /*南*/
sbit IN7 = P5^4; /*2*/
sbit IN8 = P5^5; /*1*/
/*AD采集引腳*/
sbit ADC1=P1^1;//電池電壓檢測
/*供電自鎖引腳*/
sbit gong_dian=P1^0;//電池電壓檢測
/*指示燈引腳*/
sbit RUN=P3^2;//運行指示燈
sbit dian_chi=P3^3;//電池指示燈
/*控制引腳*/
sbit MD0=P3^4;//工作模式
sbit MD1=P3^5;//工作模式
uchar DATE=0x00;//遙控器按鍵
uchar add=0X01; //遙控器地址
bit write=0;
bit flag_zx=0;
uchar sendBuf[10]; //發送緩沖區
uchar receBuf[10]; //接收緩沖區
uchar r=0;//串口接收數據計數值
uint tcnt=0;//定時器時間計數值
uchar sec=0;//定時器時間計數值
uchar k=100;//延時函數時間函數
bit bz1=0;//輸入按鍵標志
bit bz2=0;//輸入按鍵標志
bit bz3=0;//輸入按鍵標志
bit bz4=0;//輸入按鍵標志
bit bz5=0;//輸入按鍵標志
bit bz6=0;//輸入按鍵標志
bit bz7=0;//輸入按鍵標志
bit bz8=0;//輸入按鍵標志
bit dian_liang_bj=0;//電量報警
bit fa_she_bj=0;//數據發射標志
uchar adc1=0;//AD采集的數據值
/********************************************************************
定義 ISP/IAP/EEPROM 命令
*********************************************************************/
void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 單片機 在 一 安全 狀態
uint8 IapReadByte(uint16 addr);//讀數據
void IapProgramByte(uint16 addr, uint8 dat);//寫數據
void IapEraseSector(uint16 addr);//擦除數據
void KEY1();//模式1函數
void delay(uchar t);//擦除數據
void clear_receBuf();//清空發送緩沖區
void send_date1();//數據函數
void senduart1();//發送函數
void InitADC();//AD轉換初始化程序
uchar ADCRead(uchar px); //轉換輸出的數據 (PX為通道口)
/********************************************************************
AD轉換初始化程序
*********************************************************************/
void InitADC()//AD轉換初始化程序
{
P1ASF = 0x02; //設置P1.1口AD轉換,必須加// P1M0=0X1E;
ADC_RES = 0; //AD數據寄存器清空
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;//打開AD電源,轉換周期210
_nop_(); //延時一個機器周期
_nop_();
_nop_(); //延時一個機器周期
}
/********************************************************************
AD轉換控制程序
*********************************************************************/
uchar ADCRead(uchar px) //轉換輸出的數據 (PX為通道口)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL |px| ADC_START;//開始轉換
_nop_(); //延時一個機器周期
_nop_(); //延時一個機器周期
_nop_(); //延時一個機器周期
_nop_(); //延時一個機器周期
while (!(ADC_CONTR & ADC_FLAG));//等待轉換結束
ADC_CONTR &= ~ADC_FLAG; //關閉AD轉換
// AD_H = ADC_RES; // 修改的 注:把高8位AD值付給AD_H
// AD_H <<= 2; // 修改的 注:高八位左移2位
// AD_L = ADC_RESL & 0x03; // 修改的 注:取低兩位
// AD_Dat = AD_H | AD_L; // 修改的 注:把高八位和低兩位合并在一起
// AD_Dat = AD_H | AD_L; // 修改的 注:把高八位和低兩位合并在一起
AD_Dat = ADC_RES;
return AD_Dat; //返回數據
}
/********************************************************************
延時函數
*********************************************************************/
void delay(uchar t)
{
uchar i,j;
for(i=0;i<t;i++)
{
for(j=130;j>0;j--);
{ ;
}
}
}
/****************數據函數*********************/
void send_date1()//數據函數
{
adc1=ADCRead(1);
sendBuf[0]=0xAA;
sendBuf[1]=add;
sendBuf[2]=adc1;
sendBuf[3]=DATE;
sendBuf[4]=0xBB;
}
/****************發送函數*********************/
void senduart1()//發送函數
{
SBUF=sendBuf[0];while(!TI);TI=0;
SBUF=sendBuf[1];while(!TI);TI=0;
SBUF=sendBuf[2];while(!TI);TI=0;
SBUF=sendBuf[3];while(!TI);TI=0;
SBUF=sendBuf[4];while(!TI);TI=0;
}
/********************************************************************
模式1函數
*********************************************************************/
void KEY1()
{
//if(gong_dian==0){gong_dian=0;}
if((IN1==0)&&(bz1==0)){delay(k);if((IN1==0)&&(bz1==0)){fa_she_bj=1;DATE=0x01;send_date1();senduart1();bz1=1;}}if((IN1==1)&&(bz1==1)){delay(k);if((IN1==1)&&(bz1==1)){bz1=0;fa_she_bj=0;}}//輸入按鍵
if((IN2==0)&&(bz2==0)){delay(k);if((IN2==0)&&(bz2==0)){fa_she_bj=1;DATE=0x02;send_date1();senduart1();bz2=1;}}if((IN2==1)&&(bz2==1)){delay(k);if((IN2==1)&&(bz2==1)){bz2=0;fa_she_bj=0;}}//輸入按鍵
if((IN3==0)&&(bz3==0)){delay(k);if((IN3==0)&&(bz3==0)){fa_she_bj=1;DATE=0x03;send_date1();senduart1();bz3=1;}}if((IN3==1)&&(bz3==1)){delay(k);if((IN3==1)&&(bz3==1)){bz3=0;fa_she_bj=0;}}//輸入按鍵
if((IN4==0)&&(bz4==0)){delay(k);if((IN4==0)&&(bz4==0)){fa_she_bj=1;DATE=0x04;send_date1();senduart1();bz4=1;}}if((IN4==1)&&(bz4==1)){delay(k);if((IN4==1)&&(bz4==1)){bz4=0;fa_she_bj=0;}}//輸入按鍵
if((IN5==0)&&(bz5==0)){delay(k);if((IN5==0)&&(bz5==0)){fa_she_bj=1;DATE=0x05;send_date1();senduart1();bz5=1;}}if((IN5==1)&&(bz5==1)){delay(k);if((IN5==1)&&(bz5==1)){bz5=0;fa_she_bj=0;}}//輸入按鍵
if((IN6==0)&&(bz6==0)){delay(k);if((IN6==0)&&(bz6==0)){fa_she_bj=1;DATE=0x06;send_date1();senduart1();bz6=1;}}if((IN6==1)&&(bz6==1)){delay(k);if((IN6==1)&&(bz6==1)){bz6=0;fa_she_bj=0;}}//輸入按鍵
if((IN7==0)&&(bz7==0)){delay(k);if((IN7==0)&&(bz7==0)){fa_she_bj=1;DATE=0x07;send_date1();senduart1();bz7=1;}}if((IN7==1)&&(bz7==1)){delay(k);if((IN7==1)&&(bz7==1)){bz7=0;fa_she_bj=0;}}//輸入按鍵
if((IN8==0)&&(bz8==0)){delay(k);if((IN8==0)&&(bz8==0)){fa_she_bj=1;DATE=0x08;send_date1();senduart1();bz8=1;}}if((IN8==1)&&(bz8==1)){delay(k);if((IN8==1)&&(bz8==1)){bz8=0;fa_she_bj=0;}}//輸入按鍵
//if((IN1==0)||(IN2==0)||(IN3==0)||(IN4==0)||(IN5==0)||(IN6==0)||(IN7==0)||(IN8==0)){RUN=0;}
if(dian_liang_bj==0)
{
if((IN1==1)&&(IN2==1)&&(IN3==1)&&(IN4==1)&&(IN5==1)&&(IN6==1)&&(IN7==1)&&(IN8==1)){RUN=0;}//電量正常時綠燈亮
}
else{RUN=1;dian_chi;sec=0;}//當電池電量低時,紅燈亮
}
/********************************************************************
定時中斷服務函數
*********************************************************************/
void t0(void) interrupt 1 using 0 //定時中斷服務函數
{
tcnt++; //每過250ust tcnt 加一
if(tcnt==400) //計滿400 次(1/10 秒)時
{
tcnt=0; //重新再計
sec++;
if(dian_liang_bj==0){if(fa_she_bj==1){if(sec>=1){RUN=!RUN;sec=0;}}}
if(dian_liang_bj==1){if(sec>=20){dian_chi=!dian_chi;sec=0;}}
//if(sec==10){RUN=!RUN;sec=0;}
//if(sec>=20){dian_chi=!dian_chi;sec=0;}
}
}
/*****************清空發送緩沖區*************************/
void clear_receBuf()
{
uchar i;
for(i=0;i<5;i++)
{
receBuf[i]=0;
}
}
/********************************************************************
主函數
*********************************************************************/
void main()
{
P1M0 = 0x00; P1M1 = 0x02; //IO定義
P3M0 = 0x00; P3M1 = 0x00; //IO定義
SCON = 0x50;
T2L = (65536 - (FOSC/4/BAUD));
T2H = (65536 - (FOSC/4/BAUD))>>8;
AUXR = 0x14;
AUXR |= 0x01;
ES = 1;
EA = 1;
add= IapReadByte(0x01);//讀取存儲的值
if(add>=100){add=1;}
//sj2= IapReadByte(0x02);//讀取存儲的值
TMOD=0x02; //定時器工作在方式2
TH0=0x06; //對TH0 TL0 賦值
TL0=0x06;
TR0=1; //開始定時
ET0=1;
EA=1;
/*串口移植*/
ACC = P_SW1;
ACC &= ~(S1_S0 | S1_S1); //S1_S0=1 S1_S1=0
ACC |= S1_S0; //(P3.6/RxD_2, P3.7/TxD_2)
P_SW1 = ACC;
InitADC();//AD轉換初始化程序
sec=0;
MD0 = 0;//工作模式
MD1 = 0;//工作模式
gong_dian=0;
while(1)
{
KEY1();//按鍵函數
if(write==1) //修改板子地址
{
write=0;
add=1;
IapEraseSector(0); //擦除扇區
IapProgramByte(0x01,add);//寫入新的地址
//IapProgramByte(0x02,sj2);//寫入新的地址
}
}
}
/********************************************************************
串口中斷函數
*********************************************************************/
void Uart() interrupt 4 using 1
{
if (RI)
{
RI=0; //接收標志清零
receBuf[r++&0x0F]=SBUF; //把接受的數據存儲到BUT數組中
if(receBuf[0]!=0xaa){r=0;}
if(r>=5)
{ r=0;
flag_zx=1;
}
}
if(flag_zx==1)
{
flag_zx=0;
if((receBuf[0]==0xaa)&&(receBuf[1]==0x00)&&(receBuf[2]==0x00)&&(receBuf[3]==0x00)&&(receBuf[4]==0xbb))
{
write=1;
sendBuf[0]=0xaa;
sendBuf[1]=add;
sendBuf[2]=0x00;
sendBuf[3]=0x00;
sendBuf[4]=0xbb;
senduart1();
}
if((receBuf[0]==0xaa)&&(receBuf[1]==0xff)&&(receBuf[2]==0xff)&&(receBuf[3]==0xff)&&(receBuf[4]==0xbb))
{
sendBuf[0]=0xaa;
sendBuf[1]=add;
sendBuf[2]=0xff;
sendBuf[3]=0xff;
sendBuf[4]=0xbb;
senduart1();
}
clear_receBuf();
}
}
/********************************************************************
結束
*********************************************************************/
void IapIdle(){//禁用 ISP/IAP/EEPROM functionmake 單片機 在 一 安全 狀態
IAP_CONTR = 0; //
IAP_CMD = 0; //
IAP_TRIG = 0; //
IAP_ADDRH = 0x80; //
IAP_ADDRL = 0; //
}
uint8 IapReadByte(uint16 addr){//讀數據
uint8 dat;
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_READ;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
_nop_();
dat = IAP_DATA;
IapIdle();
return dat;
}
void IapProgramByte(uint16 addr, uint8 dat){//寫數據
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_PROGRAM;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_DATA = dat;
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
_nop_();
IapIdle();
}
void IapEraseSector(uint16 addr){//擦除數據
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_ERASE;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;
_nop_();
IapIdle();
}
/********************************************************************
結束
*********************************************************************/
復制代碼
STC15W408AS 串口 ADC 定時器 EEPROM.rar
2023-7-11 13:07 上傳
點擊文件名下載附件
57.87 KB, 下載次數: 121
Keil代碼
作者:
jovew
時間:
2023-7-12 07:35
好東西! 只是還沒有看明白。學習之。
作者:
13869300
時間:
2023-10-28 19:42
好東西,正在學習下載看看
作者:
STC新未來
時間:
2023-10-30 09:53
感謝樓主的精彩分享,非常的權威!后續若需要更多的案例可參考ISP軟件上的范例程序
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1