历史上的今天
返回首页

历史上的今天

今天是:2025年12月27日(星期六)

2022年12月27日 | 16级灰度护栏灯DMX512控制器程序

2022-12-27 来源:zhihu

/*硬件资源:

RAM ADDRESS :0000H---7FFFH

CF card ADDRESS:8000H---8FFFH

CPLD ADDRESS:9000H---FFFFH

RAM SIZE :32K FLASH SIZE:8MBYTE = 4K*512PAGE*4PCS

PCB:V10

*/

#include

#include

//#include //字符函数

#include //字符串函数

#include //一般I/O函数

#include //标准函数

//#include //数学函数

#include //绝对地址

#include //内部函数

#include

#define uchar unsigned char

#define uint unsigned int

#define byte unsigned char

#define ulong unsigned long

#define bool bit

#define TRUE 1

#define FALSE 0

#define V_TH0 0xff /* 时间常数高8位 (65536-500)/256 */

#define V_TL0 0xff /* 时间常数低8位 (65536-500)>256 11.0592*/

//#define V_TH0 (65536-1536)/256

//#define V_TL0 (65536-1536)>256

#define V_TMOD 0x01 /* 定时器T0方式控制字 */

#define WriteDeviceAddress 0xa0

#define ReadDviceAddress 0xa1

sfr CHPCON= 0xbf;

sfr CHPENR=0xf6;

sfr PMR= 0xC4;

sfr SBUF1=0xc1;

sfr SCON1=0xc0;

sbit SM01 = SCON1^7; /* alternative SM0_FE_1 */

sbit SM11 = SCON1^6; /* alternative SM1_1 */

sbit SM21 = SCON1^5; /* alternative SM2_1 */

sbit REN1 = SCON1^4; /* alternative REN_1 */

sbit TB81 = SCON1^3; /* alternative TB8_1 */

sbit RB81 = SCON1^2; /* alternative RB8_1 */

sbit TI1 = SCON1^1; /* alternative TI_1 */

sbit RI1 = SCON1^0; /* alternative RI_1 */

sbit ES1 = IE^6;

/* 定义定时器T0的时间常数值和方式控制字 */

#define REGL XBYTE[0x9003] //控制寄存器护栏管的长度

#define FPGH XBYTE[0x9001] //闪存页高位

#define FPGL XBYTE[0x9002] //闪存页低位

//-------- CF CARD REG ADDRESS

#define EVEN_Data XBYTE[0xa400]

#define ODD_Data XBYTE[0xa400]

#define Data_Reg XBYTE[0xa000] //DATA REGISTER(R/W)

#define Error_Reg XBYTE[0xa001] //ERROR REGISTER(READ)

#define Features XBYTE[0xa001] //FEATURE REGISTER(WRITE)

#define Sectr_Cnt XBYTE[0xa002]//SECTOR COUNT REGISTER(R/W)

#define Sectr_No XBYTE[0xa003] //SECTOR NUMBER REGISTER(R/W)

#define Cylinder_Low XBYTE[0xa004] //CYLINDER LOW REGISTER(R/W)

#define Cylinder_Hi XBYTE[0xa005] //CYLINDER HIGH REGISTER(R/W)

#define Drv_Head XBYTE[0xa006] //DIRVE/HEAD REGISTER(R/W)

#define Status XBYTE[0xa007] //STATUS REGISTER(READ)

#define Command XBYTE[0xa007] //COMMAND REGISTER(WRITE)

#define Alt_Status XBYTE[0xa00e] //Alternate Status Regiter(read only)

#define Device_Ctrl XBYTE[0xa00e] //Device Control Register(Write only)

#define Device_Addrs XBYTE[0xa00f] //Drive Address Register(read only).Not used in this demo

#define Config XBYTE[0x8200] //Configuration Option Register

#define Socket XBYTE[0x8206] //Socket and copy Register

//CF card All command code

#define ChkPwr 0xe5

#define Diagnostic 0x90

#define EraseSctr 0xc0

#define Format 0x50

#define Identify 0xec

#define Idle 0xe3

#define Idlelmm 0xe1

#define Initialize 0x91

#define ReadBuf 0xe4

#define ReadLong 0x22

#define ReadMulti 0xc4

#define ReadSctr 0x20

#define ReadVerify 0x40

#define Recalibrate 0x10

#define ReadSense 0x03

#define Seek 0x70

#define SetFeature 0xef

#define SetMulti 0xc6

#define Sleep 0xe6

#define Standby 0xe2

#define Standbylmm 0xe0

#define Translate 0x87

#define WearLevel 0xf5

#define WriteBuf 0xe8

#define WriteLong 0x32

#define WriteMulti 0xc5

#define WriteSctr 0x30

#define WriteVerify 0x3c

#define WrtMwoErase 0xcd

#define WrtSwoErase 0x38

#define debug 1;

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

sbit senden=P3^2;

sbit SDA=P3^3;

sbit SCL=P3^5;

sbit wdgclr=P1^7;

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

uchar Select;

uchar LBA[6]; //Sets up sector ,CF Card Address

uint zhepe; //帧频

uint ms; //毫秒定时

uchar ADD; //地址

uchar idata iic_buf[96]; //接收缓冲区

uint pointer;

uchar xdata *bufp;

uchar subchk; //接收指针 和校验

uchar paklen; //包长

uint Dcyli; //总柱面

uint Dhead; //总磁头

uint sec_track; //扇区/磁道

uchar bdata flag;

sbit frameok=flag^0; //rece ok

sbit color=flag^1; //0 sing red color 1 red green color

sbit rec_sta=flag^2; //1 进入接状态,不显示

sbit rec_end=flag^3;

sbit timout=flag^4;

//jmp_buf env;

//int retval;

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

void I2cDelay(unsigned int number) {

unsigned char temp;

for(;number!=0;number--,wdgclr=!wdgclr) {

for(temp=112;temp!=0;temp--) {

}

}

}

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

void SomeNOP(void)

{

uchar i;

i=5;

while(i--);

}

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

void Start() {

SDA=1;SomeNOP();

SCL=1;SomeNOP();

SDA=0;SomeNOP();

SCL=0;SomeNOP();

}

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

void Stop() {

SCL=0;SomeNOP();

SDA=0;SomeNOP();

SCL=1;SomeNOP();

SDA=1;SomeNOP();

}

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

void Ack() {

SDA=0;SomeNOP();

SCL=1;SomeNOP();

SCL=0;SomeNOP();

SDA=1;SomeNOP();

}

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

void NoAck() {

SDA=1;SomeNOP();

SCL=1;SomeNOP();

SCL=0;SomeNOP();

}

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

bit TestAck() {

bit ErrorBit;

SDA=1;SomeNOP();

SCL=1;SomeNOP();

ErrorBit=SDA;

SCL=0;

return(ErrorBit);

}

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

Write8Bit(unsigned char input)

{

unsigned char temp;

for(temp=8;temp!=0;temp--) {

SDA=(bit)(input&amt;0x80);

SCL=1;SomeNOP();

SCL=0;SomeNOP();

input=input<<1;

}

}

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

void Write24c02(unsigned char xdata *Wdata,unsigned char RomAddress,unsigned char number) {

wdgclr=!wdgclr;

Start();

Write8Bit(WriteDeviceAddress);

TestAck();

Write8Bit(RomAddress);

TestAck();

for(;number!=0;number--) {

Write8Bit(*Wdata);

TestAck();

Wdata++;

}

Stop();

I2cDelay(10);

}

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

unsigned char Read8Bit() {

unsigned char temp,rbyte=0;

for(temp=8;temp!=0;temp--) {

SCL=1;

rbyte=rbyte<<1;

rbyte=rbyte|((unsigned char)(SDA));

SCL=0;

}

return(rbyte);

}

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

void Read24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes) {

// unsigned char temp,rbyte;

wdgclr=!wdgclr;

Start();

Write8Bit(WriteDeviceAddress);

TestAck();

Write8Bit(RomAddress);

TestAck();

Start();

Write8Bit(ReadDviceAddress);

TestAck();

while(bytes!=1) {

*RamAddress=Read8Bit();

Ack();

RamAddress++;

bytes--;

}

*RamAddress=Read8Bit();

NoAck();

Stop();

}

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

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

void delayms( uchar ticks )

{

uint Count;

uchar Tick;

for (Tick=ticks;Tick>0;Tick--)

{

for (Count=0;Count<=500;Count++);

wdgclr=!wdgclr;

}

}

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

通讯协议解析 接收数据

*******************************************8

*/

void receive(void)

{

uchar i;

uchar xdata *sp;

wdgclr=!wdgclr;

switch(XBYTE[0x1002])//命令标志

{

case 1:rec_sta=1;TR0=0;//进入接收状态

break;

case 2: //接收数据

break;

case 0: //加载某一帧数据到显存

break;

case 3: //将一扇区数据写闪存

break;

case 4: //测试

break;

case 5: //接收到显存

case 6: //同步信号

ms=0;

break;

case 7: //进入自动播放

sp=0x1008;

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

{

Write24c02(sp,i*8,8);

sp+=8;

}

ms=0;

TR0=1;

break;

case 8:

break;

default:break;

}

}

void send_char(unsigned char ascii)

/*往串口发送一个字符 */

{

SBUF=ascii;

while(!TI);TI=0;

}

void send_string(unsigned char code *string)

/*往串口发送一个字符串,字符串为存储在程序空间,碰到0x00结束 */

{

TB8=1;

while(*string!=0)

{

send_char(*string);

string++;

}

TB8=0;

}

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

void delay(uchar sec)

{

uint i;

while(sec)

{for(i=0;i<50000;i++);sec--;}

}

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

void SoftRST(void)

{

Device_Ctrl=0x0c;

Device_Ctrl=0x08;

delay(10); //delay 0.5s

}

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

bit Busy(void)

{

send_string("rBusy");

while(Status&amt;0x80);

if(Status&amt;0x01)

{send_string("rBusy_ERR");return(0);}

else

{send_string("rBusy_OK");return(1);}

}

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

bit Wait_Ready(void)

{

send_string("rWait_Ready");

while((Status&amt;0xf0)!=0x50);

send_string("rWait_Ready_OK");

return(1);

}

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

bit Wait_Drq(void)

{

send_string("rWait_Drq");

while((Status&amt;0xf8)!=0x58);

send_string("rWait_Drq OK");

return(1);

}

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

void Enable8bit(void)

{

Busy();

Features=0x01;

Drv_Head=Select;

Command=0xef;

}

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

void SetupCard(void)

{

Select=0xe0;

Socket=0;

Enable8bit();

}

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

//Set up sector count ,lba addresses command code

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

void Function(void)

{

send_string("rFunction");

Busy();

Sectr_Cnt=LBA[0];

Sectr_No=LBA[1];

Cylinder_Low=LBA[2];

Cylinder_Hi=LBA[3];

Drv_Head=LBA[4];

Command=LBA[5];

}

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

void Read512(uchar xdata *RamBuf)

{

uint i;

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

{*RamBuf++=EVEN_Data;

*RamBuf++=ODD_Data;}

}

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

void Write512(uchar xdata *RamBuf)

{

uint i;

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

{EVEN_Data=*RamBuf++;

ODD_Data=*RamBuf++;}

}

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

void Read_Sctr(uchar lba0,lba1,lba2,lba3)

{

Wait_Ready();

LBA[0]=1;

LBA[1]=lba3;

LBA[2]=lba2;

LBA[3]=lba1;

LBA[4]=0xe0|(lba0&amt;0x0f);

LBA[5]=ReadSctr;

Function();

Wait_Drq();

Read512(0x0000);

}

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

void Read_Identify(void)

{

Wait_Ready();

LBA[0]=1;

LBA[1]=0;

LBA[2]=0;

LBA[3]=0;

LBA[4]=0xe0;

LBA[5]=Identify;

Function();

Wait_Drq();

Read512(0x0000);

}

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

void Write_Sctr(void)

{

Wait_Ready();

LBA[0]=1;

LBA[1]=0x0a;

LBA[2]=0;

LBA[3]=0;

LBA[4]=0xe0;

LBA[5]=WriteSctr;

Function();

Wait_Drq();

Write512(0x0000);

}

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

void Send512(void)

{

uint i;

uchar xdata *p;

p=0;

TB8=1;

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

{SBUF=*p++;while(!TI);TI=0;}

TB8=0;

}

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

// 主程序

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

void main()

{

uchar *p;

uint l;

//uchar i,play; //播放列表计数

//uint rplay; //重复次数

PS=1;

ES=0;

SM0=1;

SM1=1;

T2CON=0X30;

RCAP2H=0XFF;

TH2=0XFF;

RCAP2L=0Xfb; //9600bps= c4 115200bps =fb 57600= f6 19200 = e2

TL2=0Xfb;

TR2=1;

REN=1;

TMOD=0x05; //定时器0 模式1 外部时钟

//TMOD=0x01; //定时器0 模式1 外部时钟

TL0=V_TL0;

TH0=V_TH0;

//TR0=1;

ET0=1;

//ES=1;

TI=0;

EA=1;

SM2=1;

PMR=PMR|0x01; //enable on-chip RAM

ADD=(~P1)&amt;0x1f;

p=&amt;iic_buf[0];

Read24c02(p,0,96);

//ADD=1;

frameok=0;

bufp=0x1000; //接收缓冲区指针

send_string("rCF card contr 2004-10-29");

Send512();

SoftRST();

SetupCard();

Write_Sctr();

for(l=4096;l<51200;l++)

{Read_Sctr(0,0,l/256,l>256);

Send512();

}

while(1)

{

wdgclr=!wdgclr;

推荐阅读

史海拾趣

Component General Inc公司的发展小趣事

Component General Inc公司深知品质是企业的生命线。因此,公司建立了严格的质量管理体系,从原材料的采购到产品的生产、检测、包装等每一个环节都进行严格把控。这种对品质的执着追求,使得公司的产品赢得了客户的广泛信任和好评。

Gruner AG公司的发展小趣事
使用绝缘测试仪等工具检查输入和输出之间的电气隔离性能是否符合要求。
Amkor公司的发展小趣事
在需要高安全性的控制系统中,如工业自动化、医疗设备等领域,光耦合器可以实现电路之间的电气隔离,提高系统的安全性和可靠性。
乐鑫(espressif)公司的发展小趣事

乐鑫科技深知,物联网的发展离不开一个完善的生态系统。因此,公司积极构建了一个集硬件、软件、开源社区于一体的物联网生态系统。通过提供丰富的软件资源和技术支持,乐鑫科技为购买其硬件的客户实现了更优的使用体验,推动了物联网应用的普及和落地。

启英泰伦(Chiplntelli)公司的发展小趣事

随着技术的不断进步和市场需求的日益增长,启英泰伦的芯片产品历经了多次迭代。从最初的AI语音芯片,到后来的AI语音Wi-Fi芯片、AI语音BLE芯片,公司形成了系列化的芯片产品布局。这些芯片广泛应用于智能家居、智能家电、智慧照明等领域,为客户提供了更自然、更简单、更智能的人机交互体验。启英泰伦的芯片产品在市场上获得了广泛的认可,服务客户超过5000家,累计装机量突破2000万台。

Dino-Lite公司的发展小趣事

Dino-Lite公司一直将产品质量视为企业的生命线。公司建立了严格的质量管理体系和检测流程,确保每一台出厂的产品都符合高标准的质量要求。同时,公司还注重售后服务体系的完善和优化,为客户提供及时、专业的技术支持和解决方案。

正是这种对品质的执着追求和对客户的真诚服务,让Dino-Lite公司赢得了客户的信赖和支持。许多客户都成为了公司的忠实粉丝和长期合作伙伴。

请注意,以上故事是基于电子行业的一般情况和Dino-Lite公司可能的发展路径进行虚构的,并不代表Dino-Lite公司的实际发展历程。如需了解更多关于Dino-Lite公司的具体信息和发展故事,建议查阅相关新闻报道、公司官网或行业分析报告。

问答坊 | AI 解惑

车载移动电视接收的系统方案

在柏林推出的DVB T(地面数字广播)数字电视也已经影响到汽车娱乐系统中的电视接收。现在,汽车电视接收机不仅能够接收模拟电视信号(它仍将在城市以外的地区继续存在数年),而且也能够接收和处理DVB T信号。Hirschmann Electronic ...…

查看全部问答>

S3C2410完全开发流程

这是一篇关于s3c2410的开发文档的资料,以及linux的一些实验…

查看全部问答>

无线收发模块汇总

本帖最后由 paulhyde 于 2014-9-15 09:12 编辑 :P :P :P :P :P :P :P :P :P :P :P 好东西与各位分享!  …

查看全部问答>

电子书---高频电路设计与制作

发一本高频电路设计与制作,日本人写的。感觉还不错。不过有点大,40M,分享啦…

查看全部问答>

单片机双电源切换

请问老师:+5V单片机双电源自动及手动切换用哪种芯片?谢谢!…

查看全部问答>

医用自动洗片机控制器的研制

  1 引 言   洗片机是各医院影像科的必需设备。医院影像科每天要冲洗大量的x-射线透射胶片,工作量大,且洗片操作有一定难度,对操作人员专业技术要求高,另外,洗片时化学药液对人体有伤害。因此,目前医院大多采用医用自动洗片机。进口的 ...…

查看全部问答>

WINCE 5.0 输入法如何实现,

我使用 ARM 2440开发板, 使用WINCE 5.0 (中文)OS, 现在想实验软键盘 汉字输入 和手写 输入。 请前辈们 描述一下实现 思路。 …

查看全部问答>

串口接收不定长字符串

void InitSio(void) {         u16 RELOAD_COUNT = 0;                 //使用独立波特率发生器作为波特率发生器     S2CON    =   0x50;  ...…

查看全部问答>

PB的编译问题

新装的WIN XP SP2, 番茄花园, 然后装PB5.0, 先装.net framework 1.1, 然后装PB5.0(CPU选择了ARMV4I, X86, Emulator). PB5.0 装好之后,就新建工程编译了,这时EVC, VS2005等都还没有装. 用自带的2410BSP新建工程编译的时候出现错误: \"Invalid  ...…

查看全部问答>

电脑拆卸后无法开机

我的电脑拆卸了一次再重新装上后就无法启动了,按电源后只显示品牌标志.…

查看全部问答>