基于51单片机制作的电子广告牌系统设计
原理图:
论文预览:
源程序如下:
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- //#define x1 0x80 //第一行坐标
- #define x2 0x88 //第三行坐标
- #define x3 0x90 //第二行坐标
- //#define x4 0x98 //第四行坐标
- #define comm 0 //指令标志
- #define dat 1 //数据标志
- sbit cs = P0^0; //高电平为数据,低电平为指令
- sbit std = P0^1; //数据输出位
- sbit sclk = P0^2; //时钟
- sbit psb = P0^3; //H=并口; L=串口;
- sbit rst = P0^4; //Reset Signal 低电平有效
- uchar code tab[]={
- "计算机发送数据:"
- };
- uchar code num[]={
- "0123456789ABCDEF"
- };
- uchar buffer[6]; //接收数据缓冲区
- uchar display[12]; //显示数据缓冲器
- uchar k=0;
- void wr_lcd (uchar dat_comm,uchar content); // 串行传输数据
- void delay (uint us); // 延时
- void init_lcd(void); //初始化lcd
- void init_serial(void); // 初始化串行中断
- void chn_disp(uchar code *chn,uchar j); //显示汉字或字符
- void convert(uchar *point); // 数据转换
- void chn_disp1(void); // 显示串口送入数据
- void clrram(void); // 清DDRAM
- /******************主程序******************/
- void main()
- {
- SP=0x5f;
- init_serial(); //初始化串口
- init_lcd(); //初始化LCD
- clrram(); //清屏
- chn_disp(tab,0); //显示第1行"计算机发送数据:"
- while(1)
- {
- if(k==6) //6个数据已接收到
- {
- k=0;
- convert(buffer);//转换接收数据缓冲区数据
- chn_disp1(); //显示6个接收数据
- }
- }
- }
- /****************初始化lcd****************/
- void init_lcd(void)
- {
- rst=1; //液晶复位端无效
- psb=0; //串行输出
- wr_lcd (comm,0x30); //基本指令动作
- wr_lcd (comm,0x01); //清屏,地址指针指向00H
- delay (100);
- wr_lcd (comm,0x06); //光标的移动方向
- wr_lcd (comm,0x0c); //开显示,关游标
- }
- /****************初始化串行中断****************/
- void init_serial(void)
- {
- SCON = 0x50; //8位串行口模式1,允许接收,REN=1
- TMOD|= 0x20; //定时器1工作在模式2
- TH1 = 0xfd; //波特率位9600,晶振频率位11.0592MHz
- TL1 = 0xfd;
- ES = 1; //使能串行口中断
- EA = 1; //使能全局中断
- TR1 = 1; //启动定时器1
- }
- /****************串口中断服务程序****************/
- void serial_IT(void) interrupt 4
- {
- if(RI==1)
- {
- RI=0;
- buffer[k++]=SBUF;//将串口接收数据送入接收数据缓冲区
- }
- }
- /**************显示汉字或字符**************/
- void chn_disp(uchar code *chn,uchar j)
- {
- uchar i;
- wr_lcd (comm,0x30); //基本指令动作
- wr_lcd (comm,0x80); //设定DDRAM地址至00H
- for (i=0;i<16;i++)
- wr_lcd (dat,chn[j*16+i]);//显示第j行字符
- }
- /******************数据转换*******************/
- void convert(uchar *point)
- {
- uchar i,j1,j2;
- for(i=0;i<6;i++) //将接收数据缓冲区数据变为10进制数并存入显示数据缓冲区
- {
- j1=point[i]/16; //高4位
- j2=point[i]%16; //低4位
- display[2*i]=num[j1]; //换算成显示码
- display[2*i+1]=num[j2];
- }
- }
- /**************显示串口送入数据**************/
- void chn_disp1(void)
- {
- uchar i;
- wr_lcd(comm,0x30); //基本指令动作
- wr_lcd(comm,x3); //设定DDRAM地址至10H
- for(i=0;i<3;i++)
- {
- wr_lcd(dat,display[2*i]); //将显示码送入第二行显示
- wr_lcd(dat,display[2*i+1]);
- wr_lcd(comm,x3+2*i+2);
- }
- wr_lcd(comm,x2); //设定DDRAM地址至08H
- for(i=0;i<3;i++)
- {
- wr_lcd(dat,display[2*i+6]);//将显示码送入第三行显示
- wr_lcd(dat,display[2*i+7]);
- wr_lcd(comm,x2+2*i+2);
- }
- }
- /******************清DDRAM******************/
- void clrram(void)
- {
- wr_lcd (comm,0x30); //基本指令动作
- wr_lcd (comm,0x01); //清除显示,并将DDRAM清零
- delay (180);
- }
- /****************** ******************/
- void wr_lcd(uchar dat_comm,uchar content)
- {
- uchar a,i,j;
- delay(50);
- a=content; //指令码或数据码
- cs=1; //发送数据
- sclk=0;
- std=1; //发送5个"1",作为数据起始位
- for(i=0;i<5;i++)
- {
- sclk=1;
- sclk=0;
- }
- std=0; //发送第6位,R/W=0,写数据
- sclk=1;
- sclk=0;
- if(dat_comm) //发送第7位RS
- std=1; //若为高电平,发送数据
- else
- std=0; //若为低电平,发送指令
- sclk=1;
- sclk=0;
- std=0; //发送第8位"0"
- sclk=1;
- sclk=0;
- for(j=0;j<2;j++) //将数据位分两个字节发送
- {
- for(i=0;i<4;i++)//发送数据高4位或低4位
- {
- a=a<<1;
- std=CY;
- sclk=1;
- sclk=0;
- }
- std=0;
- for(i=0;i<4;i++)//发送4位"0"
- {
- sclk=1;
- sclk=0;
- }
- }
- }
- /******************延时******************/
- void delay(uint us) //delay time
- {
- while(us--);
- }
复制代码
单片机电子广告牌系统设计(电路原理图+单片机源程序+论文)下载:
|
|
|