松翰单片机SN程序
松翰单片机SONIXSN8P2511程序模板

松翰单片机SONIXSN8P2511程序模板#define MAIN_GLOBAL#include "..\inc\config.h"#include "..\inc\SN8P2501B.h"//************************************************************* ***//// 主函数 //// 功能: 调用各个主函数 ////************************************************************* ***//void main(void){InitCPU();Ram_init();while(1){if(TimeFlag){TEST = !TEST;TimeFlag=0;Time_Fun();}_clrwdt();}}//************************************************************* ***//// 继电器输出 //// 功能: 工作输出 ////************************************************************* ***//void Work_Fun(void){;}//************************************************************* ***//// 硬件初始化 //// 功能: 硬件初始化输入输出定时器开关 AD初始化 ////************************************************************* ***//void InitCPU(void) //单片机初始化{FGIE=0; //关总中断//------------------------------I/O口输出--------------------------//---------------P0---------------FP00M=0;//// FP01M=1;//// FP02M = 0;// FP03M = 0;// FP04M=0;//P0UR = _0000_0001b;//---------------P1---------------FP10M=0;//// FP11M=0;//FP12M=1;// 输出FP13M=0;// 按键// FP14M=1;//// FP16M=1;//// FP15M=1;//// FP17M=1;//P1UR = _0000_1001b;//---------------P2---------------FP20M=0;//FP21M=0;//FP22M=0;//FP23M=0;//FP24M=0;//FP25M=0;//// FP26M=0;//// FP27M=1;//P2UR = _0011_1111b;//---------------P5---------------// FP50M=1;//// FP51M=1;//// FP52M=1;//// FP53M=0;//FP54M=1;//// P5UR = _0000_0000b;//------------------------------T0--------------------------------FT0ENB = 0;FT0IEN = 0;FT0IRQ = 0;T0M = 0X60;//时钟为FCPU/4T0C=7; //T0 间隔250uSFT0ENB = 1;FT0IEN = 1;FGIE=1; //开总中断}//************************************************************* ***//// 变量初始化函数 //// 功能: 对程序中的变量进行赋初值 ////************************************************************* ***//void Ram_init(void){_nop();_nop();Move_Key = 0x70;// Open_FLAG = 1;}//************************************************************* ***//// 走时函数 //// 功能: 对程序中计时功能进行计数和赋值 ////************************************************************* ***//void Time_Fun(void){static uchar Time_5ms_Cnt = 0,Time_10ms_Cnt =0,Time_200ms_Cnt = 0,Time_1S_Cnt = 0;static uchar Leave_Out_ID = 0,Leave_Out_Time_Cnt = 0,YiWei_ID = 0,Leave_Out_Cnt = 5;static uchar Move_IN_Cnt = 0;uchar tmp1;if(Leave_Data_Out_Flag){if(!Leave_Out_ID){Leave_Out_Time_Cnt ++;LEAVE_DATA_OUT_ON();if(Leave_Out_Time_Cnt > 8){Leave_Out_Time_Cnt = 0;Leave_Out_ID = 1;}}else if(Leave_Out_ID == 1){Leave_Out_Time_Cnt ++;LEAVE_DATA_OUT_OFF();if(Leave_Out_Time_Cnt > 5){Leave_Out_Time_Cnt = 0;Leave_Out_ID = 2;}}else if(Leave_Out_ID == 2){if(!Leave_Out_Time_Cnt){tmp1 = Leave_ID;tmp1 |= Move_Key;tmp1 >>= YiWei_ID;tmp1 &= 1;if(tmp1)Leave_Out_Time_Cnt = 0;elseLeave_Out_Time_Cnt = 2; YiWei_ID ++;if(YiWei_ID >= 9){Leave_Out_ID = 0;YiWei_ID = 0;Leave_Out_Time_Cnt = 0; Leave_Data_Out_Flag = 0;}}if(Leave_Data_Out_Flag){Leave_Out_Time_Cnt ++;if(Leave_Out_Time_Cnt <= 4) LEAVE_DATA_OUT_ON();else if(Leave_Out_Time_Cnt < 6) LEAVE_DATA_OUT_OFF();elseLeave_Out_Time_Cnt = 0;}}}Time_5ms_Cnt ++;if(Time_5ms_Cnt >= 5) //接收5ms去扫描{Time_5ms_Cnt = 0;if(MOVE_IN) //倾倒了{Move_IN_Cnt ++;if(Move_IN_Cnt >= 10){Move_IN_Cnt = 15;Move_Key = 0x80;Leave_ID = 0;}}else{if(!K8_IN)Leave_ID = 8;else if(!K7_IN)Leave_ID = 7;else if(!K6_IN)Leave_ID = 6;else if(!K5_IN)Leave_ID = 5;else if(!K4_IN)Leave_ID = 4;else if(!K3_IN)Leave_ID = 3;else if(!K2_IN)Leave_ID = 2;else if(!K1_IN)Leave_ID = 1;Move_IN_Cnt = 0;Move_Key = 0x70;}}Time_10ms_Cnt ++;if(Time_10ms_Cnt >= 10) //发送10MS去扫描{Time_10ms_Cnt = 0;}Time_200ms_Cnt ++;if(Time_200ms_Cnt >= 200){Time_200ms_Cnt = 0;if(!Leave_Data_Out_Flag){Leave_Out_Cnt ++;if(Leave_Out_Cnt >= 10){Leave_Out_Cnt = 0;Leave_Data_Out_Flag = 1;}}}}__interrupt isr1(void) //TC0定时器中断入口{static uchar Time1MS = 0;if(FT0IRQ) //TC0 //定时0.125ms{T0C=6; //T0 间隔250uSTime1MS ++;if(Time1MS >= 4) //1MS中断函数{Time1MS = 0;TimeFlag = 1;}}FT0IRQ = 0;}。
松翰选型手册

的 USB 类型
液 串 晶 口 显 示 SN8F22511B 10K 闪存 512 8 8 4 1 7/1 SSOP16 全速 USB2.0, 支持控制/ 3 中断 SN8F2251B 10K 闪存 512 8 8 4 1 7/0 采用 QFN16 全速 USB2.0, 支持控制/ 3 中断 SN8F22521B 10K 闪存 512 8 12 4 2 1 7/2 SOP20/SSOP20 全速 USB2.0, 支持控制/ 3 中断 SN8F22531B 10K 闪存 512 8 16 4 2 1 7/2 QFN24 全速 USB2.0, 支持控制/ 3 中断 SN8F2253B 10K 闪存 512 8 16 4 2 1 7/2 SOP24 全速 USB2.0, 支持控制/ 3 中断 SN8F2255B 10K 闪存 512 8 24 4 2 1 7/2 的 LQFP32 全速 USB2.0, 支持控制/ 3 中断 SN8F2271B 5K 闪光 192 8 10 2 1 5/1 采用 QFN16 低速 USB2.0 接口,支持控 制/ 2 中断 SN8F22721B 5K 闪光 192 8 14 2 1 1 5/2 DIP20/SOP20/SSOP20 低速 USB2.0 接口,支持控 制/ 2 中断 诠释 包 分机 其他特点
程序 零件编号 存储 器
RAM (8 位) 堆
的
ADC DAC 的
定 PWM 时 的蜂鸣 器 器
中断
IO 的
SN8F2280 系列
的 USB 类型
液 零件编号 程序存 RAM (8 储器 位) 堆 的 IO ADC 的 DAC 的 器 定 时 PWM 的 串 蜂鸣器 口 晶 显 示 中断诠 包 释分机 其他特点
如何用C来完成SN8系列芯片的程序设计

如何用C来完成SN8系列芯片的程序设计松翰易爱华松翰科技(深圳)有限公司SONIX TECHNOLOGY CO.,LTD.内容概览一、C 与Assembly简述二、SN8 C studio 的安装与使用2.1SN8 C studio 的安装2.2SN8 C studio应用实例三、数据类型与运算3.1专有数据类型3.2常量与变量3.3数据的存储类型与存储结构四、程序流程控制4.1顺序结构4.2分支判断结构4.3循环控制结构五、函数5.1函数的定义5.2函数参数传递与返回值5.3函数参数与全局变量六、结构体、联合在SN8 C程序中的应用6.1结构体6.2联合七、中断7.1中断函数的定义7.2中断过程的分析7.3中断函数的结构八、位操作8.1位的定义8.2位的运算8.3位比较在程序流程控制中的应用九、内嵌汇编9.1如何内嵌汇编9.2内嵌汇编时变量的传递十、程序结构10.1主函数与子函数10.2构建可复用文件10.3构建具有实用性的程序一、C 与Assembly 简述Assembly (汇编)的历史已经有半个多世纪了,从计算机的发明那天开始,汇编就注定要与其结缘,它作为第一种真正意义上的编程语言,在计算机的发展过程中具有无可替代的地位。
汇编具有与机器语言一一对应的高效率,就是由于汇编的高效率,和其紧贴硬件的特性,使其在半个世纪之后的今天依然是目前开发单片机程序的主流工具之一。
但是由于编写汇编代码的工作量和难度都比较高,并且要求程序员对硬件必须有较深刻的了解,其入门就相对较难。
而汇编的写法各异,不同的程序员编写的代码有着巨大的差异,这就带来了学习的难度,可读性差也成为了其推广的瓶颈,程序的维护更加艰难。
随着程序复杂性的增加,开发团队的形成,应用而生的高级语言就逐渐取代了其位置。
C 就是高级语言中针对硬件操作最优秀的一种,C 也是基于汇编的,其相互关系如图所示。
随着人们不断的对C 进行改善,使C 的效率得到了很大的提升,其编译效率逐渐的逼近汇编。
松翰2711源代码

//松翰2711程序2018年3月17日,2-7-6-4-8-4-2-9-2 校验码:#include<sn8p2711a.h>#define adc_Start 0X40#define adc_Enable 0x80#define adc_ch_Enable 0x10#define adc_cone 64#define sleep() __asm{SleepMode}unsigned int num,time,codetemp;unsigned int a,b,c,d,e,zc,k,zd0,zd1,zd2;unsigned long zd3;void delayms(unsigned long xms);/***********************************************************ADM 寄存器--------------------------------------------------|ADENB | ADS | EOC | GCHS | - |CHS2 |CHS1 |CHS0 ||------|-----|-----|------|----|-----|-----|-----|************************************************************/ void delayms(unsigned long xms){unsigned long i,j;for(i=xms;i>0;i--)for(j=100;j>0;j--);}void init(void){P0M |= 0x04; //P02 OutputP4M = 0x03; //P40 p41 OutputP5M |= 0x08; //P53 OutputP0UR = 0x04; //P02 P03 pull highP4UR = 0x03; //P41 p41 pull highP5UR = 0x08; //P53 pull highTC1M = 0xd1; //开启计时器,8时钟分频,256阶TC1C = 0xff; //计数255TC1R = 0x80; //调节PWM输出级数最小// TC0M = 0x81; //pwm时间周期设定// TC0C = 0xff;TC0R = 0x80; //控制pwm 占空比TC0M=0x20;TC0C=100;INTRQ=0x00;INTEN=0x20; //打开定时器0和外部中断0中断FGIE = 1;FTC0ENB = 1; //启动定时器d=4;FP40=1;FP02=1;FP41=1;}void main(void){init();while(1){a=0;b=1;while(b){a++;if(a>19){a=0;b--;}}FP02=!FP02;if(FP54==0){a=0;b=0;while(FP54==0){a++;if(a>19)//100us{a=0;b++;}}if((b>60)&&(b<130)){FP40=!FP40;for(a=0;a<5;a++);while(FP54==1);for(a=0;a<5;a++);for(zc=0;zc<4;zc++){for(k=0;k<8;k++){while(FP54==0);a=0;b=8;while(b){a++;if(a>19){a=0;b--;}}if (FP54==1){while(FP54==1);codetemp=codetemp|0x01;if(k<7) codetemp=codetemp<<1;}else if (FP54==0){if(k<7) codetemp=codetemp<<1;}}if(zc==0) zd0=codetemp;if(zc==1) zd1=codetemp;if(zc==2) zd2=codetemp;// if(zc==3) zd3=codetemp;codetemp=0;}a=0;b=230;/*解码成功,下面处理码值*/// if((zd1==0Xff)&&(zd2==0Xff)) R61=!R61;// if(zd2==0X40) R61=!R61;// if((zd0==0x00)&&(zd1==0xff)&&(zd2==0xd8)) R61=!R61; //if((zd0==0X80)&&(zd2==0X20)) R61=!R61;if(zd2==0x40){FP41=!FP41;}else if(zd2==0xa0){}else if(zd2==0xd8){}else if(zd2==0xe0){}else if(zd2==0x10){}else if(zd2==0x90){}while(b){if (FP54==0) b=200;a++;if(a>100){a=0;b--;}}}}}}void __interrupt [0x08] isr(void){if(FTC0IRQ==1){FTC0IRQ=0;TC0C=10;num++;if(num>252) num=0;}}。
课题_松翰SN8P2602B开发参考代码

本章选择了一些简单的C语言程序例题,这些程序的结构简单,编程技巧不多,题目虽然简单,但是非常适合入门单片机的学习者学习MSP430单片机的C 语言编程。
如下列出了C语言例题运行的MSP430F149实验板硬件资源环境,熟悉这些硬件资源,对于理解程序非常重要。
(1)数码管:左侧数码管与P5口相连,a~g,h对应P5.0~P5.7右侧数码管与P4口相连,a~g,h对应P4.0~P4.7(2)发光二极管8 个发光二极管与P3 口连接(3)按钮:左侧8个按钮与P2口相连,引脚号标在按钮上方右侧8个按钮与P1口相连,引脚号标在按钮上方(4)P2.3引脚还是模拟比较器输入(5)P6.0,P6.1引脚连接模拟量电位器,用于模拟量实验9.1 通过C 语言编程例入门MSP430C 语言编程如下例子都在MSP430F149实验板上通过验证。
例1:使与P3口的P3.0引脚连接的发光二极管闪烁。
#include <msp430x14x.h> //声明库void main(void) //主函数{unsigned int i; //变量声明WDTCTL=WDTPW+WDTHOLD; //关掉看门狗P3DIR |=BIT0; //设置P3.0为输出,这里BIT0=0x0001while(1) //无限次while循环{for (i=0;i<20000;i++) //for语句,i为循环变量,i每次循环加1,当i<20000时,//循环延时P3OUT=0x00; 使P3.0输出低电平,发光二极管亮,(低电平使发光二极管亮)for (i=0;i<20000;i++) //再次循环延时P3OUT=0x01; 使P3.0输出高电平,发光二极管灭,(高电平使发光二极管灭)}}例2:8个发光二极管1、3、5、7与2、4、6、8交替发光的例子#include <msp430x14x.h>void main(void){unsigned int i;WDTCTL=WDTPW+WDTHOLD;P3DIR=0XFF; //设置P3口为输出while(1){for (i=0;i<20000;i++)P3OUT=0X55; //使发光二极管1、3、5、7 灭,2、4、6、8亮for (i=0;i<20000;i++)P3OUT=0XAA;//使发光二极管1、3、5、7亮,2、4、6、8灭}}例3:定时器控制的发光二极管闪烁。
松翰单片机SN程序

#define MAIN_GLOBAL#include "..\inc\config.h"//*****************************************************************// // 主函数////*****************************************************************// void main(void){InitCPU();Ram_init();LED1_LEAVE_OFF();LED2_LEAVE_OFF();FGIE = 1;//开启中断while(1){_clrwdt();_nop();if(TimeFlag){TimeFlag=0;Time_Fun(); //基准时间函数}// Red_Fun();}}//*****************************************************************// // 继电器负载输出函数////*****************************************************************// void Work_scan(void){static uchar CaiDeng_Cnt = 0;if(Open_Flag && !Error_Flag){MOTOR2_ON();//同步电机if(Heat_Leave == 1){if(Fan_ON_Flag && !YanShi_Cnt)YanShi_Cnt = 4;else if(!Fan_ON_Flag){FENG_MOTOR1_ON();//风机Fan_ON_Flag = 1;}if(YanShi_Cnt >= 4){HEAT1_ON();Heat1_ON_Flag = 1;}HEAT2_OFF();Heat2_ON_Flag = 0;}else if(Heat_Leave == 2){if(Fan_ON_Flag && !YanShi_Cnt)YanShi_Cnt = 4;else if(!Fan_ON_Flag){FENG_MOTOR1_ON();//风机Fan_ON_Flag = 1;}if(YanShi_Cnt >= 4){HEAT1_ON();Heat1_ON_Flag = 1;}if(YanShi_Cnt >= 8){HEAT2_ON();Heat2_ON_Flag = 1;}}else{if(YanShi_Cnt >= 60){Fan_ON_Flag = 0;FENG_MOTOR1_OFF();}HEAT1_OFF();Heat1_ON_Flag = 0;HEAT2_OFF();Heat2_ON_Flag = 0;}if(CaiDeng_Leave == 1){LED_RED = 1;LED_GREEN = 0;LED_BLUE = 0;}else if(CaiDeng_Leave == 2){LED_RED = 0;LED_GREEN = 1;LED_BLUE = 0;}else if(CaiDeng_Leave == 3){LED_RED = 0;LED_GREEN = 0;LED_BLUE = 1;}else if(CaiDeng_Leave == 4){LED_RED = 1;LED_GREEN = 1;LED_BLUE = 1;}else if(CaiDeng_Leave == 5){if(!CaiDeng_Cnt){LED_RED = 1;LED_GREEN = 0;LED_BLUE = 0;}else if(CaiDeng_Cnt == 30){LED_RED = 0;LED_GREEN = 1;LED_BLUE = 0;}else if(CaiDeng_Cnt == 60){LED_RED = 0;LED_GREEN = 0;LED_BLUE = 1;}else if(CaiDeng_Cnt == 90){LED_RED = 1;LED_GREEN = 1;LED_BLUE = 1;}CaiDeng_Cnt ;if(CaiDeng_Cnt >= 120){CaiDeng_Cnt = 0;}}else{LED_RED = 0;LED_GREEN = 0;LED_BLUE = 0;}}else{MOTOR2_OFF();//同步电机HEAT1_OFF();//加热器1Heat1_ON_Flag = 0;HEAT2_OFF();//加热器2Heat2_ON_Flag = 0;LED1_LEAVE_OFF();//2档灯LED2_LEAVE_OFF();//1档灯LED_HUOYAN_OFF();//火焰LED_RED = 0;LED_GREEN = 0;LED_BLUE = 0;if(YanShi_Cnt >= 60 || Error_Flag){Fan_ON_Flag = 0;FENG_MOTOR1_OFF();//关闭风机}}}/***************************************************************** 红外输入判断函数__MAIN_EXTERN uchar Red_In_Cnt;//按键值__MAIN_EXTERN uchar Red_Data;//按键值__MAIN_EXTERN uchar Old_Red_Data;//按键值__MAIN_EXTERN uchar Red_ID;*****************************************************************/ void Red_Fun(void){// static uchar Red_Data_Bit_Cnt = 0;// TEST = !TEST;// if(Red_In_Cnt >= 100)// {// Red_ID = 0;// Red_Data = 0;// Red_Data_Bit_Cnt = 0;// Red_In_Cnt = 0;// }// if(!Red_ID)// {// if(RED_IN)// {// if(Red_In_Cnt >= 60&&Red_In_Cnt <= 84)// {// Red_ID = 1;// }// Red_In_Cnt = 0;// }// }// else if(Red_ID == 1)// {// if(!RED_IN)// {// if(Red_In_Cnt >= 26&&Red_In_Cnt <= 46)// {// Red_ID = 2;// }// else// Red_ID = 0;// Red_In_Cnt = 0;// }// }// else if(Red_ID == 2)// {// if(RED_IN)// Red_ID = 3;// Red_In_Cnt = 0;// }// if(Red_ID == 3)// {// if(!RED_IN)// {// if(Red_In_Cnt>=3)// {// Red_Data <<= 1;// if(Red_In_Cnt >=10)// Red_Data |= 1;// Red_Data_Bit_Cnt ;// if(Red_Data_Bit_Cnt == 8)// {// if(Red_Data != _0100_0000b) // {// Red_ID = 0;// Red_Data_Bit_Cnt = 0; // }// Red_Data = 0;// }// if(Red_Data_Bit_Cnt == 24)// {// Red_Down_Flag = 1;// Old_Red_Data = Red_Data; // Red_ID = 0;// Red_Data_Bit_Cnt = 0;// Red_Data = 0;// }// Red_In_Cnt = 0;// }// }// }}//*****************************************************************// // 时基走时函数////*****************************************************************// void Time_Fun(void){static uchar Time5MS_Cnt = 0,Time10MS_Cnt = 0,Time100MS_Cnt = 0,Time500MS_Cnt = 0;static uchar T10S_Cnt = 0,T30min_Cnt;static uchar Buzz_ON_Cnt = 0,Error_Cnt = 0,PingDao_Cnt = 0;Time5MS_Cnt ;if(Time5MS_Cnt >= 5) //5MS时间基准{Time5MS_Cnt = 0;// AD_fun();}Time10MS_Cnt ;if(Time10MS_Cnt >= 10) //10MS时间基准{Time10MS_Cnt = 0;KeyFun();// LedDisplay();if(Buzz_Flag){Buzz_ON_Cnt ;if(Buzz_ON_Cnt >= 15){Buzz_ON_Cnt=0;Buzz_Flag = 0;}}}Time100MS_Cnt ;if(Time100MS_Cnt >= 100)//100MS时间基准{Time100MS_Cnt = 0;Time500MS_Cnt ;if(Time500MS_Cnt >= 5){Time500MS_Cnt = 0;if(YanShi_Cnt <70){YanShi_Cnt ;}if(SanSuo_Time){SanSuo_Time --;}elseSanSuo_Flag = 0;if(YuYue_Time){T10S_Cnt ;if(T10S_Cnt >= 20)//10S{T10S_Cnt = 0;T30min_Cnt ;if(T30min_Cnt >= 180)//180=30分钟{T30min_Cnt = 0;YuYue_Time --;if(!YuYue_Time){Open_Flag = 0;Buzz_Flag = 1;Heat_Leave = 0;YanShi_Cnt = 0;HuoYan_Leave = 3;YuYue_Time = 0;}}}}}Work_scan();// if(!PINGDAO_IN)// {// PingDao_Cnt ;// if(PingDao_Cnt >= 10)// {// Error_Flag = 1;// Open_Flag = 0;// }// }if(Error_Flag){if(Error_Cnt <= 100)Error_Cnt ;if(Error_Cnt == 10||Error_Cnt == 20||Error_Cnt == 30){Buzz_Flag = 1;}}}}/*****************************************************************按键处理//--------------------按键值-----------------------------------#define RED_KEY_ON_OFF _1101_1000b #define RED_KEY_HEATER1 _0010_1000b#define RED_KEY_FLAME_UP _0110_1000b#define RED_KEY_TIME_0011_0000b#define RED_KEY_HEATER2 _0000_1000b #define RED_KEY_FLAME_DOWN _0100_1000b#define KEY_ON_OFF 1#define KEY_HEATER1 6#define KEY_FLAME_UP 5#define KEY_TIME 4#define KEY_HEATER2 3#define KEY_COLDURS 2*****************************************************************/ void KeyFun(void) //单片机初始化{static uchar Key_Cnt = 0;if(!Error_Flag){Scan_Key();if(Red_Down_Flag)//红外按键赋值{Red_Down_Flag = 0;switch(Old_Red_Data){case RED_KEY_ON_OFF:{Key_Data = KEY_ON_OFF;}break;case RED_KEY_HEATER1:{Key_Data = KEY_HEATER1;}break;case RED_KEY_FLAME_UP:{Key_Data = KEY_FLAME_UP;}break;case RED_KEY_TIME:{Key_Data = KEY_HEATER_OFF;}break;case RED_KEY_HEATER2:{Key_Data = KEY_HEATER2;}break;case RED_KEY_FLAME_DOWN:{Key_Data = KEY_COLDURS;}break;default:break;}Old_Red_Data = 0;}switch(Key_Data){case KEY_ON_OFF://开机按键{Buzz_Flag = 1;YanShi_Cnt = 0;if(!Open_Flag){Heat_Leave = 0;HuoYan_Leave = 3;CaiDeng_Leave = 0;YuYue_Time = 0;Open_Flag = 1;}else{Open_Flag = 0;}}break;case KEY_HEATER1://1档{if(Open_Flag){if(Heat_Leave != 1 ){Buzz_Flag = 1;YanShi_Cnt = 0;Heat_Leave = 1;LED1_LEAVE_ON();LED2_LEAVE_OFF();}}}break;case KEY_HEATER2://2档{if(Open_Flag){if(Heat_Leave != 2){Buzz_Flag = 1;if(!Heat_Leave){YanShi_Cnt = 0;}Heat_Leave = 2;LED2_LEAVE_ON();LED1_LEAVE_OFF();}}}break;case KEY_HEATER_OFF://加热关闭按键{if(Open_Flag){if(Heat_Leave){Buzz_Flag = 1;Heat_Leave = 0;YanShi_Cnt = 0;LED1_LEAVE_OFF();LED2_LEAVE_OFF();}}}break;case KEY_FLAME_UP://火焰 -{if(Open_Flag){Buzz_Flag = 1;HuoYan_Leave ;if(HuoYan_Leave >= 4)HuoYan_Leave = 1;}}break;case KEY_COLDURS://彩灯{if(Open_Flag){Buzz_Flag = 1;HuoYan_Leave = 2;CaiDeng_Leave ;if(CaiDeng_Leave >= 6)CaiDeng_Leave = 0;}}break;default:break;}Key_Data = 0;}}/*****************************************************************按键扫描*****************************************************************/void Scan_Key(void){static uchar Scan_Key_ID = 0;static uchar Key1_Out_Cnt = 0,Key2_Out_Cnt = 0,Key4_Out_Cnt = 0;static ucharScan_Key_data,Key1_Old_data,Key2_Old_data,Key4_Old_data;uchar i,Tmp;Scan_Key_ID ;if(Scan_Key_ID >= 3)Scan_Key_ID = 0;if(!Scan_Key_ID){KEY1_OUT();KEY2_IN();KEY3_IN();KEY4_IN();KEY1 = 0;for(i=0;i<50;i ){_nop();}Tmp = P0;Scan_Key_data = Tmp | _1011_1011b;if(Scan_Key_data==Key1_Old_data&&Scan_Key_data!=_1111_1111b){Key1_Out_Cnt ;if(Key1_Out_Cnt >= 50)Key1_Out_Cnt = 40;if(Key1_Out_Cnt == 3){if(Key1_Old_data == _1111_1011b)Key_Data = 1;else if(Key1_Old_data == _1011_1111b)Key_Data = 2;}}else{Key1_Old_data=Scan_Key_data;Key1_Out_Cnt = 0;}KEY1 = 1;}else if(Scan_Key_ID==1){KEY1_IN();KEY2_OUT();KEY3_IN();KEY4_IN();KEY2 = 0;for(i=0;i<50;i ){_nop();}Tmp = P0;Scan_Key_data = Tmp | _1010_1111b;if(Scan_Key_data==Key2_Old_data&&Scan_Key_data!=_1111_1111b) {Key2_Out_Cnt ;if(Key2_Out_Cnt >= 50)Key2_Out_Cnt = 40;if(Key2_Out_Cnt == 3){if(Key2_Old_data == _1110_1111b)Key_Data = 3;else if(Key2_Old_data == _1011_1111b)Key_Data = 4;}}else{Key2_Old_data=Scan_Key_data;Key2_Out_Cnt = 0;}KEY2 = 1;}else if(Scan_Key_ID==2){KEY1_IN();KEY2_IN();KEY3_IN();KEY4_OUT();KEY4 = 0;for(i=0;i<50;i ){_nop();}Tmp = P0;Scan_Key_data = Tmp | _1011_1101b;if(Scan_Key_data==Key4_Old_data&&Scan_Key_data!=_1111_1111b){Key4_Out_Cnt ;if(Key4_Out_Cnt >= 50)Key4_Out_Cnt = 40;if(Key4_Out_Cnt == 3){if(Key4_Old_data == _1111_1101b)Key_Data = 5;else if(Key4_Old_data == _1011_1111b)Key_Data = 6;}}else{Key4_Old_data=Scan_Key_data;Key4_Out_Cnt = 0;}KEY4 = 1;}}//*****************************************************************//// 硬件初始化////*****************************************************************// void InitCPU(void) //单片机初始化{FGIE=0; //关总中断//------------------------------P0-----------------FP00M=1;//红灯FP01M=1;//按键FP02M=1;//按键// FP03M=1;//FP04M=1;//按键FP05M=1;//蜂鸣器FP06M=0;//FP07M=1;//LED1档火焰P0UR =_0101_0110b;//P0 = 0;//------------------------------P4-----------------FP40M=1;//蓝灯FP41M=1;//温保开关FP42M=1;//同步电机FP43M=1;//火焰FP44M=1;//绿灯P4UR =0;//P4 = 0;//------------------------------P5-----------------FP50M=1;//LED2档火焰FP51M=0;//红外输入FP52M=1;//加热2FP53M=1;//加热1FP54M=1;//风机P5UR =0;//P5 = 0;//------------------------------T0--------------------------------// TC0M = 0X60;// T0C=6; //T0 间隔为16M,250uS// FALOAD0 = 1;// FTC0IEN=1; //允许响应T0 中断// FTC0IRQ=0; //T0 中断请求标志清零// FTC0ENB=1; //开启T0运行//------------------------------TC0--------------------------------TC0M = 0X64;//4分频TC0C=131; //T0 间隔为16M,250uSTC0R=131;FALOAD0 = 1;FTC0IEN=1; //允许响应T0 中断FTC0IRQ=0; //T0 中断请求标志清零FTC0ENB=1; //开启T0运行//-----------------------ADC---------------------------------------P4CON = _0001_0000b; //P41 P44为AD--纯模拟输入ADR = _0100_0000b;//时钟为FCPU/1 //4M时,转换时间为16uSFGIE=1; //开总中断}//*****************************************************************// // 变量初始化函数////*****************************************************************// void Ram_init(void){Buzz_Flag = 1;HuoYan_Leave = 3;Key_Data = 0;Error_Flag = 0;}/*****************************************************************中断函数*****************************************************************/__interrupt isr(void) //中断入口{static uchar Time1MS = 0;static uchar HuoYan_Cnt = 0,HuoYan_Leave_Data;static uchar WenBao_Cnt = 0,WenBao_ID = 0;static uchar Red_Data_Bit_Cnt = 0;if(FTC0IRQ) //TC0 //定时0.25ms{if(WenBao_Pin == WenBao_Pin_Flag){WenBao_Cnt ;}else{WenBao_Pin_Flag = WenBao_Pin;if(WenBao_Cnt >= 40&&WenBao_Cnt <= 120){WenBao_ID ;if(WenBao_ID >= 100){Error_Flag = 1;Open_Flag = 0;}}WenBao_Cnt = 0;}Red_In_Cnt ;if(Red_In_Cnt >= 100){Red_ID = 0;Red_Data = 0;Red_Data_Bit_Cnt = 0;Red_In_Cnt = 0;}if(!Red_ID){if(RED_IN){if(Red_In_Cnt >= 60&&Red_In_Cnt <= 84){Red_ID = 1;}Red_In_Cnt = 0;}}else if(Red_ID == 1){if(!RED_IN){if(Red_In_Cnt >= 26&&Red_In_Cnt <= 46){Red_ID = 2;}elseRed_ID = 0;Red_In_Cnt = 0;}}else if(Red_ID == 2){if(RED_IN)Red_ID = 3;Red_In_Cnt = 0;}else if(Red_ID == 3){if(!RED_IN){if(Red_In_Cnt>=3){Red_Data <<= 1;if(Red_In_Cnt >=8)Red_Data |= 1;Red_Data_Bit_Cnt ;if(Red_Data_Bit_Cnt == 8){if(Red_Data != _0100_0000b){Red_ID = 0;Red_Data_Bit_Cnt = 0;}Red_Data = 0;}if(Red_Data_Bit_Cnt == 24){Red_Down_Flag = 1;Old_Red_Data = Red_Data;Red_ID = 0;Red_Data_Bit_Cnt = 0;Red_Data = 0;}}Red_In_Cnt = 0;}}if(Buzz_Flag)BUZZ = !BUZZ;elseBUZZ_OFF();Time1MS ;if(Time1MS >= 8) //1MS中断函数{Time1MS = 0;TimeFlag = 1;}if(Open_Flag){HuoYan_Cnt ;if(HuoYan_Cnt >= 12){HuoYan_Leave_Data = HuoYan_Leave*4;HuoYan_Cnt = 0;}if(HuoYan_Cnt >= HuoYan_Leave_Data){LED_HUOYAN_OFF();}elseLED_HUOYAN_ON();}}//--------------------------------------------------INTRQ = 0;//-------------------------------------------------- }。
Sonix_松翰指令用户指南

单片机程序烧录的3种方式(ISP、ICP、IAP)是什么

单片机程序烧录的3种方式(ISP、ICP、IAP)是什么说起给单片机烧录程序,大家应该都不陌生吧,我最早接触单片机是从51单片机开始的,型号是STC89C52RC,当时烧录程序就是用的下面这种烧录软件——STC-ISP。
这种方式,通过串口连接单片机,选择一个合适的波特率就可以烧录了。
后来学习STM32,编程时使用KEIL软件自带的下载按钮就能下载程序,方便了不少,但需要额外使用J-Link等下载器。
再后来,接触到产品研发,给已经发布出的产品升级,都是要靠远程无线升级的(想想看,产品已经到客户那里了,当软件需要升级时,要是还使用有线的方式烧录程序,得有多麻烦)既然给单片机烧录程序的方式有多种,那烧录方式具体怎么分类呢?可以分为3种:ISP(In-System Programming)在系统编程,使用引导程序(Bootloader)加上外围UART/SPI等接口进行烧录。
ICP (In-circuit programmer)在电路编程,使用SWD/JTAG接口。
IAP(In-Application Programming)指MCU可以在系统中获取新代码并对自己重新编程,即用程序来改变程序。
这3种烧录方式的原理是什么呢?在分析原理之前,需要先了解一下单片机Flash的访问地址,看看程序是烧录到哪个位置了。
单片机Flash在地址映射表中位置下图是一张STM32F4xx的地址映射表,从0x0000 0000到0xFFFF FFFF,总计4Gbyte。
单片机的片上Flash、片上RAM、片上外设以及外部扩展接口的访问地址,都被映射到这4Gbyte的范围之内。
这张图中,我们需要先注意下半部分Main memory 主存储区通常,我们编写的代码,是放到主存储区的起始位置(0x0800 0000)开始运行的,烧录程序时,直接将程序烧录到这里即可(KEIL 软件给STM32烧录程序的默认烧写地址就是0x0800 0000开始)System memory系统存储区System memory(起始位置0x1FFF 000)是STM32在出厂时,由ST在这个区域内部预置了一段BootLoader,也就是我们常说的ISP程序,这是一块ROM,出厂后无法修改。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define MAIN_GLOBAL#include "..\inc\config.h"//*****************************************************************// // 主函数////*****************************************************************// void main(void){InitCPU();Ram_init();LED1_LEAVE_OFF();LED2_LEAVE_OFF();FGIE = 1;//开启中断while(1){_clrwdt();_nop();if(TimeFlag){TimeFlag=0;Time_Fun(); //基准时间函数}// Red_Fun();}}//*****************************************************************// // 继电器负载输出函数////*****************************************************************// void Work_scan(void){static uchar CaiDeng_Cnt = 0;if(Open_Flag && !Error_Flag){MOTOR2_ON();//同步电机if(Heat_Leave == 1){if(Fan_ON_Flag && !YanShi_Cnt)YanShi_Cnt = 4;else if(!Fan_ON_Flag){FENG_MOTOR1_ON();//风机Fan_ON_Flag = 1;}if(YanShi_Cnt >= 4){HEAT1_ON();Heat1_ON_Flag = 1;}HEAT2_OFF();Heat2_ON_Flag = 0;}else if(Heat_Leave == 2){if(Fan_ON_Flag && !YanShi_Cnt)YanShi_Cnt = 4;else if(!Fan_ON_Flag){FENG_MOTOR1_ON();//风机Fan_ON_Flag = 1;}if(YanShi_Cnt >= 4){HEAT1_ON();Heat1_ON_Flag = 1;}if(YanShi_Cnt >= 8){HEAT2_ON();Heat2_ON_Flag = 1;}}else{if(YanShi_Cnt >= 60){Fan_ON_Flag = 0;FENG_MOTOR1_OFF();}HEAT1_OFF();Heat1_ON_Flag = 0;HEAT2_OFF();Heat2_ON_Flag = 0;}if(CaiDeng_Leave == 1){LED_RED = 1;LED_GREEN = 0;LED_BLUE = 0;}else if(CaiDeng_Leave == 2){LED_RED = 0;LED_GREEN = 1;LED_BLUE = 0;}else if(CaiDeng_Leave == 3){LED_RED = 0;LED_GREEN = 0;LED_BLUE = 1;}else if(CaiDeng_Leave == 4){LED_RED = 1;LED_GREEN = 1;LED_BLUE = 1;}else if(CaiDeng_Leave == 5){if(!CaiDeng_Cnt){LED_RED = 1;LED_GREEN = 0;LED_BLUE = 0;}else if(CaiDeng_Cnt == 30){LED_RED = 0;LED_GREEN = 1;LED_BLUE = 0;}else if(CaiDeng_Cnt == 60){LED_RED = 0;LED_GREEN = 0;LED_BLUE = 1;}else if(CaiDeng_Cnt == 90){LED_RED = 1;LED_GREEN = 1;LED_BLUE = 1;}CaiDeng_Cnt ;if(CaiDeng_Cnt >= 120){CaiDeng_Cnt = 0;}}else{LED_RED = 0;LED_GREEN = 0;LED_BLUE = 0;}}else{MOTOR2_OFF();//同步电机HEAT1_OFF();//加热器1Heat1_ON_Flag = 0;HEAT2_OFF();//加热器2Heat2_ON_Flag = 0;LED1_LEAVE_OFF();//2档灯LED2_LEAVE_OFF();//1档灯LED_HUOYAN_OFF();//火焰LED_RED = 0;LED_GREEN = 0;LED_BLUE = 0;if(YanShi_Cnt >= 60 || Error_Flag){Fan_ON_Flag = 0;FENG_MOTOR1_OFF();//关闭风机}}}/***************************************************************** 红外输入判断函数__MAIN_EXTERN uchar Red_In_Cnt;//按键值__MAIN_EXTERN uchar Red_Data;//按键值__MAIN_EXTERN uchar Old_Red_Data;//按键值__MAIN_EXTERN uchar Red_ID;*****************************************************************/ void Red_Fun(void){// static uchar Red_Data_Bit_Cnt = 0;// TEST = !TEST;// if(Red_In_Cnt >= 100)// {// Red_ID = 0;// Red_Data = 0;// Red_Data_Bit_Cnt = 0;// Red_In_Cnt = 0;// }// if(!Red_ID)// {// if(RED_IN)// {// if(Red_In_Cnt >= 60&&Red_In_Cnt <= 84)// {// Red_ID = 1;// }// Red_In_Cnt = 0;// }// }// else if(Red_ID == 1)// {// if(!RED_IN)// {// if(Red_In_Cnt >= 26&&Red_In_Cnt <= 46)// {// Red_ID = 2;// }// else// Red_ID = 0;// Red_In_Cnt = 0;// }// }// else if(Red_ID == 2)// {// if(RED_IN)// Red_ID = 3;// Red_In_Cnt = 0;// }// if(Red_ID == 3)// {// if(!RED_IN)// {// if(Red_In_Cnt>=3)// {// Red_Data <<= 1;// if(Red_In_Cnt >=10)// Red_Data |= 1;// Red_Data_Bit_Cnt ;// if(Red_Data_Bit_Cnt == 8)// {// if(Red_Data != _0100_0000b) // {// Red_ID = 0;// Red_Data_Bit_Cnt = 0; // }// Red_Data = 0;// }// if(Red_Data_Bit_Cnt == 24)// {// Red_Down_Flag = 1;// Old_Red_Data = Red_Data; // Red_ID = 0;// Red_Data_Bit_Cnt = 0;// Red_Data = 0;// }// Red_In_Cnt = 0;// }// }// }}//*****************************************************************// // 时基走时函数////*****************************************************************// void Time_Fun(void){static uchar Time5MS_Cnt = 0,Time10MS_Cnt = 0,Time100MS_Cnt = 0,Time500MS_Cnt = 0;static uchar T10S_Cnt = 0,T30min_Cnt;static uchar Buzz_ON_Cnt = 0,Error_Cnt = 0,PingDao_Cnt = 0;Time5MS_Cnt ;if(Time5MS_Cnt >= 5) //5MS时间基准{Time5MS_Cnt = 0;// AD_fun();}Time10MS_Cnt ;if(Time10MS_Cnt >= 10) //10MS时间基准{Time10MS_Cnt = 0;KeyFun();// LedDisplay();if(Buzz_Flag){Buzz_ON_Cnt ;if(Buzz_ON_Cnt >= 15){Buzz_ON_Cnt=0;Buzz_Flag = 0;}}}Time100MS_Cnt ;if(Time100MS_Cnt >= 100)//100MS时间基准{Time100MS_Cnt = 0;Time500MS_Cnt ;if(Time500MS_Cnt >= 5){Time500MS_Cnt = 0;if(YanShi_Cnt <70){YanShi_Cnt ;}if(SanSuo_Time){SanSuo_Time --;}elseSanSuo_Flag = 0;if(YuYue_Time){T10S_Cnt ;if(T10S_Cnt >= 20)//10S{T10S_Cnt = 0;T30min_Cnt ;if(T30min_Cnt >= 180)//180=30分钟{T30min_Cnt = 0;YuYue_Time --;if(!YuYue_Time){Open_Flag = 0;Buzz_Flag = 1;Heat_Leave = 0;YanShi_Cnt = 0;HuoYan_Leave = 3;YuYue_Time = 0;}}}}}Work_scan();// if(!PINGDAO_IN)// {// PingDao_Cnt ;// if(PingDao_Cnt >= 10)// {// Error_Flag = 1;// Open_Flag = 0;// }// }if(Error_Flag){if(Error_Cnt <= 100)Error_Cnt ;if(Error_Cnt == 10||Error_Cnt == 20||Error_Cnt == 30){Buzz_Flag = 1;}}}}/*****************************************************************按键处理//--------------------按键值-----------------------------------#define RED_KEY_ON_OFF _1101_1000b #define RED_KEY_HEATER1 _0010_1000b#define RED_KEY_FLAME_UP _0110_1000b#define RED_KEY_TIME_0011_0000b#define RED_KEY_HEATER2 _0000_1000b #define RED_KEY_FLAME_DOWN _0100_1000b#define KEY_ON_OFF 1#define KEY_HEATER1 6#define KEY_FLAME_UP 5#define KEY_TIME 4#define KEY_HEATER2 3#define KEY_COLDURS 2*****************************************************************/ void KeyFun(void) //单片机初始化{static uchar Key_Cnt = 0;if(!Error_Flag){Scan_Key();if(Red_Down_Flag)//红外按键赋值{Red_Down_Flag = 0;switch(Old_Red_Data){case RED_KEY_ON_OFF:{Key_Data = KEY_ON_OFF;}break;case RED_KEY_HEATER1:{Key_Data = KEY_HEATER1;}break;case RED_KEY_FLAME_UP:{Key_Data = KEY_FLAME_UP;}break;case RED_KEY_TIME:{Key_Data = KEY_HEATER_OFF;}break;case RED_KEY_HEATER2:{Key_Data = KEY_HEATER2;}break;case RED_KEY_FLAME_DOWN:{Key_Data = KEY_COLDURS;}break;default:break;}Old_Red_Data = 0;}switch(Key_Data){case KEY_ON_OFF://开机按键{Buzz_Flag = 1;YanShi_Cnt = 0;if(!Open_Flag){Heat_Leave = 0;HuoYan_Leave = 3;CaiDeng_Leave = 0;YuYue_Time = 0;Open_Flag = 1;}else{Open_Flag = 0;}}break;case KEY_HEATER1://1档{if(Open_Flag){if(Heat_Leave != 1 ){Buzz_Flag = 1;YanShi_Cnt = 0;Heat_Leave = 1;LED1_LEAVE_ON();LED2_LEAVE_OFF();}}}break;case KEY_HEATER2://2档{if(Open_Flag){if(Heat_Leave != 2){Buzz_Flag = 1;if(!Heat_Leave){YanShi_Cnt = 0;}Heat_Leave = 2;LED2_LEAVE_ON();LED1_LEAVE_OFF();}}}break;case KEY_HEATER_OFF://加热关闭按键{if(Open_Flag){if(Heat_Leave){Buzz_Flag = 1;Heat_Leave = 0;YanShi_Cnt = 0;LED1_LEAVE_OFF();LED2_LEAVE_OFF();}}}break;case KEY_FLAME_UP://火焰 -{if(Open_Flag){Buzz_Flag = 1;HuoYan_Leave ;if(HuoYan_Leave >= 4)HuoYan_Leave = 1;}}break;case KEY_COLDURS://彩灯{if(Open_Flag){Buzz_Flag = 1;HuoYan_Leave = 2;CaiDeng_Leave ;if(CaiDeng_Leave >= 6)CaiDeng_Leave = 0;}}break;default:break;}Key_Data = 0;}}/*****************************************************************按键扫描*****************************************************************/void Scan_Key(void){static uchar Scan_Key_ID = 0;static uchar Key1_Out_Cnt = 0,Key2_Out_Cnt = 0,Key4_Out_Cnt = 0;static ucharScan_Key_data,Key1_Old_data,Key2_Old_data,Key4_Old_data;uchar i,Tmp;Scan_Key_ID ;if(Scan_Key_ID >= 3)Scan_Key_ID = 0;if(!Scan_Key_ID){KEY1_OUT();KEY2_IN();KEY3_IN();KEY4_IN();KEY1 = 0;for(i=0;i<50;i ){_nop();}Tmp = P0;Scan_Key_data = Tmp | _1011_1011b;if(Scan_Key_data==Key1_Old_data&&Scan_Key_data!=_1111_1111b){Key1_Out_Cnt ;if(Key1_Out_Cnt >= 50)Key1_Out_Cnt = 40;if(Key1_Out_Cnt == 3){if(Key1_Old_data == _1111_1011b)Key_Data = 1;else if(Key1_Old_data == _1011_1111b)Key_Data = 2;}}else{Key1_Old_data=Scan_Key_data;Key1_Out_Cnt = 0;}KEY1 = 1;}else if(Scan_Key_ID==1){KEY1_IN();KEY2_OUT();KEY3_IN();KEY4_IN();KEY2 = 0;for(i=0;i<50;i ){_nop();}Tmp = P0;Scan_Key_data = Tmp | _1010_1111b;if(Scan_Key_data==Key2_Old_data&&Scan_Key_data!=_1111_1111b) {Key2_Out_Cnt ;if(Key2_Out_Cnt >= 50)Key2_Out_Cnt = 40;if(Key2_Out_Cnt == 3){if(Key2_Old_data == _1110_1111b)Key_Data = 3;else if(Key2_Old_data == _1011_1111b)Key_Data = 4;}}else{Key2_Old_data=Scan_Key_data;Key2_Out_Cnt = 0;}KEY2 = 1;}else if(Scan_Key_ID==2){KEY1_IN();KEY2_IN();KEY3_IN();KEY4_OUT();KEY4 = 0;for(i=0;i<50;i ){_nop();}Tmp = P0;Scan_Key_data = Tmp | _1011_1101b;if(Scan_Key_data==Key4_Old_data&&Scan_Key_data!=_1111_1111b){Key4_Out_Cnt ;if(Key4_Out_Cnt >= 50)Key4_Out_Cnt = 40;if(Key4_Out_Cnt == 3){if(Key4_Old_data == _1111_1101b)Key_Data = 5;else if(Key4_Old_data == _1011_1111b)Key_Data = 6;}}else{Key4_Old_data=Scan_Key_data;Key4_Out_Cnt = 0;}KEY4 = 1;}}//*****************************************************************//// 硬件初始化////*****************************************************************// void InitCPU(void) //单片机初始化{FGIE=0; //关总中断//------------------------------P0-----------------FP00M=1;//红灯FP01M=1;//按键FP02M=1;//按键// FP03M=1;//FP04M=1;//按键FP05M=1;//蜂鸣器FP06M=0;//FP07M=1;//LED1档火焰P0UR =_0101_0110b;//P0 = 0;//------------------------------P4-----------------FP40M=1;//蓝灯FP41M=1;//温保开关FP42M=1;//同步电机FP43M=1;//火焰FP44M=1;//绿灯P4UR =0;//P4 = 0;//------------------------------P5-----------------FP50M=1;//LED2档火焰FP51M=0;//红外输入FP52M=1;//加热2FP53M=1;//加热1FP54M=1;//风机P5UR =0;//P5 = 0;//------------------------------T0--------------------------------// TC0M = 0X60;// T0C=6; //T0 间隔为16M,250uS// FALOAD0 = 1;// FTC0IEN=1; //允许响应T0 中断// FTC0IRQ=0; //T0 中断请求标志清零// FTC0ENB=1; //开启T0运行//------------------------------TC0--------------------------------TC0M = 0X64;//4分频TC0C=131; //T0 间隔为16M,250uSTC0R=131;FALOAD0 = 1;FTC0IEN=1; //允许响应T0 中断FTC0IRQ=0; //T0 中断请求标志清零FTC0ENB=1; //开启T0运行//-----------------------ADC---------------------------------------P4CON = _0001_0000b; //P41 P44为AD--纯模拟输入ADR = _0100_0000b;//时钟为FCPU/1 //4M时,转换时间为16uSFGIE=1; //开总中断}//*****************************************************************// // 变量初始化函数////*****************************************************************// void Ram_init(void){Buzz_Flag = 1;HuoYan_Leave = 3;Key_Data = 0;Error_Flag = 0;}/*****************************************************************中断函数*****************************************************************/__interrupt isr(void) //中断入口{static uchar Time1MS = 0;static uchar HuoYan_Cnt = 0,HuoYan_Leave_Data;static uchar WenBao_Cnt = 0,WenBao_ID = 0;static uchar Red_Data_Bit_Cnt = 0;if(FTC0IRQ) //TC0 //定时0.25ms{if(WenBao_Pin == WenBao_Pin_Flag){WenBao_Cnt ;}else{WenBao_Pin_Flag = WenBao_Pin;if(WenBao_Cnt >= 40&&WenBao_Cnt <= 120){WenBao_ID ;if(WenBao_ID >= 100){Error_Flag = 1;Open_Flag = 0;}}WenBao_Cnt = 0;}Red_In_Cnt ;if(Red_In_Cnt >= 100){Red_ID = 0;Red_Data = 0;Red_Data_Bit_Cnt = 0;Red_In_Cnt = 0;}if(!Red_ID){if(RED_IN){if(Red_In_Cnt >= 60&&Red_In_Cnt <= 84){Red_ID = 1;}Red_In_Cnt = 0;}}else if(Red_ID == 1){if(!RED_IN){if(Red_In_Cnt >= 26&&Red_In_Cnt <= 46){Red_ID = 2;}elseRed_ID = 0;Red_In_Cnt = 0;}}else if(Red_ID == 2){if(RED_IN)Red_ID = 3;Red_In_Cnt = 0;}else if(Red_ID == 3){if(!RED_IN){if(Red_In_Cnt>=3){Red_Data <<= 1;if(Red_In_Cnt >=8)Red_Data |= 1;Red_Data_Bit_Cnt ;if(Red_Data_Bit_Cnt == 8){if(Red_Data != _0100_0000b){Red_ID = 0;Red_Data_Bit_Cnt = 0;}Red_Data = 0;}if(Red_Data_Bit_Cnt == 24){Red_Down_Flag = 1;Old_Red_Data = Red_Data;Red_ID = 0;Red_Data_Bit_Cnt = 0;Red_Data = 0;}}Red_In_Cnt = 0;}}if(Buzz_Flag)BUZZ = !BUZZ;elseBUZZ_OFF();Time1MS ;if(Time1MS >= 8) //1MS中断函数{Time1MS = 0;TimeFlag = 1;}if(Open_Flag){HuoYan_Cnt ;if(HuoYan_Cnt >= 12){HuoYan_Leave_Data = HuoYan_Leave*4;HuoYan_Cnt = 0;}if(HuoYan_Cnt >= HuoYan_Leave_Data){LED_HUOYAN_OFF();}elseLED_HUOYAN_ON();}}//--------------------------------------------------INTRQ = 0;//-------------------------------------------------- }。