久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6339|回復: 3
收起左側

基于51單片機條形碼識別系統程序

[復制鏈接]
ID:151220 發表于 2016-11-30 14:31 | 顯示全部樓層 |閱讀模式
/*****************************************************************
串行通迅     51單片機LCD1602顯示條形碼掃碼槍發來的串行數據                                                  
*************************************************************************
* 描述:(用串口調試助手軟件觀察)                                                           
*   LCD1602顯示接收數據的ASCII碼。  波特率9600         
************************************************************************/
#include <reg52.h>
#include <intrins.h>
#define uchar  unsigned char
#define uint   unsigned int
sbit LCD_RS = P3^5;            
sbit LCD_EN = P3^4;
sbit LCD_WR = P3^6;
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

uchar data  RXDdata[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
                           0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20 };
uchar temp,buf,m,count;
bit   playflag=0;         
uchar code  cdis1[ ] = {" Serial Transfer "};
uchar code  cdis2[ ] = {"xxxxxxxxxxxxxxx "};
/**********************************************************
延時子程序
**********************************************************/
void delay1(uint ms)
{
    uchar k;
    while(ms--)
    {
      for(k = 0; k < 120; k++);
    }
}
/******************************************************************/
/*                                                                */
/*檢查LCD忙狀態                                                   */
/*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據。     */
/*                                                                */
/******************************************************************/
bit lcd_busy()
  {                          
     bit result;
     LCD_RS = 0;
//    LCD_RW = 1;
     LCD_EN = 1;
     delayNOP();
     result = (bit)(P0&0x80);
     LCD_EN = 0;
     return(result);
  }
/*******************************************************************/
/*                                                                 */
/*寫指令數據到LCD                                                  */
/*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                             */
/*                                                                 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{                          
  //  while(lcd_busy());
     LCD_RS = 0;
     LCD_WR = 0;
     LCD_EN = 0;
     _nop_();
     _nop_();
     P0 = cmd;
     delayNOP();
     LCD_EN = 1;
     delayNOP();
     LCD_EN = 0;  
}
/*******************************************************************/
/*                                                                 */
/*寫顯示數據到LCD                                                  */
/*RS=H,RW=L,E=高脈沖,D0-D7=數據。                               */
/*                                                                 */
/*******************************************************************/
void lcd_wdat(uchar dat)
{                          
//   while(lcd_busy());
     LCD_RS = 1;
     LCD_WR = 0;
     LCD_EN = 0;
     P0 = dat;
     delayNOP();
     LCD_EN = 1;
     delayNOP();
     LCD_EN = 0;
}
/*******************************************************************/
/*                                                                 */
/*  LCD初始化設定                                                  */
/*                                                                 */
/*******************************************************************/
void lcd_init()
{
     delay1(15);   
     lcd_wcmd(0x01);      //清除LCD的顯示內容            
     lcd_wcmd(0x38);      //16*2顯示,5*7點陣,8位數據
    delay1(5);
     lcd_wcmd(0x38);         
     delay1(5);
     lcd_wcmd(0x38);         
     delay1(5);
    lcd_wcmd(0x0c);      //開顯示,顯示光標,光標閃爍
    delay1(5);
    lcd_wcmd(0x01);      //清除LCD的顯示內容
    delay1(5);
}
/*******************************************************************/
/*                                                                 */
/*  設定顯示位置                                                   */
/*                                                                 */
/*******************************************************************/
void lcd_pos(uchar pos)
{                          
   lcd_wcmd(pos | 0x80);  //數據指針=80+地址變量
}
/*********************************************************
  發送數據函數
*********************************************************/
void senddata(uchar dat)
{
      SBUF =dat;
      while(!TI);
      TI = 0;
}
/*********************************************************
  串行中斷服務函數
*********************************************************/
void  serial() interrupt 4
{
    ES = 0;                //關閉串行中斷
   RI = 0;                //清除串行接受標志位
   buf = SBUF;            //從串口緩沖區取得數據
    switch(buf)
    {
       case 0x31:  senddata('T');break;  //接受到1,發送字符'T'給計算機         
       case 0x32:  senddata('X');break;  //接受到2,發送字符'X'給計算機      
       case 0x33:  senddata('-');break;  //接受到3,發送字符'-'給計算機      
       case 0x34:  senddata('M');break;  //接受到4,發送字符'M'給計算機      
       case 0x35:  senddata('C');break;  //接受到5,發送字符'C'給計算機           
       case 0x36:  senddata('U');break;  //接受到6,發送字符'U'給計算機                  
       default:    senddata(buf);break;  //接受到其它數據,將其發送給計算機         
    }
   if(buf!=0x0D)
    {   
      if(buf!=0x0A)
      {
        temp =buf;
        if(count<16)
        {         
          RXDdata[count]=temp;
          count++;
if(count==16)
playflag=1;
        }
      }
    }
    ES = 1;    //允許串口中斷
}
/*********************************************************
  數據顯示函數
*********************************************************/
void  play()
{
    if(playflag)
    {
      lcd_pos(0x40);           //設置位置為第二行
     for(m=0;m<16;m++)
      {
lcd_wdat(cdis2[m]);      //清LCD1602第二行
delay1(5);
}
lcd_pos(0x40);           //設置位置為第二行
     for(m=0;m<16;++m)
      {
     //   lcd_pos(0x40+m);       //設置顯示位置為第二行
       lcd_wdat(RXDdata[m]);  //顯示字符
  delay1(5);
      }
     playflag=0;              
      count=0x00;
     for(m=0;m<16;++m)      
      {
RXDdata[m]=0x20;         //清顯存單元   
delay1(5);
}
    }               
}
/*********************************************************
  主函數
*********************************************************/
void main(void)
{
     P0 = 0xff;
     P2 = 0xff;         
     
    SCON=0x50;           //設定串口工作方式
    PCON=0x00;           //波特率不倍增
    TMOD=0x20;           //定時器1工作于8位自動重載模式, 用于產生波特率
    EA=1;
    ES = 1;              //允許串口中斷
    TL1=0xfd;
    TH1=0xfd;             //波特率9600
    TR1=1;
    lcd_init();
    lcd_pos(0x00);        //設置顯示位置為第一行
    for(m=0;m<16;m++)
       {
       lcd_wdat(cdis1[m]);   //顯示字符
       delay1(5);
       }
    lcd_pos(0x40);        //設置顯示位置為第二行
    for(m=0;m<16;m++)
       {
       lcd_wdat(cdis2[m]);   //顯示字符            
       delay1(5);
       }
     while(1)        
     {
       play();      
     }
}
/*********************************************************/

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:208781 發表于 2017-6-8 19:23 | 顯示全部樓層
有沒有圖呀
回復

使用道具 舉報

ID:292882 發表于 2018-8-21 16:08 | 顯示全部樓層
這個需要電腦嗎
回復

使用道具 舉報

ID:292882 發表于 2018-8-21 16:08 | 顯示全部樓層
這個需要連電腦嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av中文字幕网 | 91深夜福利视频 | 欧美中文字幕一区 | 欧美久久国产 | 国产一区在线免费 | 色天堂视频 | 蜜桃视频在线观看免费视频网站www | 极品粉嫩国产48尤物在线播放 | 毛片在线视频 | 国内精品久久久久久久影视简单 | 成人在线影视 | 噜久寡妇噜噜久久寡妇 | 国产丝袜一区二区三区免费视频 | 在线播放国产一区二区三区 | 日本欧美国产在线 | 亚洲三区在线 | 久久av一区 | 成人欧美日韩一区二区三区 | 欧产日产国产精品99 | 黄色毛片网站在线观看 | 国产精品一区一区 | 国产伦精品一区二区三区视频金莲 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 亚洲一二三在线 | 91亚洲精选| 欧美片网站免费 | 国产精品久久久久久久久久妇女 | 中文字幕视频在线观看 | 影音先锋中文字幕在线观看 | 精品久久久久国产 | 亚洲另类自拍 | 色婷婷久久久亚洲一区二区三区 | 久久久www成人免费精品 | 91精品久久久久 | 一区二区三区国产好 | 激情视频一区 | 免费在线观看一区二区 | 亚洲一二三区在线观看 | 日韩欧美综合在线视频 | 日韩毛片免费看 | 亚洲欧美日韩精品久久亚洲区 |