盛群c语言应用中断范例Word格式.docx

上传人:b****3 文档编号:16752937 上传时间:2022-11-25 格式:DOCX 页数:19 大小:509.63KB
下载 相关 举报
盛群c语言应用中断范例Word格式.docx_第1页
第1页 / 共19页
盛群c语言应用中断范例Word格式.docx_第2页
第2页 / 共19页
盛群c语言应用中断范例Word格式.docx_第3页
第3页 / 共19页
盛群c语言应用中断范例Word格式.docx_第4页
第4页 / 共19页
盛群c语言应用中断范例Word格式.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

盛群c语言应用中断范例Word格式.docx

《盛群c语言应用中断范例Word格式.docx》由会员分享,可在线阅读,更多相关《盛群c语言应用中断范例Word格式.docx(19页珍藏版)》请在冰豆网上搜索。

盛群c语言应用中断范例Word格式.docx

103

页共189页

7.1.2周边元件

使用单颗LED接到微控制器HT48R10A-1的埠A,PA0引脚

需要使用微控制器HT48R10A-1的暂存器INTC,TMRC与TMR等,定义如下

TMRC(TimerControlRegister)时钟控制暂存器控制时钟的功能与启动,

TMR暂存器是储存时钟启始数值的地方.当写入TMR暂存器时,也会存入preload

暂存器.若此时时钟是在停止状态中,则此数值会被写入时钟计数器(timercounter).

每当时钟被启动,它便将时钟计数器的数值往上加,一直加到FF,之后便发生时钟

满溢(timeroverflow).这时,下列的事情会发生

→产生中断讯号(interruptsignal)盛群半导体股份有限公司

104

→将preload暂存器中的数值重新载入时钟计数器,并且继续往上计数

如果需要时钟在每count个clock时产生满溢,可将256–count写入TMR

暂存器.如需要正确的时间,则需要设定根据系统频率设定TMRC暂存器中的

PSC0~PSC2.计算出对应的count并将256–count写入TMR暂存器

如需要产生时钟中断并处理之,则需要在INTC暂存器中打开时钟的中断功能,

将ETI设为1.当时钟计数满溢时,就会产生时钟中断,并跳到中断向量08H处.

中断函式会对埠A,PA0的LED做亮灭的控制

7.1.3电路图

将埠A的PA0连接到LED的阴极

7.1.4微控制器的架构设定(configurationoption)

HT48R10A-1的configurationoption设定

WDTclocksource:

disable

OSC:

Ext.Crystal

Pull-highPA:

Pull-high

InputtypePA:

SchmittTrigger

BZ/BZB:

Disable

Fsys=4M盛群半导体股份有限公司

105

7.1.5程式流程

7.1.6原始程式

1#include“ht48r10a-1.h”

2#define_ton_0e_04//暂存器TMRC的位元4,TON

3charsec_count;

//记录秒数

4voidinterruptISR_TIMER(void)@0x8//定义中断服务函式ISR在位址0x08

5{

6sec_count++;

//每16毫秒(ms)增加一

7if(sec_count>

62)//超过16*62=992毫秒,一秒

8{

9sec_count=0;

//重开始

10_pa0^=0x01;

//toggleLED,每一秒,轮流亮灭

11}

12}

13voidmain(void)盛群半导体股份有限公司

106

14{

15_pac=0x01;

//设定PA0为输出型态

16_pa=0xff;

//熄灭LED

17_intc=0x05;

//设定EMI,ETI致能.打开中断功能

18_tmrc=0x87;

//设定时钟控制暂存器,fint=fsys/256,timermode

19_tmr=(256–250);

//每250clock产生一次时钟中断

20sec_count=0;

//设定初始值

21_ton=1;

//启动时钟开始计时

22while

(1);

//无限回圈

23}

7.1.7程式说明

2定义变数_ton为时钟控制暂存器TMRC的位元4,TON控制时钟的开始或停止

3定义变数sec_count记录秒数

4~12定义时钟中断服务函式ISR_TIMER(void)放置于位址0x08处

6每16毫秒(ms)增加一

7如果累计的毫秒数超过62次(超过16*62=992毫秒,一秒)

9sec_count重设为0,重开始计数

10toggleLED,每一秒会轮流为亮灭

12~23主程式main(void)

15将PA0设为为输出型态,PA0接到LED

16设定PA0为1,熄灭LED

17设定中断控制暂存器(INTC)的EMI及ETI,让中断致能

18设定时钟控制暂存器(TMRC),fint=fsys/256,timermode,fsys=4MHz,1clock=64us

时钟频率=4M/256,clock=1/时钟频率=64us

19设定时钟每隔250clock,产生一次时钟中断.250*64us=16ms

20设定初始值

21设定_ton=1,启动时钟开始计时

22无限回圈while

(1)

107

7.2类比/数位转换(ADC)的应用

7.2.1目的

本范例利用HT46R63微控制器的类比/数位转换电路(analogtodigitalconverter)

将外界的类比讯号转换为数位,并从LCD面板显示其值.以C语言撰写ADC中断

服务函式(ISR)及LCD显示程式

7.2.2周边元件

LCD可使用盛群公司HT-IDE3000所附之LCDSimulator的液晶模拟面板档

LcdDemo.lcd及LCD各段码图案以方便调试,参阅第六章6.7节的LCD显示

HT46R63的类比/数位转换电路,包含下列的暂存器,使用前必须先设定

→ADR暂存器(22H)

类比讯号转换为数位的数值会储存在ADR暂存器中.转换的数值从0~255.

→ACSR暂存器(23H)设定A/D转换的速度

→ADCR暂存器(22H)选定A/D转换的输入通道,埠B的设定及启动转换的控制盛群半导体股份有限公司

108

当要做A/D转换时,需要先选定转换通道,埠B的设定及时钟选取.之后要将

ADCR暂存器(22H)的位元7(START)设为0->

1->

0,则A/D转换器就开始

做转换的动作.当转换完成时,ADCR暂存器的位元6(EOCB)会被清为0,若A/D

转换的中断功能是致能的(enable),则同时会产生中断.

109

如果变更转换通或埠B的设定,则需对A/D做初始化的动作,如下

在变更埠B设定的10个指令周期内将ADCR暂存器的位元7(START)设为1

再清为0即可

为了要利用HT46R62A/D转换器的中断功能,也需要设定中断向量及中断控制.

→INTC0暂存器

位元0(EMI)需要设为1,打开中断的总开关

→INTC1暂存器

位元1需要设为1,将A/D转换器的中断功能致能(enable)

110

7.2.3电路图

7.2.4微控制器的架构设定(ConfigurationOptions)

HT46R63的configurationoption设定

Fsys=4M

LCDduty:

3COM

LCDsegment:

20segments

SEG7-SEG10:

LCDoutput

SEG11-SEG14:

Logicaloutput

SEG15-SEG18:

Comparator:

111

7.2.5程式流程

7.2.6原始程式

1#include“ht46r63.h”

2//标头档中定义有变数_emi=_intc0.0,_eadi=_1e_1(INTC1bit1),

3//A/D转换器的暂存器_adr(0x21),_adcr(0x22),_acsr(0x23)

4#defineadc_start_22_7//bit7(START)ofADCR暂存器

5#defineFSYS80x01//ADC时钟来源及fsys/8

6#defineCH_AN00//ADC转换通道

7#defineADC_2CH2//ADC总通道个数:

2,AN0(PB0),AN1(PB1)

8charintflag=0;

//ADC中断旗标

9unsignedcharadcvalue=0;

//ADC转换后的数值

10voidinterruptADC_ISR(void)@0x14//ADC中断服务函式,中断向量为0x14

11{

12intflag=1;

//设定ADC中断旗标

LCDRAM清为0,不显示

打开ADC中断及总中断功能

设定ADC时钟,频率,转换通

道,总通道数,启动AD转换

将转换完成的数值显示在

LCD面板上盛群半导体股份有限公司

112

13adcvalue=_adr;

//读取转换后的数值

14}

15//启动ADC转换功能

16//adc_clk=clocksourceofADC,fsys/2,fsys/8,fsys/32(bit0~1ofACSR)

17//channel=channelnumberofAN,0~7(bit0~2ofADCR)

18//port_cfg=portBsetting(bit3~5ofADCR)

19voidStartADCTrans(charadc_clk,unsignedcharchannel,unsignedcharport_cfg)

20{

21_acsr=adc_clk;

//设定时钟来源及频率

22adcr=(port_cfg<

<

3)|channel;

//设定通道,埠B设定

23adc_start=1;

adc_start=0;

//改变ADC通道及埠B设定

24adc_start=0;

adc_start=1;

//启动ADC转换

25}

26//以下函式(除了主函式main)与第六章6.7节相同

27//定义数字‘0’~‘9’的LCDRAM资料,7个位元控制各段的显示

28//图样各段gacfbdc

29chardigit[10]={0b01111101,0b00011000,0b01110011,0b01111010,//‘0’,‘1’,’2’,’3’

300b00011110,0b01101110,0b01101111,0b00111000,//‘4’,’5’,’6’,’7’

310b01111111,0b01111110};

//‘8’,‘9’

32charLcdRam[20]@0x140;

//LCDRAM记忆体

33voidDelayTime(unsignedintcount)//10*count+11,ifcount>

256

34{

35while(count!

=0)count--;

36}

37//addr(IN)=LCDRAM位址=0x140+x

38//datal=写入LCDRAM的资料,bit0~2写入addr,bit3~5写入addr+1

39//bit6写入addr+2的bit2

40voidDisplayLcd(unsignedcharaddr,unsignedchardatal)

41{

42LcdRam[addr-0x140]=datal&

0x7;

//取位元0~2

43LcdRam[addr-0x140+1]=(data1>

>

3)&

//取位元3~5

44LcdRam[addr–0x140+2]=((data>

6)&

0x7)<

2;

//取位元6,在左移2位盛群半导体股份有限公司

113

45}

46//主函式

47voidmain(void)

48{

49intk;

50

51for(k=0;

k<

20;

k++)LcdRam[k]=0;

//将LCD记忆体清为0,LCD不显示

52_emi=0;

//停止所有中断的发生

53_eadi=1;

//ADC中断功能生效

54_emi=1;

//所有中断功能生效

55intflag=0;

56StartADCTrans(FSYS8,CH_AN0,ADC_2CH);

//开始ADC转换

57while

(1)//无限回圈,等候ADC中断产生

58{

59if(intflag==1)break;

//ADC中断产生,跳出回圈

60}

61//将转换好的数字显示于LCD面板

62k=adcvalue/100;

//取出百位数字

63DisplayLcd(0x146,digit[k]);

//显示百位数字

64k=(adcvalue/10)%10;

//取出十位数字

65DisplayLcd(0x143,digit[k]);

//显示数字

66k=adcvalue%10;

//取出个位数

67DisplayLcd(0x140,digit[k]);

68_delay(250000);

//延长1秒

69_delay(250000);

70_delay(250000);

71_delay(250000);

72for(k=0;

73}

114

7.2.7程式说明

4定义暂存器ADCR的位元7(START)

5~7定义本范例使用的ADC时钟来源及频率,转换通道及通道总个数

8定义ADC中断旗标,当等于1时表示ADC转换成功

9定义变数,储存ADC转换后的数值

10~14定义ADC中断服务函式ADC_ISR(void)及中断向量为0x14

12设定ADC中断旗标

13从暂存器读出转换后的数值并存入变数

19~25定义函式StartADCTrans()执行ADC转换

21设定ADC转换时钟及频率

22选定ADC转换通道及通道总数

23埠B设定更改

24启动ADC转换功能

26~45与第六章6.7节相同,LCD显示函式

47~73主函式,设定及启动ADC转换并将转换后的数值从LCD面板显示

51将LCD记忆体清为0,LCD不显示

52停止所有中断的发生

53ADC中断功能生效

54所有中断功能有效

55ADC中断旗标清为0

56开始ADC转换

57~60无限回圈,等候ADC中断产生则跳出回圈

59产生ADC中断,跳出回圈

62~67将转换后的数值显示在LCD面板

62~63取出百位数字,显示百位数字

64~65取出十位数字,显示数字

66~67取出个位数,显示数字

68~69延长显示时间为1秒

72将LCD显示器关闭

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1