单片机程序总结

合集下载

51系列单片机程序跑飞的经验总结

51系列单片机程序跑飞的经验总结

51 系列单片机程序跑飞的经验总结
一、程序运行跑飞现象:
单片机中的程序计数器(PC)的值出乎我们所需要的,发生了异常的偏移,脱离了原本设定好的程序要执行的位置,进入原定程序以外的区域,例如:程序的空白区、程序以外的空间或者是某种死循环中。

二、跑飞的影响:
使指令的地址码和操作码发生改变,而PC 把操作码当作指令来执行,操作码改变就代表着将执行错误的指令;或者PC 的值指向一个不符合逻辑关系的指令或非程序的区域,会造成运行结果进入死循环,即常说的死机。

三、程序跑飞的原因:
1. 意外中断。

打开了某个中断,但是没有响应和清除中断标志,导致程序一直进入中断,造成死机假象。

2. 中断变量处理不妥。

3. 地址溢出。

4. 无条件的死循环。

单片机程序

单片机程序
led=0xfe; //左移初始值定位
led1=0x7f;
P0=led; //输出
P1=led1;
ys1ms(120); //延时
for(i=1;i<8;i++) //设置移动7次
{
a=led<<i;//灯左移i位
P0=a; //依次点亮
b=led1>>i;
case 0xfd:rlszy();break;//扫描状态标志,为2时,第2种效果
case 0xfb:rsdzmyy();break;//扫描状态标志,为3时,第3种效果
case 0xf7:rlsnwyd();break; //扫描状态标志,为4时,第4种效果
P1=b;
ys1ms(150);
}
}
//按键3效果程序:3灯走马右移函
rsdzmyy()
{
P0=0x1f;//00011111
P1=0xff;//11111111
ys1ms(80);
P0=0x8f;//10001111
P1=0xfe;//11111110
}
}
if(P2==0xfd) //11111101 按键2
{
ys1ms(10);
if(P2==0xfd)
{
flag=0xfd;
while(P2==0xfd);
}
}
if(P2==0xfe) //11111110 按键1
{
P1=0xff;
ys1ms(300);
P0=0xe7;//11100111
P1=0xe7;
ys1ms(90);

51单片机基本程序

51单片机基本程序

51单片机基本程序在学习嵌入式系统开发中,51单片机是一个重要的组成部分。

通过编写基本程序,可以更好地理解51单片机的原理和工作方式。

本文将介绍51单片机基本程序的编写方法及应用。

一、概述51单片机是一种基于哈佛结构的8位单片机,采用英特尔的经典架构。

通过编写基本程序,可以实现各种功能,如LED灯控制、数码管显示以及与外设的通信等。

二、开发工具在编写51单片机基本程序之前,我们需要准备一些开发工具。

最常用的工具是Keil C51开发环境,它是一种集成开发环境(IDE),提供了包括编译器、调试器在内的多种工具。

另外,还需要一个烧录器,用于将程序烧录到单片机中。

三、编写基本程序编写51单片机基本程序的第一步是创建一个新的项目。

在Keil C51中,选择“File”->“New Project”来创建一个新的项目,然后选择单片机型号和存储路径。

接下来,我们需要编写程序代码。

以下是一个简单的LED闪烁程序的示例:```c#include <reg52.h>sbit LED = P1^0;void delay(unsigned int time) {unsigned int i, j;for (i = 0; i < time; i++)for (j = 0; j < 500; j++); }void main(){while (1){LED = 0; // LED灯亮 delay(1000); //延时1秒 LED = 1; // LED灯灭 delay(1000); //延时1秒 }}```在上述代码中,我们首先定义了一个LED的IO口,并使用了一个延时函数来控制LED的亮灭。

在主函数中,我们使用一个无限循环来实现LED的闪烁。

四、程序调试和测试编写完基本程序后,我们需要对程序进行调试和测试。

在Keil C51中,选择“Debug”->“Start/Stop Debug Session”来启动调试会话。

单片机实训总结(集锦10篇)

单片机实训总结(集锦10篇)

单片机实训总结(集锦10篇)单片机实训总结第1篇单片机是一门应用性和综合性很强的学科,它综合了电子技术中的模拟电路和数字电路方面的知识,特别是数字电路,因为数字电路在单片机里面的应用很多。

由于单片机涉及的知识很多,所以我们只能循序渐进的学习,逐步的积累,没有什么捷径可循。

在大二的时候,我就听学长介绍过单片机,当时感觉很神奇,从此就对单片机特别感兴趣,也感觉它特别有用。

于是经学长推荐,在大二上学期我利用学习之余在图书馆借书,学习了KILE和Proteus软件,刚开始学习的时候,对单片机没有什么认识,不知道什么是单片机,更不知道它有什么作用。

通过学习才大体知道了单片机的一些知识。

由中央处理器CPU、随机存储器RAM、只读存储器ROM、I/O接口、定时器/计数器以及串行通信接口等集成在一块芯片上,构成了一个单片微型计算机,简称为单片机。

也算给我正式学习单片机打下一个基础。

在大二下学期,我购买了一套单片机学习开发板和郭天祥主编的《新概念51单片机C语言教程》,从此正式开启我的单片机学习之路。

在刚开始学时,就完全模仿郭天祥主编的这本书再结合开发板一步一步的学,从点亮一个发光二级管,流水灯,数码管,定时器,中断,矩阵键盘,AD、DA,串口通行,I2C总线等一步一步的深入学习。

此时,我虽然能看懂程序,一些简单的程序可以自己编写,但一些比较复杂的自己编不出来。

在大二暑假,我发现了郭天祥主讲的《十天学会单片机》视屏,于是我坚持天天看视屏,然后在自己根据视屏内容结合开发板写程序,调程序,就这样学了一个暑假。

通过这个视屏,我初步了解了单片机的硬件结构,编程方法及调试方法(用KILE软件调试和用开发板调试),寄存器的使用,学会了如何看芯片资料,初步开始利用芯片时序图来编程。

可以说这个视屏对我学习单片机有巨大的帮助,更夸张的说是这个视屏将我带进了单片机的世界,让我尽情的体验单片机带给我的快乐!在大三上学期,我有幸参加了教改班的单片机课程学习。

单片机课程学习总结

单片机课程学习总结

《单片机》课程学习总结《单片机》这门课程我已经学了一个学期了,在这一个学期的学习过程中,我一开始不怎么懂得编程,但慢慢的我现在已经不仅会读程序还会写程序了。

真为自己一个学期来努力学到的单片机知识只是而感到高兴。

怎么学单片机?也常看到有人说学了好几个月可就是没有什么进展。

当然,受限于每个人受到的教育水平不同和个人理解能力的差异,学习起来会有快慢之分,但我感觉最重的就是学习方法。

一个好的学习方法,能让你事半功倍,这里说说我学习单片机的经历和方法。

我觉得学习单片机首先要懂得C语言,因为单片机大多说都是靠程序来实现的,如果看不懂程序或则不懂的编程是很难学会单片机的。

学习单片机首先要明白一个程序是怎么走的,要完全懂得程序每一个步骤的意思。

其次要懂得每一条指令的意思,不能盲目地去靠背指令,这是记得不牢靠的,最主要的还是靠了解。

学习单片机最主要的对89C51芯片内部结构有全方面的,只要了解了89C51才能知道单片机实现什么样的功能和作用,才能对单片机有更深一步的了解。

通过一个学期《单片机》这门课程的学习,我也从中有了不少心得和体会想和大家分享一下。

万事开头难、要勇敢迈出第一步。

开始的时候,不要老是给自己找借口,不要说单片机的程序全是英文,自己看不懂。

遇到困难要一件件攻克,不懂指令就要勤奋看书,不懂程序就先学它,这方面网上教程很多,随便找找看一下,做几次就懂了。

然后可以参考别的人程序,抄过来也无所谓,写一个最简单的,让它运行起来,先培养一下自己的感觉,知道写程序是怎么一回事,无论写大程序还是小程序,要做的工序不会差多少。

然后建个程序,加入项目中,再写代码、编译、运行。

必须熟悉这一套工序。

个人认为,一块学习板还是必要的,写好程序在上面运行一下看结果,学习效果会好很多,仿真器就看个人需要了。

单片机是注重理论和实践的,光看书不动手,是学不会的。

知识点用到才学,不用的暂时丢一边。

厚厚的一本书,看着人头都晕了,学了后面的,前面的估计也快忘光了,所以,最好结合实际程序,用到的时候才去看,不必说非要把书从第一页看起,看完它才来写程序。

单片机程序架构详解篇

单片机程序架构详解篇

单片机程序架构详解一、前言单片机,也称为微控制器(Microcontroller),是将计算机的体系结构集成到一个芯片上的微型计算机。

由于其体积小、成本低、可靠性高等特点,单片机在工业控制、智能仪表、家用电器等领域得到了广泛应用。

了解单片机的程序架构是编写和优化单片机程序的关键。

二、单片机程序架构概述单片机的程序架构主要由以下几个部分组成:1. 硬件抽象层(HAL):这一层为上层软件提供了一个与硬件无关的接口,使得软件可以独立于硬件进行开发和运行。

HAL层通常包括对单片机各种外设(如GPIO、UART、SPI、PWM等)的操作函数。

2. 系统服务层:这一层提供了系统级的各种服务,如任务调度、内存管理、时间管理等。

这些服务使得上层应用程序可以更加专注于业务逻辑的实现。

3. 应用层:这是最上层,直接面向用户,包含了各种应用程序的逻辑代码。

三、各层详解1. 硬件抽象层(HAL)硬件抽象层(HAL)是单片机程序架构中非常重要的一层,其主要目标是使得硬件相关的操作与具体的硬件实现无关。

这样,当硬件平台发生变化时,只要HAL层设计得当,上层代码就不需要改变。

HAL层通常包括以下内容:* 各种外设寄存器的操作函数:例如,GPIO的输入输出函数、UART的发送接收函数等。

这些函数隐藏了具体的寄存器操作细节,使得开发者只需要关注功能实现而不需要关心底层寄存器的操作。

* 硬件初始化函数:用于在系统启动时对单片机进行初始化,如配置时钟、启动看门狗等。

* 中断处理函数:用于处理单片机的各种中断事件,如定时器溢出、串口接收等。

2. 系统服务层系统服务层提供了单片机操作系统所需的各种服务,如任务调度、内存管理、时间管理等。

这些服务使得上层应用程序可以更加专注于业务逻辑的实现。

以下是一些常见的系统服务:* 任务调度:多任务环境下,任务调度器负责分配CPU时间给各个任务,使得各个任务能够按需运行。

* 内存管理:负责动态内存的分配和释放,如堆和栈的管理。

51单片机总结(适合于初学者)

51单片机总结(适合于初学者)

学习使用单片机就是理解单片机硬件结构,以及内部资源的应用,在汇编或C语言中学会各种功能的初始化
设置,以及实现各种功能的程序编制。
第一步:数字I/O的使用
使用按钮输入信号,发光二极管显示输出电平,就可以学习引脚的数字I/O功能,在按下某个按钮后
,某发光二极管发亮,这就是数字电路中组合逻辑的功能,虽然很简单,但是可以学习一般的单片机编程
不先进,但是对于接口的学习是非ห้องสมุดไป่ตู้重要的。正确使用USART接口,需要学习通信协议,PC机的RS232接口
编程等等知识。试想,单片机实验板上的数据显示在PC机监视器上,而PC机的键盘信号可以在单片机实验
板上得到显示,将是多么有意思的事情啊!
第五步:学会A/D转换
MAP430单片机带有多通道12位A/D转换器,通过这些A/D转换器可以使单片机操作模拟量,显示和检测
bit flags;
unsigned char vextor[10];
int wwww;
注意:变量名不能用C语言中的关键字表示。
(9)
包含的头文件(可以在安装目录下INC目录下查看)
通常有:reg51.h reg52.h math.h ctype.h stdio.h stdlib.h absacc.h
能就是在快速动作发生后,单片机中断正常运行的程序,处理快速发生的动作,处理完成后,在返回执行
正常的程序。中断功能使用中的困难是需要精确地知道什么时候不允许中断发生(屏蔽中断)、什么时候
允许中断发生(开中断),需要设置哪些寄存器才能使某 种中断起作用,中断开始时,程序应该干什么
,中断完成后,程序应该干什么等等 。
第四步:与PC机进行RS232通信

stc单片机范例程序

stc单片机范例程序

stc单片机范例程序STC单片机范例程序STC单片机是一种常用的嵌入式系统开发工具,它具有体积小、功耗低、功能强大等特点,被广泛应用于各种电子设备中。

在使用STC单片机开发项目时,范例程序是非常重要的参考资料。

本文将介绍一些常见的STC单片机范例程序,以帮助读者更好地理解和应用STC单片机。

一、LED闪烁程序以下是一个简单的LED闪烁程序范例:```c#include <reg52.h>sbit LED = P1^0;void main(){while(1){LED = 0; // LED亮delay(500); // 延时500msLED = 1; // LED灭delay(500); // 延时500ms}}void delay(unsigned int count){unsigned int i, j;for(i = 0; i < count; i++)for(j = 0; j < 120; j++);}```该程序使用了P1口的第0位作为控制LED的引脚,通过不断改变LED的状态来实现LED的闪烁效果。

其中的delay函数用于延时一定的时间,以控制LED的亮灭频率。

二、按键检测程序以下是一个简单的按键检测程序范例:```c#include <reg52.h>sbit KEY = P2^0;sbit LED = P1^0;void main(){while(1){if(KEY == 0) // 检测按键是否按下{LED = 0; // LED亮}else{LED = 1; // LED灭}}}```该程序使用了P2口的第0位作为检测按键的引脚,当按键被按下时,LED亮起;当按键松开时,LED熄灭。

三、数码管显示程序以下是一个简单的数码管显示程序范例:```c#include <reg52.h>unsigned char code ledChar[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};sbit digit1 = P2^0;sbit digit2 = P2^1;sbit digit3 = P2^2;sbit digit4 = P2^3;void main(){unsigned char i = 0;while(1){P0 = ledChar[i]; // 在数码管上显示数字digit1 = 1; // 第1位数码管亮digit2 = 0; // 第2位数码管灭digit3 = 0; // 第3位数码管灭digit4 = 0; // 第4位数码管灭delay(10);P0 = ledChar[i]; // 在数码管上显示数字digit1 = 0; // 第1位数码管灭digit2 = 1; // 第2位数码管亮digit3 = 0; // 第3位数码管灭digit4 = 0; // 第4位数码管灭delay(10);P0 = ledChar[i]; // 在数码管上显示数字 digit1 = 0; // 第1位数码管灭digit2 = 0; // 第2位数码管灭digit3 = 1; // 第3位数码管亮digit4 = 0; // 第4位数码管灭delay(10);P0 = ledChar[i]; // 在数码管上显示数字 digit1 = 0; // 第1位数码管灭digit2 = 0; // 第2位数码管灭digit3 = 0; // 第3位数码管灭digit4 = 1; // 第4位数码管亮delay(10);i++;if(i == 10){i = 0;}}}void delay(unsigned int count){unsigned int i, j;for(i = 0; i < count; i++)for(j = 0; j < 120; j++);}```该程序使用了P0口作为数码管的控制引脚,通过改变P0口的输出来控制数码管显示不同的数字。

单片机的40个程序

单片机的40个程序

名称:定时器0#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED=P1^2; //定义LED端口/*-----------------------定时器初始化子程序------------*/void Init_Timer0(void){TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TH0=0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出TL0=0x00;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}/*--------主程序-----------*/main(){Init_Timer0();while(1);}/*--------- 定时器中断子程序--------*/void Timer0_isr(void) interrupt 1 using 1{TH0=0x00; //重新赋值TL0=0x00;LED=~LED; //指示灯反相,可以看到闪烁}/*---------- 名称:定时器1----*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED=P1^2; //定义LED端口/*---定时器初始化子程序----*/void TIM2Inital(void){RCAP2H = (65536-60000)/256;//晶振12M 10ms 16bit 自动重载RCAP2L = (65536-60000)%256;ET2=1; //打开定时器中断EA=1; //打开总中断TR2=1; //打开定时器开关}/*-----主程序---*/main(){TIM2Inital();while(1);}/*--------定时器中断子程序-----*/void TIM2(void) interrupt 5 using 1//定时器2中断{TF2=0;LED=~LED; //指示灯反相}名称:外部中断0电平触发#include<reg52.h>/*------主程序-*/main(){P1=0x55; //P1口初始值EA=1; //全局中断开EX0=1; //外部中断0开IT0=0; //电平触发while(1){//在此添加其他程序}}/*---------外部中断程序--------*/void ISR_Key(void) interrupt 0 using 1{P1=~P1;}名称:外部中断1#include<reg52.h>main(){P1=0x55; //P1口初始值EA=1; //全局中断开EX1=1; //外部中断0开IT1=1; //边沿触发,IT1=0表示电平触发while(1){//在此添加其他程序}}/*-------外部中断程序-*/void ISR_Key(void) interrupt 2 using 1{//在此处可以添加去抖动程序,防止按键抖动造成错误P1=~P1;}名称:遥控器红外解码LCD1602液晶显示#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的#include<stdio.h>#include<intrins.h>#define TURE 1#define FALSE 0sbit IR=P3^2; //红外接口标志sbit RS = P2^4;//Pin4sbit RW = P2^5;//Pin5sbit E = P2^6;//Pin6#define Data P0//数据端口unsigned int hour,minute,second,count;char code Tab[16]="0123456789ABCDEF";char data TimeNum[]=" ";char data Test1[]=" ";/* 变量声明*/unsigned char irtime;//红外用全局变量bit irpro_ok,irok;unsigned char IRcord[4]; //处理后的红外码,分别是客户码,客户码,数据码,数据码反码unsigned char irdata[33]; //33个高低电平的时间数据/* 函数声明*/void Ir_work(void);void Ircordpro(void);void ShowString (unsigned char line,char *ptr);/* 定时器0中断服务函数*/void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数{irtime++; //用于计数2个下降沿之间的时间}/* 外部中断0函数*/void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数{static unsigned char i; //接收红外信号处理static bit startflag; //是否开始处理标志位if(startflag){if(irtime<63&&irtime>=33)//引导码TC9012的头码,9ms+4.5msi=0;irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1irtime=0;i++;if(i==33){irok=1;i=0;}}else{irtime=0;startflag=1;}}/* 定时器0初始化*/void TIM0init(void)//定时器0初始化{TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //重载值TL0=0x00; //初始化值ET0=1; //开中断TR0=1;}/* 外部中断初始化*/void EX0init(void){IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)EX0 = 1; //使能外部中断EA = 1; //开总中断}/* 红外键值处理*/void Ir_work(void) //红外键值散转程序{TimeNum[5] = Tab[IRcord[0]/16]; //处理客户码并显示TimeNum[6] = Tab[IRcord[0]%16];TimeNum[8] = Tab[IRcord[1]/16]; //处理客户码并显示TimeNum[9] = Tab[IRcord[1]%16];TimeNum[11] = Tab[IRcord[2]/16]; //处理数据码并显示TimeNum[12] = Tab[IRcord[2]%16];TimeNum[14] = Tab[IRcord[3]/16]; //处理数据反码并显示TimeNum[15] = Tab[IRcord[3]%16];ShowString(1,TimeNum);//显示处理过后的码值irpro_ok=0; //处理完成后清楚标志位}/* 红外解码函数处理*/void Ircordpro(void)//红外码值处理函数{unsigned char i, j, k;unsigned char cord,value;k=1;for(i=0;i<4;i++) //处理4个字节{for(j=1;j<=8;j++) //处理1个字节8位{cord=irdata[k];if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差{value=value|0x80;}else{value=value;}if(j<8){value=value>>1;}k++;}IRcord[i]=value;value=0;} irpro_ok=1;//处理完毕标志位置1}/* 微秒延时函数*/void DelayUs(unsigned char us)//delay us{unsigned char uscnt;uscnt=us>>1;/* Crystal frequency in 12MHz*/while(--uscnt);}/* 毫秒函数声明*/void DelayMs(unsigned char ms)//delay Ms{while(--ms){DelayUs(250);DelayUs(250);DelayUs(250);DelayUs(250);}}/* 写入命令函数*/void WriteCommand(unsigned char c){DelayMs(5);//操作前短暂延时,保证信号稳定E=0;RS=0;RW=0;_nop_();E=1;Data=c;E=0;}/*写入数据函数*/void WriteData(unsigned char c){DelayMs(5); //操作前短暂延时,保证信号稳定E=0;RS=1;RW=0;_nop_();E=1;Data=c;E=0;RS=0;}/*写入字节函数*/void ShowChar(unsigned char pos,unsigned char c) {unsigned char p;if (pos>=0x10)p=pos+0xb0; //是第二行则命令代码高4位为0xc elsep=pos+0x80; //是第二行则命令代码高4位为0x8 WriteCommand (p);//写命令WriteData (c); //写数据}/*写入字符串函数*/void ShowString (unsigned char line,char *ptr){unsigned char l,i;l=line<<4;for (i=0;i<16;i++)ShowChar (l++,*(ptr+i));//循环显示16个字符}/* 初始化函数*/void InitLcd(){DelayMs(15);WriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x06); //显示光标移动位置WriteCommand(0x0c); //显示开及光标设置WriteCommand(0x01); //显示清屏}/*主函数*/void main(void){EX0init(); //初始化外部中断TIM0init();//初始化定时器InitLcd(); //初始化液晶DelayMs(15);sprintf(Test1," "); //显示第一行固定信息ShowString(0,Test1);sprintf(TimeNum,"Code ");//显示第二行固定信息ShowString(1,TimeNum);while(1)//主循环{if(irok) //如果接收好了进行红外处理{Ircordpro();irok=0;}if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键显示对应的数字等{Ir_work();}}}/*-----------------------------------------------名称:遥控器红外解码数码管显示#include<reg52.h>#include<stdio.h>#include<intrins.h>#define TURE 1#define FALSE 0sbit IR=P3^2; //红外接口标志unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*变量声明*/unsigned char irtime;//红外用全局变量bit irpro_ok,irok;unsigned char IRcord[4];unsigned char irdata[33];/* 函数声明*/void Delay(unsigned char mS);void Ir_work(void);void Ircordpro(void);/*定时器0中断服务函数*/void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数{irtime++; //用于计数2个下降沿之间的时间}/*外部中断0函数*/void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数{static unsigned char i; //接收红外信号处理static bit startflag; //是否开始处理标志位if(startflag){if(irtime<63&&irtime>=33)//引导码TC9012的头码,9ms+4.5msi=0;irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1irtime=0;i++;if(i==33){irok=1;i=0;}}else{irtime=0;startflag=1;}}/* 定时器0初始化*/void TIM0init(void)//定时器0初始化{TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //重载值TL0=0x00; //初始化值ET0=1; //开中断TR0=1;}/*外部中断初始化*/void EX0init(void){IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)EX0 = 1; //使能外部中断EA = 1; //开总中断}/*红外键值处理*/void Ir_work(void)//红外键值散转程序{switch(IRcord[2])//判断第三个数码值{case 0:P0=dofly[1];break;//1 显示相应的按键值case 1:P0=dofly[2];break;//2case 2:P0=dofly[3];break;//3case 3:P0=dofly[4];break;//4case 4:P0=dofly[5];break;//5case 5:P0=dofly[6];break;//6case 6:P0=dofly[7];break;//7case 7:P0=dofly[8];break;//8case 8:P0=dofly[9];break;//9}irpro_ok=0;//处理完成标志}/* 红外解码函数处理*/void Ircordpro(void)//红外码值处理函数{unsigned char i, j, k;unsigned char cord,value;k=1;for(i=0;i<4;i++) //处理4个字节{for(j=1;j<=8;j++) //处理1个字节8位{cord=irdata[k];if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差{value=value|0x80;}else{value=value;}if(j<8){value=value>>1;}k++;}IRcord[i]=value;value=0;} irpro_ok=1;//处理完毕标志位置1}void main(void){EX0init(); //初始化外部中断TIM0init();//初始化定时器P2=0x00;//1位数码管全部显示while(1)//主循环{if(irok) //如果接收好了进行红外处理{Ircordpro();irok=0;}if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等{Ir_work();}}}名称:与电脑串口通信内容:连接好串口或者usb转串口至电脑,下载该程序,打开电源打开串口调试程序,将波特率设置为9600,无奇偶校验晶振11.0592MHz,发送和接收使用的格式相同,如都使用字符型格式,在发送框输入hello,I Love MCU ,在接收框中同样可以看到相同字符,说明设置和通信正确#include<reg52.h> /void main (void){SCON = 0x50; /* SCON: 模式1, 8-bit UART, 使能接收*/ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */TH1 = 0xFD; /* TH1: reload value for 9600 baud @ 11.0592MHz */ TR1 = 1; /* TR1: timer 1 run */ EA = 1; /*打开总中断*/ES = 1; /*打开串口中断*/while (1) /*主循环不做任何动作*/{}}*/串口中断程序*/void UART_SER (void) interrupt 4 //串行中断服务程序{unsigned char Temp; //定义临时变量if(RI) //判断是接收中断产生{RI=0; //标志位清零Temp=SBUF; //读入缓冲区的值P1=Temp; //把值输出到P1口,用于观察SBUF=Temp; //把接收到的值再发回电脑端}if(TI) //如果是发送标志位,清零TI=0;}/*-----------------------------------------------名称:红外收发内容:*红外测试程序,用单片机通过发射管发射38K的调制频率码,由一体化接收并解码由发光管显示。

单片机实验报告总结

单片机实验报告总结

单片机实验报告总结单片机实验报告总结单片机实验心得体会单片机实验心得体会时间过得真快,不经意间,一个学期就到了尾声,进入到如火如荼的期末考试阶段。

在学习单片机这门课程之前,就早早的听各种任课老师和学长学姐们说过这门课程的重要性和学好这门课程的关键~~多做单片机实验。

这个学期,我们除了在课堂上学习理论知识,还在实验室做了7次实验。

将所学知识运用到实践中,在实践中发现问题,强化理论知识。

现在,单片机课程已经结束,即将开始考试了,需要来好好的反思和回顾总结下了。

第一次是借点亮LED灯来熟悉keil软件的使用和试验箱上器材。

第一次实验体现了一个人对新事物的接受能力和敏感度。

虽然之前做过许多种实验。

但依旧发现自己存在一个很大的问题,对已懂的东西没耐心听下去,容易开小差;在听老师讲解软件使用时,思路容易停滞,然后就跟不上老师的步骤了,结果需要别人再次指导;对软件的功能没有太大的热情去研究探索,把一个个图标点开,进去看看。

所以第一次试验相对失败。

鉴于此,我自己在宿舍下载了软件,然后去熟悉它的各个功能,使自己熟练掌握。

在做实验中,第二个问题应该是准备不充分吧。

一开始,由于没有课前准备的意识,每每都是到了实验室才开始编程,完成作业,导致每次时间都有些仓促。

后来在老师的批评下,认识到这是个很大的问题:老师提前把任务告诉我们,就是希望我们私下把程序编好。

于是我便在上机之前把程序编好,拷到U盘,这样上机时只需调试,解决出现的问题。

这样就会节约出时间和同学讨论,换种思路,换种方法,把问题给吃透。

发现、提出、分析、解决问题和实践能力是作为我们这个专业的基本素质。

三是我的依赖性很大,刚开始编程序时喜欢套用书上的语句,却对语句的理解不够。

于是当程序出现问题时,不知道如何修改,眼前的程序都是一块一块的被拼凑整合起来的,没法知道哪里错了。

但是编程是一件很严肃的事情,容不得半点错误。

于是便只能狠下决心,坚持自己编写,即使套用时,也把每条语句弄懂。

单片机学习总结与心得范文8篇

单片机学习总结与心得范文8篇

单片机学习总结与心得范文8篇第1篇示例:单片机学习总结与心得单片机作为嵌入式系统中的核心部件,是现代电子技术领域中不可或缺的部分。

在我学习单片机的过程中,我深刻感受到了它的重要性和广泛应用性。

通过不断的学习和实践,我积累了一些经验和心得,希望能与大家分享。

学习单片机需要具备一定的基础知识。

单片机是一种微型计算机,它具有微处理器、存储器和输入输出设备等基本部件。

对计算机原理、数字电路等基础知识的掌握是必不可少的。

在学习过程中,要注重理论与实践相结合,通过动手实践来加深对知识的理解和掌握。

学习单片机需要有耐心和毅力。

单片机编程是一项复杂而繁琐的工作,常常需要反复试验和调试才能达到理想的效果。

在遇到问题和困难时,不要灰心丧气,要持之以恒,不断尝试和学习。

只有通过不断地实践和积累经验,才能逐渐掌握单片机编程的技巧和方法。

学习单片机需要注重团队合作。

单片机项目通常需要多人合作完成,每个人负责不同的部分。

在团队合作中,要注重沟通和协作,共同协商解决问题,避免出现分歧和矛盾。

只有团结一致,大家才能共同完成任务,取得成功。

学习单片机要保持好奇心和求知欲。

单片机技术是一个不断发展和进步的领域,新的技术和方法不断涌现。

要保持学习的热情和积极性,不断更新知识,跟上技术的发展。

只有不断学习和探索,才能不断提高自己的技术水平和能力。

学习单片机是一个磨砺意志和提升能力的过程。

通过学习单片机,我不仅增加了对电子技术的了解和掌握,还培养了坚韧不拔的毅力和团队合作的精神。

我相信,在未来的学习和工作中,这些经验和心得将对我产生重要的影响和帮助。

第2篇示例:单片机学习总结与心得学习单片机需要扎实的基础知识。

单片机涉及到很多的电子元器件和原理,例如电路基础、数字电子技术、模拟电子技术等,对这些知识的掌握是学习单片机的前提。

在学习的过程中,要多看书、多动手实践,加强对基础知识的理解和掌握,这样才能更好地应用到实际项目中。

学习单片机需要不断实践,善于总结经验。

2023年单片机学习总结报告7篇

2023年单片机学习总结报告7篇

2023年单片机学习总结报告7篇第1篇示例:2023年已经过去,回顾这一年的单片机学习历程,不禁让人感慨万千。

单片机作为嵌入式系统的核心,被广泛应用于各种领域,学习单片机不仅可以丰富我们的知识储备,还可以培养我们的动手能力和解决问题的能力。

在2023年,我在单片机学习方面取得了一些进步,下面就来总结一下吧。

2023年是我正式开始系统学习单片机的一年。

在之前的时间里,我只是简单了解了一些基础知识,对于单片机的原理和应用并不是很清楚。

我在这一年中开始系统地学习了单片机的原理、指令集、编程方法等内容,逐渐建立了自己的知识体系。

通过学习单片机的基础知识,我对单片机的工作原理有了更深入的理解,可以更好地应用单片机来解决实际问题。

2023年我在单片机编程方面取得了一些进步。

在学习单片机的过程中,我主要使用C语言进行编程。

通过实践和不断地练习,我逐渐掌握了单片机的编程方法,并能够利用单片机实现一些简单的功能。

我可以通过编程控制LED灯的亮灭、驱动舵机的旋转等。

这些实践不仅加深了我对单片机编程的理解,还培养了我的动手能力和创造力。

在2023年的单片机学习中,我也参加了一些实践项目,提升了我的综合能力。

在一次实训中,我与同学们共同完成了一个简单的智能小车项目。

在这个项目中,我们需要设计和搭建一个能够自动避障的小车,通过单片机控制小车行驶方向和速度。

通过这个项目,我不仅学会了如何将单片机应用到实际项目中,还锻炼了我的团队合作能力和解决问题的能力。

2023年是我单片机学习的一个重要阶段,我在这一年中积累了许多宝贵的经验和知识。

在未来的学习和实践中,我将继续努力,不断提升自己的单片机技术,为将来的发展打下坚实的基础。

希望在2024年,我能够取得更大的进步,实现更多有意义的单片机应用项目。

【文章结束】。

第2篇示例:2023年单片机学习总结报告在2023年的单片机学习中,我们更加深入地学习了单片机的原理和应用。

通过课堂上的理论学习和实践操作,我们对单片机的工作原理有了更深入的了解,掌握了单片机的基本功能和应用。

51单片机汇编程序

51单片机汇编程序

51单片机汇编程序1. 简介51单片机是一种常用的8位单片机芯片,具有广泛的应用领域。

51单片机的编程语言主要有汇编语言、C语言和底层汇编语言。

本文主要介绍51单片机的汇编程序。

2. 汇编程序基础2.1 寄存器51单片机的CPU有4个8位寄存器(A、B、DPTR、PSW)和一个16位寄存器(PC)。

在汇编程序中,我们可以使用这些寄存器来进行各种操作。

•A寄存器(累加器):用于存储数据和进行算术运算。

•B寄存器:辅助寄存器,可用于存储数据和进行算术运算。

•DPTR寄存器:数据指针寄存器,用于存储数据存取的地址。

•PSW寄存器:程序状态字寄存器,用于存储程序运行状态信息。

•PC寄存器:程序计数器,用于存储当前执行指令的地址。

2.2 指令集51单片机的指令集包含了多种汇编指令,可以用来进行数据操作、算术运算、逻辑运算、控制流程等。

常用的汇编指令有:•MOV:数据传送指令。

•ADD、SUB:加法和减法运算指令。

•ANL、ORL、XRL:逻辑运算指令。

•MOVX:外部RAM的读写指令。

•CJNE、DJNZ:条件分支指令。

•LCALL、RET:函数调用和返回指令。

2.3 编写一个简单的汇编程序下面是一个简单的汇编程序示例,用于将A寄存器中的数据加1,并将结果存储到B寄存器中。

ORG 0x0000 ; 程序的起始地址MOV A, #0x01 ; 将A寄存器赋值为1ADD A, #0x01 ; 将A寄存器加1MOV B, A ; 将A寄存器的值传送到B寄存器END ; 程序结束在上面的示例中,ORG指令用于指定程序的起始地址,MOV 指令用于将A寄存器赋值为1,ADD指令用于将A寄存器加1,MOV指令用于将A寄存器的值传送到B寄存器,END指令用于标记程序结束。

3. 汇编语言的应用51单片机的汇编语言广泛应用于各种嵌入式系统中,包括智能家居、工业自动化、仪器仪表等领域。

汇编程序具有以下特点:•程序执行效率高:由于汇编语言直接操作硬件,可以精确控制程序的执行流程,提高程序的执行效率。

单片机应用及实验报告总结

单片机应用及实验报告总结

单片机应用及实验报告总结单片机是一个集成电路,能够实现计算、控制和处理信息的功能。

它广泛应用于各种电子设备和系统中,例如家用电器、车辆控制系统、工业自动化等。

我在单片机应用及实验中,学习了单片机的基本原理和使用方法,并进行了一些简单的实验。

在单片机的应用方面,我了解到单片机可以通过输入和输出口与外部设备进行通信。

通过编写程序,可以实现从外部设备读取输入信号,并根据程序的逻辑进行处理和控制。

一种常见的应用是通过输入按键的信号来实现对设备的控制,例如控制电视的开关和音量调节等。

此外,单片机还可以通过输出信号控制外部设备的各种操作,例如点亮LED灯、控制电机运转等。

在实验过程中,我学习了单片机的编程语言和开发工具。

通过使用流行的编程语言如C语言和汇编语言,我成功地编写了一些简单的控制程序。

在不同的实验中,我学会了如何使用单片机读取和处理各种输入信号,并通过输出口控制外部设备的操作。

这些实验让我对单片机的原理和使用有了更深入的理解。

通过单片机应用及实验,我认识到了单片机的优点和局限性。

单片机具有体积小、功耗低、成本低等优点,非常适合嵌入式系统的开发。

同时,单片机还具有处理速度快、功能强大的特点,能够满足各种复杂的应用需求。

然而,单片机也存在一些限制,例如存储能力有限、硬件资源不足等。

在一些复杂应用中,可能需要多个单片机进行协作,或者使用其他的处理器和硬件来实现更复杂的功能。

总的来说,单片机应用及实验让我对单片机的原理和使用有了更深入的了解。

通过学习不同的实验和应用案例,我对单片机的优点和局限性有了更清晰的认识。

单片机在各个领域都有广泛的应用,对于我今后从事电子工程相关工作将有很大帮助。

同时,我也认识到在实际应用中,需要根据具体的需求选择合适的处理器和硬件来实现更复杂的功能。

通过不断实践和学习,我相信我能够运用单片机技术解决更多实际问题。

单片机常见程序

单片机常见程序

单片机常见程序单片机(Microcontroller)作为一种嵌入式系统的核心元件,其程序设计是嵌入式系统开发中至关重要的一环。

在单片机常见程序中,包括了很多不同的程序类型,如控制程序、通信程序、驱动程序等。

这些程序以其独特的功能和特点,为嵌入式系统的正常运行提供了必要的支持。

一、控制程序控制程序是单片机常见程序中最基本的类型之一。

它主要用于控制各种外部设备或传感器的运行状态,实现对嵌入式系统行为的控制。

例如,单片机可以通过控制程序来控制电机的启停、风扇的转速、灯光的亮度等。

控制程序通常采用循环结构实现,通过检测外部输入信号,并根据输入信号的变化进行相应的操作和控制。

二、通信程序通信程序是单片机应用中另一个常见的程序类型。

在现代嵌入式系统中,单片机往往需要与其他设备或者系统进行数据交互和通信。

通信程序可以通过串口、CAN总线、以太网等方式来实现数据的传输和通信。

单片机通过通信程序可以与电脑、手机、传感器等设备进行数据交换,实现信息的输入输出、远程监控、智能控制等功能。

三、驱动程序驱动程序是单片机常见程序中的另一个重要类型。

在嵌入式系统中,单片机需要通过驱动程序来控制各类外设的工作。

驱动程序可以包括对按键、LED灯、LCD显示屏、温度传感器等各类设备的初始化、配置和控制操作。

通过合理编写驱动程序,可以使得单片机能够与各类外设无缝衔接,实现功能的完整性和稳定性。

四、中断程序中断程序是单片机常见程序中一种特殊的类型。

在嵌入式系统中,中断程序的作用是及时处理外部设备的中断请求,以提高系统的响应速度和实时性。

中断程序通常用于处理按键中断、定时器中断、串口中断等。

当外部设备发生中断事件时,单片机会立即跳转到相应的中断程序中执行特定的操作,然后再返回到原来的程序中继续执行。

中断程序的编写需要特殊的注意和设计,以确保系统的稳定性和可靠性。

五、算法实现程序除了以上几种常见的程序类型之外,单片机的应用还需要根据实际需求编写各类算法实现程序。

2023年单片机学习总结报告8篇

2023年单片机学习总结报告8篇

2023年单片机学习总结报告8篇第1篇示例:2023年,是单片机学习领域的关键一年。

在这一年里,我系统性地学习了单片机的相关知识,并在实践中不断提升自己的技能。

通过这份报告,我将总结2023年我在单片机学习方面所取得的成果和经验,以及未来的学习计划和展望。

一、2023年单片机学习总结2. 学习内容在2023年里,我系统地学习了单片机的基本原理、结构和工作方式,掌握了常用的单片机型号和规格,学习了单片机的编程语言和编程方法,熟悉了常用的单片机编程工具和软件,掌握了单片机的输入输出、中断、定时器、串口通信等基本功能,了解了单片机的应用领域和发展趋势。

3. 学习方法在学习单片机的过程中,我采取了多种学习方法,包括阅读相关书籍和文档、参加单片机学习班和培训课程、观看网络视频教程、参与单片机实践项目、与其他单片机爱好者交流经验等。

通过这些学习方法,我深入了解了单片机的知识点,掌握了单片机的技能要点,提升了单片机的工程能力。

4. 学习成果在2023年里,我取得了一些学习成果,包括独立编写了几个简单的单片机程序,成功运行了一些单片机实验项目,参与了一些单片机竞赛活动,获得了一些单片机证书和奖项,积累了一些单片机项目经验,建立了一些单片机合作关系,实现了一些单片机目标和愿望。

二、未来的学习计划和展望1. 学习目标在未来,我将继续深入学习单片机的知识和技能,包括拓展单片机的应用领域和开发平台,深化单片机的原理和应用,提升单片机的性能和稳定性,创新单片机的功能和功能,推广单片机的产品和服务。

4. 学习规划在未来的学习中,我将根据单片机领域的发展趋势和需求特点,制定合理的学习规划和总结报告,不断调整和优化自己的学习计划和目标设定,根据自己的学习进度和水平,确定具体的学习任务和时程安排,不断提高自己的学习能力和实践效果。

第2篇示例:2023年单片机学习总结报告引言单片机作为嵌入式系统中的核心元件,在现代科技领域中扮演着至关重要的角色。

STC51单片机程序下载失败总结

STC51单片机程序下载失败总结

STC51单⽚机程序下载失败总结STC为宏晶公司推出的国产51单⽚机,其优点在于价格低廉,功能强⼤,使⽤⽅便,尤其是其串⼝ISP下载程序的⽅式⽅便了⼤量⽤户,免去了购买昂贵的编程器,⾮常适合单⽚机⼊门学习使⽤。

但是初学者常会遇到程序⽆法下载的情况,很多⼈甚⾄因此放弃了学习,实在可惜,在此给⼤家总结了常见的出错原因、判断⽅法和解决⽅法。

⼯具STC单⽚机最⼩系统、USB-TTL下载线(或者单⽚机学习板⾃带下载电路)、电脑STC单⽚机下载程序主要分三部分:单⽚机最⼩系统、下载电路、计算机端下载失败⼀般就从这三个⽅⾯来解决问题。

⼀、最⼩系统的问题1、不是STC系列单⽚机,如果是AT或其他品牌单⽚机,下载⽅式与STC不同。

2、单⽚机损坏,⽐如有的单⽚机内由于ISP系统引导码出错,能运⾏之前下载进的程序,但不能下载程序;或者单⽚机已损坏。

3、晶振问题,如:没有晶振,晶振放在插座上接触不良,或者引脚太长不起振等。

最⼩系统电路图如下,由电源、单⽚机、复位电路、晶振时钟电路组成:STC89C52RC单⽚机:⼆、下载电路的问题1、下载芯⽚损坏(⼀般下载涉及的芯⽚有PL2303、CH341、MAX232)。

2、PL2303的晶振不是12M。

3、USB接⼝松动,下载线断路等。

4、接线错误,如:TXD、RXD接反。

MAX232电路图(串⼝电平转换):USB转串⼝(⼀般⽤CH341芯⽚):USB-TTL⼩板(⼀般⽤PL2303芯⽚):USB-TTL电路图:三、计算机端的问题1、下载软件的问题,最好使⽤STC_ISP最新版本,在Win7系统中有时可能要以管理员⾝份运⾏。

2、驱动安装的问题,如果设备管理器中有COM⼝“USBtoSerial”且⽆感叹号,⼀般驱动就没有问题,但是还是可以重装驱动看看;安装的驱动要与系统对应(Windows732位、64位或者WindowsXP)。

3、COM⼝设置错,⼀般下载时会提⽰打开串⼝失败。

单片机课心得体会8篇

单片机课心得体会8篇

单片机课心得体会8篇(经典版)编制人:__________________审核人:__________________审批人:__________________编制单位:__________________编制时间:____年____月____日序言下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!并且,本店铺为大家提供各种类型的经典范文,如工作计划、工作总结、述职报告、合同协议、演讲致辞、条据文书、心得体会、策划方案、教学资料、其他范文等等,想了解不同范文格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!Moreover, our store provides various types of classic sample essays, such as work plans, work summaries, job reports, contract agreements, speeches, documents, insights, planning plans, teaching materials, other sample essays, and more. If you want to learn about different sample formats and writing methods, please stay tuned!单片机课心得体会8篇通过写心得体会,我们可以分享自己在学习中的成功经验,为他人提供指导和鼓励,写下心得体会可以让我们更好地反思和总结自己的经验,提高自身的思考和分析能力,本店铺今天就为您带来了单片机课心得体会8篇,相信一定会对你有所帮助。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机子程序汇总该文档中所有程序测试期间系统配置如下:MCU:STC12C5A60S2晶体:22.1184MHZ一、AD程序程序需要先声明ADC通道,即给ADC_PASS定义通道值,0x00—0x07共8个通道1、8位精度unsigned int Get_ADC(void){unsigned int ADC_Result;ADC_CONTR = ADC_CONTR|0x80; //开启AD电源//资料写初次打开电源后,做适当延时,让电源稳定P1ASF = P1ASF | (0x01<<ADC_PASS); //设置ADC通道为模拟模式ADC_CONTR = 0xE0|ADC_PASS; //设置ADC转换通道ADC_RES = 0x00; //清零转换结果寄存器ADC_CONTR = ADC_CONTR | 0x08;while(!(ADC_CONTR & 0x10)); //等待转换完成ADC_CONTR = ADC_CONTR & (0xE0|ADC_PASS); //清标志ADC_Result = ADC_RES; //提取采集到的数据return ADC_Result;}经测试,该程序运行一次所需要时间大约7us2、10位精度unsigned int Get_ADC(void){unsigned int ADC_Result,ADC_Result1;ADC_CONTR = ADC_CONTR|0x80; //开启AD电源/***资料写初次打开电源后,做适当延时,让电源稳定***********/P1ASF = P1ASF | (0x01<<ADC_PASS); //设置ADC通道为模拟模式ADC_CONTR = 0xE0|ADC_PASS; //设置ADC转换通道ADC_RES = 0x00; //清零转换结果寄存器ADC_CONTR = ADC_CONTR | 0x08;while(!(ADC_CONTR & 0x10)); //等待转换完成ADC_CONTR = ADC_CONTR & (0xE0|ADC_PASS); //清标志ADC_Result = ADC_RES; //提取采集到的数据ADC_Result1 = ADC_RESL;ADC_Result = ADC_Result<<2|ADC_Result1;return ADC_Result;}经测试,程序运行一次需要大约9us时间3、AD采集的数值与电压值转换函数unsigned int ADC_Converter(void){unsigned int Vol_Value,Get_Data;double Temp0,Temp1;Get_Data = Get_ADC();//此计算时间较长32usTemp0=Get_Data;Temp1=Temp0*ADC_VCC/1023;Vol_Value = (unsigned int)Temp1;return Vol_Value;}经测试,数据处理过程需要32us时间如果是8为数据采集,把除数改成255即可二、PWM程序程序需要先设置PWM工作时钟,通过对寄存器CMOD的设置,确定PWM_CLK#define CIDL 1 //7,计数器阵列空闲控制,0:空闲模式PCA计数继续工作1:空闲模式PCA计数停止工作#define CPS2 1 //3——1,PCA计数脉冲选择#define CPS1 0 //000 Fosc/12#define CPS0 0 //001 Fosc/2//010 定时器0的一处,实现可调频率的PWM输出//011 ECI/P3.4脚的外部时钟输入,最大速率Fosc/2//100 Fosc//101 Fosc/4//110 Fosc/6//111 Fosc/8#define ECF 0#define PWM_CLK_12 0#define PWM_CLK_2 1#define PWM_CLK_T0 2#define PWM_CLK_ECI 3#define PWM_CLK_1 4#define PWM_CLK_4 5#define PWM_CLK_6 6#define PWM_CLK_8 71、PWM启动程序void Pwm_Init(){CMOD = (CIDL<<7)|(PWM_CLK_T0<<1)|ECF; //PCA在空闲模式下停止计数;PCA时钟源为机器周期的1/4;不允许PCA中断CL=0x00;CH=0x00;CCAP0L=0xC0;//占空比调节占空比=1-(CCAP0L/255)当前占空比是百分之25,3F时占空比为百分之75CCAP0H=0xC0;CCAPM0=0x42;CR=1; //计数器清零}2、PWM时钟取决于定时器0时,T0的初始化程序void Timer0_Init(){AUXR = 0x80; //设置T0为1T模式下计数TMOD = 0x02;TH0 = 0xFD; //Fosc的三分频TL0 = 0xFD;EA = 1;ET0 = 1;TR0 = 1;}三、SPI程序程序需要先配置硬件SPI#define SSIG 1 //1: 忽略SS脚,由MSTR位决定主机还是从机0: SS脚用于决定主从机。

#define SPEN 1 //1: 允许SPI,0:禁止SPI,所有SPI管脚均为普通IO#define DORD 0 //1:LSB先发,0:MSB 先发#define MSTR 1 //1:设为主机0:设为从机#define CPOL 1 //1: 空闲时SCLK为高电平,0:空闲时SCLK为低电平#define CPHA 1 //#define SPR1 0 //SPR1,SPR0 00: fosc/4, 01: fosc/16#define SPR0 0 // 10: fosc/64, 11: fosc/128#define SPEED_4 0 // fosc/4#define SPEED_16 1 // fosc/16#define SPEED_64 2 // fosc/64#define SPEED_128 3 // fosc/128#define SPIF 0x80 //SPI传输完成标志。

写入1清0。

#define WCOL 0x40 //SPI写冲突标志。

写入1清0。

1、SPI初始化配置函数void SPI_Init_Initing(){SPCTL = (SSIG << 7) + (SPEN << 6) + (DORD << 5) + (MSTR << 4) + (CPOL <<3) + (CPHA << 2) + SPEED_64; //重点:最后SPEED决定SPI速率}2、SPI发送一个字节函数void SD_spi_write(unsigned char Mydata){SPSTAT = 0xC0; //清0 SPIF和WCOL标志SPDAT = Mydata; //发送一个字节while(!(SPSTAT & SPIF)) ; //等待发送完成}3、SPI接收一个字节函数unsigned char SD_spi_read(void){SPSTAT = 0xC0; //清0 SPIF和WCOL标志SPDAT = 0xff; //发送一个字节while(!(SPSTAT & SPIF)) ; //等待发送完成return SPDAT;}四、串口1程序1、串口1初始化函数该函数在22.1184M晶振条件下,波特率为9600void UART_Init(){SCON = 0X50;BRT = 0XFA;AUXR = 0X11; //允许独立波特率发生器独立波特率发生器用于串口1ES = 1;EA = 1;}2、串口1发送字节数据void Uart_Send_Byte(unsigned char mydata) //发送一个字节数据{ES=0;TI=0;SBUF=mydata;while(!TI);TI=0;ES=1;}3、串口1发送字符串数据void Sto_Uart_cmd(unsigned char *dat) //发送字符串{unsigned char i;for(i=0;i<8;i++)Uart_Send_Byte(*(dat+i));}4、串口1接收字节数据void Uart_Received_Interrupt(void) interrupt 4{unsigned char Temp;if(RI){Temp=SBUF;// REN=0;RI=0;}Uart_Send_Byte(Temp);}五、串口2程序该函数在22.1184M晶振条件下,波特率为96001、串口2初始化函数void Serial_Sec_Init(){S2CON=0X50; //8位波特率可变,允许接收//S2SM0 S2SM1 串口工作方式设置//S2SM1//S2REN 接收允许位//S2TB8 S2RB8 发送接收停止标志位//S2TI S2RI 发送接收完成标志位BRT=0XFA;AUXR=0X10; //T0x12,T1x12 0:定时器12分频;1:定时器不分频//UART_M0x6 0:串口12分频;1:串口2分频//BRTR 0:不允许独立波特率发生器;1:允许//S2SMOD 1:串口2波特率x2//BRTx12 0:独立波特率发生器12时钟计数一次1:1时钟计数一次//EXTRAM 0:允许使用内部1024RAM 1:禁止//S1BRS 0:串口1使用定时器1产生波特率// 1:独立波特率发生器用于串口1,释放定时器1 IE2=0X01; //XXXXXX ESPI ES2 SPI中断允许位串口2中断允许位EA = 1;}2、串口2发送字节数据void Serial_Sec_Send_Byte(unsigned char Mydata){unsigned char Temp0;IE2=0x00;S2CON=S2CON&0xFD;S2BUF=Mydata;do{Temp0=S2CON;Temp0=Temp0&0x02;}while(Temp0==0);S2CON=S2CON&0xFD;IE2=0x01;}3、串口2接收字节数据void Serial_Sec_Received() interrupt 8{unsigned char Temp=0;Temp = S2CON;Temp = Temp&0x01;if(Temp==1){S2CON = S2CON&0xFE;Temp = S2BUF;}Serial_Sec_Send_Byte(Temp);}六、IIC程序该程序经DS1302芯片测试1、IIC协议字节写入函数void I2C_Write(unsigned char Mydata) //DS1302底层驱动写数据{unsigned char i;for(i=0;i<8;i++){Time_DATA=Mydata&0x01;Time_CLK=0;Mydata=Mydata>>1;Time_CLK=1;}}2、IIC协议字节读取函数unsigned char I2C_Read(void){unsigned char i;unsigned char Mydata;for(i=0;i<8;i++){Time_CLK=1;Mydata>>=1;Time_CLK=0;_nop_();if(Time_DATA) Mydata+=0x80;}return Mydata;}七、CLKOUT程序单片机的P3.4,P3.5以及P1.0分别在T0、T1以及BRT溢出时产生时钟/**********************************//****输出模式不能开启定时器中断****//**CLKOUT=(Fosc/2)/12/(256-TH0)****//*******定时器0工作在12T模式*******//***定时器0工作在1T模式,不除12****//**********************************/void main(){TMOD = 0x02;TH0 = 0xFA;TL0 = 0xFA;TR0 = 1;WAKE_CLKO = (W AKE_CLKO & 0xFE)|0x01; while(1);}。

相关文档
最新文档