历史上的今天
返回首页

历史上的今天

今天是:2026年01月13日(星期二)

正在发生

2023年01月13日 | 用C语言写一个温度测量显示程序

2023-01-13 来源:zhihu

P1ASF = 0x0C; P1.2 P1.3做ADC

ADC_CONTR = 0xE0; //90T, ADC power on

AUXR = 0x80; //Timer0 set as 1T, 16 bits timer auto-reload,

TH0 = (u8)(Timer0_Reload / 256);

TL0 = (u8)(Timer0_Reload % 256);

ET0 = 1; //Timer0 interrupt enable

TR0 = 1; //Tiner0 run

EA = 1; //打开总中断

for(i=0; i<8; i++) LED8[i] = 0x10; //上电消隐

while(1)

{

if(B_1ms) //1ms到

{

B_1ms = 0;

if(++msecond >= 300) //300ms到

{

msecond = 0;

j = Get_ADC10bitResult(2); //参数0~7,查询方式做一次ADC, 返回值就是结果, == 1024 为错误

if(j < 1024)

{

LED8[0] = j / 1000; //显示ADC值

LED8[1] = (j % 1000) / 100;

LED8[2] = (j % 100) / 10;

LED8[3] = j % 10;

if(LED8[0] == 0) LED8[0] = DIS_BLACK;

}

else //错误

{

for(i=0; i<4; i++) LED8[i] = DIS_;

}

j = Get_ADC10bitResult(3); //参数0~7,查询方式做一次ADC, 返回值就是结果, == 1024 为错误

j += Get_ADC10bitResult(3);

j += Get_ADC10bitResult(3);

j += Get_ADC10bitResult(3);


if(j < 1024*4)

{

/*

LED8[0] = j / 1000; //显示ADC值

LED8[1] = (j % 1000) / 100;

LED8[2] = (j % 100) / 10;

LED8[3] = j % 10;

if(LED8[0] == 0) LED8[0] = DIS_BLACK;

*/

j = get_temperature(j); //计算温度值


if(j >= 400) F0 = 0, j -= 400; //温度 >= 0度

else F0 = 1, j = 400 - j; //温度 < 0度

LED8[4] = j / 1000; //显示温度值

LED8[5] = (j % 1000) / 100;

LED8[6] = (j % 100) / 10 + DIS_DOT;

LED8[7] = j % 10;

if(LED8[4] == 0) LED8[4] = DIS_BLACK;

if(F0) LED8[4] = DIS_; //显示-

}

else //错误

{

for(i=0; i<8; i++) LED8[i] = DIS_;

}

}

}

}

}

u16 Get_ADC10bitResult(u8 channel) //channel = 0~7

{

ADC_RES = 0;

ADC_RESL = 0;

ADC_CONTR = (ADC_CONTR & 0xe0) | 0x08 | channel; //start the ADC

NOP(4);

while((ADC_CONTR & 0x10) == 0) ; //wait for ADC finish

ADC_CONTR &= ~0x10; //清除ADC结束标志

return (((u16)ADC_RES << 2) | (ADC_RESL & 3));

}

// MF52E 10K at 25, B = 3950, ADC = 12 bits

u16 code temp_table[]={

140, //;-40 0

149, //;-39 1

159, //;-38 2

168, //;-37 3

178, //;-36 4

188, //;-35 5

199, //;-34 6

210, //;-33 7

222, //;-32 8

233, //;-31 9

246, //;-30 10

259, //;-29 11

272, //;-28 12

286, //;-27 13

301, //;-26 14

317, //;-25 15

333, //;-24 16

349, //;-23 17

367, //;-22 18

385, //;-21 19

403, //;-20 20

423, //;-19 21

443, //;-18 22

464, //;-17 23

486, //;-16 24

509, //;-15 25

533, //;-14 26

558, //;-13 27

583, //;-12 28

610, //;-11 29

638, //;-10 30

667, //;-9 31

696, //;-8 32

727, //;-7 33

758, //;-6 34

791, //;-5 35

824, //;-4 36

858, //;-3 37

893, //;-2 38

929, //;-1 39

965, //;0 40

1003, //;1 41

1041, //;2 42

1080, //;3 43

1119, //;4 44

1160, //;5 45

1201, //;6 46

1243, //;7 47

1285, //;8 48

1328, //;9 49

1371, //;10 50

1414, //;11 51

1459, //;12 52

1503, //;13 53

1548, //;14 54

1593, //;15 55

1638, //;16 56

1684, //;17 57

1730, //;18 58

1775, //;19 59

1821, //;20 60

1867, //;21 61

1912, //;22 62

1958, //;23 63

2003, //;24 64

2048, //;25 65

2093, //;26 66

2137, //;27 67

2182, //;28 68

2225, //;29 69

2269, //;30 70

2312, //;31 71

2354, //;32 72

2397, //;33 73

2438, //;34 74

2479, //;35 75

2519, //;36 76

2559, //;37 77

2598, //;38 78

2637, //;39 79

2675, //;40 80

2712, //;41 81

2748, //;42 82

2784, //;43 83

2819, //;44 84

2853, //;45 85

2887, //;46 86

2920, //;47 87

2952, //;48 88

2984, //;49 89

3014, //;50 90

3044, //;51 91

3073, //;52 92

3102, //;53 93

3130, //;54 94

3157, //;55 95

3183, //;56 96

3209, //;57 97

3234, //;58 98

3259, //;59 99

3283, //;60 100

3306, //;61 101

3328, //;62 102

3351, //;63 103

3372, //;64 104

3393, //;65 105

3413, //;66 106

3432, //;67 107

3452, //;68 108

3470, //;69 109

3488, //;70 110

3506, //;71 111

3523, //;72 112

3539, //;73 113

3555, //;74 114

3571, //;75 115

3586, //;76 116

3601, //;77 117

3615, //;78 118

3628, //;79 119

3642, //;80 120

3655, //;81 121

3667, //;82 122

3679, //;83 123

3691, //;84 124

3702, //;85 125

3714, //;86 126

3724, //;87 127

3735, //;88 128

3745, //;89 129

3754, //;90 130

3764, //;91 131

3773, //;92 132

3782, //;93 133

3791, //;94 134

3799, //;95 135

3807, //;96 136

3815, //;97 137

3822, //;98 138

3830, //;99 139

3837, //;100 140

3844, //;101 141

3850, //;102 142

3857, //;103 143

3863, //;104 144

3869, //;105 145

3875, //;106 146

3881, //;107 147

3887, //;108 148

3892, //;109 149

3897, //;110 150

3902, //;111 151

3907, //;112 152

3912, //;113 153

3917, //;114 154

3921, //;115 155

3926, //;116 156

3930, //;117 157

3934, //;118 158

3938, //;119 159

3942 //;120 160

};

/*** 计算温度 ***/

// 计算结果: 0对应-40.0度, 400对应0度, 625对应25.0度, 最大1600对应120.0度.

// 为了通用, ADC输入为12bit的ADC值.

// 电路和软件算法设计: Coody

#define D_SCALE 10 //结果放大倍数, 放大10倍就是保留一位小数

u16 get_temperature(u16 adc)

{

u16 code *p;

u16 i;

u8 j,k,min,max;

adc = 4096 - adc; //Rt接地

p = temp_table;

if(adc < p[0]) return (0xfffe);

if(adc > p[160]) return (0xffff);

min = 0; //-40度

max = 160; //120度

for(j=0; j<5; j++) //对分查表

{

k = min / 2 + max / 2;

if(adc <= p[k]) max = k;

else min = k;

}

if(adc == p[min]) i = min * D_SCALE;

else if(adc == p[max]) i = max * D_SCALE;

else // min < temp < max

{

while(min <= max)

{

min++;

if(adc == p[min]) {i = min * D_SCALE; break;}

else if(adc < p[min])

{

min--;

i = p[min]; //min

j = (adc - i) * D_SCALE / (p[min+1] - i);

i = min;

i *= D_SCALE;

i += j;

break;

}

}

}

return i;

}

/***向HC595发送一个字节函数 ***/

void Send_595(u8 dat)

{

u8 i;

for(i=0; i<8; i++)

{

dat <<= 1;

P_HC595_SER = CY;

P_HC595_SRCLK = 1;

P_HC595_SRCLK = 0;

}

}

/*** 显示扫描函数 ***/

void DisplayScan(void)

{

Send_595(~T_COM[display_index]); //输出位码

Send_595(t_display[LED8[display_index]]); //输出段码

P_HC595_RCLK = 1;

P_HC595_RCLK = 0; //锁存输出数据

if(++display_index >= 8) display_index = 0; //8位结束回0

}

/*** Timer0 1ms中断函数 ***/

void timer0 (void) interrupt TIMER0_VECTOR

{

DisplayScan(); //1ms扫描显示一位

B_1ms = 1; //1ms标志

}


推荐阅读

史海拾趣

GPD Optoelectronics Corp公司的发展小趣事

GPD Optoelectronics Corp公司发展故事

故事一:初创与锗晶体管的诞生

GPD Optoelectronics Corp.(前身为Germanium Power Devices Corp.)成立于1973年,最初专注于高品质锗晶体管的制造。在那个半导体技术刚刚起步的年代,锗晶体管作为重要的电子元件,在电子行业中占据着举足轻重的地位。公司凭借其精湛的工艺和严格的质量控制,迅速在市场中站稳了脚跟,为后续的光电二极管业务打下了坚实的基础。

故事二:转型为光电二极管制造商

进入1980年代,随着光电技术的快速发展,GPD Optoelectronics Corp.敏锐地捕捉到了市场趋势,开始逐步转型为光电二极管制造商。1980年,公司成功推出了Ge pn探测器产品,标志着其正式进入光电领域。这一转型不仅拓宽了公司的业务范围,也为其后续在光电领域的深入发展奠定了技术基础。

故事三:InGaAs探测器的研发与推广

为了进一步满足市场对高性能光电探测器的需求,GPD Optoelectronics Corp.在1993年推出了InGaAs探测器产品。InGaAs探测器以其优异的光谱响应范围和灵敏度,在光通信、光谱学等领域得到了广泛应用。公司的这一举措不仅巩固了其在光电领域的领先地位,也为其赢得了更多客户的青睐。

故事四:产能扩大与技术创新

进入21世纪,GPD Optoelectronics Corp.继续保持着强劲的发展势头。2000年,公司搬迁至新罕布什尔州塞勒姆的新工厂,产能实现了翻倍增长。同时,公司不断加大研发投入,推出了多款创新产品,如扩展波长InGaAs探测器、可定制的双色探测器以及InGaAs象限光电二极管等。这些产品的推出不仅丰富了公司的产品线,也进一步提升了其市场竞争力。

故事五:表面贴装封装选项的引入

随着电子产品的不断小型化和集成化,GPD Optoelectronics Corp.紧跟市场趋势,于2019年增加了表面贴装封装选项。这一举措使得公司的光电二极管产品更加符合现代电子产品的设计要求,进一步拓宽了其在智能手机、平板电脑等消费电子领域的应用市场。同时,公司也继续致力于为客户提供量身定制的定制零件服务,以满足不同客户的特定需求。

Eurohm Resistors公司的发展小趣事

随着环保意识的不断提高,Eurohm Resistors公司积极响应绿色发展的号召。公司投入大量资源研发环保型电阻器产品,采用可再生材料和绿色生产工艺,降低产品对环境的影响。同时,公司还积极参与各种环保活动,推动行业的绿色发展。

方向电子公司的发展小趣事

在全球化的浪潮下,Eurohm Resistors公司积极拓展海外市场。公司深入分析了全球电子行业的发展趋势和市场需求,制定了详细的市场拓展计划。通过与当地合作伙伴的紧密合作,Eurohm Resistors成功打入了多个国家和地区的市场,实现了全球化布局。

联智(Celfras)公司的发展小趣事

联智的半导体集成电路芯片研发及产业化项目是其发展历程中的又一重要里程碑。该项目总投资高达20亿元,分两期建设。一期项目将建设半导体集成电路模拟芯片封测生产线,预计年产量可达1.5亿颗。二期项目将研发更高功率有线无线融合一体化电源管理芯片和新一代A4WP远距离无线充电芯,同时布局物联网IoT芯片市场。这一项目的实施将进一步提升联智的技术实力和市场竞争力。

BH Electronics公司的发展小趣事

进入21世纪,BH Electronics面临着更加激烈的市场竞争。为了保持领先地位,公司加大了对技术研发的投入。在一次技术研讨会上,工程师小王提出了一项革命性的技术设想。经过多次试验和改进,BH Electronics成功研发出了一款具有划时代意义的电子产品,不仅提升了性能,还降低了成本。这一创新产品迅速在市场上获得了广泛认可,为公司的快速发展奠定了坚实基础。

中微股份(Cmsemicon)公司的发展小趣事

中微股份(Cmsemicon)的起点可以追溯到2004年,当时公司以刻蚀设备为核心业务,致力于引领中国刻蚀技术水平的提升。经过几年的不懈努力,2007年,中微成功研制出首台CCP刻蚀设备,这一里程碑标志着公司在刻蚀设备领域取得了重大突破。此后,公司不断突破技术壁垒,2011年刻蚀设备达到45nm工艺节点,2013年达到22nm,2016年更是达到了14nm,并当前已量产5nm工艺节点设备。这些技术成果不仅证明了中微在刻蚀设备领域的实力,也为公司的后续发展奠定了坚实基础。

问答坊 | AI 解惑

各种交换机的数据接口类型一览

作为局域网的主要连接设备,以太网交换机成为应用普及最快的网络设备之一,同时,也是随着这种快速的发展,交换机的功能不断增强,随之而来则是交换机端口的更新换代以及各种特殊设备连接端口不断的添加到交换机上,这也使得交换机的接口类型变得非 ...…

查看全部问答>

我是来找人才的,求各位帮忙啦?!!(表删除)

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 Job description: · Responsible for the creation, implementation and debugging of board level tests for Xbox accessories. · The test engineer must also be able to create d ...…

查看全部问答>

68013的GPIO口如何接收串行数据?

大家好,68013的GPIO口一般是用8个端口(如P0-P7)接收8位数据,或16个端口(如P0-P15)接收16位数据,也就是第一个端口接收一位数据,现在我有另一个GPIO接口,只有一条线,输出的数据是以b0,b1~b7,这样的顺序,输完一个字节,又接着输第二个字节. 请问怎样才 ...…

查看全部问答>

如何在evc下使用directDraw???

那位大侠做过evc下使用directDraw???有的话给我个例子,谢谢!!!!! zhangw0407@hotmail.com…

查看全部问答>

wince下计算两个日期差!

比如一个输入  2007-10-21   ,另一个输入   2008-11-12        如何计算这两个input的差值是多少秒 精确到秒 谢谢…

查看全部问答>

STM32的电机应用套件太贵了!

                                 STM32的电机应用套件太贵了!我本想买个学习一下,价格1万多,我退却了,因为TI的DSP电机开发板目前市场才3-4千,,说道 ...…

查看全部问答>

探讨下关于不等电位的MOS管驱动

如图,请大家一起他们探讨下关于这种不等电位的MOS管驱动有哪些办法,不用专门芯片,谢谢 …

查看全部问答>

TI的Zstack,如何剪裁。。。

只需要个开关灯的功能,怎么能编译小于128k啊。。。目前是150k。。。…

查看全部问答>

自行车测速、里程计图/程序

自行车测速、里程计图/程序…

查看全部问答>