松翰单片机 SN8F5702程序例程
#include <stdio.h>#include "SN8F5702.h"#include <intrins.h> // for _nop_void InitCPU(void); //单片机初始化void Ram_init(void); //全局变量赋值void Time_Fun(void); //基准走时函数void SYSIspStart(unsigned int pageAddress);//----------------------字节全局变量-------------------------------u8 idata ISP_RAM[32] ; // IRAM 0xE0 to 0xFF#define WenDu_Up ISP_RAM[1]#define WenDu_Down ISP_RAM[2]#define WenDu_Cha ISP_RAM[3]// u8 WenDu_Up;// u8 WenDu_Down;u8 WenDu_HJ;u8 ADC_WenDu_HJ;u8 AD_key;u8 Time_500ms_Cnt;u8 Temp_ChaZhi_ID;//0显示环境温度,1显示差值闪烁u8 SS_500Ms_Cnt;//500ms闪烁标志位u8 IAP_Save_Cnt;//存储标志位//--------------------位全局变量-----------------------------------bit TimeFlag ;//定时标记bit Buzz_Flag ;//蜂鸣器标志位bit SS_500Ms_Flag ;//500ms闪烁标志位bit ZiDong_ShouDong_Flag;//自动手动标志位bit ShouDong_Out_Flag;//手动输出标志位bit IAP_Save_Flag;//存储标志位bit NTC_Error_Flag;//传感器错误bit NTC_OK_Flag;//传感器错误u8 code ISP_ROM[32] _at_ 0X0200;//****************************************************************** #define ADC_GLOBAL#include "..\inc\config.h"/*****************************************************************/ #define AD_DATA_CNT 250const u16 code TEMP_AD_DATA[AD_DATA_CNT+1]={3138 , // 03100 , // 13061 , // 22982 , // 4 2941 , // 5 2899 , // 6 2857 , // 7 2815 , // 8 2771 , // 9 2728 , // 10 2684 , // 11 2639 , // 12 2595 , // 13 2550 , // 14 2504 , // 15 2459 , // 16 2413 , // 17 2367 , // 18 2321 , // 19 2276 , // 20 2230 , // 21 2184 , // 22 2139 , // 23 2093 , // 24 2048 , // 25 2003 , // 26 1959 , // 27 1914 , // 28 1870 , // 29 1827 , // 30 1784 , // 31 1741 , // 32 1699 , // 33 1658 , // 34 1617 , // 35 1577 , // 36 1537 , // 37 1498 , // 38 1459 , // 39 1421 , // 40 1384 , // 41 1348 , // 42 1312 , // 43 1277 , // 44 1243 , // 45 1209 , // 461144 , // 48 1112 , // 49 1082 , // 50 1052 , // 51 1022 , // 52 994 , // 53 966 , // 54 938 , // 55 912 , // 56 886 , // 57 861 , // 58 836 , // 59 812 , // 60 789 , // 61 766 , // 62 744 , // 63 723 , // 64 702 , // 65 682 , // 66 662 , // 67 643 , // 68 624 , // 69 606 , // 70 589 , // 71 572 , // 72 555 , // 73 539 , // 74 524 , // 75 509 , // 76 494 , // 77 480 , // 78 466 , // 79 453 , // 80 440 , // 81 427 , // 82 415 , // 83 403 , // 84 392 , // 85 381 , // 86 370 , // 87 360 , // 88 349 , // 89 340 , // 90330 , // 91321 , // 92312 , // 93303 , // 94295 , // 95287 , // 96279 , // 97271 , // 98264 , // 99};void AD_fun(void) //{static u8 AD_Sum_Cnt = 0,AD_ID=0;static u16 AD_Sum = 0;static u8 Temp_Change_Cnt=0;u8 i;AD_Sum += Get_ADC(AD_ID);AD_Sum_Cnt ++;if(AD_Sum_Cnt >= 8){AD_Sum_Cnt = 0;AD_Sum >>= 3;if(1){if(!AD_ID){if(AD_Sum<40||AD_Sum>4050){NTC_Error_Flag = 1;}else{NTC_Error_Flag = 0;}AD_ID=1;}}AD_Sum = 0;}}u16 Get_ADC( uchar n){u16 dat;//dat = 0;if(!n){ADM = _1000_0000b;//AIN0通道}else if(n==1){ADM = _1000_0110b;//AIN6通道}else if(n==2){ADM = _1000_0111b;//AIN7通道}else if(n==3){ADM = _1000_1000b;//AIN8通道}_nop_();_nop_();ADM |= _0100_0000b; //开始转换while(!(ADM & _0010_0000b)); //转换中_nop_();_nop_();ADM &= _1101_1111b;dat = ADB;dat <<= 4;dat += (ADR&0x0f);_nop_();_nop_();return dat;}void SYSIspStart(unsigned int pageAddress){ISP(pageAddress, ISP_RAM);}/***************************************************************硬件初始化函数: 硬件初始化输入输出定时器开关AD初始化****************************************************************/void InitCPU(void) //单片机初始化{EAL=0; //关总中断CLKSEL = _0000_0101b;//内部32MRC Fhosc/4 分频CLKCMD = 0x69;//时钟开关启动CKCON = _0011_0001b;//------------------------------I/O口输出--------------------------//---------------P0---------------P0M=_1111_1111b; //P07=BUZZ P06=COM6 P05=COM5 P04=COM4P0UR = _0000_0000b; //P03=COM3 P02=COM2 P01=COM1 P00=LED1P0 = _0000_0000b;//---------------P1---------------// P1W = _0000_1000b;P1M=_0011_1110b; //P17=ADC7 P16=ADC6 P15=LED2 P14=?P1UR = _0000_0000b; //P13=? P12=? P11=? P10=ADC0_温度P1 = _0000_0000b;//---------------P2---------------P2M=_1111_1101b; //P27=? P26=? P25=? P24=?P2UR = _0000_0000b; //P23=? P22=? P21=ADC6 P20=REY_OUTP2 = _0000_0000b;//------------------------------INT--------------------------------// PEDGE |= 0x03; // EX0G 电平变换触发,双沿// EX0 = 1; // INT0 isr enable// PEDGE |= 0x04; // EX1G = 0x01 : INT1 Rising edge trigger// EX1 = 1; // INT1 isr enable//// PEDGE |= 0x30; // EX1G = 0x11 : Both rising and falling edge trigger (Level change trigger).// IEN4 |= 0x40; // INT2 isr enable (EX2)//====================PWM1设置======================// PW1M = _1010_0000b;// PW1CH = _0001_0000b;// PW1YH = 0;// PW1YL = 26;// PW1DH = 0;// PW1DL = 7;// PW1A = 5;// PW1B = PW1D;//------------------------------T0--------------------------------TMOD = _0110_0110b; // T0 T1 8位自动装载TH0 = 131; // Initial valuesTL0 = 131;TCON0 = _0010_0011b; // T0 = Fhsoc/32. T1 = Fhsoc/16ET0 = 1; // Timer 0 isr enableTR0 = 1; // enable Timer 0 Run control//------------------------------T1--------------------------------TH1 = 6; // Initial valuesTL1 = 6;ET1 = 0; // Timer 1 isr enableTR1 = 0; // enable Timer 1 Run controlIP0 = _0000_1000b;IP1 = _0000_1000b;//----------------------AD配置--------------------------------------//----------------------AD配置--------------------------------------ADM = _1000_0000b; //AIN3通道ADR = _0101_0000b;// [ADR.5 ADR.4]00 = Fhosc/16, 01 = Fhosc/8, 10 = Fhosc/1, 11 = Fhosc/2VREFH = _0000_0011b; //参考电压VDDP1CON = _1100_0001b;P2CON = _0000_0010b;//------------------------------------------------------------------EAL=1; //开总中断}void Ram_init(void){u8 i;NTC_OK_Flag=0;//NTC 测温OK后才继电器开始工作WenDu_Up=30;WenDu_Down=20;WenDu_HJ=25;Temp_ChaZhi_ID=0;//0显示环境温度,1显示差值闪烁_clrwdt();for(i=0;i<20;i++){ISP_RAM[i]=ISP_ROM[i];}_nop_();_nop_();if(ISP_RAM[0]==0x55){if(WenDu_Up>99||WenDu_Down>99||WenDu_Cha>18){ISP_RAM[0]=0x55;ISP_RAM[1]=30;ISP_RAM[2]=20;ISP_RAM[3]=9;_clrwdt();SYSIspStart(0X0200);}}else{ISP_RAM[0]=0x55;ISP_RAM[1]=30;ISP_RAM[2]=20;ISP_RAM[3]=9;_clrwdt();SYSIspStart(0X0200);}_nop_();_nop_();}//*****************************************************************// // 主函数////*****************************************************************// void main(void){u8 i;InitCPU();i=200;while(i){i --;_clrwdt();Ram_init();while(1){if(TimeFlag){TimeFlag=0;Time_Fun(); //基准时间函数}_clrwdt();_nop_();}}//*****************************************************************//// 时间走时函数////*****************************************************************//void Work_Fun(void){}//*****************************************************************//// 时间走时函数////*****************************************************************//void Time_Fun(void){static u8 Time_4ms_Cnt = 0,Time_10ms_Cnt = 0,Time_100ms_Cnt = 0,Time_250ms_Cnt = 0;static u8 Buzz_Cnt=0;//***************充放电判断*********************LedDisplay();Time_4ms_Cnt ++;if(Time_4ms_Cnt>=2){Time_4ms_Cnt=0;AD_fun();}Time_10ms_Cnt ++;if(Time_10ms_Cnt>=5){Time_10ms_Cnt=0;KeyDataProcess();}Time_100ms_Cnt++;if(Time_100ms_Cnt>=50){Work_Fun();Time_100ms_Cnt=0;}}//*****************************************************************// // 中断函数// //*****************************************************************// void Timer0_ISR(void) interrupt ISRTimer0 // Vector @ 0x0B{static u8 Time2MS = 0;Time2MS ++;if(Time2MS >= 16) //2MS中断函数{Time2MS = 0;TimeFlag = 1;}if(Buzz_Flag)BUZZ=!BUZZ;elseBUZZ=0;//***************************************}void Timer1_ISR(void) interrupt ISRTimer1 // Vector @ 0x1B{;}。
SN 8 位单片机 M2IDEV137 简体中文汇编程序
SONiX 8 位单片机 M2IDE_V137 简体中文汇编主程序这里提供一份 SC_M2Asm137.exe 简体中文汉化文件,可以解压缩后覆盖原来安装目录下的同名文件,成为简体中文界面.(记得部分原英文文件,同时把本文件前面的"SC_"去掉.)汉化主要针对大部分 8 位单片机的菜单,对话框等. 语音芯片部分没有进行汉化.喜欢使用中文界面的朋友可下载: SC_M2Asm137.rarSONiX 8 位单片机开发工具说明:SONiX IDE M2IDE_V137 <M2IDE_V137.exe>SONiX IDE for SN8ICE 2K, SN8ICE 2K Plus, SN8ICE 2K PlusII, 嵌入式 ICE编译与调试 M2Asm137 <M2Asm137.exe>编译与调试为 SN8P2XXX, SN8FXXXX 家族<A> 支持芯片型号:支持最新型号 :完全支持下列芯片的全部功能的仿真调试:SN8P2501A, SN8P2602A, SN8P2604, SN8P2606, SN8P2608, SN8P270XA, SN8P2711, SN8P2714,SN8P27142, SN8P27143, SN8P2715, SN8P2308, SN8P26042, SN8P2612, SN8P2613, SN8P2624,SN8P2603A, SN8P2611, SN8P2622, SN8P2501B, SN8P2602B, SN8PC13, SN8P2201, SN8P2202,SN8P2203, SN8P2204, SN8A2617, SN8P2604A, SN8P2614, SN8P2808, SN8P2212, SN8P2213,SN8P22121, SN8P26L32, SN8P26L321, SN8P26L34, SN8P2722, SN8P2807, SN8P2234, SN8P2236,SN8P2238, SN8P2711A, SN8P26L38, SN8PC20, SN8P26042A, SN8P22021, SN8P26L31, SN8P2522,SN8P2732, SN8P2733, SN8P2734, SN8P2735, SN8P2754, SN8P2755, SN8P2758, SN8F2251,SN8F2253, SN8F2255, SN8F22511, SN8F22521, SN8F22531, SN8F2251B, SN8F2253B, SN8F2255B,SN8F22511B, SN8F22521B, SN8F22531B, SN8F22721, SN8F2271, SN8F2277, SN8F22711, SN8F2271B,SN8F2277B, SN8F22711B, SN8F22721B, SN8F2288, SN8P2267, SN8PC21, SN8P2233, SN8P2242,SN8P22421, SN8P2521, SN8P26L37, SN8P2708B, SN8F27E62, SN8F27E62L, SN8F27E64, SN8F27E64L,SN8F27E65, SN8F27E65L, SN8P2742, SN8P2743, SN8P2318, SN8P2501B1, SN8P2501C, SN8P2602C,SN8P2712, SN8P2523, SN8P2241, SN8P2317, SN8P2602C1, SN8P2711A1, SN8F27E93, SN8F27E93L,SN8F27E94, SN8F27E94L, SN8P25231, SN8PC22, SN8F26E61, SN8F26E61L, SN8F27E61, SN8F27E61L,SN8F26E611, SN8F26E611L,SN8F27E611, SN8F27E611L,SN8P2267B, SN8P2839, SN8P2947, SN8PC2014,SN8PC2016, SN8P2704B, SN8P2524, SN8P27411, SN8P2267C, SZK671, SN8P2949, SN8P2711A2,SN8P27122, SN8P2511, SN8FMD24, SN8FMD24L, SN8FMD25, SN8FMD25L, SN8F26E64, SN8F26E64L,SN8F26E65, SN8F26E65L, SN8F25E24, SN8F25E24L, SN8F25E25, SN8F25E25L, SN8FMD21, SN8FMD21L,SN8FMD22, SN8FMD22L, SN8FMD23, SN8FMD23L, SN8P2711B提示:a. M2IDE V1.00 或更新版本仅仅支持 SN8ICE_2K.b. SN8IDE V1.99L ~ V1.99Z 仅仅支持 SN8ICE_1K(又叫 S8KD-2 ICE).c. 不再支持烧写器 V3.0 软件.SN8P2711 提示:a. 当设置 EVHENB=1, P4.0 在仿真时仍然是 ADC 输入功能, 但是实际芯片是外部参考电压输入.b. P0.0 当在 TC0 事件计数器输入模式时具有唤醒功能, 但在实际芯片时不是.c. P0.1 当在 TC1 事件计数器输入模式时具有唤醒功能, 但在实际芯片时不是.d. TC0 事件计数器在绿色模式没有唤醒功能,但在实际芯片时有唤醒功能.。
松翰单片机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;}。
松翰SN 汇编语言与开发工具
Example:
B0MOV 0x80, #3
// RAM[0x80] = #3
另外,符号$表示编译器当前运行程序地址(PC值)。
Example:
JMP $ JMP $+1
// To represent unlimited loop // Equivalent to two NOPs
符号$还可以用来获取标号地址的高、中、低字节。
为了避免使用太多不同的标号,以下符号可以用来表示不同的标号名称: 首先,使用符号“@@:”作为临时标号名,可以从前面和后面对它进行访问。 其次,使用“@B”指向前面离它最近的“@@:”标号;使用“@F”指向下一个(离它最近的) “@@:”标号。
Example:
JMP @@:
… JMP
@F
… @B
; jump to the next @@ ; jump to the previous@@
7.1.7 算术运算符
用户可使用+、-、*、/、%、&、|、^、~、()等符号进行算术运算。
Example:
2+3–4 1 2 + 3 * 4 14
以下按优先级顺序列出这些符号的数学涵义。
()
= sub-expression
+
= plus
-
= minus
~
= not
!
= logical not
*
= multiplication
Example:
TITLE
This is a demo code.
SONiX TECHNOLOGY CO., LTD
Page69
SN8 C Studio User’s Manual
如何用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 的效率得到了很大的提升,其编译效率逐渐的逼近汇编。
课题_松翰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:定时器控制的发光二极管闪烁。
松翰sn8p2700系列单片机的原理及应用
松翰sn8p2700系列单片机的原理及应用1. 简介单片机(Microcontroller Unit,简称MCU),是一种集成了微处理器核心、存储器和外设功能模块的集成电路芯片。
松翰sn8p2700系列单片机是松翰科技推出的一款高性能、低功耗的单片机产品。
本文将介绍松翰sn8p2700系列单片机的基本原理及其在实际应用中的一些典型案例。
2. 特点和功能松翰sn8p2700系列单片机具有以下特点和功能:•高性能:采用高性能的RISC架构,运行速度快,反应迅速。
•低功耗:通过优化电路设计和功耗管理策略,实现低功耗运行,延长电池使用寿命。
•多功能IO口:具有丰富的IO口资源,可以连接各种外设和传感器模块。
•大容量存储器:具有较大的Flash存储器和RAM存储器,可满足复杂的应用需求。
•丰富的外设:内置多个通用定时器、串行通信接口、模拟电路等外设模块,可方便地连接各种外部设备。
•多种封装尺寸:提供多种封装尺寸,适用于不同应用场景。
3. 基本原理松翰sn8p2700系列单片机的基本工作原理如下:•输入与输出:单片机通过GPIO口(General Purpose Input/Output)与外部设备进行数据交互。
通过对GPIO口的配置,可以实现输入和输出功能。
•处理器核心:单片机的处理器核心采用RISC架构,具有高性能和低功耗的特点。
它包括中央处理器(Central Processing Unit,简称CPU)、寄存器和运算单元等组成部分。
•存储器:单片机具有Flash存储器和RAM存储器。
Flash存储器用于存储程序代码和常量数据,RAM存储器用于存储变量和临时数据。
•时钟和定时器:单片机内部有时钟和定时器模块,用于产生时序信号和定时计时功能。
时钟信号用于同步各个模块的工作,定时器用于定时触发某些事件。
•外设接口:单片机通过串口、SPI(Serial Peripheral Interface)等接口与外部设备进行通信。
松翰单片机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_松翰指令用户指南
单片机程序100范例+详细注释
100例程序设计范例汇总第一章 (4)【实例1】使用累加器进行简单加法运算: (4)【实例2】使用B寄存器进行简单乘法运算: (4)【实例3】通过设置RS1,RS0选择工作寄存器区1: (4)【实例4】使用数据指针DPTR访问外部数据数据存储器: (4)【实例5】使用程序计数器PC查表: (4)【实例6】IF语句实例: (4)【实例7】SWITCH-CASE语句实例: (4)【实例8】FOR语句实例: (4)【实例9】WHILE语句实例: (5)【实例10】DO...WHILE语句实例: . (5)【实例11】语句形式调用实例: (5)【实例12】表达式形式调用实例: (5)【实例13】以函数的参数形式调用实例: (5)【实例14】函数的声明实例: (5)【实例15】函数递归调用的简单实例: (5)【实例16】数组的实例: (6)【实例17】指针的实例: (6)【实例18】数组与指针实例: (6)【实例19】P1口控制直流电动机实例 (6)第二章 (8)【实例20】用74LS165实现串口扩展并行输入口 (8)【实例21】用74LS164实现串口扩展并行输出口 (10)【实例22】P0I/O扩展并行输入口 (12)【实例23】P0I/O扩展并行输出口 (12)【实例24】用8243扩展I/O端口 (12)【实例25】用8255A扩展I/O口 (14)【实例26】用8155扩展I/O口 (19)第三章 (26)【实例29】与AT24系列EEPROM接口及驱动程序 (26)【实例30】EEPROM(X5045)接口及驱动程序 (30)【实例31】与铁电存储器接口及驱动程序 (33)【实例32】与双口RAM存储器接口及应用实例 (35)【实例33】与NANDFLASH(K9F5608)接口及驱动程序 (35)第四章 (43)【实例34】独立键盘控制 (43)【实例35】矩阵式键盘控制 (44)【实例36】改进型I/O端口键盘 (46)【实例37】PS/2键盘的控制 (49)【实例39】段数码管(HD7929)显示实例 (54)【实例40】16×2字符型液晶显示实例 (55)【实例41】点阵型液晶显示实例 (61)【实例42】LCD显示图片实例 (63)第五章 (70)【实例43】简易电子琴的设计 (70)【实例44】基于MCS-51单片机的四路抢答器 (71)【实例45】电子调光灯的制作 (76)【实例46】数码管时钟的制作 (81)【实例47】LCD时钟的制作 (96)【实例48】数字化语音存储与回放 (103)【实例49】电子标签设计 (112)第六章 (120)【实例50】指纹识别模块 (121)【实例51】数字温度传感器 (121)第七章 (124)【实例53】超声波测距 (124)【实例54】数字气压计 (125)【实例55】基于单片机的电压表设计 (132)【实例56】基于单片机的称重显示仪表设计 (133)【实例57】基于单片机的车轮测速系统 (136)第八章 (138)【实例58】电源切换控制 (138)【实例59】步进电机控制 (140)【实例60】单片机控制自动门系统 (141)【实例61】控制微型打印机 (144)【实例62】单片机控制的EPSON微型打印头 (144)【实例63】简易智能电动车 (145)【实例64】洗衣机控制器 (149)第九章 (152)【实例65】串行A/D转换 (152)【实例66】并行A/D转换 (153)【实例67】模拟比较器实现A/D转换 (154)【实例68】串行D/A转换 (155)【实例69】并行电压型D/A转换 (156)【实例70】并行电流型D/A转换 (156)【实例71】2I C接口的A/D转换 (157)【实例72】2I C接口的D/A转换 (161)【实例73】单片机间双机通信 (164)【实例74】单片机间多机通信方法之一 (166)【实例75】单片机间多机通信方法之二 (171)【实例76】PC与单片机通信 (176)【实例77】红外通信接口 (178)第十一章 (180)【实例79】单片机实现PWM信号输出 (180)【实例80】实现基于单片机的低频信号发生器 (182)【实例81】软件滤波方法 (183)【实例82】FSK信号解码接收 (186)【实例83】单片机浮点数运算实现 (187)【实例84】神经网络在单片机中的实现 (192)【实例85】信号数据的FFT变换 (194)第十二章 (198)【实例86】2I C总线接口的软件实现 (198)【实例87】SPI总线接口的软件实现 (200)【实例88】1-WIRE总线接口的软件实现 (205)【实例89】单片机外挂CAN总线接口 (207)【实例90】单片机外挂USB总线接口 (210)【实例91】单片机实现以太网接口 (214)【实例92】单片机控制GPRS传输 (221)【实例93】单片机实现TCP/IP协议 (223)第十三章 (229)【实例94】读写U盘 (229)【实例95】非接触IC卡读写 (234)【实例96】SD卡读写 (238)【实例97】高精度实时时钟芯片的应用 (242)第十四章 (247)【实例98】智能手机充电器设计 (247)【实例99】单片机控制门禁系统 (248)第一章【实例1】使用累加器进行简单加法运算:MOV A,#02H ;A←2ADD A,#06H ;A←A+06H【实例2】使用B寄存器进行简单乘法运算:MOV A,#02H ; A←2MOV B,#06H ; B←6MUL AB ; BA←A*B=6*2【实例3】通过设置RS1,RS0选择工作寄存器区1:CLR PSW.4 ; PSW.4←0SETB PSW.5 ; PSW.5←1【实例4】使用数据指针DPTR访问外部数据数据存储器:MOV DPTR, #data16 ; DPTR←data16MOVX A, @ DPTR ; A←((DPTR))MOVX @ DPTR, A ; (DPTR)←A【实例5】使用程序计数器PC查表:MOV A, #data ;A←dataMOVC A, @ A+DPTR ; PC←(PC)+1 ,A←((A)+(PC)) 【实例6】if语句实例:void main(){ int a,b,c,min;printf("\n please input three number:");scanf("%d%d%d ",&a,&b,&c);if(a<b&&a<c) printf("min=%d\n",a );else if(b<a&&b<c) printf("min=%d\n",b);else if(c<a&&c<c) printf("min=%d\n",c);else printf("There at least two numbers are equal\n");}【实例7】switch-case语句实例:void main(){ int num; printf("input one number:");scanf("%d",& num);switch(num){ case 1: printf("num =%d\n", num);break;case 2: printf("num =%d\n", num);break;case 3: printf("num =%d\n", num);break;case 4: printf("num =%d\n", num);break;default: printf("The number is out of the range\n", num);}}【实例8】for语句实例:void main(){ for(int a=10;n>0;a --)printf("%d",a);}【实例9】while语句实例:void main(){ int i=0;while(i<=10) i++;}【实例10】do…while语句实例:void main(){ int i=0;do{ i++;}while(i<=10);}【实例11】语句形式调用实例:void main(){ int i=0; while(i<=10) i++; ……Sum(); /*函数调用*/}【实例12】表达式形式调用实例:void main(){ int a,b,i=0; while(i<=10) i++; ……i=4*Sum(a,b); /*函数调用*/}【实例13】以函数的参数形式调用实例:void main(){ int a,b,c,i=0; while(i<=10) i++; ……i= max(c,Sum(a,b)); /*函数调用*/ }【实例14】函数的声明实例:void main(){ int max(int x,int y); /*函数的声明*/ int a,b,c,i=0; while(i<=10) i++; ……i= max(c,Sum(a,b)); /*函数调用*/ }【实例15】函数递归调用的简单实例:void fun(){ int a=1, result,i;for(i=0;i<10;){ i=a+I;result = fun(); /*函数调用*/}return result;}【实例16】数组的实例:void main(){ char num[3] [3]={{ '','#',''},{'#','','#'},{'','#',''}}; /*定义多维数组*/ int i=0,j=0;for(;i<3;i++){ for(;j<3;j++) printf(“%c”,num[i][j]);printf(“/n”);}【实例17】指针的实例:void main(){ int a=3,*p;p=&a; /*将变量a的地址赋值给指针变量p*/printf(“%d,%d”,a,*p); /*输出二者的数值进行对比*/}【实例18】数组与指针实例:void main(){ int i=3,num[3]={1,2,3},*p;p=num; /*将数组num[]的地址赋值给指针变量p*/result =max(p,3); /*函数调用,计算数组的最大值*/}【实例19】P1口控制直流电动机实例sfr p1=0x90;sbit p10=p1^0;sbit p11=p1^1;void main (){int i, m;int j=100;int k=20;// 正快转for (i=0; i<100; i++){P10=1;for (j=0; j<50; j++){m=0;}}P10=0;for (j=0; j<10; j++){m=0}//正慢转for (i=0; i<100; i++) {P10=1;for (j=0; j<10; j++) {m=0}}p10=0;for (j=0; j<50; j++) {m=0}// 负快转for (i=0; i<100; i++) {p11=1;for (j=0; j<50; j++) {m=0;}}p11=0;for (j=0; j<10; j++) {m=0;}// 负慢转for (i=0; i<100; i++) {p11=1;for (j=0;j<10;j++) {m=0;}}p11=0for (j=0; j<50; j++) {m=0;}}第二章【实例20】用74LS165实现串口扩展并行输入口(1)函数声明管脚定义//---------------------------------------库函数声明,管脚定义------------------------------------------ #include<reg52.h>sbit LOAD=P1^7;//用P1^7控制SH/ 管脚(2)串口初始化函数UART_init()//-------------------------------------------------------------------------------------------------------------- // 函数名称:UART_init()// 功能说明:串口初始化,设定串口工作在方式0//-------------------------------------------------------------------------------------------------------------- void UART_init(void){SCON=0x10;//设串行口方式0,允许接收,启动接收过程ES=0;//禁止串口中断}(3)数据接收函数PA()//-------------------------------------------------------------------------------------------------------------- // 函数名称:PA()// 输入参数:无// 输出参数:返回由并口输入的数据// 功能说明:接收八位串行数据//-------------------------------------------------------------------------------------------------------------- unsigned char PA(void){unsigned char PA_data;LOAD=0;//当P1.7输出低电平,74LS165将并行数据装入寄存器//当中LOAD=1;//当P1.7输出高电平,74LS165在时钟信号下进行移位UART_init();//74LS165工作在时钟控制下的串行移位状态while(RI==0);//循环等待RI=0;PA_data=SBUF;return PA_data;//返回并行输入的数据}(1)函数声明管脚定义//---------------------------------------库函数声明,管脚定义------------------------------------------ #include<reg52.h>sbit a7=ACC^7;sbit simuseri_CLK=P1^6;//用P1^6模拟串口时钟sbit simuseri_DATA=P1^5;//用P1^5模拟串口数据sbit drive74165_LD=P1^7;//用P1^7控制SH/ 管脚(2)数据输入函数in_simuseri()//-------------------------------------------------------------------------------------------------------------- // 函数名称:in_simuseri()// 输入参数:无// 输出参数:data_buf// 功能说明:8位同位移位寄存器,将simuseri_DATA串行输入的数据按从低位到// 高位// 保存到data_buf//-------------------------------------------------------------------------------------------------------------- unsigned char in_simuseri(void){unsigned char i;unsigned char data_buf;i=8;do{ACC=ACC>>1;for(;simuseri_CLK==0;);a7= simuseri_DA TA;for(;simuseri_CLK==1;);}while(--i!=0);simuseri_CLK=0;data_buf=ACC;return(data_buf);}(3)数据输出函数PAs()//-------------------------------------------------------------------------------------------------------------- // 函数名称:PAs()// 输入参数:无// 输出参数:PAs _buf,返回并行输入74LS165的数据// 功能说明:直接调用,即可读取并行输入74LS165的数据,不需要考虑74LS165的// 工作原理//--------------------------------------------------------------------------------------------------------------unsigned char PAs(void){unsigned char PAs_buf;drive74165_LD=0;drive74165_LD=1;PAs_buf= in_simuseri();return(PAs_buf);}【实例21】用74LS164实现串口扩展并行输出口单片机串口驱动74LS164的程序主要包括函数声明管脚定义部分、串口初始化函数以及数据发送函数。
松翰单片机应用程序
中断;********************************************************例:设置INT0 中断请求和双方向边沿触发。
MOV A, #18HB0MOV PEDGE, A ; 设置INT0中断触发沿为双向触发B0BSET FP00IEN ; 使能INT0中断B0BCLR FP00IRQ ; 清INT0中断请求标志B0BSET FGIE ; 使能GIE;*********************************************************例:INT0中断服务程序。
ORG 8 ; 中断向量地址JMP INT_SERVICEINT_SERVICE:…; 保存ACC和PFLAGB0BTS1 FP00IRQ ; 判断是否有外部中断请求JMP EXIT_INT ; P00IRQ = 0,退出中断B0BCLR FP00IRQ ; 清中断请求标志…; INT0中断服务程序…EXIT_INT:…; 恢复ACC和PFLAGRETI ; 退出中断;************************************************************初始化TC0。
B0BCLR FTC0IEN ; 禁止TC0中断B0BCLR FTC0ENB ; 停止TC0计数MOV A, #20H ; 00100000B,010=64B0MOV TC0M, A ; 设置TC0时钟= Fcpu / 64MOV A, #74H ; 设置TC0C初始值= 74HB0MOV TC0C, A ; 设置TC0间隔时间= 10 msB0BSET FTC0IEN ; 使能TC0中断B0BCLR FTC0IRQ ; 清TC0 中断请求标志B0BSET FTC0ENB ; 使能TC0计数B0BSET FGIE ; 使能GIE;***************************************************************;************************************************************ 例:TC0 中断服务程序。
