扫描枪读条码数据在单片机串口电路的读取与显示
生活随笔
收集整理的這篇文章主要介紹了
扫描枪读条码数据在单片机串口电路的读取与显示
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
相關知識聲明:
1.單片機一般用TTL串口
TTL電平:+5V等價于邏輯“1”,0V等價于邏輯“0”,這被稱做TTL(晶體管-晶體管邏輯電平)信號系統,這是計算機處理器控制的設備內部各部分之間通信的標準技術
2.PC機一般用232串口
RS232電平:-3V~-15V代表邏輯1,+3~+15V代表邏輯0。所以單片機與PC機的串口進行通訊時,需要進行電平轉換,一般使用max232芯片把232電平轉換為TTL才能與單片機管腳RXD、TXD通信
3.usb接口
對于USB2.0,除去屏蔽層,有4根線,分別是VCC、GND和D+、D-兩根信號線。5V是USB的電源電壓,給USB device供電用。信號線對于USB2.0,D+比D-大200mV時為1,D-比D+大200mV時為0,屬差分信號,與TTL電平不兼容,信號傳輸時需要電平轉換電路。(一般用ch240芯片轉換與單片機連接)
4.對單片機串口中斷的一些理解:
串口中斷有收和發中斷,中斷一旦產生可以處理也可以不處理,只是處理器給你提供了一個處理的機會,可以不做任何處理
目的:
單片機串口讀取條碼掃描槍數據,并在LCD1602顯示(詳見注釋)
效果圖:
注意:由于串口轉換電路(max232芯片),和單片機實驗板分別供電,所以要把兩個芯片共地線(地線連接到一起),否則沒有回路,無法通信
單片機程序:
// //中斷法收數據 // #include <REG52.H> #include <string.h> #define uchar unsigned char #define uint unsigned int uchar UART_buff; uchar table[20]; int count; bit New_rec = 0, Send_ed = 1;sbit lcden=P3^4; sbit lcdrs=P3^5; sbit dula=P2^6; sbit wela=P2^7; sbit guo=P3^6;void delay(uint z) { //延時函數uint x,y;for(x=z; x>0; x--)for(y=110; y>0; y--); } void write_com(uchar com) { //需要看操作時序lcdrs=0;P0=com; //P0送的指令碼delay(5);lcden=1;delay(5);lcden=0; } void write_dat(uchar dat) { //需要看操作時序lcdrs=1;P0=dat; //P0送的指令碼delay(5);lcden=1;delay(5);lcden=0; } void init() {guo=0;dula=0; //關閉數碼管鎖存端wela=0;lcden=0;write_com(0x38); //設置顯示模式write_com(0x0e); //設置光標write_com(0x06); //設置字符指針write_com(0x01); //清屏指令write_com(0x80); //光標定位} //---------------------------------------------- void main (void) {int num;init();SCON = 0x50; //串口方式1, 8-n-1, 允許接收.TMOD = 0x20; //T1方式2TH1 = 0xFD; //9600bps@11.0592MHzTL1 = 0xFD;TR1 = 1;ES = 1; //開中斷.EA = 1;while(1) {if (New_rec == 1) { //如果收到新數據SBUF = UART_buff; //發送數據table[count++]=UART_buff;while(!Send_ed); //等待數據發送完畢if(!(table[9]==0)) { //如果緩存表滿,給LCD送出數據init(); //清屏及光標定位for(num=0; num<10; num++) {write_dat(table[num]);}count=0; //緩存表初始化num=0;memset(table, 0, 20*sizeof(char)); //緩存表清零}New_rec = 0; //接收完數據,標記置0Send_ed = 0; //發送完數據,標記置0}} } //---------------------------------------------- void ser_int (void) interrupt 4 {if(RI == 1) { //處理接收中斷RI = 0; //接收中斷標記置0New_rec = 1; //通知主函數接收到新數據UART_buff = SBUF; //取串口數據} if(TI == 1) { //處理發送中斷TI = 0; //發送中斷標記置0Send_ed = 1; //通知主函數數據發送完成} } //---------------------------------------------- 實現連續讀取條碼數據,再來看一張效果圖:
總結
以上是生活随笔為你收集整理的扫描枪读条码数据在单片机串口电路的读取与显示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单片机串行收发电路制作记录
- 下一篇: JDBC的封装类