历史上的今天
返回首页

历史上的今天

今天是:2024年12月28日(星期六)

2021年12月28日 | 创意小发明:山寨码表.自行车码表的制作

2021-12-28 来源:eefocus

最近比较懒,因缺乏锻炼,加上之前上了2个月的"长夜班",身体有米其林化的趋势.为了阻止这种不良的发展.决定买个二手自行车在家骑自行车锻炼锻炼.


但是很快发现光骑车没劲,于是出于好奇心里 做个码表装上看看能骑多少快,骑了多少路.


废话不多说,先上实物图:

在这里插入图片描述

虽然样子有点丑,但是显示效果还是可以滴


单片机用stc89c52,因为之前买了几片还没用掉,因为它只要3块多钱,因为我只要几个IO加上外部中断,定时器.

显示用yleee的12232液晶,因为已经放了快2年了.3片只用掉一片,而且做完之后依然压箱底. 不用掉浪费.

电源用白菜模块做单锂升压到5.2v来使用. 因为买了太多了,不用掉浪费.

在这里插入图片描述

电池暂时找了块yleee的太阳能移动电源中的大肚子锂聚合物电池. 当时肚子很大,电压很低.给它捅了一刀以后继续充电,身材恢复苗条,就是有点皱纹. 500ma放电能有3,400 mah容量.

传感器用了大家都说好的干簧管,还是从中学劳技课的板子上拆下来的. 磁钢安装就尽显山寨本色了.

在这里插入图片描述
在这里插入图片描述

既然画了PCB,就顺便加上了 1302, 18b20,万一没事干又想加上去了.

在这里插入图片描述

板子继续热转印,这次买了瓶新的三氯化铁,放在新买的电磁炉里水浴加热到80°,竟然还花了10几分钟. 期间还把三氯化铁滴到了锅子里,以后吃火锅能吃到正宗的化学锅底了. 恩.

在这里插入图片描述

这是之前的试做版本.


话说制作期间,一天都没运动过,终于在第六天倒下了,去医院把我全新的医保卡上写上了历史性的一页,而配的药的纸壳,就成了这次的山寨码表暂时蜗居的地方.


刚才完成基本功能,发现我的破车骑在20km/h已经很吃力了. 全力只能跑到30km/h. 看来也就这水平了.

在这里插入图片描述

为了看得清, 用了四倍字体大小. 很给力.

在这里插入图片描述

界面就改成这样了. 显示这些东西也够看了

按第一个键保存总行程. 第三个键背光开关. 开机时摁住第一第二键 总行程清零.


自行车山寨码表 参考源代码


#include “12232.h”


#define A0_0() LCD_A0 = 0

#define A0_1() LCD_A0 = 1

#define E1_0() LCD_E1 = 0

#define E1_1() LCD_E1 = 1

#define E2_0() LCD_E2 = 0

#define E2_1() LCD_E2 = 1


#define LCD_DISPLAYON 0xaf //af 开显示

#define LCD_DISPLAYOFF 0xae //ae 关显示

#define LCD_DRIVERON 0xa5 //a5 静态显示驱动

#define LCD_DRIVEROFF 0xa4 //a4 正常驱动

#define LCD_DUTY16 0xa8 //占空比1/16

#define LCD_DUTY32 0xa9 //占空比1/32


#define LCD_END 0xee

/关闭“读-修改-写”模式,并把列地址指针

恢复到打开“读-修改-写”模式前的位置。/


#define LCD_RESET 0xe2

/初始化。① 设置显示初始行为第一行;

②页地址设置为第三页。/


#define LCD_RWMODE 0xe0

/*“读-修改-写”模式 。执行该指令以后,

每执行一次写数据,指令列地址自动加1;

但执行读数据指令时列地址不会改变。

这个状态一直持续到执行“END”指令。

注意:在“读-修改-写”模式下,

除列地址设置指令之外,其他指令照常执行。 */


#define LCD_STARTLINE0 0xc0 //设置显示起始行 可以加0-31

#define LCD_PAGE0 0xb8 //页地址设置 可以加0-3

#define LCD_COLUMNADDR0 0x00 //列地址设置 可以加0-60


#define LCD_ON() LCD_Command(LCD_DISPLAYON)

#define LCD_OFF() LCD_Command(LCD_DISPLAYOFF)

#define LCD_StaticON() LCD_Command(LCD_DRIVERON)

#define LCD_StaticOFF() LCD_Command(LCD_DRIVEROFF)

#define LCD_Select16() LCD_Command(LCD_DUTY16)

#define LCD_Select32() LCD_Command(LCD_DUTY32)

#define LCD_StartRW() LCD_Command(LCD_RWMODE)

#define LCD_EndRW() LCD_Command(LCD_END)

#define LCD_Reset() LCD_Command(LCD_RESET)

#define LCD_SetStartLine(i) LCD_Command(LCD_STARTLINE0|i)

#define LCD_SetPage(i) LCD_Command(LCD_PAGE0|i)

#define LCD_SetColumn(i) LCD_Command(LCD_COLUMNADDR0|i)


unsigned char code ascii[][6]={

{0x00,0x00,0x00,0x00,0x00,0x00},/0 SPACE/

{0x00,0x00,0x00,0x4f,0x00,0x00},/1 !/

{0x00,0x00,0x00,0x07,0x00,0x07},/2 "/

{0x00,0x14,0x7f,0x14,0x7f,0x14},/3 #/

{0x00,0x24,0x2a,0x7f,0x2a,0x12},/4 $/

{0x00,0x23,0x13,0x08,0x62,0x61},/5 %/

{0x00,0x36,0x49,0x55,0x22,0x50},/6 &/

{0x00,0x00,0x00,0x05,0x03,0x00},/7 '/

{0x00,0x00,0x1c,0x22,0x41,0x00},/8 (/

{0x00,0x00,0x41,0x22,0x1c,0x00},/9 )/

{0x00,0x14,0x08,0x3e,0x08,0x14},/*10 **/

{0x00,0x08,0x08,0x3e,0x08,0x08},/11 +/

{0x00,0x00,0x00,0x28,0x18,0x00},/12 ,/

{0x00,0x08,0x08,0x08,0x08,0x08},/13 -/

{0x00,0x00,0x00,0x60,0x60,0x00},/14 ./

{0x00,0x20,0x10,0x08,0x04,0x02},/15 //

{0x00,0x3e,0x51,0x49,0x45,0x3e},/16 0/

{0x00,0x00,0x42,0x7f,0x40,0x40},/17 1/

{0x00,0x62,0x51,0x51,0x49,0x46},/18 2/

{0x00,0x21,0x41,0x45,0x4b,0x31},/19 3/

{0x00,0x18,0x14,0x12,0x7f,0x10},/20 4/

{0x00,0x27,0x45,0x45,0x45,0x39},/21 5/

{0x00,0x3c,0x4a,0x49,0x49,0x30},/22 6/

{0x00,0x01,0x71,0x09,0x05,0x03},/23 7/

{0x00,0x36,0x49,0x49,0x49,0x36},/24 8/

{0x00,0x06,0x49,0x49,0x29,0x1e},/25 9/

{0x00,0x00,0x36,0x36,0x00,0x00},/26 :/

{0x00,0x00,0x56,0x36,0x00,0x00},/27 ;/

{0x00,0x08,0x14,0x22,0x41,0x00},/28 {0x00,0x14,0x14,0x14,0x14,0x14},/29 =/

{0x00,0x00,0x41,0x22,0x14,0x08},/30 >/

{0x00,0x02,0x01,0x51,0x09,0x06},/31 ?/

{0x00,0x3e,0x59,0x55,0x79,0x3e},/32 @/

{0x00,0x7e,0x21,0x21,0x21,0x7e},/33 A/

{0x00,0x7f,0x49,0x49,0x49,0x36},/34 B/

{0x00,0x3e,0x41,0x41,0x41,0x22},/35 C/

{0x00,0x7f,0x41,0x41,0x22,0x1c},/36 D/

{0x00,0x7f,0x49,0x49,0x49,0x49},/37 E/

{0x00,0x7f,0x09,0x09,0x09,0x01},/38 F/

{0x00,0x3e,0x41,0x49,0x49,0x7a},/39 G/

{0x00,0x7f,0x08,0x08,0x08,0x7f},/40 H/

{0x00,0x41,0x7f,0x41,0x00,0x00},/41 I/

{0x00,0x20,0x40,0x41,0x3f,0x01},/42 J/

{0x00,0x7f,0x08,0x14,0x22,0x41},/43 K/

{0x00,0x7f,0x40,0x40,0x40,0x40},/44 L/

{0x00,0x7f,0x02,0x0c,0x02,0x7f},/45 M/

{0x00,0x7f,0x04,0x08,0x10,0x7f},/46 N/

{0x00,0x3e,0x41,0x41,0x41,0x3e},/47 O/

{0x00,0x7f,0x09,0x09,0x09,0x06},/48 P/

{0x00,0x3E,0x41,0x51,0x21,0x5E},/49 Q/

{0x00,0x7f,0x09,0x19,0x29,0x46},/50 R/

{0x00,0x46,0x49,0x49,0x49,0x31},/51 S/

{0x00,0x01,0x01,0x7f,0x01,0x01},/52 T/

{0x00,0x3f,0x40,0x40,0x40,0x3f},/53 U/

{0x00,0x1f,0x20,0x40,0x20,0x1f},/54 V/

{0x00,0x3f,0x40,0x38,0x40,0x3f},/55 W/

{0x00,0x63,0x14,0x08,0x14,0x63},/56 X/

{0x00,0x07,0x08,0x70,0x08,0x07},/57 Y/

{0x00,0x61,0x51,0x49,0x45,0x43},/58 Z/

{0x00,0x00,0x7f,0x41,0x41,0x00},/59 [/

{0x00,0x01,0x02,0x08,0x10,0x20},/*50 */

{0x00,0x00,0x41,0x41,0x7f,0x00},/61 ]/

{0x00,0x04,0x02,0x01,0x02,0x04},/62 ^/

{0x00,0x40,0x40,0x40,0x40,0x40},/63 _/

{0x00,0x00,0x01,0x02,0x04,0x00},/64 `/

{0x00,0x20,0x54,0x54,0x54,0x7c},/65 a/

{0x00,0x7f,0x48,0x44,0x44,0x38},/66 b/

{0x00,0x38,0x44,0x44,0x44,0x20},/67 c/

{0x00,0x38,0x44,0x44,0x48,0x7f},/68 d/

{0x00,0x38,0x54,0x54,0x54,0x18},/69 e/

{0x00,0x08,0x7e,0x09,0x01,0x02},/70 f/

{0x00,0x0c,0x52,0x52,0x52,0x3e},/71 g/

{0x00,0x7f,0x08,0x04,0x04,0x78},/72 h/

{0x00,0x00,0x44,0x7d,0x40,0x00},/73 i/

{0x00,0x40,0x40,0x44,0x3d,0x00},/74 j/

{0x00,0x7f,0x10,0x28,0x44,0x00},/75 k/

{0x00,0x00,0x41,0x7e,0x40,0x00},/76 l/

{0x00,0x7c,0x04,0x18,0x04,0x78},/77 m/

{0x00,0x7c,0x08,0x04,0x04,0x78},/78 n/

{0x00,0x38,0x44,0x44,0x44,0x38},/79 o/

{0x00,0x7c,0x14,0x14,0x14,0x08},/80 p/

{0x00,0x08,0x14,0x14,0x14,0x7c},/81 q/

{0x00,0x7c,0x08,0x04,0x04,0x08},/82 r/

{0x00,0x48,0x54,0x54,0x54,0x20},/83 s/

{0x00,0x04,0x3f,0x44,0x44,0x24},/84 t/

{0x00,0x3c,0x40,0x40,0x20,0x7c},/85 u/

{0x00,0x1c,0x20,0x40,0x20,0x1c},/86 v/

{0x00,0x3c,0x40,0x30,0x40,0x3c},/87 w/

{0x00,0x44,0x28,0x10,0x28,0x44},/88 x/

{0x00,0x06,0x48,0x48,0x48,0x3e},/89 y/

{0x00,0x44,0x64,0x54,0x4c,0x44},/80 z/

{0x00,0x00,0x08,0x36,0x41,0x00},/91 {/

{0x00,0x00,0x00,0x7e,0x00,0x00},/92 |/

{0x00,0x00,0x41,0x36,0x08,0x00},/93 }/

{0x00,0x04,0x08,0x04,0x08,0x04},/94 ~/

{0x10,0x20,0x40,0x20,0x10,0x08},//95对号一半

{0x04,0x02,0x00,0x00,0x00,0x00},//96对号一半


};


unsigned char target1,target2,target3,target4;


/******************************************************************************************


函数名称 :LCD_Command

功能描述 :写命令

参数 : 参数名称: 输入/输出? 类型 描述

返回值 :

作者 :

创建日期 :2018-12-19

全局变量 :

全局静态变量:

局部静态变量:

*----------------------------------------修改历史------------------------------------------

当前版本 : 修改人: 修改日期:

修改说明 :

/

void LCD_Command(unsigned char nCommand)

{

A0_0();

// asm(“nop”);

// asm(“nop”);

E1_1();

E2_1();

// asm(“nop”);

// asm(“nop”);

DATA=nCommand;

// asm(“nop”);

// asm(“nop”);

E1_0();

E2_0();

}

/

函数名称 :LCD_SetRam

功能描述 :送显示数据ndata,setMS为0主,1从

参数 : 参数名称: 输入/输出? 类型 描述

返回值 :

作者 :

创建日期 :2018-12-19

全局变量 :

全局静态变量:

局部静态变量:

*----------------------------------------修改历史------------------------------------------

当前版本 : 修改人: 修改日期:

修改说明 :

/

void LCD_SetRam(unsigned char ChipSelect,unsigned char ndata)

{

A0_1();

// asm(“nop”);

// asm(“nop”);

if( ChipSelect )

{

E1_0();

E2_1(); //选择左半屏

}

else

{

E1_1(); //选择右半屏

E2_0();

}

// asm(“nop”);

// asm(“nop”);

DATA=ndata;

// asm(“nop”);

// asm(“nop”);

E1_0();

E2_0();

}

/

函数名称 :LCD_Init

功能描述 :

参数 : 参数名称: 输入/输出? 类型 描述

返回值 :

作者 :

创建日期 :2018-12-19

全局变量 :

全局静态变量:

局部静态变量:

*----------------------------------------修改历史------------------------------------------

当前版本 : 修改人: 修改日期:

修改说明 :

******************************************************************************************/

void LCD_init(void)

{

LCD_OFF(); //关闭显示

LCD_Command(LCD_RESET); //复位

LCD_Command(0xa0); //列与段驱动反方向

LCD_Command(LCD_DUTY32); //1/32

LCD_Command(0xa4); //关闭静态显示 打开正常驱动

LCD_EndRW(); //关闭自动列加1

LCD_SetStartLine(0); //设置起始行

LCD_SetColumn(0); //起始列

LCD_SetPage(0); //起始页

LCD_ON(); //开显示

}

/******************************************************************************************


函数名称 :clrscr


功能描述 :清屏


参数 : 参数名称: 输入/输出? 类型 描述


返回值 :


作者 :


创建日期 :2018-12-19


全局变量 :


全局静态变量:


局部静态变量:

*----------------------------------------修改历史------------------------------------------


当前版本 : 修改人: 修改日期:


修改说明 :

/

void clrscr(unsigned char hdata)

{

unsigned char i;

unsigned char page;

for(page=0;page<4;page++)

{

LCD_SetPage(page);

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

{

LCD_SetColumn(i);

LCD_SetRam(0,hdata);

LCD_SetRam(1,hdata);

}

}

}

/


函数名称 :drawword


功能描述 ://layer 值为0,2;wenzi 码表中的几个字


参数 : 参数名称: 输入/输出? 类型 描述


返回值 :


作者 :


创建日期 :2018-12-19


全局变量 :


全局静态变量:


局部静态变量:

*----------------------------------------修改历史------------------------------------------


当前版本 : 修改人: 修改日期:


修改说明 :

*****************************************************************************************/

/

void drawword(unsigned char liedizhi,unsigned char layer,unsigned char *buff)

{

unsigned char column,i;//layer 值为0,2;wenzi 码表中的几个字

unsigned char cs;

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

{

column=liedizhi+i;

if(column>60)

{

cs=1;

column-=61;

}

else

cs=0;


//LCD_SetStartLine(0);//设置起始行

LCD_SetColumn(column);//设置起始列

LCD_SetPage(layer);

LCD_SetRam(cs,(buff+i));

//LCD_SetStartLine(0);//设置起始行

LCD_SetColumn(column);//设置起始列

LCD_SetPage(layer+1);

LCD_SetRam(cs,(buff+16+i));

}

}

*/


void drawascii(unsigned char liedizhi,unsigned char layer,unsigned char *text)

{

unsigned char column,i;//layer 值为0,2;wenzi 码表中的几个字

unsigned char cs;


while(*text)

{

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

{

column=liedizhi+i;

if(column>60)

{

cs=1;

column-=61;

}

else cs=0;


//LCD_SetStartLine(0);//设置起始行

LCD_SetColumn(column);//设置起始列

LCD_SetPage(layer);

LCD_SetRam(cs,ascii[*text-32][i]);

}

text++;

liedizhi+=6;

}

}


void make_ascii_big(unsigned char c)

{

target1 = 0;

target2 = 0;


if((c&0x80) != 0)

{

target1 += 192;

}

if((c&0x40) != 0)

{

target1 += 48;

}

if((c&0x20) != 0)

{

target1 += 12;

}

if((c&0x10) != 0)

{

target1 += 3;

}


if((c&0x08) != 0)

{

target2 += 192;

}

if((c&0x04) != 0)

{

target2 += 48;

}

if((c&0x02) != 0)

{

target2 += 12;

}

if((c&0x01) != 0)

{

target2 += 3;

}

}


void make_ascii_very_big(unsigned char c)

{

target1 = 0;

target2 = 0;

target3 = 0;

target4 = 0;


if((c&0x80) != 0)

{

target1 += 240;

}

if((c&0x40) != 0)

{

target1 += 15;

}

if((c&0x20) != 0)

{

target2 += 240;

}

if((c&0x10) != 0)

{

target2 += 15;

}


if((c&0x08) != 0)

{

target3 += 240;

}

if((c&0x04) != 0)

{

target3 += 15;

}

if((c&0x02) != 0)

{

target4 += 240;

}

if((c&0x01) != 0)

{

target4 += 15;

}

}


void draw_big_ascii(unsigned char liedizhi,unsigned char layer,unsigned char *text)

{

unsigned char column,i;

unsigned char cs;


while(*text)

{

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

{

column=liedizhi+i+i;

if(column>60)

{

cs=1;

column-=61;

}

else cs=0;


make_ascii_big(ascii[*text-32][i]);

推荐阅读

史海拾趣

Auctor Corp公司的发展小趣事

Auctor Corp公司的创始人,一群富有远见和冒险精神的工程师,怀揣着对电子技术的热情和对市场的敏锐洞察,决定共同创办这家公司。在创业初期,公司面临着资金紧张、技术储备不足等多重困难。然而,团队成员们凭借着坚韧不拔的精神和对技术的执着追求,通过自主研发和不断改进,逐渐在市场上站稳了脚跟。

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

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

Custom Electronics Inc公司的发展小趣事

在电子行业的早期阶段,CEI凭借其卓越的研发团队和创新能力,成功开发出一款具有革命性的新型电容器。这款电容器以其高效能、长寿命和稳定性强的特点,迅速在市场中获得认可。CEI借此机会,进一步扩大了生产规模,提高了产品质量,逐渐确立了其在电子行业中的领先地位。

蓝箭(BLUE ROCKET)公司的发展小趣事

蓝箭电子的前身是佛山市无线电四厂,创建于七十年代初。随着时代的变迁和市场的需求,该厂在1998年成功转制为有限责任公司,迈出了向现代化企业转型的重要一步。这次转型不仅为公司注入了新的活力,也为后续的发展奠定了坚实的基础。

Desco Tools公司的发展小趣事

近年来,随着全球对环保问题的日益关注,Desco Tools公司也积极响应环保号召,将环保理念融入公司的生产和经营中。公司采用环保材料和工艺,减少生产过程中的废弃物和污染物排放。同时,公司还积极推动绿色生产和可持续发展,为客户提供更加环保、可持续的防静电解决方案。这些举措不仅有助于保护环境,还提升了公司的社会责任感和形象。

Corsair Electrical Connectors Inc公司的发展小趣事

Corsair深知品质是企业生存和发展的关键。因此,公司建立了严格的质量管理体系,从原材料采购、生产加工到产品出厂,每一个环节都进行严格的质量控制。Corsair还引入了先进的质量检测设备和方法,确保每一件产品都符合客户的要求和行业标准。这种对品质的执着追求使得Corsair的产品在市场上赢得了良好的声誉。

问答坊 | AI 解惑

利用光纤收发器实现长距离组网

在以前的工程施工中使用了大量光纤收发器进行组网,祥子对于这一类设备还是比较了解的,因此结合这次组网(也有以前组网)的经验,向大家介绍一下光纤收发器在网络组建过程中的使用。 最近这一个月以来一直在忙一个大工程,即市至县的数字电视传输 ...…

查看全部问答>

电机驱动模块电路

电机驱动模块电路…

查看全部问答>

每次都要发帖 然后才能下载

本帖最后由 paulhyde 于 2014-9-15 08:58 编辑 每次都要发帖 然后才能下载  …

查看全部问答>

西思科技诚聘Windows Mobile/CE 应用软件工程师

工作职责 1、编写基于Windows Mobile/Wince平台的手机应用程序,实现2D/3D人机交互、数据库访问、与互联网服务器交互数据等功能。 2、编写PC客户端程序,实现与手机数据同步,与互联网服务器交互数据等功能。 3、对部分模块化的代码或算法基 ...…

查看全部问答>

捕获按键

现在打开了2个Dialog,一个是CMain,一直打开不会关闭,还有一个CXXX窗体,是在CMain上方,这个是不确定的。当CXXX打开的时候,如何捕获硬键(上下左右这四个键)的消息呢?…

查看全部问答>

ucos ii 下GPRS模块通过拨号方式进行tcp连接,不知如何下手?

    现在mcu是stm32 芯片,gprs模块是华为gtm900 ,通过查找资料如果不用模块内部的协议栈的话,自己得在ucos ii上实现ppp协议与tcp/ip协议栈,现在在网上下载了ucip1-0-3,里面就是src 目录下,有相关代码,里面还有makefile,似乎应该在li ...…

查看全部问答>

STM32FLASH读保护测试,片子挂了,高手帮忙请进!

int main(void){   ....   FLASH_ReadOutProtection(ENABLE);   while(1)   {    ....   }}现在通过J-Link下载不了程序了。Debug  ...…

查看全部问答>

【MSP430共享】智能涡街流量计的设计与实现

涡街流量计众多的优点使其跻身通用流量计之一,但是当流速较低时。会存在测量不稳定的缺点。针对涡街流量传感器的非线性特性, 本系统采用16位微处理器MSP430F435为核心, 将传感器特性曲线存储在F l a s h存储器中. 实现了对涡街传感器的非 ...…

查看全部问答>

【信号处理】:续附件 经典书籍《数字信号处理的FPGA实现》中英

无线通信FPGA设计 田耕等编著的《无线通信FPGA设计 》XILINX指定的培训教材:《无线通信的MATLAB和FPGA实现》[西瑞克斯]  附件太大 先上传代码…

查看全部问答>

我在做一个并口单片机下载线出现不能对芯片“写”

       我今天做了一个并口的51单片机下载线但是只能读不能写,会出现下面这种情况,电路我是按照给的资料画的,然后对着给的电路图把板子走了一遍就是没找到原因,还希望大侠们帮帮我,不胜感激!!,还有我画的原理图,画的 ...…

查看全部问答>