STCCAS单片机各个模块程序代码_第1页
STCCAS单片机各个模块程序代码_第2页
STCCAS单片机各个模块程序代码_第3页
STCCAS单片机各个模块程序代码_第4页
STCCAS单片机各个模块程序代码_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/*/STC12C5A60S2可编程时钟模块/涉及寄存器:BRT(AUXR辅助寄存器)、WAKE_CLKO(钟与系统掉电唤醒控制寄存器独立波特率发生器定寸器寄存器 )/程序说明:/P1.0本程序可选实现 P3.4输出CLK0UT0寸钟、P3.5输出CLKOUT1 寸钟 输出CLKOUT时钟/说明:STC12C5A60S2单片机有三路可编程时钟输出CLKOUT0/T0/P3.4CLKOUT1/T1/P3.5、 CLKOUT2/P1.0/ /* */#include <STC12C5A60S2.H>#include <intrins.h>/#define Port_BRT

2、/如果想测试独立波特率发生器寸钟输出请打开此句若想测试CLKOUT和CLKOUT请注释此句#ifdef Port_BRT /*条件编译独立波特率发生器时钟输出 */*/ CLKOUT2 时钟初始化 /*/void CLKOUT_init(void)WAKE_CLKO = 0x04; /Bit2-BRTCLKO出允许 P1.0 配置为独立波特率发生器的时钟输AUXRBRT #else/BRT/BRT= 0x14; /Bit4-BRTR /Bit2-BRTx12 BRT = 0xff; /*工作在工作在1T模式下时的输出频率=Sysclk/(256-BRT)/212T 模式下时输出频率 =Sysc

3、lk/12/(256-BRT)/2 允许独立波特率发生器运行工作在1T模式下更改该寄存器的值可实现对输出的时钟频率进行分频条件编译CLKOUT0寸钟输出*/*/ CLKOUT0时钟和CLKOUT初始化 /*/ void CLKOUT_init(void)WAKE_CLK0 = 0x03;/T0/T0/1T/12T允许将 P3.4/T0 脚配置为定时器工作在1T模式时的输出频率工作在12T模式时的输出频率指的是每1个时钟加1,是普通C51的12倍指的是每12个时钟加1与普通C51 一样0 的时钟输出 CLK0UT0= SYSclk/(256-TH0)/2= SYSclk/12/(256-TH0)

4、/2/工作在定时器模式 2 下/T1/T1允许将 P3.5/T1 脚配置为定时器1的时钟输出CLK0UT1只能/1T/12T工作在1T模式时的输出频率工作在12T模式时的输出频率指的是每1个时钟加1,是普通C51的12倍 指的是每12个时钟加1与普通C51 一样= SYSclk/(256-TH0)/2= SYSclk/12/(256-TH0)/2AUXR= 0xc0;/T1TM0D= 0x22;/TH0= 0xff; /TL0= 0xff;TH1= 0xff; /TL1= 0xff;TR1= 1;TR0= 1;#endif/T0/更改该寄存器的值可实现对输出的时钟频率进行分频定时器速度是普通

5、8051的12倍,即工作在1T模式下定时器速度是普通 8051的12倍,即工作在1T模式下 定时器 0 工作模式为方式 2, 自动装载时间常数 定时器 1 工作模式为方式 2, 自动装载时间常数 更改该寄存器的值可实现对输出的时钟频率进行分频/*/*/ void main()CLK0UT_init();while(1);主程序/* / / / /STC12C5A60S2系统时钟模块/说明: STC12C5A60S2 单片机有两个时钟源,内部 R/C 振荡时钟和外部晶体时钟 出厂标准配置是使用外部晶体或时钟/涉及寄存器:/32CLK_DIV(时钟分频寄存器)由该寄存器的 Bit0-2 组合可实现

6、对时钟源进行 、64、 128 分频0、2、4、8、 16/程序说明:/对外部时钟进行分频得到 Sysclk, 然后经过 P1.0 的独立波特率 时钟输出功能 Sysclk/2 输出时钟频率 /* / #include <STC12C5A60S2.h>#include <intrins.h>若要修改系统时钟直接在此处修改/12为12M的 sysclk/6为6M的 sysclk/3为3M的 sysclk/1500为1.5M的 sysclk/750为750kHz的 sysclk/375为375kHz的 sysclk/187500为187.5kHz的 sysclk/93750

7、为93.75kHz的 sysclk/*/系统时钟初始化/*/#define Bus_clk 12/void Sysclk_init(void)WAKE_CLKO = 0x04;/AUXR = 0x14; /配置 P1.0 口为频率输出 允许波特率时钟工作/ 工作模式为 1TBRT = 0xff;#if( Bus_clk = 12 )CLK_DIV = 0x00;#elif( Bus_clk = 6 )CLK_DIV = 0x01;#elif( Bus_clk = 3 )CLK_DIV = 0x02;#elif( Bus_clk = 1500 )CLK_DIV = 0x03;#elif( Bus

8、_clk = 750 )CLK_DIV = 0x04;#elif( Bus_clk = 375 )CLK_DIV = 0x05; #elif( Bus_clk = 187500 )CLK_DIV = 0x06;#elif( Bus_clk = 93750 ) CLK_DIV = 0x07;#endif/*/ /主程序/*/ void main()Sysclk_init(); while(1);/* / / / / / / /STC12C5A60S2 系 统 省 电 模 块/涉及寄存器:Bit0 - IDLBit1 - PDPCON电源控制寄存器)控制单片机进入 IDLE 空闲模式 控制单片机进

9、入掉电模式/程序说明:/程序实现让单片机先工作一阵子(通过P0A3指示灯显示)然后进入掉电状态 ,利用外部中断 0口来唤醒单片机工作 唤醒后单片机将通过 P0人0-3 口的灯闪烁显示开始工作说明: STC12C5A60S2 单片机有三种省电模式以降低功耗 . 空闲模式,低速模式 掉电模式/*/#include <STC12C5A60S2.h>#include <intrins.h> #define uchar unsigned char#define uint unsigned intuchar Power_Down_Flag = 0;/进入掉电状态标志sbit Chi

10、p_Start_LED= P 0人0;sbit Po wer_Down_LED_INT0 = P0 人1; sbit N_Po wer_Down_LED_INT0 =卩0人2;sbit Normal_Work_LED= P 0人3;sbit Power_Dow n_Wakeup_INT0= P 3人2;/INT0/INT0/单片机开始工作指示灯 口掉电唤醒指示灯 口没有唤醒指示灯 正常工作指示灯 外中断唤醒输入口void Delay_ms( uint time ); void Normal_work(void); void Intp_init(void);void After_Powr_Dow

11、n(void);/*/软件延时/*/void Delay_ms( uint time )uint t;while(time-)for( t = 0; t < 82; t+ );/*/延时时间 = (time*1003+16)us/正常工作指示/*/void Normal_work(void)Normal_Work_LED = 1;Delay_ms(500);Normal_Work_LED = 0;Delay_ms(500);void After_Power_Down(void)uchar i ;for( i = 0; i < 100; i+ )P0 = 0x0f; Delay_ms

12、(500);P0 = 0x00;Delay_ms(500);/*/中断初始化/*/void Intp_init(void)IT0 = 0; /外部中断源 0 为低电平触发 允许外部中断EX0 = 1; /EA = 1; /开总中断/*/ 主程序/*/void main()uchar j = 0;uchar wakeup_counter = 0; / P0 = 0x00;Chip_Start_LED = 1; /Intp_init(); /while(1)记录掉电次数单片机开始工作外中断 0 初始化P2 = wakeup_counter; wakeup_counter+; for( j = 0;

13、 j < 250; j+ )Normal_work(); /Power_Down_Flag = 1; / PCON = 0x02;_nop_();_nop_();_nop_();_nop_();After_Power_Down(); /系统正常工作指示系统开始进入掉电状态掉电唤醒后/*/中断服务/*/void INT0_Service(void) interrupt 0 if( Power_Down_Flag )Power_Down_Flag Power_Down_LED_INT0/掉电唤醒状态指示= 0; = 1;while( Power_Down_Wakeup_INT0 = 0 )

14、_nop_();Power_Down_LED_INT0 = 0;/ 等待高电平else/ 未掉电状态N_Power_Down_LED_INT0 = 1;/while( Power_Down_Wakeup_INT0 = 0 ) _nop_();N_Power_Down_LED_INT0 = 0;不是掉电唤醒指示/*/STC12C5A60S2 A/D 转 换 模 块/说明:STC12C5A60S2单片机有8路10位高速 AD转换器,P"0-卩1人7/涉及寄存器:P1ASF模拟功能控制寄存器)、ADC_CONTR(AD控制寄存器)ADC_RES、ADC_RESL转换结果寄存器)/动 A/D

15、 转换注意 :、初次打开内部 A/D 模拟电源需适当延时等内部模拟电源稳定后 , 再启/转换/启动A/D后,在转换结束前不改变任何I/O 口的状态,有利于高精度 A/D/正确/若能将定时器 /串行/中断系统关闭更好。、A/D转换模块使用的时钟为内部R/C振荡器所产生的系统时钟、由于使用两套时钟,设置好ADC_CONT后要加4个空延时操作才可以读到ADC CONT寄存器的值/程序说明:/结果通过/12864本程序实现P"0 口作为A/D采集输入口,对外部电压的测量并将测量和串口显示出来/* */ #include <STC12C5A60S2.h>#include <i

16、ntrins.h>#include "lcd.h"#define ADC_POWER 0x80 /AD#define ADC_START 0x08 /AD电源控制转换控制转换完成#define Speed_0#define Speed_1#define Speed_20x00 /540 clk0x20 /360 clk0x40 /180 clk#define Speed_3#define ADC00x60 /90 clk0x00 /P1.0#define ADC10x01 /P1.1#define ADC20x02 /P1.2#define ADC30x03 /P1.

17、3#define ADC40x04 /P1.4#define ADC50x05 /P1.5#define ADC60x06 /P1.6#define ADC70x07 /P1.7#define ADC_FLAG 0x10 /ADvoid AD_init(void);double Result_Calculate(void); void SendData( uchar byte ); /*/A/D初始化/*/ void AD_init(void)AUXR1 =0x04;低8位放在ADC RESI中/转换结果高2位放在ADC_RES勺低2位中,P1ASF = 0x01;/P1.0口作为模拟功能 A

18、/D 使用ADC_RES = 0x00;/结果清零ADC_RESL = 0x00;ADC_CONTR = ADC_POWER|Speed_2|ADC0|ADC_START; / 打开电源 ,180CLK 周期转换 , 选择 P1.0 作输入_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();EADC = 1;/EA = 1;/允许 A/D 转换中断开总中断/*/串口初始化/*/void UART_init(void) SM0SM1RENBRT= 0; /= 1; /8= 1;= 0xDC;选择串口为方式 1 工作 位数

19、据波特率可变AUXR = 0x15; /选择独立波特率发生器为串行 口的波特率发生器 , 模式为 1T/*/转换结果计算/*/ double Result_Calculate(void) uint temp;double result;temp = ADC_RES * 256 + ADC_RESL;result = temp * 4.94 / 1024;return result;/*/串口发送数据/*/void SendData( uchar byte )SBUF = byte;while(!TI);TI = 0;/*/主程序/*/void main()Init_LCD();AD_init(

20、);UART_init();while(1);/*/ A/D 中断服务 /*/void AD_Service(void) interrupt 5 ADC_CONTR &= !ADC_FLAG; / 清标志 Printf_Decimal(Result_Calculate();ADC_RES = OxOO;ADC_RESL = OxOO;ADC_CONTR = ADC_POWER|Speed_2|ADC_START; /开始下一次转换 _nop_();_nop_();_nop_();_nop_();#include <intrins.h> #include <STC12C

21、5A6OS2.h> #define uchar unsigned char #define uint unsigned intsbitsbit sbit sbitPSB = POM; / RS = P 0人7; / RW = PO 9 / E = P Op /串 / 并行接口选择 1- 并行 O- 串行 并行数据/命令选择 ,串行片选 O- 指令 1- 数据 并行读写选择 O- 写 1- 读 串行数据口 并行使能 , 串行同步时钟void Delay_ms( uint time ); / uchar Busy(void); / 读忙 uchar Read_Status(void);/ 读

22、状态 uchar Read_Date(void); / 读数据 void Write_Cmd( uchar cmd ); / 写命令 void Write_Date( uchar date );/写数据void Init_LCD(void);/ 初始化 LCD void Location( uchar x, uchar y );/ 设定显示位置 void Clear_Screen(void);/ 清屏 void Write_str( uchar *p );void Printf_Decimal(double Num);延时#include "lcd.h"extern voi

23、d SendData( uchar byte );/*以下部分为 LCD的驱动程序*/*/*/*/*/*名称功能输入输出Delay_ms() 实现软件延时 time - 时间参数 无/*/void Delay_ms( uint time )uint t;/82,延时时间 = (time*1003+16)uswhile(time-)/41,for( t = 0; t < 41; t+ );/*/ 延时时间 = (time*499+16)us/*/*/*/*名称 : Busy() 功能 : 读取忙状态 输入 : 无输出 : 1- 忙 0- 空闲/*/uchar Busy(void)uchar

24、 busy,flag;Delay_ms(1);busy = Read_Status();if( busy & 0x80 )flag = 1;elseflag = 0;Delay_ms(1);return flag;/*/*/*/*/*名称功能输入输出Read_Status() 读 12864 状态 无 status- 当前状态/*/uchar Read_Status(void)uchar status;RS = 0;RW = 1;E = 0;_nop_();_nop_();_nop_();E = 1;Delay_ms(1);status = P2;Delay_ms(1);E = 0;_

25、nop_();_nop_();return status;/*/*名称: Write_Cmd()/*功能: 向 12864 写命令/*输入: cmd - 命令参数/*输出: 无/*/void Write_Cmd( uchar cmd )RS = 0;RW = 0;E = 0;Delay_ms(1);P2 = cmd;Delay_ms(1);/ 等待数据稳定 E = 1;Delay_ms(1);E= 0;/*/*名称 :Write_Date()/*功能:向 12864 写数据/*输入:date - 待写入的数据/*输出:无/*/void Write_Date( uchar date )while

26、(Busy();RS = 1;RW = 0;E = 0;_nop_();_nop_();P2 = date;Delay_ms(1);/ 待数据稳定E = 1;Delay_ms(1);E = 0;_nop_();_nop_();/*/*x/*/*/*/*名称功能输入输出Read_Date() 向 12864 读数据 无date - 返回的数据/*/ uchar Read_Date(void)uchar date; while(Busy(); / RS = 1; RW = 1;E = 0;_nop_();_nop_();_nop_();E = 1;Delay_ms(1); date = P2;De

27、lay_ms(1);E = 0;_nop_();return date;/*/*名称 :Init_LCD()/*功能:初始化 LCD/*输入:无/*输出 :无/*/ void Init_LCD(void)Delay_ms(4);PSB = 1;/并行方式Delay_ms(4);开显示关游标Write_Cmd(0x0c);/Delay_ms(4);清屏Clear_Screen();/*/*/*/*名称 : Location()功能 : 设定显示位置 输入 : x,y -X 轴点 -Y 轴点 只能是 1-4 中的一个数/* Y 只能是 0-7 中的一个数/* 输出 : 无/*/void Locat

28、ion( uchar x, uchar y ) uchar position;if( x = 1 )x = 0x80;else if( x = 2 )x = 0x90;else if( x = 3 )x = 0x88;else if( x = 4 )x = 0x98;position = x + y;Write_Cmd(position);Delay_ms(2);/*/*/*/*/*名称 : Clear_Screen() 功能: 输入: 输出:清屏无 无/*/void Clear_Screen(void)Write_Cmd(0x34); /Delay_ms(11); /10msWrite_Cm

29、d(0x30); /Delay_ms(1);Write_Cmd(0x01);/Delay_ms(10);/*/*/*/*/*扩充指令基本指令清屏名称功能输入输出Write_str()向 12864 里写字符串*p -字符串地址无/*/ void Write_str( uchar *p ) while( *p != '0' )Write_Date(*p);p+;/*/*名称:Printf_Decimal()/*功能:打印浮点类型数据/*输入:double Num - 要打印的数据/*输出:无/*/void Printf_Decimal(double Num)uchar s6 =

30、0,0,46,0,0;uint t;t = (uint)(Num * 1000);s0 = t/10000+48;s1 = t%10000/1000+48;s3 = t%1000/100+48;s4 = t%100/10+48;s5 = t%10+48;Location(1,2);Write_str(s);SendData(s0);SendData(s1);SendData(s2);SendData(s3);SendData(s4);SendData(s5);SendData('t');/*/STC12C5A60S2 PCA/PWM 模 块说明:STC12C5A60S2单片机有

31、两路可编程计数器阵列(PCA)模块,可用于软件定时器,外部脉冲的捕捉、高速输出以及脉宽调制(PWM输出涉及寄存器:CMOD(PC工作模式寄存器)CCON(PCA控制寄存器)CCAPM0,CCAPM1(PCA比较/ 捕获寄存器 )CH,CL(PCA的16位计数器)、CCAPnL CCAPnH(PC捕捉/比较寄存器)PCA_PWMO,PCA_PWM1(PCA模块 PWM寄存器)AUXR1(辅助寄存器 1)/程序说明:本程序实现对P CA/PWM模块的四种工作模式的测试。/始化注意:当选择相应的模式时 , 需在主函数内和中断服务内更改相应模式的初/和相应的中断服务程序。去掉注释即可 , 若要更改相应

32、模式的功能 , 需在相应/的初始化函数里更改相应的参数,脉宽调制(PWM默认设置为无中断方式/* */ #include <STC12C5A60S2.H> #include <intrins.h> #define uchar unsigned char#define uint unsigned int/* 高速模式变量更改 */ #define FOSC 12000000高速脉冲输出频率计算 : f = PCA 模块的时钟源时钟源 /2/f#define T100KHz (FOSC/2/100000)/(2*CCAP0L)/CCAP0L = PCA/* 定时模式变量更改

33、 */定时计数值 =T/(1/PCA 的时钟源 )/#define T5ms (0.005*FOSC) /*PWM 模式变量更改 */#define DR_50 0x7f/50%#define DR_10 0x19/10%占空比占空比/* 时钟源选择*/#define CLK_0 0x00#define CLK_1 0x02#define CLK_2 0x04#define CLK_3 0x06#define CLK_4 0x08 #define CLK_5 0x0a/Sysclk/12/Sysclk/2 / 定时器/ECI/P1.2(P4.1)/Sysclk/Sysclk/40 的溢出脉冲输

34、入的外部时钟/*/Sysclk/6/Sysclk/8*/#define CLK_6 0x0d#define CLK_8 0x0e 模式选择#define H_model 0x4d / #define T_model 0x49 / #define P_model 0x42 /#define PL_model 0x63 /高速输出模式 , 中断模式定时模式无中断PWM模式由低变高可中断 PWM模式#define PH_model 0x53 / #define PHL_model 0x73 /#define CU_model 0x61 /16 由高变低可中断 PWM模式 高低都可中断PWM模式位捕获

35、 , 上升触发中断模式#define CD_model 0x51 /16位捕获 , 下降触发中断模式#define CUD_model Ox71 /16位捕获 , 跳变触发中断模式uint value = T1OOKHz; /1OOkHz uint time = T5ms; uint test = O;sbit LED = P 1人7;/* 函数声明 void HP_init(void); / void PP_init(void); /PWM void TP_init(void); / void CD_init(void); / /*/ / H_model 初始化 /*/5ms /*/void

36、 HP_init(void) CMODCCAPMOCCAPOLCCAPOHvalueCR= CLK_4;= H_model; = value;= value>>8; += T1OOKHz;EA时的CCAPOL值时的 CCAPOL和 CCAPOK测试用 , 要删除 用来观测定时模式和捕获模式的现象定时模式时500MS闪烁,捕获模式时捕获一次时取反高速模式初始化模式初始化 定时器模式初始化 捕获模式初始化/PCA/= 1;/= 1;/*/P_model初始化/*/void PP_init(void)CMOD = CLK_4; /CCAPMO = P_model; /CCAPOL = D

37、R_5O;CCAPOH = DR_5O;/%50/时钟源为 Sysclk 高速输出模式开启PCA计数器开总中断/CR= 1; /时钟源为 Sysclk无中断PWM模式占空比当CL值大于CCAPOL寸输出为高 当CL溢出时CCAPO啲值装载到 开启PCA计数器当不使用定时 O 溢出为时钟源时, 反之输出为低CCA POL中,PWM输出的频率=PCA的时钟源/256/使用定时器溢出的时钟源时 , 可设定定时器的值对输出频率的改变/分频为 0-256 分频/*/初始化/ T_model/*/ void TP_init(void)时钟源为定时模式SysclkCMOD = CLK_4; /CCAPM0

38、= T_model; / CCAP0L = time; /CCAP0H = time>>8; / time定时5msCREA+= T5ms;= 1;= 1;/*/初始化/ CD_model/*/ void CD_init(void)CMOD = CLK_4;CCAPM0 = CD_model;CR = 1;EA = 1;/*/主程序/*/ void main()CD_init();/PP_init();/HP_init(); /TP_init(); while(1)/*/中断服务/*/ void CD_Service(void) interrupt 7CCF0 = 0;LED = LED;/*void TP_Service(void) interrupt 7清除PCA计数器溢出中断标志CCF0 = 0; /

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论