中断驱动多任务--- 单片机(MCU) 下的一种软件设计结构

Akron 2008-08-01 11:41:26
加精
http://blog.csdn.net/Akron/archive/2008/08/01/2755643.aspx


mcu由于内部资源的限制,软件设计有其特殊性,程序一般没有复杂的算法以及数据结构,代码量也不大, 通常不会使用 OS (Operating System), 因为对于一个只有 若干K ROM, 一百多byte RAM 的 mcu 来说,一个简单OS 也会吃掉大部分的资源。



对于无 os 的系统,流行的设计是主程序(主循环 ) + (定时)中断,这种结构虽然符合自然想法,不过却有很多不利之处,首先是中断可以在主程序的任何地方发生,随意打断主程序。其次主程序与中断之间的耦合性(关联度)较大,这种做法 使得主程序与中断缠绕在一起,必须仔细处理以防不测。



那么换一种思路,如果把主程序全部放入(定时)中断中会怎么样?这么做至少可以立即看到几个好处: 系统可以处于低功耗的休眠状态,将由中断唤醒进入主程序; 如果程序跑飞,则中断可以拉回;没有了主从之分(其他中断另计),程序易于模块化。



(题外话:这种方法就不会有何处喂狗的说法,也没有中断是否应该尽可能的简短的争论了)



为了把主程序全部放入(定时)中断中,必须把程序化分成一个个的模块,即任务,每个任务完成一个特定的功能,例如扫描键盘并检测按键。 设定一个合理的时基 (tick), 例如 5, 10 或 20 ms, 每次定时中断,把所有任务执行一遍,为减少复杂性,一般不做动态调度(最多使用固定数组以简化设计,做动态调度就接近 os 了),这实际上是一种无优先级时间片轮循的变种。来看看主程序的构成:



void main()

{

…. // Initialize

while (true) {

IDLE; //sleep

}

}



这里的 IDLE 是一条sleep 指令,让 mcu 进入低功耗模式。中断程序的构成



void Timer_Interrupt()

{

SetTimer();

ResetStack();

Enable_Timer_Interrupt;

….





进入中断后,首先重置Timer, 这主要针对8051, 8051 自动重装分频器只有 8-bit, 难以做到长时间定时;复位 stack ,即把stack 指针赋值为栈顶或栈底(对于 pic, TI DSP 等使用循环栈的 mcu 来说,则无此必要),用以表示与过去决裂,而且不准备返回到中断点,保证不会保留程序在跑飞时stack 中的遗体。Enable_Timer_Interrupt 也主要是针对8051。8051 由于中断控制较弱,只有两级中断优先级,而且使用了如果中断程序不用 reti 返回,则不能响应同级中断这种偷懒方法,所以对于 8051, 必须调用一次 reti 来开放中断:



_Enable_Timer_Interrupt:

acall _reti

_reti: reti



下面就是任务的执行了,这里有几种方法。第一种是采用固定顺序,由于mcu 程序复杂度不高,多数情况下可以采用这种方法:





Enable_Timer_Interrupt;

ProcessKey();

RunTask2();



RunTaskN();

while (1) IDLE;



可以看到中断把所有任务调用一遍,至于任务是否需要运行,由程序员自己控制。另一种做法是通过函数指针数组:



#define CountOfArray(x) (sizeof(x)/sizeof(x[0]))

typedef void (*FUNCTIONPTR)();



const FUNCTIONPTR[] tasks = {

ProcessKey,

RunTask2,



RunTaskN

};



void Timer_Interrupt()

{

SetTimer();

ResetStack();

Enable_Timer_Interrupt;

for (i=0; i<CountOfArray (tasks), i++)

(*tasks[i])();

while (1) IDLE;

}





使用const 是让数组内容位于 code segment (ROM) 而非 data segment (RAM) 中,8051 中使用 code 作为 const 的替代品。



(题外话:关于函数指针赋值时是否需要取地址操作符 & 的问题,与数组名一样,取决于 compiler. 对于熟悉汇编的人来说,函数名和数组名都是常数地址,无需也不能取地址。对于不熟悉汇编的人来说,用 & 取地址是理所当然的事情。Visual C++ 2005对此两者都支持)



这种方法在汇编下表现为散转, 一个小技巧是利用 stack 获取跳转表入口:



mov A, state

acall MultiJump

ajmp state0

ajmp state1

...



MultiJump: pop DPH

pop DPL

rl A

jmp @A+DPTR





还有一种方法是把函数指针数组(动态数组,链表更好,不过在 mcu 中不适用)放在 data segment 中,便于修改函数指针以运行不同的任务,这已经接近于动态调度了:



FUNCTIONPTR[COUNTOFTASKS] tasks;



tasks[0] = ProcessKey;

tasks[0] = RunTaskM;

tasks[0] = NULL;



...

FUNCTIONPTR pFunc;

for (i=0; i< COUNTOFTASKS; i++) {

pFunc = tasks[i]);

if (pFunc != NULL)

(*pFunc)();

}





通过上面的手段,一个中断驱动的框架形成了,下面的事情就是保证每个 tick 内所有任务的运行时间总和不能超过一个 tick 的时间。为了做到这一点,必须把每个任务切分成一个个的时间片,每个 tick 内运行一片。这里引入了状态机 (state machine) 来实现切分。关于 state machine, 很多书中都有介绍, 这里就不多说了。



(题外话:实践升华出理论,理论再作用于实践。我很长时间不知道我一直沿用的方法就是state machine,直到学习UML/C++,书中介绍 tachniques for identifying dynamic behvior,方才豁然开朗。功夫在诗外,掌握 C++, 甚至C# JAVA, 对理解嵌入式程序设计,会有莫大的帮助)



状态机的程序实现相当简单,第一种方法是用 swich-case 实现:



void RunTaskN()

{

switch (state) {

case 0: state0(); break;

case 1: state1(); break;



case M: stateM(); break;

default:

state = 0;

}

}



另一种方法还是用更通用简洁的函数指针数组:



const FUNCTIONPTR[] states = { state0, state1, …, stateM };



void RunTaskN()

{

(*states[state])();

}



下面是 state machine 控制的例子:



void state0() { }

void state1() { state++; } // next state;

void state2() { state+=2; } // go to state 4;

void state3() { state--; } // go to previous state;

void state4() { delay = 100; state++; }

void state5() { delay--; if (delay <= 0) state++; } //delay 100*tick

void state6() { state=0; } // go to the first state



一个小技巧是把第一个状态 state0 设置为空状态,即:



void state0() { }



这样,state =0可以让整个task 停止运行,如果需要投入运行,简单的让 state = 1 即可。



以下是一个键盘扫描的例子,这里假设 tick = 20 ms, ScanKeyboard() 函数控制口线的输出扫描,并检测输入转换为键码,利用每个state 之间 20 ms 的间隔去抖动。



enum EnumKey {

EnumKey_NoKey = 0,



};

struct StructKey {

int keyValue;

bool keyPressed;

} ;



struct StructKeyProcess key;



void ProcessKey() { (*states[state])(); }



void state0() { }

void state1() { key.keyPressed = false; state++; }

void state2() { if (ScanKey() != EnumKey_NoKey) state++; } //next state if a key pressed

void state3()

{ //debouncing state

key.keyValue = ScanKey();

if (key.keyValue == EnumKey_NoKey)

state--;

else {

key.keyPressed = true;

state++;

}

}

void state4() { if (ScanKey() == EnumKey_NoKey) state++; } //next state if the key released

void state5() { ScanKey() == EnumKey_NoKey? state = 1 : state--; }





上面的键盘处理过程显然比通常使用标志去抖的程序简洁清晰,而且没有软件延时去抖的困扰。以此类推,各个任务都可以划分成一个个的state, 每个state 实际上占用不多的处理时间。某些任务可以划分成若干个子任务,每个子任务再划分成若干个状态。



(题外话:对于常数类型,建议使用 enum 分类组织,避免使用大量 #define 定义常数)


...全文
2987 84 打赏 收藏 转发到动态 举报
写回复
用AI写文章
84 条回复
切换为时间正序
请发表友善的回复…
发表回复
jialong6688 2012-03-10
  • 打赏
  • 举报
回复
顶一下!
wenweima 2012-03-10
  • 打赏
  • 举报
回复

佩服楼主的精神,保留搂主的结论
叮当 2011-09-19
  • 打赏
  • 举报
回复
MSP430不采用这种架构也可以大部分时间处于睡眠状态,我没有看出这种架构的好处,不过可以这样思考还是很不错的!
gzfsaok 2011-09-03
  • 打赏
  • 举报
回复
误入歧途,.............
qq363155763 2011-09-02
  • 打赏
  • 举报
回复
用中断中实现主程序,限制比较大~
ailiufeng6 2011-09-01
  • 打赏
  • 举报
回复
驱动延时外设时就不行了,比如LCD.
guangbiao_w 2011-06-03
  • 打赏
  • 举报
回复
顶一下!
既然存在就有一定的适用范围,只是还没有面面俱到。
革命尚未成功,楼主还需努力。
看好你。。。
宋哥 2011-05-27
  • 打赏
  • 举报
回复
觉得没必要,画蛇添足。按楼主的想法,放在中断外面会更好,也可以实现其所定义的多任务。比如第一个循环干这个,第二个循环干那个,比在中断里安全的多。中断里还是少做点事比较安全。
mark0668 2011-05-26
  • 打赏
  • 举报
回复
高手!学习了
zjh2287 2011-05-26
  • 打赏
  • 举报
回复
46楼、70楼的说法很好,这几天我也要实现一个功能,其中有个3s的延时,而且我在这3s中我还需要做四个按键的检测。按照楼主的方法就没法实现了。但是楼主的想法还是很好的,看得出来楼主对汇编、对实时系统的了解还是很深的。
wrt851001 2011-04-13
  • 打赏
  • 举报
回复
很不错,学习了。
greatriver007 2011-04-11
  • 打赏
  • 举报
回复
像高手学习啊,厉害
liaoshuipinggfkd 2011-04-11
  • 打赏
  • 举报
回复
值得学习一下!
AnYidan 2011-04-10
  • 打赏
  • 举报
回复
佩服楼主的精神,保留搂主的结论
ninesunsz 2011-04-10
  • 打赏
  • 举报
回复
如果不想用操作系统可以在中断里置标志位。在while(1)里用检测标志位的方法来运行各个任务。主要就是切换任务的时候处理比较麻烦,这可能是有些人不愿意用操作系统的原因
ruiyudong 2011-04-09
  • 打赏
  • 举报
回复
好东东,学习,学习,再学习!!!!!
wangweihe68 2011-04-01
  • 打赏
  • 举报
回复
这种想法不错,但是有个致命的问题,负责轮转的中断必须是最高级的中断,这样的话会大大降低系统的实时性
thrawsnow 2011-03-28
  • 打赏
  • 举报
回复
讲得很好,收藏
fzzz123 2011-03-05
  • 打赏
  • 举报
回复
我确实看不懂
hicaru000000 2011-01-24
  • 打赏
  • 举报
回复
终于看完了,说说自己的见解吧。

1. 个人感觉这并非是多任务处理,是响应中断后,一连串的流程控制,只不过是写成了多任务的形式,

也更像是汇编的一些编程方式(似乎LZ对汇编语言的造诣比较深吧,呵呵);

2. 这一长段中断响应之后,整个单片机应该就没有余力去进行其他程序段的运行了,

(没看到LZ中断程序中其他中断响应的处理,应该是屏蔽了吧)。

也就是说程序的可扩展性、可移植性不是很高吧,仅限于完成一些类似于PLC的流程控制。

个人浅见,忘大家品评。
加载更多回复(64)
单片机原理及应用》 课程设计报告 课题名称: 单片机液晶显示"万年历" 分 院: 机械与电气工程学院 教 研 室: 电气工程及其自动化 班 级: 姓 名: 学 号: 指导教师: 二 一三 年 五 月 单片机液晶显示"万年历" 1、 设计任务 1、用字符型液晶显示模块LCD1602显示万年历的日期/时间等,如下图 所示(仅供参考,可个性化差异设计,如显示学号等): 2012/05/01 DHY 16:47:58 123789 2、单片机与实时时钟芯片DS1302之间通过SPI接口实现"日期/时 间"数据的采集。 3、用3×4行列式键盘进行校时,共有"1、2、3、4、5、6、7、8、9、 0" 、"校时(闪烁)"和"(年/月/日/时/分/秒)切换"等十二个 按键。 2、 硬件设计 1.系统框图 按照系统设计功能的要求,初步确定系统由主控模块、时控模块、 显示驱动及显示模块和键盘接口模块共4个模块组成,电路系统构成框 图如图1-1所示。 图1-1电子万年历电路系统构成框图 主控芯片使用51系列AT89C51单片机,时钟芯片使用美国 DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟 DS1302。采用DS1302作为计时芯片,可以做到计时准确。更重要的 是,DS1302可以在很小电流的后备电源(2.5~5.5V电源,在2.5V时耗 电小于300nA),而且DS1302可以编程选择多种充电电流来对后备电 源进行慢速充电,可以保证后备电源基本不耗电。显示驱动采用排阻 RESPACK-8驱动和LM016L液晶显示 、图条/柱图显示或64 点阵显示接 口的小型串行输入/输出芯片。片内包括BCD 译码器、多路扫描控制 器、字和位驱动器和8*8 静态RAM。RESPACK-8需九导线连接,每位 显示数字有一个地址由微处理器写入。允许使用者选择每位是BCD 译 码或不译码。使用者还可选择停机模式、数字亮度控制、从1~8 选择 扫描位数和对所有LCD显示器的测试模式。显示模块采用普通的LCD 显示屏。 2.各部分介绍(包括电路和主要器件介绍) 2.1电路设计 如图2-1示为电子万年历电路设计原理图,系统由主控制器 AT89C51、时钟电路DS1302、显示驱动RESPACK-8电路,LM016L液 晶显示电路及键扫描电路组成。 图2-1 电子万年历电路原理图 2.2系统硬件概述 2.2.1 主控制器AT89C51 ATMEL公司生产的AT89C51单片机采用高性能的静态80C51设计, 并采用先进工艺制造,还带有非易失性Flash程序存储器。它是一种高性 能、低功耗的8位CMOS微处理芯片,市场应用最多。其主要特点如 下: 8KB Flash ROM,可以擦除1000次以上,数据保存10年。 256字节内部RAM; 电源控制模式; 时钟可停止和恢复; 空闲模式; 掉电模式; 6个中断源; 4个中断优先级; 4个8位I/O口; 全双工增强型TUAR; 3个16位定时/计数器:T0、T1(标准80C51)和增加的T2(捕获 和比较) 全静态工作方式:0~24MHZ 2.2.2 时钟电路DS1302 DS1302的性能特性: 实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年 进行比较; 用于高速数据暂存的31*8位RAM; 最少引脚的串行I/O; 2.5~5.5V电压工作范围; 2.5V时电流小于300nA; 用于时钟或RAM数据读/写的单字节或多字节(脉冲方式)数 据传送方式; 简单的三线接口; 可选的慢速充电(至VCC1)的能力。 DS1302在任何数据传送时必须先初始化,把RST脚置为高电平,然 后把8位地址和命令字装入移位寄存器,数据在SCLK的上升沿被访问 到。在开始8个时钟周期,把命令字节装入移位寄存器后,另外的时钟 周期在读操作时输出数据,在写操作时写入数据。时钟脉冲的个数在单 字节方式下为8+8,在多字节方式下为8+字节数,最大可达248字节数。 如果在传送过程中置RST脚为低电平,则会终止本次数据传送,并且I/O 引脚变为高阻态。上电运行时,在VCC 2.5V之前,RST脚必须保持低 电平。只有在SCLK为低电平时,才能将RST置为高电平。 2.3主要单元电路的设计 2.3.1显示电路 显示部分采用普通的LM016L液晶显示,如图2-2,以减少硬件电 路。LM016L液晶模块采用hd 44780控制器,hd44780具有简单而功能较 强的指令集,可以实现字符移动,闪烁等功能,LM016L与单片机MCU 通讯可采用8位或4位并行传输两种方式,hd44780控制器由两个8位寄存 器,指令寄存器(IR)和数据寄存器(DR)忙标志(BF),显示数 RAM(DDRAM),字符发生器ROM(CGOROM)字符发生器 RAM(CGR
课程名称: 微机原理课程设计 题 目: 数字电压表 摘要 单片微型计算机简称单片机,是典型的嵌入式微控制器,常用英文字母的缩写MCU表 示单片机单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个 计算机系统集成到一个芯片上。单片机由运算器,控制器,存储器,输入输出设备构成 ,相当于一个微型的计算机(最小系统),和计算机相比,单片机缺少了外围设备等。 概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应 用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择 。它最早是被用在工业控制领域。 其中我们用于学习用的最多的是STC89C52单片机,STC89C52是STC公司生产的一种低 功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。STC89C52使用经典 的MCS- 51内核,但也做了很多改进使得芯片具有传统51单片机不具备的功能。STC89C52具有8k 字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结 构,全双工串行口。 本设计就是以单片机STC89C52为核心,附以外围电路,实现数字电压表的功能,并运 用软件Proteus进行仿真来得到实验结果。 关键词:STC89C52单片机、仿真、中断、数字电压表、数码管显示 目录 一、任务要求 4 1.1 设计任务 4 1.2 设计要求 4 1.3 发挥部分 4 1.4 创新部分 4 二、方案总体设计与论证 5 三、硬件设计 6 3.1 单片机晶振部分 6 3.2 单片机复位部分 6 3.3 电源模块部分 7 3.4 A/D转换部分 7 3.5 数码管显示部分 8 3.6 单片机STC89C52 10 四、软件设计 13 4.1 程序设计总方案 13 4.2 系统子程序设计 13 4.3 A/D转换子程序 13 4.4 中断 14 五、系统仿真与调试 15 六、设计总结与心得体会 18 6.1 设计总结 18 6.2 心得体会 18 七、参考文献 19 一、任务要求 1.1 设计任务 使用所学的单片机以及编程的知识,利用PCF8591A/D转换芯片把电阻转换为电压并使 用四位数码管显示出来。 1.2 设计要求 利用所学的软硬件知识,使用KEIL uVision4软件编写能够实现数字电压表功能的程序。使用软件将数字电压表的硬件电路 的模拟电路在70mm*90mmPCB板模板上绘制出来,然后根据lochmaster30软件所绘制的模 拟电路在70mm*90mmPCB板上焊接出来。检查电路焊接完好后把编写好的程序下载到单片 机内验证编写的程序,观察数字电压表的显示情况是否与实验要求相符。 1.3 发挥部分 使用PCF8591A/D转换芯片通过电阻的调节改变电压并在数码管上显示出来,并且使用 一个LED实时的把电压的大小体现出来,电压变高LED就变亮,电压变低LED就变暗。 1.4 创新部分 本实验需求测量0- 5V电压,发挥创新,将测量电压的大小增大,设置成可调挡的形式。可测量5V、10V、2 0V电压等。由于时间关系,程序只写了测量5V电压的,稍后会更新程序。本实验采用的 是四路检测问做法,尽可能发挥了它的功能。 二、方案总体设计与论证 本次步进电机控制实验以单片机为主体,P0口接上拉电阻驱动数码管的段码,P2口连 接数码管的位码,P2口的高四位从低到高分别控制第一、二、三、四个数码管亮或者灭 。P1.0口和P1.1口分别接PCF8591芯片的SCL和SDA引脚。SCL和SDA引脚分别为I2C总线的 时钟线、数据线。AIN0口接蓝白卧式可调电阻,当可调电阻滑动时,电阻的变化引起电 压的变化,经过PCF8591芯片的实时转换,通过单片机处理实时的在数码管上显示出来。 同时也能够通过外接在芯片的AOUT口的LED体现电压的大小。AOUT口为芯片的D/A转换输 出端。外加复位和晶振电路等组成的最小系统。EA引脚接高电平。 进行本实验之初具有两套方案: 方案一:使用附加发光二极管的亮与暗来体现电压的大小。此方法拥有体现电压大小 的效果更明确的优势。但是硬件电路会复杂一点。 方案二:不使用附加发光二极管的亮与暗来体现电压的大小。此方法具有硬件电路简 单的优势,节约了成本。但是体现效果不明显。 经过衡量,觉得附加LED体现会使电压大小的体现效果更加明了。所以选择方案一。 使用数码管显示附加LED来体现不电压的大小。 设计变化框图如图1所示: 图1 变化框图 设计系统功能图如图2所示: 图2 系统功能图 总体方案工作原理:STC89C52是集成40个I/O口的单片机,拥有12MHZ的晶振周期
目录 第一章前言 1 第二章 系统组成与原理 2 2.1 系统组成及通讯原理 2 2.1.1 系统构成 2 2.1.2 通信原理及协议 3 第三章 硬件电路设计 8 3.1 接口电平电路设计 8 3.1.1 RS-232接口电路设计 8 3.2 单片机电路设计 12 3.2.1 单片机电路设计图 12 第四章 软件设计 13 4.1 功能描述 13 4.1.1 上位机和下位机实现的功能 13 4.2 程序 13 4.2.1 下位机程序设计 13 4.2.2 上位机(PC机)程序设计 18 第五章 结束语 23 参考文献 25 致谢 26 摘要 :微机与单片机串行通信端口在系统控制的范畴中一直占据着及其重要的地位,它不仅 没有因为时代的进步而遭淘汰,反而在规格上越来越完善,应用也越来越广泛。作为一 种基本而又灵活方便的通信方式,串口通信被广泛应用于PC与PC或者PC与单片机之间的 数据交换以及其他工业控制与自动控制中。本次设计主要解决上位机与下位机之间的通 信问题。 ABSTRACT:Serial-communication based on Visual Studio 2005—Visual Basic 2005(VB.NET) is introduced in the paper. With this method, the development cycle of system can be reduced and the reliability of the system can be improved. An example of serial-communication between PC and MCS-51 is also given. The method is very useful to learners who want to learn new serial- communication technology between PC and MCS-51. 关键词:串行通信;单片机;PC机 KEY WORDS: Serial-Communication; MCU;PC 第一章前言 随着计算机技术的迅速发展及其在各领域的广泛应用,远程控制以及数据采集系统多 采用上位机和下位机的主从工作方式,由于串行通信具有高效可靠、价格便宜,遵循统一 的标准等特点,因而成为主要的通信手段。微机的分析处理能力较强,有很好的人机界面 和大容量的多种存储方式,所以上位机一般采用微机。而单片机具有价格低,功能强,抗干 扰能力好,以及面向控制等特点,所以下位机采用单片机来构成主从式多机工作模式。 本次设计的任务是给出在分布式控制系统中上位PC机与下位单片机(MSP430F149 )之间进行异步串行通信的解决方案,实现了上位机向多个(最多8个)下位机发送信息 以及下位机接收上位机的数据并能够向上位机发送数据的功能。要求在实际运行过程中 ,简单方便,稳定可靠,较好地解决上位机与下位机之间的通信问题。 第二章 系统组成与原理 2.1 系统组成及通讯原理 2.1.1 系统构成 一 MSP430F149功能简介: 本设计选用的主要芯片为MSP430F149,该单片机属于德州仪器公司MSP430F14X/16X FLASH 系列。该系列是一组工业级超低功耗的微控制器,运行环境温度为 -40~+85 摄氏度工作电压范围1.8~3.6V, MSP430 单片机之所以有超低的功耗,是因为其在降低芯片的电源电压及灵活而可控的运行时钟 方面都有其独到之处。由于具有16位RISC(精简指令集)结构,16位寄存器和常数寄存 器,MSP430 达到了最大的代码效率。数字控制的振荡器提供快速从所有低功耗模式苏醒到活动模式 的能力时间少于6ms。MSP430F149有较高的处理速度,在 8MHz 晶体驱动下指令周期为 125 ns。 另外它带有两个16 位定时器(带看门狗功能)、速度极快的8 通道12 位A/D 转换器(ADC)(带内部参考电压、采样保持和自动扫描功能)、一个内部比较器和两个通 用同步/异步发射接收器、48个I/O口(均可独立控制)的微处理器结构。硬件乘法器提高 了单片机的性能并使单片机在编码和硬件上可兼容[3]。这些特点保证了可编制出高效率 的源程序。 二、系统构成 1、系统框图 系统构成如图2.1所示,由上位机(即工业控制计算机)、通讯接口和下位机3部分组 成。上位机选用的是工控机 ,智能终端由单片机MSP430F149和外围传感器放大电路等构成(本设计部涉及该部分的 设计)。单片机与PC机之间通信方式为串行异步方式(UART),下位机采用中断方式进 行与上位机的数据交换,上位机采用按时查询方式对各串口进行读写操作。单片机MSP4 30要想与

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧