盛群c语言应用中断范例Word格式.docx
《盛群c语言应用中断范例Word格式.docx》由会员分享,可在线阅读,更多相关《盛群c语言应用中断范例Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
![盛群c语言应用中断范例Word格式.docx](https://file1.bdocx.com/fileroot1/2022-11/25/e0cb5184-784f-4643-abd7-67a6e18efb99/e0cb5184-784f-4643-abd7-67a6e18efb991.gif)
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显示器关闭