当前位置:网站首页>Stc8h8k Series Assembly and c51 Real combat - NIXIE TUBE displays ADC, Key Series port reply Key number and ADC value
Stc8h8k Series Assembly and c51 Real combat - NIXIE TUBE displays ADC, Key Series port reply Key number and ADC value
2022-07-02 05:53:00 【Personne.】
Le tube numérique montreADC、Affichage du port sérieADCTouches et valeurs
Un.、Titre
Le passage et le passage sont réalisésADC0Connecté16- Oui.ADCMesure de la variation du signal de tension analogique causée par le bouton,Avec un tube numérique sur la boîte d'essai2Code clé d'affichage de bits,Faible4Affichage des bitsADValeur.Utilisation du port série1Afficher les valeurs clés et les valeurs des résultats de conversion sur l'assistant de port série hôte, Le format d'affichage est: Valeurs clés:Correspondant àADCRésultats.Continuer à appuyer sur la touche Entrée pour changer de ligne,Afficher la valeur de la clé suivante dans le même format etADCRésultats.
2.、Code
mainFonctions
//Élevé2Code clé d'affichage de bits,Faible4Affichage des bitsADValeur
#include<stc8h.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
bit busy;
u8 key=0;
uchar cnt1ms=0;
uint ad_volume=0;
#define ADC_OFFSET 64
uchar KeyCode=0;
void CalculateAdcKey(uint adc);
uint Get_ADC12bitResult(uchar channel); //channel = 0~7
#define font_PORT P6 // Définir le port de sortie du Code de police
#define position_PORT P7 // Définir le port de sortie du Code de contrôle des bits
uchar code LED_SEG[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0x40,0x79,0x24,0x30,0x19,0x12d,0x02,0x78,0x00,0x10,0xbf };
//Définition"0、1、2、3、4、5、6、7、8、9","A、B、C、D、E、F"Et"éteint." Le Code de police de
//Définition"0、1、2、3、4、5、6、7、8、9"(Avec point décimal) Et “-” Le Code de police de
uchar code Scan_bit[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf, 0xbf, 0x7f}; // Définir le Code de contrôle du BIT de balayage
uchar data Dis_buf[]={
16,16,16,16,16,16,16,0}; //Définir le tampon d'affichage, Affichage du BIT le plus bas "0",Les autres sont"éteint."
void gpio() //gpio Initialiser comme port quasi bidirectionnel , Au début, à part P30,P31 Les autres sont à haute résistance
{
P0M1 = 0x00; P0M0 = 0x00; //Réglage du port quasi bidirectionnel
P1M1 = 0x00; P1M0 = 0x00; //Réglage du port quasi bidirectionnel
P2M1 = 0x00; P2M0 = 0x00; //Réglage du port quasi bidirectionnel
P3M1 = 0x00; P3M0 = 0x00; //Réglage du port quasi bidirectionnel
P4M1 = 0x00; P4M0 = 0x00; //Réglage du port quasi bidirectionnel
P5M1 = 0x00; P5M0 = 0x00; //Réglage du port quasi bidirectionnel
P6M1 = 0x00; P6M0 = 0x00; //Réglage du port quasi bidirectionnel
P7M1 = 0x00; P7M0 = 0x00; //Réglage du port quasi bidirectionnel
}
/*---------------------------- Envoyer des octets ----------------------------*/
void SendData(uchar dat)
{
while (busy);
busy = 1;
SBUF = dat; // Stockage des données à envoyer SBUF
}
/*---------------------------- Envoyer une fonction de chaîne ----------------------------*/
void SendString(uchar *s)
{
while (*s !='\0') // La chaîne ne s'arrête pas tant qu'elle n'est pas lue
{
SendData(*s++); // Chaque octet envoyé s++
}
}
void Timer0Init(void) //[email protected]
{
AUXR |= 0x80; //Horloge de minuterie1TMode
TMOD &= 0xF0; //Réglage du mode minuteur
TL0 = 0x40; //Définir la valeur initiale du timing
TH0 = 0xA2; //Définir la valeur initiale du timing
TF0 = 0; //EffacerTF0Le logo
TR0 = 1; //Minuterie0Début du timing
}
/*――――――――――Fonction de retard――――――――――――*/
void Delay1ms() //@24.000MHz
{
unsigned char i, j;
_nop_();
i = 32;
j = 40;
do
{
while (--j);
} while (--i);
}
void Delay500us() //@24.000MHz
{
unsigned char i, j;
i = 16;
j = 147;
do
{
while (--j);
} while (--i);
}
/*――――――――――Afficher les fonctions――――――――――――*/
void LED_display(void)
{
uchar i;
for(i=0;i<8;i++)
{
position_PORT =0xff; font_PORT =LED_SEG[Dis_buf[i]]; position_PORT = Scan_bit[7-i]; Delay500us();
}
}
/*――――――――――Initialisation du port série――――――――――――*/
void InitUART(void)
{
SCON = 0x50; //8Données binaires
P_SW1= P_SW1 & 0x3F;
AUXR |= 0x40; //Minuterie1TMode
AUXR &= 0xFE;
TMOD &= 0x0F;
TMOD |= 0x20; //8Mode de recharge automatique bit
TL1 = 0xDC; //
TH1 = 0xDC;
TR1 = 1; //Allumez le minuteur1
ES = 1; //Ouverture de l'interruption du port série
EA = 1;
}
/**********************************************/
void main(void)
{
uint j;
gpio();
ADCCFG=ADCCFG|0x20; //RESFMTEmplacement1, Enregistrer les résultats à droite
ADC_CONTR = 0x80; //Ouvre.AD Alimentation du module de conversion
P1M1=P1M1|0x01; //P1 Port réglé à haute résistance
Timer0Init();
InitUART();
ET0 = 1; //Timer0 interrupt enable
TR0 = 1; //Tiner0 run
EA = 1; //Ouvrir l'interruption totale
while(1)
{
Dis_buf[4] = ad_volume / 1000%10; //AfficheradValeur
Dis_buf[5] = ad_volume/100%10; //AfficheradValeur
Dis_buf[6] = ad_volume / 10%10; //AfficheradValeur
Dis_buf[7] = ad_volume % 10; //AfficheradValeur
Dis_buf[0] = KeyCode / 10; // Afficher les clés
Dis_buf[1] = KeyCode % 10; // Afficher les clés
LED_display();
if(cnt1ms >= 10) //10msLisez une foisADC
{
cnt1ms = 0;
j = Get_ADC12bitResult(0); //0Accès,Méthode de requête une foisADC, La valeur de retour est le résultat, == 4096 Erreur
if(((256-ADC_OFFSET)<j)&&(j < 4096))
{
LED_display(); //Secoue - toi.
LED_display();
j = Get_ADC12bitResult(0);
if(((256-ADC_OFFSET)<j)&&(j < 4096))
{
ad_volume=j;
CalculateAdcKey(j); // Touches de calcul
SendData(KeyCode/10+0x30);
SendData(KeyCode%10+0x30);
SendString(": ");
SendData(ad_volume / 1000%10+0x30);
SendData(ad_volume/100%10+0x30);
SendData(ad_volume / 10%10+0x30);
SendData(ad_volume % 10+0x30);
SendString("\r\n");
Dis_buf[4] = ad_volume / 1000%10; //AfficheradValeur
Dis_buf[5] = ad_volume/100%10; //AfficheradValeur
Dis_buf[6] = ad_volume / 10%10; //AfficheradValeur
Dis_buf[7] = ad_volume % 10; //AfficheradValeur
Dis_buf[0] = KeyCode / 10; // Afficher les clés
Dis_buf[1] = KeyCode % 10; // Afficher les clés
LED_display();
L1: j = Get_ADC12bitResult(0);
while(((256-ADC_OFFSET)<j)&&(j < 4096)) //Key Release
{
LED_display();
goto L1;
}
}
}
}
}
}
/****************MesureADValeur*************************/
uint Get_ADC12bitResult(uchar channel) //channel = 0~15
{
ADC_RES = 0; // Effacer le registre des résultats de conversion 0
ADC_RESL = 0;
ADC_CONTR = (ADC_CONTR & 0xe0) | 0x40 | channel; //D'abord l'électricité.,On recommence., Sélectionner à nouveau le canal
_nop_(); _nop_(); _nop_(); _nop_();// Attendez que le circuit se stabilise au début.
while((ADC_CONTR & 0x20) == 0) ; //Attendez.ADCTerminé.
ADC_CONTR &= ~0x20; //EffacerADCDrapeau de fin
return (((uint)ADC_RES << 8) | ADC_RESL );
}
/***************** ADC Clé de calcul du clavier ********************************/
void CalculateAdcKey(uint adc)
{
uchar i;
uint j=256;
for(i=1; i<=16; i++)
{
if((adc >= (j - ADC_OFFSET)) && (adc <= (j + ADC_OFFSET))) break; // Déterminer si l'écart se situe dans la plage
j += 256;
}
if(i < 17) KeyCode = i; // Enregistrer la clé
}
/********************** Timer0 1msFonction d'interruption ************************/
void timer0 (void) interrupt 1
{
cnt1ms++;
}
/*---------------------------- UART Interruption -----------------------------*/
void Uart() interrupt 4 using 1
{
LED_display();
if (RI)
{
RI = 0; // Après avoir reçu les caractères ,RIChing0
}
if (TI)
{
TI = 0; // Après avoir envoyé les caractères TIChing0
busy = 0; // Après avoir envoyé un caractère busyChing0
}
}
LED_displayFonctions
// Ce qui suit:LED_display.c
#include <stc8h.h>
#include <intrins.h>
#define font_PORT P6 // Définir le port de sortie du Code de police
#define position_PORT P7 // Définir le port de sortie du Code de contrôle des bits
uchar code LED_SEG[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0x40,0x79,0x24,0x30,0x19,0x12d,0x02,0x78,0x00,0x10,0xbf };
//Définition"0、1、2、3、4、5、6、7、8、9","A、B、C、D、E、F"Et"éteint." Le Code de police de
//Définition"0、1、2、3、4、5、6、7、8、9"(Avec point décimal) Et “-” Le Code de police de
uchar code Scan_bit[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf, 0xbf, 0x7f}; // Définir le Code de contrôle du BIT de balayage
uchar data Dis_buf[]={
16,16,16,16,16,16,16,0}; //Définir le tampon d'affichage, Affichage du BIT le plus bas "0",Les autres sont"éteint."
/*――――――――――Fonction de retard――――――――――――*/
void Delay1ms() //@24.000MHz
{
unsigned char i, j;
_nop_();
i = 32;
j = 40;
do
{
while (--j);
} while (--i);
}
/*――――――――――Afficher les fonctions――――――――――――*/
void LED_display(void)
{
uchar i;
for(i=0;i<8;i++)
{
position_PORT =0xff; font_PORT =LED_SEG[Dis_buf[i]]; position_PORT = Scan_bit[7-i]; Delay1ms ();
}
}
LED_display.hFichier d 'en - tête
#ifndef __LED_DISPLAY_H__
#define __LED_DISPLAY_H__
void Delay1ms();
void LED_display(void);
uchar code LED_SEG[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0x40,0x79,0x24,0x30,0x19,0x12d,0x02,0x78,0x00,0x10,0xbf };
//Définition"0、1、2、3、4、5、6、7、8、9","A、B、C、D、E、F"Et"éteint." Le Code de police de
//Définition"0、1、2、3、4、5、6、7、8、9"(Avec point décimal) Et “-” Le Code de police de
uchar code Scan_bit[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf, 0xbf, 0x7f}; // Définir le Code de contrôle du BIT de balayage
uchar data Dis_buf[]={
16,16,16,16,16,16,16,0}; //Définir le tampon d'affichage, Affichage du BIT le plus bas "0",Les autres sont"éteint."
#end if
Merci beaucoup de regarder. !!!
Série d'articles——STC8H8KCompilation des séries51Sur le terrain
STC8H8K Compilation de séries et C51Sur le terrain—— Réalisation de la lumière de course (51Édition)
STC8H8K Compilation de séries et C51Sur le terrain—— Feu de circulation à double interruption
STC8H8K Compilation de séries et C51Sur le terrain—— Compteur de fréquence simple
STC8H8K Compilation de séries et C51Sur le terrain—— Compteur de secondes (Compilation)
STC8H8K Compilation de séries et C51Sur le terrain—— Compteur de secondes (51Édition)
STC8H8K Compilation de séries et C51Sur le terrain—— Nombre de touches autorisé (51Édition)
STC8H8K Compilation de séries et C51Sur le terrain—— Nombre de touches autorisé (Compilation)
边栏推荐
猜你喜欢
GRBL 软件:简单解释的基础知识
Summary of MySQL constraints
3D printer G code command: complete list and tutorial
Stick to the big screen UI, finereport development diary
PHP development and testing WebService (soap) -win
idea開發工具常用的插件合集匯總
Minimum value ruler method for the length of continuous subsequences whose sum is not less than s
MySQL transaction and isolation level
15 C language advanced dynamic memory management
软件测试 - 概念篇
随机推荐
all3dp. All Arduino projects in com website (2022.7.1)
Lambda 表达式 和 方法引用
RNN recurrent neural network
【LeetCode】Day92-盛最多水的容器
php数组转化为xml
PHP 开发与测试 Webservice(SOAP)-Win
Stick to the big screen UI, finereport development diary
memcached安装
Yyds dry inventory what is test driven development
Go language web development is very simple: use templates to separate views from logic
PHP array to XML
A collection of commonly used plug-ins for idea development tools
XSS basic content learning (continuous update)
JWT工具类
Applet jumps to official account
492.构造矩形
软件测试基础篇
Zzuli:1069 learn from classmate Z
Cube magique infini "simple"
CNN可视化技术 -- CAM & Grad-CAM详解及pytorch简洁实现